merb 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/README +22 -4
  2. data/Rakefile +15 -3
  3. data/TODO +2 -3
  4. data/bin/merb +61 -36
  5. data/examples/sample_app/dist/app/controllers/files.rb +31 -0
  6. data/examples/sample_app/dist/app/controllers/posts.rb +26 -2
  7. data/examples/sample_app/dist/app/controllers/test.rb +7 -1
  8. data/examples/sample_app/dist/app/views/files/progress.jerb +3 -0
  9. data/examples/sample_app/dist/app/views/files/start.herb +62 -0
  10. data/examples/sample_app/dist/app/views/files/upload.herb +6 -0
  11. data/examples/sample_app/dist/app/views/layout/{application.rhtml → application.herb} +2 -3
  12. data/examples/sample_app/dist/app/views/layout/{foo.rhtml → foo.herb} +0 -0
  13. data/examples/sample_app/dist/app/views/posts/{_comments.rhtml → _comments.herb} +0 -0
  14. data/examples/sample_app/dist/app/views/posts/comment.jerb +1 -0
  15. data/examples/sample_app/dist/app/views/posts/{list.rhtml → list.herb} +0 -0
  16. data/examples/sample_app/dist/app/views/posts/{new.rhtml → new.herb} +0 -0
  17. data/examples/sample_app/dist/app/views/posts/{show.rhtml → show.herb} +0 -0
  18. data/examples/sample_app/dist/app/views/posts/xml_test.xerb +3 -0
  19. data/examples/sample_app/dist/app/views/test/{foo.rhtml → foo.herb} +0 -0
  20. data/examples/sample_app/dist/app/views/test/{hello.rhtml → hello.herb} +0 -0
  21. data/examples/sample_app/dist/app/views/test/json.jerb +1 -0
  22. data/examples/sample_app/dist/conf/merb.yml +11 -0
  23. data/examples/sample_app/dist/conf/merb_init.rb +1 -1
  24. data/examples/sample_app/dist/conf/mup.conf +11 -0
  25. data/examples/sample_app/dist/public/javascripts/mup.js +113 -0
  26. data/examples/sample_app/script/merb_stop +7 -3
  27. data/examples/sample_app/script/startdrb +8 -0
  28. data/lib/merb.rb +37 -2
  29. data/lib/merb/merb_class_extensions.rb +21 -22
  30. data/lib/merb/merb_controller.rb +101 -33
  31. data/lib/merb/merb_handler.rb +26 -25
  32. data/lib/merb/merb_router.rb +1 -1
  33. data/lib/merb/merb_utils.rb +35 -37
  34. data/lib/merb/mixins/basic_authentication_mixin.rb +39 -0
  35. data/lib/merb/mixins/controller_mixin.rb +119 -115
  36. data/lib/merb/mixins/javascript_mixin.rb +63 -0
  37. data/lib/merb/mixins/render_mixin.rb +85 -69
  38. data/lib/merb/mixins/responder_mixin.rb +38 -0
  39. data/lib/merb/session/merb_drb_server.rb +107 -0
  40. data/lib/merb/session/merb_drb_session.rb +71 -0
  41. data/lib/merb/session/merb_session.rb +1 -0
  42. data/lib/merb/vendor/paginator/README.txt +84 -0
  43. data/lib/merb/vendor/paginator/paginator.rb +121 -0
  44. data/lib/mutex_hotfix.rb +34 -0
  45. metadata +41 -63
  46. data/doc/rdoc/classes/ControllerMixin.html +0 -676
  47. data/doc/rdoc/classes/Hash.html +0 -148
  48. data/doc/rdoc/classes/Merb.html +0 -140
  49. data/doc/rdoc/classes/Merb/Controller.html +0 -338
  50. data/doc/rdoc/classes/Merb/RouteMatcher.html +0 -388
  51. data/doc/rdoc/classes/Merb/Server.html +0 -148
  52. data/doc/rdoc/classes/Merb/Session.html +0 -201
  53. data/doc/rdoc/classes/Merb/SessionMixin.html +0 -199
  54. data/doc/rdoc/classes/MerbControllerError.html +0 -111
  55. data/doc/rdoc/classes/MerbHandler.html +0 -430
  56. data/doc/rdoc/classes/MerbHash.html +0 -469
  57. data/doc/rdoc/classes/MerbHash/Mutex.html +0 -198
  58. data/doc/rdoc/classes/Noroutefound.html +0 -153
  59. data/doc/rdoc/classes/Object.html +0 -149
  60. data/doc/rdoc/classes/RenderMixin.html +0 -362
  61. data/doc/rdoc/classes/String.html +0 -212
  62. data/doc/rdoc/classes/Symbol.html +0 -179
  63. data/doc/rdoc/created.rid +0 -1
  64. data/doc/rdoc/files/LICENSE.html +0 -129
  65. data/doc/rdoc/files/README.html +0 -417
  66. data/doc/rdoc/files/TODO.html +0 -151
  67. data/doc/rdoc/files/lib/merb/merb_class_extensions_rb.html +0 -101
  68. data/doc/rdoc/files/lib/merb/merb_controller_rb.html +0 -101
  69. data/doc/rdoc/files/lib/merb/merb_handler_rb.html +0 -101
  70. data/doc/rdoc/files/lib/merb/merb_router_rb.html +0 -101
  71. data/doc/rdoc/files/lib/merb/merb_utils_rb.html +0 -108
  72. data/doc/rdoc/files/lib/merb/mixins/controller_mixin_rb.html +0 -101
  73. data/doc/rdoc/files/lib/merb/mixins/render_mixin_rb.html +0 -101
  74. data/doc/rdoc/files/lib/merb/session/merb_session_rb.html +0 -101
  75. data/doc/rdoc/files/lib/merb_rb.html +0 -140
  76. data/doc/rdoc/files/lib/merb_tasks_rb.html +0 -101
  77. data/doc/rdoc/fr_class_index.html +0 -43
  78. data/doc/rdoc/fr_file_index.html +0 -40
  79. data/doc/rdoc/fr_method_index.html +0 -104
  80. data/doc/rdoc/index.html +0 -24
  81. data/doc/rdoc/rdoc-style.css +0 -208
  82. data/examples/sample_app/dist/app/controllers/upload.rb +0 -29
  83. data/examples/sample_app/dist/app/views/posts/comment.merbjs +0 -1
  84. data/examples/sample_app/dist/app/views/upload/start.rhtml +0 -15
  85. data/examples/sample_app/dist/app/views/upload/upload.rhtml +0 -4
  86. data/examples/sample_app/dist/public/files/README +0 -35
  87. data/examples/sample_app/dist/public/files/setup.rb +0 -1346
  88. data/examples/sample_app/log/merb.log +0 -778
