soapbox 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (525) hide show
  1. data/.document +5 -0
  2. data/Gemfile +33 -0
  3. data/Gemfile.lock +142 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +75 -0
  6. data/Rakefile +53 -0
  7. data/VERSION +1 -0
  8. data/app/controllers/admin/admin_controller.rb +111 -0
  9. data/app/controllers/admin/analytics_controller.rb +53 -0
  10. data/app/controllers/admin/attachments_controller.rb +28 -0
  11. data/app/controllers/admin/categories_controller.rb +2 -0
  12. data/app/controllers/admin/comments_controller.rb +2 -0
  13. data/app/controllers/admin/contents_controller.rb +2 -0
  14. data/app/controllers/admin/galleries_controller.rb +2 -0
  15. data/app/controllers/admin/gallery_images_controller.rb +29 -0
  16. data/app/controllers/admin/groups_controller.rb +10 -0
  17. data/app/controllers/admin/images_controller.rb +3 -0
  18. data/app/controllers/admin/menu_items_controller.rb +6 -0
  19. data/app/controllers/admin/menus_controller.rb +2 -0
  20. data/app/controllers/admin/pages_controller.rb +13 -0
  21. data/app/controllers/admin/plugins_controller.rb +2 -0
  22. data/app/controllers/admin/redirects_controller.rb +2 -0
  23. data/app/controllers/admin/settings_controller.rb +2 -0
  24. data/app/controllers/admin/users_controller.rb +2 -0
  25. data/app/controllers/admin/versions_controller.rb +6 -0
  26. data/app/controllers/application_controller.rb +38 -0
  27. data/app/controllers/attachments_controller.rb +2 -0
  28. data/app/controllers/categories_controller.rb +2 -0
  29. data/app/controllers/comments_controller.rb +2 -0
  30. data/app/controllers/groups_controller.rb +2 -0
  31. data/app/controllers/pages_controller.rb +18 -0
  32. data/app/controllers/plugins_controller.rb +2 -0
  33. data/app/controllers/redirects_controller.rb +5 -0
  34. data/app/controllers/settings_controller.rb +2 -0
  35. data/app/controllers/sitemap_controller.rb +7 -0
  36. data/app/helpers/content_helper.rb +17 -0
  37. data/app/helpers/layout_helper.rb +35 -0
  38. data/app/helpers/menu_helper.rb +26 -0
  39. data/app/helpers/page_helper.rb +21 -0
  40. data/app/helpers/plugin_helper.rb +21 -0
  41. data/app/helpers/soapbox_helper.rb +118 -0
  42. data/app/mailers/soapbox_mailer.rb +10 -0
  43. data/app/models/attachment.rb +16 -0
  44. data/app/models/content.rb +26 -0
  45. data/app/models/gallery.rb +9 -0
  46. data/app/models/gallery_image.rb +7 -0
  47. data/app/models/group.rb +27 -0
  48. data/app/models/member.rb +14 -0
  49. data/app/models/membership.rb +6 -0
  50. data/app/models/menu.rb +4 -0
  51. data/app/models/menu_item.rb +17 -0
  52. data/app/models/page.rb +41 -0
  53. data/app/models/permission.rb +12 -0
  54. data/app/models/plugin.rb +8 -0
  55. data/app/models/redirect.rb +3 -0
  56. data/app/models/setting.rb +16 -0
  57. data/app/models/user.rb +30 -0
  58. data/app/views/admin/analytics/index.html.erb +198 -0
  59. data/app/views/admin/attachments/_image.html.erb +15 -0
  60. data/app/views/admin/attachments/form.html.erb +26 -0
  61. data/app/views/admin/attachments/index.html.erb +16 -0
  62. data/app/views/admin/categories/form.html.erb +27 -0
  63. data/app/views/admin/categories/index.html.erb +1 -0
  64. data/app/views/admin/comments/form.html.erb +34 -0
  65. data/app/views/admin/comments/index.html.erb +1 -0
  66. data/app/views/admin/galleries/_image.html.erb +8 -0
  67. data/app/views/admin/galleries/_manager.html.erb +57 -0
  68. data/app/views/admin/galleries/form.html.erb +18 -0
  69. data/app/views/admin/galleries/index.html.erb +1 -0
  70. data/app/views/admin/groups/form.html.erb +81 -0
  71. data/app/views/admin/groups/index.html.erb +1 -0
  72. data/app/views/admin/menu_items/form.html.erb +28 -0
  73. data/app/views/admin/menus/_item.html.erb +5 -0
  74. data/app/views/admin/menus/form.html.erb +25 -0
  75. data/app/views/admin/menus/index.html.erb +82 -0
  76. data/app/views/admin/pages/form.html.erb +68 -0
  77. data/app/views/admin/pages/index.html.erb +1 -0
  78. data/app/views/admin/pages/link_list.html.erb +9 -0
  79. data/app/views/admin/plugins/form.html.erb +30 -0
  80. data/app/views/admin/plugins/index.html.erb +2 -0
  81. data/app/views/admin/redirects/form.html.erb +26 -0
  82. data/app/views/admin/redirects/index.html.erb +1 -0
  83. data/app/views/admin/settings/form.html.erb +27 -0
  84. data/app/views/admin/settings/index.html.erb +1 -0
  85. data/app/views/admin/shared/_form_buttons.html.erb +4 -0
  86. data/app/views/admin/shared/_form_errors.html.erb +10 -0
  87. data/app/views/admin/shared/_list.html.erb +68 -0
  88. data/app/views/admin/shared/_list_footer.html.erb +8 -0
  89. data/app/views/admin/shared/_list_toolbar.html.erb +22 -0
  90. data/app/views/admin/shared/_tag_manager.html.erb +20 -0
  91. data/app/views/admin/shared/order.html.erb +33 -0
  92. data/app/views/admin/shared/tree.html.erb +49 -0
  93. data/app/views/admin/shared/wysiwyg.html.erb +17 -0
  94. data/app/views/admin/users/form.html.erb +28 -0
  95. data/app/views/admin/users/index.html.erb +1 -0
  96. data/app/views/admin/versions/index.html.erb +38 -0
  97. data/app/views/devise/confirmations/new.html.erb +11 -0
  98. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  99. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  100. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  101. data/app/views/devise/passwords/edit.html.erb +15 -0
  102. data/app/views/devise/passwords/new.html.erb +11 -0
  103. data/app/views/devise/registrations/edit.html.erb +25 -0
  104. data/app/views/devise/registrations/new.html.erb +18 -0
  105. data/app/views/devise/sessions/new.html.erb +17 -0
  106. data/app/views/devise/shared/_links.erb +23 -0
  107. data/app/views/devise/unlocks/new.html.erb +12 -0
  108. data/app/views/galleries/_nivo_slider.html.erb +22 -0
  109. data/app/views/galleries/_pretty_photo.html.erb +19 -0
  110. data/app/views/groups/index.html.erb +7 -0
  111. data/app/views/groups/show.html.erb +16 -0
  112. data/app/views/layouts/_admin_toolbar.html.erb +29 -0
  113. data/app/views/layouts/_admin_top_nav.html.erb +19 -0
  114. data/app/views/layouts/_head.html.erb +31 -0
  115. data/app/views/layouts/admin.html.erb +11 -0
  116. data/app/views/layouts/admin_blank.html.erb +9 -0
  117. data/app/views/layouts/login.html.erb +22 -0
  118. data/app/views/pages/error_404.html.erb +2 -0
  119. data/app/views/pages/index.html.erb +7 -0
  120. data/app/views/pages/templates/default.html.erb +3 -0
  121. data/app/views/sitemap/sitemap.rxml +9 -0
  122. data/app/views/soapbox_mailer/email_form.html.erb +13 -0
  123. data/app/views/soapbox_mailer/email_form.text.erb +8 -0
  124. data/config/permissions.yml.template +35 -0
  125. data/config/routes.rb +62 -0
  126. data/install.rb +8 -0
  127. data/lib/generators/soapbox_migration/soapbox_migration_generator.rb +22 -0
  128. data/lib/generators/soapbox_migration/templates/migration.rb +259 -0
  129. data/lib/generators/soapbox_scaffold/soapbox_scaffold_generator.rb +69 -0
  130. data/lib/generators/soapbox_scaffold/templates/admin_controller.rb +2 -0
  131. data/lib/generators/soapbox_scaffold/templates/controller.rb +2 -0
  132. data/lib/generators/soapbox_scaffold/templates/migration.rb +20 -0
  133. data/lib/generators/soapbox_scaffold/templates/model.rb +3 -0
  134. data/lib/generators/soapbox_scaffold/templates/views/admin/form.html.erb +25 -0
  135. data/lib/generators/soapbox_scaffold/templates/views/admin/index.html.erb +1 -0
  136. data/lib/generators/soapbox_scaffold/templates/views/index.html.erb +7 -0
  137. data/lib/generators/soapbox_scaffold/templates/views/show.html.erb +17 -0
  138. data/lib/soapbox.rb +48 -0
  139. data/lib/soapbox/engine.rb +17 -0
  140. data/lib/soapbox/paperclip.rb +31 -0
  141. data/lib/soapbox/version.rb +4 -0
  142. data/lib/states.rb +52 -0
  143. data/public/404.html +26 -0
  144. data/public/422.html +26 -0
  145. data/public/500.html +26 -0
  146. data/public/favicon.ico +0 -0
  147. data/public/robots.txt +5 -0
  148. data/public/soapbox/images/alert-overlay.png +0 -0
  149. data/public/soapbox/images/prettyPhoto/dark_rounded/btnNext.png +0 -0
  150. data/public/soapbox/images/prettyPhoto/dark_rounded/btnPrevious.png +0 -0
  151. data/public/soapbox/images/prettyPhoto/dark_rounded/contentPattern.png +0 -0
  152. data/public/soapbox/images/prettyPhoto/dark_rounded/default_thumbnail.gif +0 -0
  153. data/public/soapbox/images/prettyPhoto/dark_rounded/loader.gif +0 -0
  154. data/public/soapbox/images/prettyPhoto/dark_rounded/sprite.png +0 -0
  155. data/public/soapbox/images/prettyPhoto/dark_square/btnNext.png +0 -0
  156. data/public/soapbox/images/prettyPhoto/dark_square/btnPrevious.png +0 -0
  157. data/public/soapbox/images/prettyPhoto/dark_square/contentPattern.png +0 -0
  158. data/public/soapbox/images/prettyPhoto/dark_square/default_thumbnail.gif +0 -0
  159. data/public/soapbox/images/prettyPhoto/dark_square/loader.gif +0 -0
  160. data/public/soapbox/images/prettyPhoto/dark_square/sprite.png +0 -0
  161. data/public/soapbox/images/prettyPhoto/default/default_thumb.png +0 -0
  162. data/public/soapbox/images/prettyPhoto/default/loader.gif +0 -0
  163. data/public/soapbox/images/prettyPhoto/default/sprite.png +0 -0
  164. data/public/soapbox/images/prettyPhoto/default/sprite_next.png +0 -0
  165. data/public/soapbox/images/prettyPhoto/default/sprite_prev.png +0 -0
  166. data/public/soapbox/images/prettyPhoto/default/sprite_x.png +0 -0
  167. data/public/soapbox/images/prettyPhoto/default/sprite_y.png +0 -0
  168. data/public/soapbox/images/prettyPhoto/facebook/btnNext.png +0 -0
  169. data/public/soapbox/images/prettyPhoto/facebook/btnPrevious.png +0 -0
  170. data/public/soapbox/images/prettyPhoto/facebook/contentPatternBottom.png +0 -0
  171. data/public/soapbox/images/prettyPhoto/facebook/contentPatternLeft.png +0 -0
  172. data/public/soapbox/images/prettyPhoto/facebook/contentPatternRight.png +0 -0
  173. data/public/soapbox/images/prettyPhoto/facebook/contentPatternTop.png +0 -0
  174. data/public/soapbox/images/prettyPhoto/facebook/default_thumbnail.gif +0 -0
  175. data/public/soapbox/images/prettyPhoto/facebook/loader.gif +0 -0
  176. data/public/soapbox/images/prettyPhoto/facebook/sprite.png +0 -0
  177. data/public/soapbox/images/prettyPhoto/light_rounded/btnNext.png +0 -0
  178. data/public/soapbox/images/prettyPhoto/light_rounded/btnPrevious.png +0 -0
  179. data/public/soapbox/images/prettyPhoto/light_rounded/default_thumbnail.gif +0 -0
  180. data/public/soapbox/images/prettyPhoto/light_rounded/loader.gif +0 -0
  181. data/public/soapbox/images/prettyPhoto/light_rounded/sprite.png +0 -0
  182. data/public/soapbox/images/prettyPhoto/light_square/btnNext.png +0 -0
  183. data/public/soapbox/images/prettyPhoto/light_square/btnPrevious.png +0 -0
  184. data/public/soapbox/images/prettyPhoto/light_square/default_thumbnail.gif +0 -0
  185. data/public/soapbox/images/prettyPhoto/light_square/loader.gif +0 -0
  186. data/public/soapbox/images/prettyPhoto/light_square/sprite.png +0 -0
  187. data/public/soapbox/javascripts/admin.js +119 -0
  188. data/public/soapbox/javascripts/blogger.js +52 -0
  189. data/public/soapbox/javascripts/jquery-1.4.2.min.js +154 -0
  190. data/public/soapbox/javascripts/jquery-1.6.2.min.js +18 -0
  191. data/public/soapbox/javascripts/jquery-ui-1.8rc3.custom.min.js +374 -0
  192. data/public/soapbox/javascripts/jquery.fileupload-ui.js +533 -0
  193. data/public/soapbox/javascripts/jquery.fileupload.js +975 -0
  194. data/public/soapbox/javascripts/jquery.flot.js +2599 -0
  195. data/public/soapbox/javascripts/jquery.formtastic.js +45 -0
  196. data/public/soapbox/javascripts/jquery.nivo.slider.pack.js +67 -0
  197. data/public/soapbox/javascripts/jquery.prettyPhoto.js +27 -0
  198. data/public/soapbox/javascripts/jquery.timepicker.js +304 -0
  199. data/public/soapbox/javascripts/jquery.tools.min.js +116 -0
  200. data/public/soapbox/javascripts/jquery.ui.nestedSortable.js +356 -0
  201. data/public/soapbox/javascripts/rails-1.6.js +331 -0
  202. data/public/soapbox/javascripts/rails.js +143 -0
  203. data/public/soapbox/javascripts/soapbox.js +27 -0
  204. data/public/soapbox/javascripts/tiny_mce/init.js +54 -0
  205. data/public/soapbox/javascripts/tiny_mce/jquery.tinymce.js +1 -0
  206. data/public/soapbox/javascripts/tiny_mce/langs/en.js +169 -0
  207. data/public/soapbox/javascripts/tiny_mce/license.txt +504 -0
  208. data/public/soapbox/javascripts/tiny_mce/plugins/advhr/css/advhr.css +5 -0
  209. data/public/soapbox/javascripts/tiny_mce/plugins/advhr/editor_plugin.js +1 -0
  210. data/public/soapbox/javascripts/tiny_mce/plugins/advhr/editor_plugin_src.js +57 -0
  211. data/public/soapbox/javascripts/tiny_mce/plugins/advhr/js/rule.js +43 -0
  212. data/public/soapbox/javascripts/tiny_mce/plugins/advhr/langs/en_dlg.js +5 -0
  213. data/public/soapbox/javascripts/tiny_mce/plugins/advhr/rule.htm +57 -0
  214. data/public/soapbox/javascripts/tiny_mce/plugins/advimage/css/advimage.css +13 -0
  215. data/public/soapbox/javascripts/tiny_mce/plugins/advimage/editor_plugin.js +1 -0
  216. data/public/soapbox/javascripts/tiny_mce/plugins/advimage/editor_plugin_src.js +50 -0
  217. data/public/soapbox/javascripts/tiny_mce/plugins/advimage/image.htm +232 -0
  218. data/public/soapbox/javascripts/tiny_mce/plugins/advimage/img/sample.gif +0 -0
  219. data/public/soapbox/javascripts/tiny_mce/plugins/advimage/js/image.js +443 -0
  220. data/public/soapbox/javascripts/tiny_mce/plugins/advimage/langs/en_dlg.js +43 -0
  221. data/public/soapbox/javascripts/tiny_mce/plugins/advlink/css/advlink.css +8 -0
  222. data/public/soapbox/javascripts/tiny_mce/plugins/advlink/editor_plugin.js +1 -0
  223. data/public/soapbox/javascripts/tiny_mce/plugins/advlink/editor_plugin_src.js +61 -0
  224. data/public/soapbox/javascripts/tiny_mce/plugins/advlink/js/advlink.js +528 -0
  225. data/public/soapbox/javascripts/tiny_mce/plugins/advlink/langs/en_dlg.js +52 -0
  226. data/public/soapbox/javascripts/tiny_mce/plugins/advlink/link.htm +333 -0
  227. data/public/soapbox/javascripts/tiny_mce/plugins/advlist/editor_plugin.js +1 -0
  228. data/public/soapbox/javascripts/tiny_mce/plugins/advlist/editor_plugin_src.js +154 -0
  229. data/public/soapbox/javascripts/tiny_mce/plugins/autoresize/editor_plugin.js +1 -0
  230. data/public/soapbox/javascripts/tiny_mce/plugins/autoresize/editor_plugin_src.js +117 -0
  231. data/public/soapbox/javascripts/tiny_mce/plugins/autosave/editor_plugin.js +1 -0
  232. data/public/soapbox/javascripts/tiny_mce/plugins/autosave/editor_plugin_src.js +422 -0
  233. data/public/soapbox/javascripts/tiny_mce/plugins/autosave/langs/en.js +4 -0
  234. data/public/soapbox/javascripts/tiny_mce/plugins/bbcode/editor_plugin.js +1 -0
  235. data/public/soapbox/javascripts/tiny_mce/plugins/bbcode/editor_plugin_src.js +120 -0
  236. data/public/soapbox/javascripts/tiny_mce/plugins/contextmenu/editor_plugin.js +1 -0
  237. data/public/soapbox/javascripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js +127 -0
  238. data/public/soapbox/javascripts/tiny_mce/plugins/directionality/editor_plugin.js +1 -0
  239. data/public/soapbox/javascripts/tiny_mce/plugins/directionality/editor_plugin_src.js +82 -0
  240. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/editor_plugin.js +1 -0
  241. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/editor_plugin_src.js +43 -0
  242. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/emotions.htm +40 -0
  243. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-cool.gif +0 -0
  244. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-cry.gif +0 -0
  245. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif +0 -0
  246. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif +0 -0
  247. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-frown.gif +0 -0
  248. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif +0 -0
  249. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif +0 -0
  250. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif +0 -0
  251. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif +0 -0
  252. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif +0 -0
  253. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-smile.gif +0 -0
  254. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif +0 -0
  255. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif +0 -0
  256. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif +0 -0
  257. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-wink.gif +0 -0
  258. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/img/smiley-yell.gif +0 -0
  259. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/js/emotions.js +22 -0
  260. data/public/soapbox/javascripts/tiny_mce/plugins/emotions/langs/en_dlg.js +20 -0
  261. data/public/soapbox/javascripts/tiny_mce/plugins/example/dialog.htm +22 -0
  262. data/public/soapbox/javascripts/tiny_mce/plugins/example/editor_plugin.js +1 -0
  263. data/public/soapbox/javascripts/tiny_mce/plugins/example/editor_plugin_src.js +84 -0
  264. data/public/soapbox/javascripts/tiny_mce/plugins/example/img/example.gif +0 -0
  265. data/public/soapbox/javascripts/tiny_mce/plugins/example/js/dialog.js +19 -0
  266. data/public/soapbox/javascripts/tiny_mce/plugins/example/langs/en.js +3 -0
  267. data/public/soapbox/javascripts/tiny_mce/plugins/example/langs/en_dlg.js +3 -0
  268. data/public/soapbox/javascripts/tiny_mce/plugins/fullpage/css/fullpage.css +182 -0
  269. data/public/soapbox/javascripts/tiny_mce/plugins/fullpage/editor_plugin.js +1 -0
  270. data/public/soapbox/javascripts/tiny_mce/plugins/fullpage/editor_plugin_src.js +149 -0
  271. data/public/soapbox/javascripts/tiny_mce/plugins/fullpage/fullpage.htm +571 -0
  272. data/public/soapbox/javascripts/tiny_mce/plugins/fullpage/js/fullpage.js +471 -0
  273. data/public/soapbox/javascripts/tiny_mce/plugins/fullpage/langs/en_dlg.js +85 -0
  274. data/public/soapbox/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -0
  275. data/public/soapbox/javascripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js +148 -0
  276. data/public/soapbox/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +109 -0
  277. data/public/soapbox/javascripts/tiny_mce/plugins/iespell/editor_plugin.js +1 -0
  278. data/public/soapbox/javascripts/tiny_mce/plugins/iespell/editor_plugin_src.js +54 -0
  279. data/public/soapbox/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
  280. data/public/soapbox/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +635 -0
  281. data/public/soapbox/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  282. data/public/soapbox/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  283. data/public/soapbox/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  284. data/public/soapbox/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  285. data/public/soapbox/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  286. data/public/soapbox/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  287. data/public/soapbox/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  288. data/public/soapbox/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
  289. data/public/soapbox/javascripts/tiny_mce/plugins/inlinepopups/template.htm +387 -0
  290. data/public/soapbox/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin.js +1 -0
  291. data/public/soapbox/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js +83 -0
  292. data/public/soapbox/javascripts/tiny_mce/plugins/layer/editor_plugin.js +1 -0
  293. data/public/soapbox/javascripts/tiny_mce/plugins/layer/editor_plugin_src.js +212 -0
  294. data/public/soapbox/javascripts/tiny_mce/plugins/legacyoutput/editor_plugin.js +1 -0
  295. data/public/soapbox/javascripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js +136 -0
  296. data/public/soapbox/javascripts/tiny_mce/plugins/media/css/content.css +6 -0
  297. data/public/soapbox/javascripts/tiny_mce/plugins/media/css/media.css +16 -0
  298. data/public/soapbox/javascripts/tiny_mce/plugins/media/editor_plugin.js +1 -0
  299. data/public/soapbox/javascripts/tiny_mce/plugins/media/editor_plugin_src.js +414 -0
  300. data/public/soapbox/javascripts/tiny_mce/plugins/media/img/flash.gif +0 -0
  301. data/public/soapbox/javascripts/tiny_mce/plugins/media/img/flv_player.swf +0 -0
  302. data/public/soapbox/javascripts/tiny_mce/plugins/media/img/quicktime.gif +0 -0
  303. data/public/soapbox/javascripts/tiny_mce/plugins/media/img/realmedia.gif +0 -0
  304. data/public/soapbox/javascripts/tiny_mce/plugins/media/img/shockwave.gif +0 -0
  305. data/public/soapbox/javascripts/tiny_mce/plugins/media/img/trans.gif +0 -0
  306. data/public/soapbox/javascripts/tiny_mce/plugins/media/img/windowsmedia.gif +0 -0
  307. data/public/soapbox/javascripts/tiny_mce/plugins/media/js/embed.js +73 -0
  308. data/public/soapbox/javascripts/tiny_mce/plugins/media/js/media.js +630 -0
  309. data/public/soapbox/javascripts/tiny_mce/plugins/media/langs/en_dlg.js +103 -0
  310. data/public/soapbox/javascripts/tiny_mce/plugins/media/media.htm +817 -0
  311. data/public/soapbox/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin.js +1 -0
  312. data/public/soapbox/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js +53 -0
  313. data/public/soapbox/javascripts/tiny_mce/plugins/noneditable/editor_plugin.js +1 -0
  314. data/public/soapbox/javascripts/tiny_mce/plugins/noneditable/editor_plugin_src.js +90 -0
  315. data/public/soapbox/javascripts/tiny_mce/plugins/pagebreak/css/content.css +1 -0
  316. data/public/soapbox/javascripts/tiny_mce/plugins/pagebreak/editor_plugin.js +1 -0
  317. data/public/soapbox/javascripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js +77 -0
  318. data/public/soapbox/javascripts/tiny_mce/plugins/pagebreak/img/pagebreak.gif +0 -0
  319. data/public/soapbox/javascripts/tiny_mce/plugins/pagebreak/img/trans.gif +0 -0
  320. data/public/soapbox/javascripts/tiny_mce/plugins/paste/editor_plugin.js +1 -0
  321. data/public/soapbox/javascripts/tiny_mce/plugins/paste/editor_plugin_src.js +929 -0
  322. data/public/soapbox/javascripts/tiny_mce/plugins/paste/js/pastetext.js +36 -0
  323. data/public/soapbox/javascripts/tiny_mce/plugins/paste/js/pasteword.js +51 -0
  324. data/public/soapbox/javascripts/tiny_mce/plugins/paste/langs/en_dlg.js +5 -0
  325. data/public/soapbox/javascripts/tiny_mce/plugins/paste/pastetext.htm +27 -0
  326. data/public/soapbox/javascripts/tiny_mce/plugins/paste/pasteword.htm +21 -0
  327. data/public/soapbox/javascripts/tiny_mce/plugins/preview/editor_plugin.js +1 -0
  328. data/public/soapbox/javascripts/tiny_mce/plugins/preview/editor_plugin_src.js +53 -0
  329. data/public/soapbox/javascripts/tiny_mce/plugins/preview/example.html +28 -0
  330. data/public/soapbox/javascripts/tiny_mce/plugins/preview/jscripts/embed.js +73 -0
  331. data/public/soapbox/javascripts/tiny_mce/plugins/preview/preview.html +17 -0
  332. data/public/soapbox/javascripts/tiny_mce/plugins/print/editor_plugin.js +1 -0
  333. data/public/soapbox/javascripts/tiny_mce/plugins/print/editor_plugin_src.js +34 -0
  334. data/public/soapbox/javascripts/tiny_mce/plugins/save/editor_plugin.js +1 -0
  335. data/public/soapbox/javascripts/tiny_mce/plugins/save/editor_plugin_src.js +101 -0
  336. data/public/soapbox/javascripts/tiny_mce/plugins/searchreplace/css/searchreplace.css +6 -0
  337. data/public/soapbox/javascripts/tiny_mce/plugins/searchreplace/editor_plugin.js +1 -0
  338. data/public/soapbox/javascripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js +57 -0
  339. data/public/soapbox/javascripts/tiny_mce/plugins/searchreplace/js/searchreplace.js +130 -0
  340. data/public/soapbox/javascripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js +16 -0
  341. data/public/soapbox/javascripts/tiny_mce/plugins/searchreplace/searchreplace.htm +99 -0
  342. data/public/soapbox/javascripts/tiny_mce/plugins/spellchecker/css/content.css +1 -0
  343. data/public/soapbox/javascripts/tiny_mce/plugins/spellchecker/editor_plugin.js +1 -0
  344. data/public/soapbox/javascripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js +341 -0
  345. data/public/soapbox/javascripts/tiny_mce/plugins/spellchecker/img/wline.gif +0 -0
  346. data/public/soapbox/javascripts/tiny_mce/plugins/style/css/props.css +13 -0
  347. data/public/soapbox/javascripts/tiny_mce/plugins/style/editor_plugin.js +1 -0
  348. data/public/soapbox/javascripts/tiny_mce/plugins/style/editor_plugin_src.js +55 -0
  349. data/public/soapbox/javascripts/tiny_mce/plugins/style/js/props.js +641 -0
  350. data/public/soapbox/javascripts/tiny_mce/plugins/style/langs/en_dlg.js +63 -0
  351. data/public/soapbox/javascripts/tiny_mce/plugins/style/props.htm +726 -0
  352. data/public/soapbox/javascripts/tiny_mce/plugins/tabfocus/editor_plugin.js +1 -0
  353. data/public/soapbox/javascripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js +112 -0
  354. data/public/soapbox/javascripts/tiny_mce/plugins/table/cell.htm +178 -0
  355. data/public/soapbox/javascripts/tiny_mce/plugins/table/css/cell.css +17 -0
  356. data/public/soapbox/javascripts/tiny_mce/plugins/table/css/row.css +25 -0
  357. data/public/soapbox/javascripts/tiny_mce/plugins/table/css/table.css +13 -0
  358. data/public/soapbox/javascripts/tiny_mce/plugins/table/editor_plugin.js +1 -0
  359. data/public/soapbox/javascripts/tiny_mce/plugins/table/editor_plugin_src.js +1118 -0
  360. data/public/soapbox/javascripts/tiny_mce/plugins/table/js/cell.js +286 -0
  361. data/public/soapbox/javascripts/tiny_mce/plugins/table/js/merge_cells.js +27 -0
  362. data/public/soapbox/javascripts/tiny_mce/plugins/table/js/row.js +237 -0
  363. data/public/soapbox/javascripts/tiny_mce/plugins/table/js/table.js +449 -0
  364. data/public/soapbox/javascripts/tiny_mce/plugins/table/langs/en_dlg.js +74 -0
  365. data/public/soapbox/javascripts/tiny_mce/plugins/table/merge_cells.htm +32 -0
  366. data/public/soapbox/javascripts/tiny_mce/plugins/table/row.htm +155 -0
  367. data/public/soapbox/javascripts/tiny_mce/plugins/table/table.htm +187 -0
  368. data/public/soapbox/javascripts/tiny_mce/plugins/template/blank.htm +12 -0
  369. data/public/soapbox/javascripts/tiny_mce/plugins/template/css/template.css +23 -0
  370. data/public/soapbox/javascripts/tiny_mce/plugins/template/editor_plugin.js +1 -0
  371. data/public/soapbox/javascripts/tiny_mce/plugins/template/editor_plugin_src.js +159 -0
  372. data/public/soapbox/javascripts/tiny_mce/plugins/template/js/template.js +106 -0
  373. data/public/soapbox/javascripts/tiny_mce/plugins/template/langs/en_dlg.js +15 -0
  374. data/public/soapbox/javascripts/tiny_mce/plugins/template/template.htm +32 -0
  375. data/public/soapbox/javascripts/tiny_mce/plugins/visualchars/editor_plugin.js +1 -0
  376. data/public/soapbox/javascripts/tiny_mce/plugins/visualchars/editor_plugin_src.js +76 -0
  377. data/public/soapbox/javascripts/tiny_mce/plugins/wordcount/editor_plugin.js +1 -0
  378. data/public/soapbox/javascripts/tiny_mce/plugins/wordcount/editor_plugin_src.js +98 -0
  379. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/abbr.htm +141 -0
  380. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/acronym.htm +141 -0
  381. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/attributes.htm +148 -0
  382. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/cite.htm +141 -0
  383. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css +11 -0
  384. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/css/popup.css +9 -0
  385. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/del.htm +161 -0
  386. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js +1 -0
  387. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js +144 -0
  388. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/ins.htm +161 -0
  389. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js +28 -0
  390. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js +28 -0
  391. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js +126 -0
  392. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/js/cite.js +28 -0
  393. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/js/del.js +63 -0
  394. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js +231 -0
  395. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/js/ins.js +62 -0
  396. data/public/soapbox/javascripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js +32 -0
  397. data/public/soapbox/javascripts/tiny_mce/themes/advanced/about.htm +54 -0
  398. data/public/soapbox/javascripts/tiny_mce/themes/advanced/anchor.htm +26 -0
  399. data/public/soapbox/javascripts/tiny_mce/themes/advanced/charmap.htm +53 -0
  400. data/public/soapbox/javascripts/tiny_mce/themes/advanced/color_picker.htm +73 -0
  401. data/public/soapbox/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -0
  402. data/public/soapbox/javascripts/tiny_mce/themes/advanced/editor_template_src.js +1167 -0
  403. data/public/soapbox/javascripts/tiny_mce/themes/advanced/image.htm +80 -0
  404. data/public/soapbox/javascripts/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  405. data/public/soapbox/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
  406. data/public/soapbox/javascripts/tiny_mce/themes/advanced/js/about.js +72 -0
  407. data/public/soapbox/javascripts/tiny_mce/themes/advanced/js/anchor.js +37 -0
  408. data/public/soapbox/javascripts/tiny_mce/themes/advanced/js/charmap.js +335 -0
  409. data/public/soapbox/javascripts/tiny_mce/themes/advanced/js/color_picker.js +253 -0
  410. data/public/soapbox/javascripts/tiny_mce/themes/advanced/js/image.js +245 -0
  411. data/public/soapbox/javascripts/tiny_mce/themes/advanced/js/link.js +156 -0
  412. data/public/soapbox/javascripts/tiny_mce/themes/advanced/js/source_editor.js +62 -0
  413. data/public/soapbox/javascripts/tiny_mce/themes/advanced/langs/en.js +62 -0
  414. data/public/soapbox/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +51 -0
  415. data/public/soapbox/javascripts/tiny_mce/themes/advanced/link.htm +58 -0
  416. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/default/content.css +35 -0
  417. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +117 -0
  418. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  419. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  420. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  421. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  422. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  423. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  424. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +213 -0
  425. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +35 -0
  426. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +116 -0
  427. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  428. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  429. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  430. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +215 -0
  431. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  432. data/public/soapbox/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  433. data/public/soapbox/javascripts/tiny_mce/themes/advanced/source_editor.htm +26 -0
  434. data/public/soapbox/javascripts/tiny_mce/themes/simple/editor_template.js +1 -0
  435. data/public/soapbox/javascripts/tiny_mce/themes/simple/editor_template_src.js +85 -0
  436. data/public/soapbox/javascripts/tiny_mce/themes/simple/img/icons.gif +0 -0
  437. data/public/soapbox/javascripts/tiny_mce/themes/simple/langs/en.js +11 -0
  438. data/public/soapbox/javascripts/tiny_mce/themes/simple/skins/default/content.css +25 -0
  439. data/public/soapbox/javascripts/tiny_mce/themes/simple/skins/default/ui.css +32 -0
  440. data/public/soapbox/javascripts/tiny_mce/themes/simple/skins/o2k7/content.css +17 -0
  441. data/public/soapbox/javascripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png +0 -0
  442. data/public/soapbox/javascripts/tiny_mce/themes/simple/skins/o2k7/ui.css +35 -0
  443. data/public/soapbox/javascripts/tiny_mce/tiny_mce.js +1 -0
  444. data/public/soapbox/javascripts/tiny_mce/tiny_mce_popup.js +5 -0
  445. data/public/soapbox/javascripts/tiny_mce/tiny_mce_src.js +13134 -0
  446. data/public/soapbox/javascripts/tiny_mce/utils/editable_selects.js +70 -0
  447. data/public/soapbox/javascripts/tiny_mce/utils/form_utils.js +200 -0
  448. data/public/soapbox/javascripts/tiny_mce/utils/mctabs.js +77 -0
  449. data/public/soapbox/javascripts/tiny_mce/utils/validate.js +220 -0
  450. data/public/soapbox/stylesheets/admin.css +599 -0
  451. data/public/soapbox/stylesheets/admin_toolbar.css +24 -0
  452. data/public/soapbox/stylesheets/awesome_buttons.css +48 -0
  453. data/public/soapbox/stylesheets/base/images/ui-anim_basic_16x16.gif +0 -0
  454. data/public/soapbox/stylesheets/base/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  455. data/public/soapbox/stylesheets/base/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  456. data/public/soapbox/stylesheets/base/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  457. data/public/soapbox/stylesheets/base/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  458. data/public/soapbox/stylesheets/base/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  459. data/public/soapbox/stylesheets/base/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  460. data/public/soapbox/stylesheets/base/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  461. data/public/soapbox/stylesheets/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  462. data/public/soapbox/stylesheets/base/images/ui-icons_222222_256x240.png +0 -0
  463. data/public/soapbox/stylesheets/base/images/ui-icons_2e83ff_256x240.png +0 -0
  464. data/public/soapbox/stylesheets/base/images/ui-icons_454545_256x240.png +0 -0
  465. data/public/soapbox/stylesheets/base/images/ui-icons_888888_256x240.png +0 -0
  466. data/public/soapbox/stylesheets/base/images/ui-icons_cd0a0a_256x240.png +0 -0
  467. data/public/soapbox/stylesheets/base/jquery.ui.accordion.css +10 -0
  468. data/public/soapbox/stylesheets/base/jquery.ui.all.css +2 -0
  469. data/public/soapbox/stylesheets/base/jquery.ui.autocomplete.css +35 -0
  470. data/public/soapbox/stylesheets/base/jquery.ui.base.css +10 -0
  471. data/public/soapbox/stylesheets/base/jquery.ui.button.css +35 -0
  472. data/public/soapbox/stylesheets/base/jquery.ui.core.css +37 -0
  473. data/public/soapbox/stylesheets/base/jquery.ui.datepicker.css +61 -0
  474. data/public/soapbox/stylesheets/base/jquery.ui.dialog.css +13 -0
  475. data/public/soapbox/stylesheets/base/jquery.ui.progressbar.css +4 -0
  476. data/public/soapbox/stylesheets/base/jquery.ui.resizable.css +13 -0
  477. data/public/soapbox/stylesheets/base/jquery.ui.slider.css +17 -0
  478. data/public/soapbox/stylesheets/base/jquery.ui.tabs.css +11 -0
  479. data/public/soapbox/stylesheets/base/jquery.ui.theme.css +247 -0
  480. data/public/soapbox/stylesheets/devise.css +0 -0
  481. data/public/soapbox/stylesheets/formtastic.css +131 -0
  482. data/public/soapbox/stylesheets/formtastic_changes.css +27 -0
  483. data/public/soapbox/stylesheets/jquery.fileupload-ui.css +151 -0
  484. data/public/soapbox/stylesheets/jquery.timepicker.css +104 -0
  485. data/public/soapbox/stylesheets/nivo-slider.css +89 -0
  486. data/public/soapbox/stylesheets/nivo-themes/default/arrows.png +0 -0
  487. data/public/soapbox/stylesheets/nivo-themes/default/bullets.png +0 -0
  488. data/public/soapbox/stylesheets/nivo-themes/default/default.css +74 -0
  489. data/public/soapbox/stylesheets/nivo-themes/default/loading.gif +0 -0
  490. data/public/soapbox/stylesheets/nivo-themes/orman/arrows.png +0 -0
  491. data/public/soapbox/stylesheets/nivo-themes/orman/bullets.png +0 -0
  492. data/public/soapbox/stylesheets/nivo-themes/orman/loading.gif +0 -0
  493. data/public/soapbox/stylesheets/nivo-themes/orman/orman.css +98 -0
  494. data/public/soapbox/stylesheets/nivo-themes/orman/readme.txt +1 -0
  495. data/public/soapbox/stylesheets/nivo-themes/orman/ribbon.png +0 -0
  496. data/public/soapbox/stylesheets/nivo-themes/orman/slider.png +0 -0
  497. data/public/soapbox/stylesheets/nivo-themes/pascal/bullets.png +0 -0
  498. data/public/soapbox/stylesheets/nivo-themes/pascal/controlnav.png +0 -0
  499. data/public/soapbox/stylesheets/nivo-themes/pascal/featured.png +0 -0
  500. data/public/soapbox/stylesheets/nivo-themes/pascal/loading.gif +0 -0
  501. data/public/soapbox/stylesheets/nivo-themes/pascal/pascal.css +102 -0
  502. data/public/soapbox/stylesheets/nivo-themes/pascal/readme.txt +1 -0
  503. data/public/soapbox/stylesheets/nivo-themes/pascal/ribbon.png +0 -0
  504. data/public/soapbox/stylesheets/nivo-themes/pascal/slider.png +0 -0
  505. data/public/soapbox/stylesheets/pbar-ani.gif +0 -0
  506. data/public/soapbox/stylesheets/prettyPhoto.css +1 -0
  507. data/public/soapbox/stylesheets/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  508. data/public/soapbox/stylesheets/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  509. data/public/soapbox/stylesheets/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  510. data/public/soapbox/stylesheets/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  511. data/public/soapbox/stylesheets/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  512. data/public/soapbox/stylesheets/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  513. data/public/soapbox/stylesheets/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  514. data/public/soapbox/stylesheets/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  515. data/public/soapbox/stylesheets/smoothness/images/ui-icons_222222_256x240.png +0 -0
  516. data/public/soapbox/stylesheets/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  517. data/public/soapbox/stylesheets/smoothness/images/ui-icons_454545_256x240.png +0 -0
  518. data/public/soapbox/stylesheets/smoothness/images/ui-icons_888888_256x240.png +0 -0
  519. data/public/soapbox/stylesheets/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  520. data/public/soapbox/stylesheets/smoothness/jquery-ui-1.8.4.custom.css +572 -0
  521. data/public/soapbox/stylesheets/standardize.css +127 -0
  522. data/soapbox.gemspec +617 -0
  523. data/test/helper.rb +18 -0
  524. data/test/test_soapbox.rb +7 -0
  525. metadata +872 -0