data/README CHANGED
@@ -7,6 +7,15 @@ for simple dynamic pages.
7
7
 
8
8
  **Sample APP included**
9
9
 
10
+ **Important**
11
+ The new default filename extensions for templates are as follows:
12
+ html -> .herb
13
+ js -> .jerb
14
+ xml -> .xerb
15
+
16
+ You can change the extensions to anything you want in your config file in
17
+ yourapp/dist/conf/merb.yml. See the default settings in the sample app.
18
+
10
19
  Unpack the gem and grab the sample app
11
20
 
12
21
  $ gem unpack merb
@@ -19,10 +28,19 @@ $ merb
19
28
  then the sample app will be running on port 4000 in the foreground.
20
29
  you can go to a few urls:
21
30
 
22
- http://localhost:4000/upload/start
31
+ You will need the mongrel_upload_progress gem installed to go to /files
32
+
33
+ http://localhost:4000/files/start
23
34
 
24
35
  http://localhost:4000/foo/123/baz/12234345
25
36
 
37
+ If you have checked out merb trunk from svn you will want to build and install
38
+ the gem to use merb. Run this command from the root of the merb svn checkout
39
+ to do that:
40
+
41
+ $ sudo rake install
42
+
43
+ *note* you may have to run this comand twice if it fails the first time.
26
44
 
27
45
  **FEATURES** 1. Mongrel handler built in that parses incoming requests
28
46
  including multipart uploads and post as well as ?query=strings. Puts the