@@ -0,0 +1,975 @@
1
+ /*
2
+ * jQuery File Upload Plugin 4.5.1
3
+ * https://github.com/blueimp/jQuery-File-Upload
4
+ *
5
+ * Copyright 2010, Sebastian Tschan
6
+ * https://blueimp.net
7
+ *
8
+ * Licensed under the MIT license:
9
+ * http://creativecommons.org/licenses/MIT/
10
+ */
11
+
12
+ /*jslint browser: true, unparam: true */
13
+ /*global XMLHttpRequestUpload, File, FileReader, FormData, ProgressEvent, unescape, jQuery, upload */
14
+
15
+ (function ($) {
16
+ 'use strict';
17
+
18
+ var defaultNamespace = 'file_upload',
19
+ undef = 'undefined',
20
+ func = 'function',
21
+ FileUpload,
22
+ methods,
23
+
24
+ MultiLoader = function (callBack, numOrList) {
25
+ var loaded = 0,
26
+ list = [];
27
+ if (numOrList) {
28
+ if (numOrList.length) {
29
+ list = numOrList;
30
+ } else {
31
+ list[numOrList - 1] = null;
32
+ }
33
+ }
34
+ this.complete = function () {
35
+ loaded += 1;
36
+ if (loaded === list.length) {
37
+ callBack(list);
38
+ loaded = 0;
39
+ list = [];
40
+ }
41
+ };
42
+ this.push = function (item) {
43
+ list.push(item);
44
+ };
45
+ this.getList = function () {
46
+ return list;
47
+ };
48
+ },
49
+
50
+ SequenceHandler = function () {
51
+ var sequence = [];
52
+ this.push = function (callBack) {
53
+ sequence.push(callBack);
54
+ if (sequence.length === 1) {
55
+ callBack();
56
+ }
57
+ };
58
+ this.next = function () {
59
+ sequence.shift();
60
+ if (sequence.length) {
61
+ sequence[0]();
62
+ }
63
+ };
64
+ };
65
+
66
+ FileUpload = function (container) {
67
+ var fileUpload = this,
68
+ uploadForm,
69
+ fileInput,
70
+ settings = {
71
+ namespace: defaultNamespace,
72
+ uploadFormFilter: function (index) {
73
+ return true;
74
+ },
75
+ fileInputFilter: function (index) {
76
+ return true;
77
+ },
78
+ cssClass: defaultNamespace,
79
+ dragDropSupport: true,
80
+ dropZone: container,
81
+ url: function (form) {
82
+ return form.attr('action');
83
+ },
84
+ method: function (form) {
85
+ return form.attr('method');
86
+ },
87
+ fieldName: function (input) {
88
+ return input.attr('name');
89
+ },
90
+ formData: function (form) {
91
+ return form.serializeArray();
92
+ },
93
+ requestHeaders: null,
94
+ multipart: true,
95
+ multiFileRequest: false,
96
+ withCredentials: false,
97
+ forceIframeUpload: false,
98
+ sequentialUploads: false,
99
+ maxChunkSize: null,
100
+ maxFileReaderSize: 50000000,
101
+ replaceFileInput: true
102
+ },
103
+ documentListeners = {},
104
+ dropZoneListeners = {},
105
+ protocolRegExp = /^http(s)?:\/\//,
106
+ optionsReference,
107
+ multiLoader = new MultiLoader(function (list) {
108
+ if (typeof settings.onLoadAll === func) {
109
+ settings.onLoadAll(list);
110
+ }
111
+ }),
112
+ sequenceHandler = new SequenceHandler(),
113
+
114
+ completeNext = function () {
115
+ multiLoader.complete();
116
+ sequenceHandler.next();
117
+ },
118
+
119
+ isXHRUploadCapable = function () {
120
+ return typeof XMLHttpRequest !== undef && typeof XMLHttpRequestUpload !== undef &&
121
+ typeof File !== undef && (!settings.multipart || typeof FormData !== undef ||
122
+ (typeof FileReader !== undef && typeof XMLHttpRequest.prototype.sendAsBinary === func));
123
+ },
124
+
125
+ initEventHandlers = function () {
126
+ if (settings.dragDropSupport) {
127
+ if (typeof settings.onDocumentDragEnter === func) {
128
+ documentListeners['dragenter.' + settings.namespace] = function (e) {
129
+ settings.onDocumentDragEnter(e);
130
+ };
131
+ }
132
+ if (typeof settings.onDocumentDragLeave === func) {
133
+ documentListeners['dragleave.' + settings.namespace] = function (e) {
134
+ settings.onDocumentDragLeave(e);
135
+ };
136
+ }
137
+ documentListeners['dragover.' + settings.namespace] = fileUpload.onDocumentDragOver;
138
+ documentListeners['drop.' + settings.namespace] = fileUpload.onDocumentDrop;
139
+ $(document).bind(documentListeners);
140
+ if (typeof settings.onDragEnter === func) {
141
+ dropZoneListeners['dragenter.' + settings.namespace] = function (e) {
142
+ settings.onDragEnter(e);
143
+ };
144
+ }
145
+ if (typeof settings.onDragLeave === func) {
146
+ dropZoneListeners['dragleave.' + settings.namespace] = function (e) {
147
+ settings.onDragLeave(e);
148
+ };
149
+ }
150
+ dropZoneListeners['dragover.' + settings.namespace] = fileUpload.onDragOver;
151
+ dropZoneListeners['drop.' + settings.namespace] = fileUpload.onDrop;
152
+ settings.dropZone.bind(dropZoneListeners);
153
+ }
154
+ fileInput.bind('change.' + settings.namespace, fileUpload.onChange);
155
+ },
156
+
157
+ removeEventHandlers = function () {
158
+ $.each(documentListeners, function (key, value) {
159
+ $(document).unbind(key, value);
160
+ });
161
+ $.each(dropZoneListeners, function (key, value) {
162
+ settings.dropZone.unbind(key, value);
163
+ });
164
+ fileInput.unbind('change.' + settings.namespace);
165
+ },
166
+
167
+ isChunkedUpload = function (settings) {
168
+ return typeof settings.uploadedBytes !== undef;
169
+ },
170
+
171
+ createProgressEvent = function (lengthComputable, loaded, total) {
172
+ var event;
173
+ if (typeof document.createEvent === func && typeof ProgressEvent !== undef) {
174
+ event = document.createEvent('ProgressEvent');
175
+ event.initProgressEvent(
176
+ 'progress',
177
+ false,
178
+ false,
179
+ lengthComputable,
180
+ loaded,
181
+ total
182
+ );
183
+ } else {
184
+ event = {
185
+ lengthComputable: true,
186
+ loaded: loaded,
187
+ total: total
188
+ };
189
+ }
190
+ return event;
191
+ },
192
+
193
+ getProgressTotal = function (files, index, settings) {
194
+ var i,
195
+ total;
196
+ if (typeof settings.progressTotal === undef) {
197
+ if (files[index]) {
198
+ total = files[index].size;
199
+ settings.progressTotal = total ? total : 1;
200
+ } else {
201
+ total = 0;
202
+ for (i = 0; i < files.length; i += 1) {
203
+ total += files[i].size;
204
+ }
205
+ settings.progressTotal = total;
206
+ }
207
+ }
208
+ return settings.progressTotal;
209
+ },
210
+
211
+ handleGlobalProgress = function (event, files, index, xhr, settings) {
212
+ var progressEvent,
213
+ loaderList,
214
+ globalLoaded = 0,
215
+ globalTotal = 0;
216
+ if (event.lengthComputable && typeof settings.onProgressAll === func) {
217
+ settings.progressLoaded = parseInt(
218
+ event.loaded / event.total * getProgressTotal(files, index, settings),
219
+ 10
220
+ );
221
+ loaderList = multiLoader.getList();
222
+ $.each(loaderList, function (index, item) {
223
+ // item is an array with [files, index, xhr, settings]
224
+ globalLoaded += item[3].progressLoaded || 0;
225
+ globalTotal += getProgressTotal(item[0], item[1], item[3]);
226
+ });
227
+ progressEvent = createProgressEvent(
228
+ true,
229
+ globalLoaded,
230
+ globalTotal
231
+ );
232
+ settings.onProgressAll(progressEvent, loaderList);
233
+ }
234
+ },
235
+
236
+ handleLoadEvent = function (event, files, index, xhr, settings) {
237
+ var progressEvent;
238
+ if (isChunkedUpload(settings)) {
239
+ settings.uploadedBytes += settings.chunkSize;
240
+ progressEvent = createProgressEvent(
241
+ true,
242
+ settings.uploadedBytes,
243
+ files[index].size
244
+ );
245
+ if (typeof settings.onProgress === func) {
246
+ settings.onProgress(progressEvent, files, index, xhr, settings);
247
+ }
248
+ handleGlobalProgress(progressEvent, files, index, xhr, settings);
249
+ if (settings.uploadedBytes < files[index].size) {
250
+ if (typeof settings.resumeUpload === func) {
251
+ settings.resumeUpload(
252
+ event,
253
+ files,
254
+ index,
255
+ xhr,
256
+ settings,
257
+ function () {
258
+ upload(event, files, index, xhr, settings, true);
259
+ }
260
+ );
261
+ } else {
262
+ upload(event, files, index, xhr, settings, true);
263
+ }
264
+ return;
265
+ }
266
+ }
267
+ settings.progressLoaded = getProgressTotal(files, index, settings);
268
+ if (typeof settings.onLoad === func) {
269
+ settings.onLoad(event, files, index, xhr, settings);
270
+ }
271
+ completeNext();
272
+ },
273
+
274
+ handleProgressEvent = function (event, files, index, xhr, settings) {
275
+ var progressEvent = event;
276
+ if (isChunkedUpload(settings) && event.lengthComputable) {
277
+ progressEvent = createProgressEvent(
278
+ true,
279
+ settings.uploadedBytes + parseInt(event.loaded / event.total * settings.chunkSize, 10),
280
+ files[index].size
281
+ );
282
+ }
283
+ if (typeof settings.onProgress === func) {
284
+ settings.onProgress(progressEvent, files, index, xhr, settings);
285
+ }
286
+ handleGlobalProgress(progressEvent, files, index, xhr, settings);
287
+ },
288
+
289
+ initUploadEventHandlers = function (files, index, xhr, settings) {
290
+ if (xhr.upload) {
291
+ xhr.upload.onprogress = function (e) {
292
+ handleProgressEvent(e, files, index, xhr, settings);
293
+ };
294
+ }
295
+ xhr.onload = function (e) {
296
+ handleLoadEvent(e, files, index, xhr, settings);
297
+ };
298
+ xhr.onabort = function (e) {
299
+ settings.progressTotal = settings.progressLoaded;
300
+ if (typeof settings.onAbort === func) {
301
+ settings.onAbort(e, files, index, xhr, settings);
302
+ }
303
+ completeNext();
304
+ };
305
+ xhr.onerror = function (e) {
306
+ settings.progressTotal = settings.progressLoaded;
307
+ if (typeof settings.onError === func) {
308
+ settings.onError(e, files, index, xhr, settings);
309
+ }
310
+ completeNext();
311
+ };
312
+ },
313
+
314
+ getUrl = function (settings) {
315
+ if (typeof settings.url === func) {
316
+ return settings.url(settings.uploadForm || uploadForm);
317
+ }
318
+ return settings.url;
319
+ },
320
+
321
+ getMethod = function (settings) {
322
+ if (typeof settings.method === func) {
323
+ return settings.method(settings.uploadForm || uploadForm);
324
+ }
325
+ return settings.method;
326
+ },
327
+
328
+ getFieldName = function (settings) {
329
+ if (typeof settings.fieldName === func) {
330
+ return settings.fieldName(settings.fileInput || fileInput);
331
+ }
332
+ return settings.fieldName;
333
+ },
334
+
335
+ getFormData = function (settings) {
336
+ var formData;
337
+ if (typeof settings.formData === func) {
338
+ return settings.formData(settings.uploadForm || uploadForm);
339
+ } else if ($.isArray(settings.formData)) {
340
+ return settings.formData;
341
+ } else if (settings.formData) {
342
+ formData = [];
343
+ $.each(settings.formData, function (name, value) {
344
+ formData.push({name: name, value: value});
345
+ });
346
+ return formData;
347
+ }
348
+ return [];
349
+ },
350
+
351
+ isSameDomain = function (url) {
352
+ if (protocolRegExp.test(url)) {
353
+ var host = location.host,
354
+ indexStart = location.protocol.length + 2,
355
+ index = url.indexOf(host, indexStart),
356
+ pathIndex = index + host.length;
357
+ if ((index === indexStart || index === url.indexOf('@', indexStart) + 1) &&
358
+ (url.length === pathIndex || $.inArray(url.charAt(pathIndex), ['/', '?', '#']) !== -1)) {
359
+ return true;
360
+ }
361
+ return false;
362
+ }
363
+ return true;
364
+ },
365
+
366
+ initUploadRequest = function (files, index, xhr, settings) {
367
+ var file = files[index],
368
+ url = getUrl(settings),
369
+ sameDomain = isSameDomain(url);
370
+ xhr.open(getMethod(settings), url, true);
371
+ if (sameDomain) {
372
+ xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
373
+ if (!settings.multipart || isChunkedUpload(settings)) {
374
+ xhr.setRequestHeader('X-File-Name', file.name);
375
+ xhr.setRequestHeader('X-File-Type', file.type);
376
+ xhr.setRequestHeader('X-File-Size', file.size);
377
+ if (!isChunkedUpload(settings)) {
378
+ xhr.setRequestHeader('Content-Type', file.type);
379
+ } else if (!settings.multipart) {
380
+ xhr.setRequestHeader('Content-Type', 'application/octet-stream');
381
+ }
382
+ }
383
+ } else if (settings.withCredentials) {
384
+ xhr.withCredentials = true;
385
+ }
386
+ if ($.isArray(settings.requestHeaders)) {
387
+ $.each(settings.requestHeaders, function (index, header) {
388
+ xhr.setRequestHeader(header.name, header.value);
389
+ });
390
+ } else if (settings.requestHeaders) {
391
+ $.each(settings.requestHeaders, function (name, value) {
392
+ xhr.setRequestHeader(name, value);
393
+ });
394
+ }
395
+ },
396
+
397
+ formDataUpload = function (files, xhr, settings) {
398
+ var formData = new FormData(),
399
+ i;
400
+ $.each(getFormData(settings), function (index, field) {
401
+ formData.append(field.name, field.value);
402
+ });
403
+ for (i = 0; i < files.length; i += 1) {
404
+ formData.append(getFieldName(settings), files[i]);
405
+ }
406
+ xhr.send(formData);
407
+ },
408
+
409
+ loadFileContent = function (file, callBack) {
410
+ file.reader = new FileReader();
411
+ file.reader.onload = callBack;
412
+ file.reader.readAsBinaryString(file);
413
+ },
414
+
415
+ utf8encode = function (str) {
416
+ return unescape(encodeURIComponent(str));
417
+ },
418
+
419
+ buildMultiPartFormData = function (boundary, files, filesFieldName, fields) {
420
+ var doubleDash = '--',
421
+ crlf = '\r\n',
422
+ formData = '',
423
+ buffer = [];
424
+ $.each(fields, function (index, field) {
425
+ formData += doubleDash + boundary + crlf +
426
+ 'Content-Disposition: form-data; name="' +
427
+ utf8encode(field.name) +
428
+ '"' + crlf + crlf +
429
+ utf8encode(field.value) + crlf;
430
+ });
431
+ $.each(files, function (index, file) {
432
+ formData += doubleDash + boundary + crlf +
433
+ 'Content-Disposition: form-data; name="' +
434
+ utf8encode(filesFieldName) +
435
+ '"; filename="' + utf8encode(file.name) + '"' + crlf +
436
+ 'Content-Type: ' + utf8encode(file.type) + crlf + crlf;
437
+ buffer.push(formData);
438
+ buffer.push(file.reader.result);
439
+ delete file.reader;
440
+ formData = crlf;
441
+ });
442
+ formData += doubleDash + boundary + doubleDash + crlf;
443
+ buffer.push(formData);
444
+ return buffer.join('');
445
+ },
446
+
447
+ fileReaderUpload = function (files, xhr, settings) {
448
+ var boundary = '----MultiPartFormBoundary' + (new Date()).getTime(),
449
+ loader,
450
+ i;
451
+ xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
452
+ loader = new MultiLoader(function () {
453
+ xhr.sendAsBinary(buildMultiPartFormData(
454
+ boundary,
455
+ files,
456
+ getFieldName(settings),
457
+ getFormData(settings)
458
+ ));
459
+ }, files.length);
460
+ for (i = 0; i < files.length; i += 1) {
461
+ loadFileContent(files[i], loader.complete);
462
+ }
463
+ },
464
+
465
+ getBlob = function (file, settings) {
466
+ var blob,
467
+ ub = settings.uploadedBytes,
468
+ mcs = settings.maxChunkSize;
469
+ if (file && typeof file.slice === func && (ub || (mcs && mcs < file.size))) {
470
+ settings.uploadedBytes = ub = ub || 0;
471
+ blob = file.slice(ub, mcs || file.size - ub);
472
+ settings.chunkSize = blob.size;
473
+ return blob;
474
+ }
475
+ return file;
476
+ },
477
+
478
+ upload = function (event, files, index, xhr, settings, nextChunk) {
479
+ var send;
480
+ send = function () {
481
+ if (!nextChunk) {
482
+ if (typeof settings.onSend === func &&
483
+ settings.onSend(event, files, index, xhr, settings) === false) {
484
+ completeNext();
485
+ return;
486
+ }
487
+ }
488
+ var blob = getBlob(files[index], settings),
489
+ filesToUpload;
490
+ initUploadEventHandlers(files, index, xhr, settings);
491
+ initUploadRequest(files, index, xhr, settings);
492
+ if (!settings.multipart) {
493
+ if (xhr.upload) {
494
+ xhr.send(blob);
495
+ } else {
496
+ $.error('Browser does not support XHR file uploads');
497
+ }
498
+ } else {
499
+ filesToUpload = (typeof index === 'number') ? [blob] : files;
500
+ if (typeof FormData !== undef) {
501
+ formDataUpload(filesToUpload, xhr, settings);
502
+ } else if (typeof FileReader !== undef && typeof xhr.sendAsBinary === func) {
503
+ fileReaderUpload(filesToUpload, xhr, settings);
504
+ } else {
505
+ $.error('Browser does not support multipart/form-data XHR file uploads');
506
+ }
507
+ }
508
+ };
509
+ if (!nextChunk) {
510
+ multiLoader.push(Array.prototype.slice.call(arguments, 1));
511
+ if (settings.sequentialUploads) {
512
+ sequenceHandler.push(send);
513
+ return;
514
+ }
515
+ }
516
+ send();
517
+ },
518
+
519
+ handleUpload = function (event, files, input, form, index) {
520
+ var xhr = new XMLHttpRequest(),
521
+ uploadSettings = $.extend({}, settings);
522
+ uploadSettings.fileInput = input;
523
+ uploadSettings.uploadForm = form;
524
+ if (typeof uploadSettings.initUpload === func) {
525
+ uploadSettings.initUpload(
526
+ event,
527
+ files,
528
+ index,
529
+ xhr,
530
+ uploadSettings,
531
+ function () {
532
+ upload(event, files, index, xhr, uploadSettings);
533
+ }
534
+ );
535
+ } else {
536
+ upload(event, files, index, xhr, uploadSettings);
537
+ }
538
+ },
539
+
540
+ handleLegacyGlobalProgress = function (event, files, index, iframe, settings) {
541
+ var total = 0,
542
+ progressEvent;
543
+ if (typeof index === undef) {
544
+ $.each(files, function (index, file) {
545
+ total += file.size ? file.size : 1;
546
+ });
547
+ } else {
548
+ total = files[index].size ? files[index].size : 1;
549
+ }
550
+ progressEvent = createProgressEvent(true, total, total);
551
+ settings.progressLoaded = total;
552
+ handleGlobalProgress(progressEvent, files, index, iframe, settings);
553
+ },
554
+
555
+ legacyUploadFormDataInit = function (input, form, settings) {
556
+ var formData = getFormData(settings);
557
+ form.find(':input').not(':disabled')
558
+ .attr('disabled', true)
559
+ .addClass(settings.namespace + '_disabled');
560
+ $.each(formData, function (index, field) {
561
+ $('<input type="hidden"/>')
562
+ .attr('name', field.name)
563
+ .val(field.value)
564
+ .addClass(settings.namespace + '_form_data')
565
+ .appendTo(form);
566
+ });
567
+ input
568
+ .attr('name', getFieldName(settings))
569
+ .appendTo(form);
570
+ },
571
+
572
+ legacyUploadFormDataReset = function (input, form, settings) {
573
+ input.detach();
574
+ form.find('.' + settings.namespace + '_disabled')
575
+ .removeAttr('disabled')
576
+ .removeClass(settings.namespace + '_disabled');
577
+ form.find('.' + settings.namespace + '_form_data').remove();
578
+ },
579
+
580
+ legacyUpload = function (event, files, input, form, iframe, settings, index) {
581
+ var send;
582
+ send = function () {
583
+ if (typeof settings.onSend === func && settings.onSend(event, files, index, iframe, settings) === false) {
584
+ completeNext();
585
+ return;
586
+ }
587
+ var originalAttributes = {
588
+ 'action': form.attr('action'),
589
+ 'method': form.attr('method'),
590
+ 'target': form.attr('target'),
591
+ 'enctype': form.attr('enctype')
592
+ };
593
+ iframe
594
+ .unbind('abort')
595
+ .bind('abort', function (e) {
596
+ iframe.readyState = 0;
597
+ // javascript:false as iframe src prevents warning popups on HTTPS in IE6
598
+ // concat is used here to prevent the "Script URL" JSLint error:
599
+ iframe.unbind('load').attr('src', 'javascript'.concat(':false;'));
600
+ handleLegacyGlobalProgress(e, files, index, iframe, settings);
601
+ if (typeof settings.onAbort === func) {
602
+ settings.onAbort(e, files, index, iframe, settings);
603
+ }
604
+ completeNext();
605
+ })
606
+ .unbind('load')
607
+ .bind('load', function (e) {
608
+ iframe.readyState = 4;
609
+ handleLegacyGlobalProgress(e, files, index, iframe, settings);
610
+ if (typeof settings.onLoad === func) {
611
+ settings.onLoad(e, files, index, iframe, settings);
612
+ }
613
+ // Fix for IE endless progress bar activity bug
614
+ // (happens on form submits to iframe targets):
615
+ $('<iframe src="javascript:false;" style="display:none;"></iframe>')
616
+ .appendTo(form).remove();
617
+ completeNext();
618
+ });
619
+ form
620
+ .attr('action', getUrl(settings))
621
+ .attr('method', getMethod(settings))
622
+ .attr('target', iframe.attr('name'))
623
+ .attr('enctype', 'multipart/form-data');
624
+ legacyUploadFormDataInit(input, form, settings);
625
+ iframe.readyState = 2;
626
+ form.get(0).submit();
627
+ legacyUploadFormDataReset(input, form, settings);
628
+ $.each(originalAttributes, function (name, value) {
629
+ if (value) {
630
+ form.attr(name, value);
631
+ } else {
632
+ form.removeAttr(name);
633
+ }
634
+ });
635
+ };
636
+ multiLoader.push([files, index, iframe, settings]);
637
+ if (settings.sequentialUploads) {
638
+ sequenceHandler.push(send);
639
+ } else {
640
+ send();
641
+ }
642
+ },
643
+
644
+ normalizeFile = function (index, file) {
645
+ if (typeof file.name === undef && typeof file.size === undef) {
646
+ file.name = file.fileName;
647
+ file.size = file.fileSize;
648
+ }
649
+ },
650
+
651
+ handleLegacyUpload = function (event, input, form, index) {
652
+ if (!(event && input && form)) {
653
+ $.error('Iframe based File Upload requires a file input change event');
654
+ return;
655
+ }
656
+ // javascript:false as iframe src prevents warning popups on HTTPS in IE6:
657
+ var iframe = $('<iframe src="javascript:false;" style="display:none;" name="iframe_' +
658
+ settings.namespace + '_' + (new Date()).getTime() + '"></iframe>'),
659
+ uploadSettings = $.extend({}, settings),
660
+ files = event.target && event.target.files;
661
+ files = files ? Array.prototype.slice.call(files, 0) : [{name: input.val(), type: null, size: null}];
662
+ $.each(files, normalizeFile);
663
+ index = files.length === 1 ? 0 : index;
664
+ uploadSettings.fileInput = input;
665
+ uploadSettings.uploadForm = form;
666
+ iframe.readyState = 0;
667
+ iframe.abort = function () {
668
+ iframe.trigger('abort');
669
+ };
670
+ iframe.bind('load', function () {
671
+ iframe.unbind('load');
672
+ if (typeof uploadSettings.initUpload === func) {
673
+ uploadSettings.initUpload(
674
+ event,
675
+ files,
676
+ index,
677
+ iframe,
678
+ uploadSettings,
679
+ function () {
680
+ legacyUpload(event, files, input, form, iframe, uploadSettings, index);
681
+ }
682
+ );
683
+ } else {
684
+ legacyUpload(event, files, input, form, iframe, uploadSettings, index);
685
+ }
686
+ }).appendTo(form);
687
+ },
688
+
689
+ canHandleXHRUploadSize = function (files) {
690
+ var bytes = 0,
691
+ totalBytes = 0,
692
+ i;
693
+ if (settings.multipart && typeof FormData === undef) {
694
+ for (i = 0; i < files.length; i += 1) {
695
+ bytes = files[i].size;
696
+ if (bytes > settings.maxFileReaderSize) {
697
+ return false;
698
+ }
699
+ totalBytes += bytes;
700
+ }
701
+ if (settings.multiFileRequest && totalBytes > settings.maxFileReaderSize) {
702
+ return false;
703
+ }
704
+ }
705
+ return true;
706
+ },
707
+
708
+ handleFiles = function (event, files, input, form) {
709
+ if (!canHandleXHRUploadSize(files)) {
710
+ handleLegacyUpload(event, input, form);
711
+ return;
712
+ }
713
+ var i;
714
+ files = Array.prototype.slice.call(files, 0);
715
+ $.each(files, normalizeFile);
716
+ if (settings.multiFileRequest && settings.multipart && files.length) {
717
+ handleUpload(event, files, input, form);
718
+ } else {
719
+ for (i = 0; i < files.length; i += 1) {
720
+ handleUpload(event, files, input, form, i);
721
+ }
722
+ }
723
+ },
724
+
725
+ initUploadForm = function () {
726
+ uploadForm = (container.is('form') ? container : container.find('form'))
727
+ .filter(settings.uploadFormFilter);
728
+ },
729
+
730
+ initFileInput = function () {
731
+ fileInput = (uploadForm.length ? uploadForm : container).find('input:file')
732
+ .filter(settings.fileInputFilter);
733
+ },
734
+
735
+ replaceFileInput = function (input) {
736
+ var inputClone = input.clone(true);
737
+ $('<form/>').append(inputClone).get(0).reset();
738
+ input.after(inputClone).detach();
739
+ initFileInput();
740
+ };
741
+
742
+ this.onDocumentDragOver = function (e) {
743
+ if (typeof settings.onDocumentDragOver === func &&
744
+ settings.onDocumentDragOver(e) === false) {
745
+ return false;
746
+ }
747
+ e.preventDefault();
748
+ };
749
+
750
+ this.onDocumentDrop = function (e) {
751
+ if (typeof settings.onDocumentDrop === func &&
752
+ settings.onDocumentDrop(e) === false) {
753
+ return false;
754
+ }
755
+ e.preventDefault();
756
+ };
757
+
758
+ this.onDragOver = function (e) {
759
+ if (typeof settings.onDragOver === func &&
760
+ settings.onDragOver(e) === false) {
761
+ return false;
762
+ }
763
+ var dataTransfer = e.originalEvent.dataTransfer;
764
+ if (dataTransfer && dataTransfer.files) {
765
+ dataTransfer.dropEffect = dataTransfer.effectAllowed = 'copy';
766
+ e.preventDefault();
767
+ }
768
+ };
769
+
770
+ this.onDrop = function (e) {
771
+ if (typeof settings.onDrop === func &&
772
+ settings.onDrop(e) === false) {
773
+ return false;
774
+ }
775
+ var dataTransfer = e.originalEvent.dataTransfer;
776
+ if (dataTransfer && dataTransfer.files && isXHRUploadCapable()) {
777
+ handleFiles(e, dataTransfer.files);
778
+ }
779
+ e.preventDefault();
780
+ };
781
+
782
+ this.onChange = function (e) {
783
+ if (typeof settings.onChange === func &&
784
+ settings.onChange(e) === false) {
785
+ return false;
786
+ }
787
+ var input = $(e.target),
788
+ form = $(e.target.form);
789
+ if (form.length === 1) {
790
+ if (settings.replaceFileInput) {
791
+ input.data(defaultNamespace + '_form', form);
792
+ replaceFileInput(input);
793
+ }
794
+ } else {
795
+ form = input.data(defaultNamespace + '_form');
796
+ }
797
+ if (!settings.forceIframeUpload && e.target.files && isXHRUploadCapable()) {
798
+ handleFiles(e, e.target.files, input, form);
799
+ } else {
800
+ handleLegacyUpload(e, input, form);
801
+ }
802
+ };
803
+
804
+ this.init = function (options) {
805
+ if (options) {
806
+ $.extend(settings, options);
807
+ optionsReference = options;
808
+ }
809
+ initUploadForm();
810
+ initFileInput();
811
+ if (container.data(settings.namespace)) {
812
+ $.error('FileUpload with namespace "' + settings.namespace + '" already assigned to this element');
813
+ return;
814
+ }
815
+ container
816
+ .data(settings.namespace, fileUpload)
817
+ .addClass(settings.cssClass);
818
+ settings.dropZone.not(container).addClass(settings.cssClass);
819
+ initEventHandlers();
820
+ if (typeof settings.init === func) {
821
+ settings.init();
822
+ }
823
+ };
824
+
825
+ this.options = function (options) {
826
+ var oldCssClass,
827
+ oldDropZone,
828
+ uploadFormFilterUpdate,
829
+ fileInputFilterUpdate;
830
+ if (typeof options === undef) {
831
+ return $.extend({}, settings);
832
+ }
833
+ if (optionsReference) {
834
+ $.extend(optionsReference, options);
835
+ }
836
+ removeEventHandlers();
837
+ $.each(options, function (name, value) {
838
+ switch (name) {
839
+ case 'namespace':
840
+ $.error('The FileUpload namespace cannot be updated.');
841
+ return;
842
+ case 'uploadFormFilter':
843
+ uploadFormFilterUpdate = true;
844
+ fileInputFilterUpdate = true;
845
+ break;
846
+ case 'fileInputFilter':
847
+ fileInputFilterUpdate = true;
848
+ break;
849
+ case 'cssClass':
850
+ oldCssClass = settings.cssClass;
851
+ break;
852
+ case 'dropZone':
853
+ oldDropZone = settings.dropZone;
854
+ break;
855
+ }
856
+ settings[name] = value;
857
+ });
858
+ if (uploadFormFilterUpdate) {
859
+ initUploadForm();
860
+ }
861
+ if (fileInputFilterUpdate) {
862
+ initFileInput();
863
+ }
864
+ if (typeof oldCssClass !== undef) {
865
+ container
866
+ .removeClass(oldCssClass)
867
+ .addClass(settings.cssClass);
868
+ (oldDropZone ? oldDropZone : settings.dropZone).not(container)
869
+ .removeClass(oldCssClass);
870
+ settings.dropZone.not(container).addClass(settings.cssClass);
871
+ } else if (oldDropZone) {
872
+ oldDropZone.not(container).removeClass(settings.cssClass);
873
+ settings.dropZone.not(container).addClass(settings.cssClass);
874
+ }
875
+ initEventHandlers();
876
+ };
877
+
878
+ this.option = function (name, value) {
879
+ var options;
880
+ if (typeof value === undef) {
881
+ return settings[name];
882
+ }
883
+ options = {};
884
+ options[name] = value;
885
+ fileUpload.options(options);
886
+ };
887
+
888
+ this.destroy = function () {
889
+ if (typeof settings.destroy === func) {
890
+ settings.destroy();
891
+ }
892
+ removeEventHandlers();
893
+ container
894
+ .removeData(settings.namespace)
895
+ .removeClass(settings.cssClass);
896
+ settings.dropZone.not(container).removeClass(settings.cssClass);
897
+ };
898
+
899
+ this.upload = function (files) {
900
+ if (typeof files.length === undef) {
901
+ files = [files];
902
+ }
903
+ handleFiles(null, files);
904
+ };
905
+ };
906
+
907
+ methods = {
908
+ init : function (options) {
909
+ return this.each(function () {
910
+ (new FileUpload($(this))).init(options);
911
+ });
912
+ },
913
+
914
+ option: function (option, value, namespace) {
915
+ namespace = namespace ? namespace : defaultNamespace;
916
+ var fileUpload = $(this).data(namespace);
917
+ if (fileUpload) {
918
+ if (!option) {
919
+ return fileUpload.options();
920
+ } else if (typeof option === 'string' && typeof value === undef) {
921
+ return fileUpload.option(option);
922
+ }
923
+ } else {
924
+ $.error('No FileUpload with namespace "' + namespace + '" assigned to this element');
925
+ }
926
+ return this.each(function () {
927
+ var fu = $(this).data(namespace);
928
+ if (fu) {
929
+ if (typeof option === 'string') {
930
+ fu.option(option, value);
931
+ } else {
932
+ fu.options(option);
933
+ }
934
+ } else {
935
+ $.error('No FileUpload with namespace "' + namespace + '" assigned to this element');
936
+ }
937
+ });
938
+ },
939
+
940
+ destroy: function (namespace) {
941
+ namespace = namespace ? namespace : defaultNamespace;
942
+ return this.each(function () {
943
+ var fileUpload = $(this).data(namespace);
944
+ if (fileUpload) {
945
+ fileUpload.destroy();
946
+ } else {
947
+ $.error('No FileUpload with namespace "' + namespace + '" assigned to this element');
948
+ }
949
+ });
950
+ },
951
+
952
+ upload: function (files, namespace) {
953
+ namespace = namespace ? namespace : defaultNamespace;
954
+ return this.each(function () {
955
+ var fileUpload = $(this).data(namespace);
956
+ if (fileUpload) {
957
+ fileUpload.upload(files);
958
+ } else {
959
+ $.error('No FileUpload with namespace "' + namespace + '" assigned to this element');
960
+ }
961
+ });
962
+ }
963
+ };
964
+
965
+ $.fn.fileUpload = function (method) {
966
+ if (methods[method]) {
967
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
968
+ } else if (typeof method === 'object' || !method) {
969
+ return methods.init.apply(this, arguments);
970
+ } else {
971
+ $.error('Method "' + method + '" does not exist on jQuery.fileUpload');
972
+ }
973
+ };
974
+
975
+ }(jQuery));