@@ -63,7 +81,7 @@ lambda{|path|
63
81
  3. Simple controller classes with built in render method and template handling
64
82
  with instance vars available in the views automatically. Merb also supports
65
83
  layouts. It will look for a layout named after your controller class first and
66
- then fall back to application.rhtml if no layout exists named after your controller.
84
+ then fall back to application.herb if no layout exists named after your controller.
67
85
  You can use render_no_layout or do layout :none right before you render
68
86
 
69
87
 
@@ -105,10 +123,10 @@ def ajax_action
105
123
  render_js
106
124
  end
107
125
 
108
- # ajax_action.merbjs
126
+ # ajax_action.jerb
109
127
  $('comments').update('<%= escape_js(partial(:posts)) %>');
110
128
 
111
- # _posts.rhtml
129
+ # _posts.herb
112
130
  <ul>
113
131
  <% @posts.each do |p| %>
114
132
  <li>
data/Rakefile CHANGED
@@ -6,10 +6,11 @@ require 'rake/testtask'
6
6
  require 'spec/rake/spectask'
7
7
  require 'code_statistics'
8
8
  require 'fileutils'
9
+ require File.dirname(__FILE__)+'/tools/rakehelp'
9
10
  include FileUtils
10
11
 
11
12
  NAME = "merb"
12
- VERS = "0.0.6"
13
+ VERS = "0.0.7"
13
14
  CLEAN.include ['**/.*.sw?', '*.gem', '.config']
14
15
  RDOC_OPTS = ['--quiet', '--title', "Merb Documentation",
15
16
  "--opname", "index.html",
@@ -17,12 +18,21 @@ RDOC_OPTS = ['--quiet', '--title', "Merb Documentation",
17
18
  "--main", "README",
18
19
  "--inline-source"]
19
20
 
21
+ setup_clean [ "pkg", "lib/*.bundle", "*.gem",
22
+ "doc", ".config", "examples/sample_app/dist/public/files/**/*"]
23
+
24
+
20
25
  desc "Packages up Merb."
21
26
  task :default => [:package]
22
- task :package => [:clean]
27
+ task :package => [:really_clean, :clean, :rdoc]
23
28
 
24
29
  task :doc => [:rdoc]
25
30
 
31
+ task :really_clean do
32
+ rm_rf 'examples/sample_app/log/*'
33
+ end
34
+
35
+
26
36
  Rake::RDocTask.new do |rdoc|
27
37
  rdoc.rdoc_dir = 'doc/rdoc'
28
38
  rdoc.options += RDOC_OPTS
@@ -48,9 +58,10 @@ spec = Gem::Specification.new do |s|
48
58
 
49
59
  s.add_dependency('mongrel')
50
60
  s.add_dependency('erubis')
61
+ s.add_dependency('json')
51
62
  s.required_ruby_version = '>= 1.8.4'
52
63
 
53
- s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{app,bin,doc,test,lib,examples}/**/*")
64
+ s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{app,bin,test,lib,examples}/**/*")
54
65
 
55
66
  s.require_path = "lib"
56
67
  s.bindir = "bin"
@@ -62,6 +73,7 @@ Rake::GemPackageTask.new(spec) do |p|
62
73
  end
63
74
 
64
75
  task :install do
76
+ sh %{rake clean}
65
77
  sh %{rake package}
66
78
  sh %{sudo gem install pkg/#{NAME}-#{VERS}}
67
79
  end
data/TODO CHANGED
@@ -4,14 +4,13 @@
4
4
  * Helpers
5
5
  * config file **DONE**
6
6
  * session
7
- ** AR
7
+ ** AR ** DONE **
8
8
  ** DRb
9
9
  * Rails integration
10
- * Mongoose ?
11
10
  * Text backend?
12
11
  * plugins support(rails plugins too?)
13
12
  * Layouts **DONE**
14
13
  * auto template_dir **DONE**
15
- * before/after filters
14
+ * before/after filters **DONE**
16
15
  * merbjs **DONE**
17
16
  * testing
data/bin/merb CHANGED
@@ -4,6 +4,8 @@ require 'optparse'
4
4
  require 'ostruct'
5
5
  require 'fileutils'
6
6
  require 'yaml'
7
+ require 'erubis'
8
+
7
9
  module Merb
8
10
  end
9
11
 
@@ -13,11 +15,11 @@ class Merb::Config
13
15
  :host => "0.0.0.0",
14
16
  :port => "4000",
15
17
  :allow_reloading => true,
16
- :merb_root => Dir.pwd
18
+ :merb_root => Dir.pwd,
19
+ :template_ext => {:html => :herb, :js => :jerb, :xml => :xerb}
17
20
  }
18
-
19
21
  begin
20
- options = defaults.merge(YAML.load(ERB.new(IO.read("#{defaults[:merb_root]}/dist/conf/merb.yml")).result))
22
+ options = defaults.merge(YAML.load(Erubis::Eruby.new(IO.read("#{defaults[:merb_root]}/dist/conf/merb.yml")).result))
21
23
  rescue
22
24
  options = defaults
23
25
  end
@@ -47,10 +49,6 @@ class Merb::Server
47
49
  opts.on("-p", "--port [Integer]") do |port|
48
50
  options[:port] = port
49
51
  end
50
-
51
- opts.on("-n", "--num-procs [Integer]") do |numprocs|
52
- options[:numprocs] = numprocs
53
- end
54
52
 
55
53
  opts.on("-h", "--host [String]") do |host|
56
54
  options[:host] = host
@@ -64,9 +62,12 @@ class Merb::Server
64
62
  options[:console] = true
65
63
  end
66
64
 
67
- opts.on("-s", "--session-on") do |session|
68
- require 'active_record'
69
- options[:session] = true
65
+ opts.on("-s", "--session-drb-port [Integer]") do |drb_port|
66
+ options[:session] = drb_port
67
+ end
68
+
69
+ opts.on("-l", "--log-level [String]") do |loglevel|
70
+ options[:log_level] = loglevel
70
71
  end
71
72
 
72
73
  end
@@ -79,19 +80,23 @@ class Merb::Server
79
80
  puts @@merb_opts.to_yaml; puts
80
81
  end
81
82
 
83
+ def self.initialize_merb
84
+ require 'merb'
85
+ require @@merb_opts[:merb_root]+'/dist/conf/router.rb'
86
+ require @@merb_opts[:merb_root]+'/dist/conf/merb_init.rb'
87
+ end
88
+
82
89
  def self.run
83
90
  @@merb_raw_opts = ARGV
84
91
  merb_config
85
92
 
86
93
  @@merb_opts[:dist_root] = @@merb_opts[:merb_root]+'/dist'
94
+ $LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/app/controllers') )
95
+ $LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/app/models') )
96
+ $LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/lib') )
87
97
 
88
- $LOAD_PATH.unshift( File.join(@@merb_opts[:merb_root] , '/dist/app/controllers') )
89
- $LOAD_PATH.unshift( File.join(@@merb_opts[:merb_root] , '/dist/lib') )
90
- require 'merb'
91
- require @@merb_opts[:merb_root]+'/dist/conf/router.rb'
92
- require @@merb_opts[:merb_root]+'/dist/conf/merb_init.rb'
93
-
94
98
  if @@merb_opts[:console]
99
+ initialize_merb
95
100
  ARGV.clear # Avoid passing args to IRB
96
101
  require 'irb'
97
102
  require 'irb/completion'
@@ -105,57 +110,77 @@ class Merb::Server
105
110
  exit!
106
111
  end
107
112
 
113
+ if @@merb_opts[:session]
114
+ start(@@merb_opts[:session], :drbserver_start)
115
+ end
116
+
108
117
  if @@merb_opts[:cluster]
109
- delete_pidfile
118
+ delete_pidfiles
110
119
  @@merb_opts[:port].to_i.upto(@@merb_opts[:port].to_i+@@merb_opts[:cluster].to_i-1) do |port|
111
120
  puts "Starting merb server on port: #{port}"
112
121
  start(port)
113
122
  end
114
123
  elsif @@merb_opts[:daemonize]
115
- delete_pidfile
124
+ delete_pidfiles(@@merb_opts[:port])
116
125
  start(@@merb_opts[:port])
117
126
  else
118
- trap('INT') {exit}
127
+ initialize_merb
128
+ trap('TERM') { exit }
119
129
  mongrel_start(@@merb_opts[:port])
120
130
  end
121
131
 
122
132
  end
123
133
 
124
- def self.store_pid(pid)
125
- File.open("#{@@merb_opts[:merb_root]}/log/merb.pid", 'a'){|f| f.write("#{Process.pid}\n")}
134
+ def self.store_pid(pid,port)
135
+ File.open("#{@@merb_opts[:merb_root]}/log/merb.#{port}.pid", 'w'){|f| f.write("#{Process.pid}\n")}
126
136
  end
127
137
 
128
- def self.start(port)
138
+ def self.start(port,what=:mongrel_start)
129
139
  fork do
130
140
  Process.setsid
131
141
  exit if fork
132
- store_pid(Process.pid)
142
+ if what == :mongrel_start
143
+ store_pid(Process.pid, port)
144
+ else
145
+ store_pid(Process.pid, "drb.#{port}")
146
+ end
133
147
  Dir.chdir @@merb_opts[:merb_root]
134
148
  File.umask 0000
135
149
  STDIN.reopen "/dev/null"
136
150
  STDOUT.reopen "/dev/null", "a"
137
151
  STDERR.reopen STDOUT
138
152
  trap("TERM") { exit }
139
- mongrel_start(port)
153
+ send(what, port)
140
154
  end
141
155
  end
142
156
 
143
- def self.delete_pidfile
144
- FileUtils.rm("#{@@merb_opts[:merb_root]}/log/merb.pid") rescue nil
157
+ def self.delete_pidfiles(portor_star='*')
158
+ Dir["#{@@merb_opts[:merb_root]}/log/merb.#{portor_star}.pid"].each do |pid|
159
+ FileUtils.rm(pid) rescue nil
160
+ end
145
161
  end
146
162
 
147
- def self.start_cluster(ports)
148
- delete_pidfile
149
- ports.each do |p|
150
- start(port)
151
- end
152
- end
163
+ def self.drbserver_start(port)
164
+ require 'merb/session/merb_drb_server'
165
+ DRb.start_service("druby://#{@@merb_opts[:host]}:#{port}", Merb::DRbSession.setup)
166
+ DRb.thread.join
167
+ end
153
168
 
154
169
  def self.mongrel_start(port)
155
- h = Mongrel::HttpServer.new((@@merb_opts[:host]||"0.0.0.0"), (port ||4000), (@@merb_opts[:numprocs]||100))
156
- h.register("/", MerbHandler.new(@@merb_opts[:dist_root]+'/public'))
157
- h.register("/favicon.ico", Mongrel::Error404Handler.new(""))
158
- h.run.join
170
+ initialize_merb
171
+
172
+ config = Mongrel::Configurator.new :host => (@@merb_opts[:host]||"0.0.0.0"), :port => (port ||4000) do
173
+ load_plugins( :includes => ["mongrel"], :excludes => ["rails"] ) if @@merb_opts[:config]
174
+ listener do
175
+ run_config(@@merb_opts[:config]) if @@merb_opts[:config]
176
+ uri "/", :handler => MerbHandler.new(@@merb_opts[:dist_root]+'/public')
177
+ uri "/favicon.ico", :handler => Mongrel::Error404Handler.new("")
178
+ end
179
+
180
+ trap("INT") { stop }
181
+ run
182
+ end
183
+ config.join
159
184
  end
160
185
 
161
186
  def self.config
@@ -0,0 +1,31 @@
1
+ class Files < Merb::Controller
2
+
3
+ def start
4
+ render_no_layout
5
+ end
6
+
7
+ def index
8
+ @args = params
9
+ render 'start'
10
+ end
11
+
12
+ def upload
13
+ puts params.inspect
14
+
15
+ FileUtils.mv params[:data][:tempfile].path,
16
+ Merb::Server.config[:dist_root]+"/public/files/#{params[:data][:filename]}"
17
+ render_no_layout
18
+ end
19
+
20
+ def progress
21
+ puts params.inspect
22
+ Mongrel::Uploads.debug = true
23
+ @upstatus = Mongrel::Uploads.check(params[:upload_id])
24
+ render_js 'progress'
25
+ end
26
+
27
+ def file
28
+ send_file DIST_ROOT+'/public/files/'+params[:file]
29
+ end
30
+
31
+ end
@@ -2,7 +2,8 @@
2
2
  class Posts < Merb::Controller
3
3
 
4
4
  def new
5
- #session[:foo] = 'bar'
5
+ session[:foo] = 'bar'
6
+ puts session.sess_id
6
7
  render
7
8
  end
8
9
 
@@ -12,12 +13,35 @@ class Posts < Merb::Controller
12
13
  end
13
14
 
14
15
  def show
15
- #puts session[:foo]
16
+ puts session[:foo]
17
+ session[:foo] = 'changed'
16
18
  @post = Post.find params[:id]
17
19
  @comments = @post.comments
18
20
  render
19
21
  end
20
22
 
23
+ def test
24
+ puts "protocol: #{protocol}"
25
+ puts "ssl?: #{ssl?}"
26
+ puts "uri: #{uri}"
27
+ puts "path: #{path}"
28
+ puts "path_info: #{path_info}"
29
+ puts "port: #{port}"
30
+ puts "host: #{host}"
31
+ puts "domain: #{domain}"
32
+ puts "get?: #{get?}"
33
+ puts "post?: #{post?}"
34
+ puts "put?: #{put?}"
35
+ puts "delete?: #{delete?}"
36
+ puts "head?: #{head?}"
37
+ puts "xhr?: #{xhr?}"
38
+ puts @env.inspect
39
+ end
40
+
41
+ def xml_test
42
+ render_xml
43
+ end
44
+
21
45
  def list
22
46
  @posts = Post.find :all, :limit => 4
23
47
  render
@@ -1,11 +1,12 @@
1
1
 
2
2
  class Test < Merb::Controller
3
3
 
4
- before :bfilter
4
+ before :authenticate
5
5
  before lambda{|c| puts 'lambda filter called'}
6
6
 
7
7
  def bfilter
8
8
  puts "Filter Called!"
9
+ #throw :halt
9
10
  end
10
11
 
11
12
  def hello
@@ -18,6 +19,11 @@ class Test < Merb::Controller
18
19
  "<html><body><h2>#{params[:rest]}</h2></body></html>"
19
20
  end
20
21
 
22
+ def json
23
+ @post = Post.find :first
24
+ render_js
25
+ end
26
+
21
27
  def foo
22
28
  @args = params
23
29
  render
@@ -0,0 +1,3 @@
1
+ <% if @upstatus %>
2
+ UploadProgress.update(<%= @upstatus[:size] %>, <%= @upstatus[:received] %>);
3
+ <% end %>
@@ -0,0 +1,62 @@
1
+ <html>
2
+ <head>
3
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
4
+ <title>mongrel test</title>
5
+ <script src="/javascripts/prototype.js" type="text/javascript"></script>
6
+ <script src="/javascripts/effects.js" type="text/javascript"></script>
7
+ <script src="/javascripts/mup.js" type="text/javascript"></script>
8
+
9
+ <style type="text/css">
10
+ #progress-bar {
11
+ width:500px;
12
+ height:25px;
13
+ margin:15px;
14
+ border:solid 1px #000;
15
+ position:relative;
16
+ }
17
+
18
+ #progress-bar #status-bar {
19
+ display:block;
20
+ height:25px;
21
+ width:0;
22
+ background-color:#00f;
23
+ border-right:solid 1px #000;
24
+ position:absolute;
25
+ top:0; left:0;
26
+ }
27
+
28
+ #progress-bar #status-text {
29
+ display:block;
30
+ padding: 0 15px;
31
+ line-height:25px;
32
+ position:absolute;
33
+ top:0; left:0;
34
+ }
35
+ </style>
36
+ </head>
37
+ <body>
38
+
39
+ <h2>Test file uploading.</h2>
40
+ <%= @upid = Time.now.to_i.to_s %>
41
+ <form action="/files/upload?upload_id=<%= @upid %>"
42
+ enctype="multipart/form-data" target='upload' method="post"
43
+ onsubmit="UploadProgress.monitor('<%= escape_js @upid %>')">
44
+
45
+ <dl>
46
+ <dt><label>Select a file</label></dt>
47
+ <dd><input name="data" type="file" /></dd>
48
+ </dl>
49
+
50
+
51
+ <p>
52
+ <input name="commit" type="submit" value="Upload" />
53
+ </p>
54
+ </form>
55
+
56
+ <div id="results"></div>
57
+ <div id="progress-bar"></div>
58
+
59
+ <iframe id="upload" name="upload" src="about:blank"></iframe>
60
+
61
+ </body>
62
+ </html>