qwerty 0.0.1.pre → 0.0.3.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (338) hide show
  1. data/README.rdoc +20 -6
  2. data/app/controllers/documents_controller.rb +20 -1
  3. data/app/controllers/qwerty_admin/base_controller.rb +5 -4
  4. data/app/controllers/qwerty_base_controller.rb +6 -3
  5. data/app/helpers/documents_helper.rb +1 -1
  6. data/app/models/document.rb +8 -3
  7. data/app/views/cms/show.html.erb +4 -0
  8. data/app/views/kaminari/twitter/_first_page.html.erb +13 -0
  9. data/app/views/kaminari/twitter/_gap.html.erb +11 -0
  10. data/app/views/kaminari/twitter/_last_page.html.erb +3 -0
  11. data/app/views/kaminari/twitter/_next_page.html.erb +3 -0
  12. data/app/views/kaminari/twitter/_page.html.erb +5 -0
  13. data/app/views/kaminari/twitter/_paginator.html.erb +17 -0
  14. data/app/views/kaminari/twitter/_prev_page.html.erb +12 -0
  15. data/app/views/layouts/qwerty_admin.html.erb +0 -1
  16. data/app/views/qwerty_admin/documents/_document.html.erb +4 -2
  17. data/app/views/qwerty_admin/documents/_form.html.erb +1 -1
  18. data/app/views/qwerty_admin/documents/index.html.erb +3 -3
  19. data/app/views/qwerty_admin/documents/show.html.erb +6 -2
  20. data/app/views/qwerty_admin/nodes/_node.html.erb +2 -2
  21. data/config/routes.rb +2 -2
  22. data/db/migrate/20110909144300_create_documents.rb +1 -1
  23. data/lib/generators/qwerty/copy_views/copy_views_generator.rb +10 -0
  24. data/lib/generators/qwerty/create_document_views/create_document_views_generator.rb +18 -0
  25. data/lib/generators/qwerty/create_document_views/templates/show.html.erb +22 -0
  26. data/lib/generators/qwerty/install/install_generator.rb +24 -0
  27. data/lib/generators/qwerty/install/templates/README +30 -0
  28. data/lib/generators/qwerty/install/templates/qwerty.rb +34 -0
  29. data/lib/generators/qwerty/install/templates/sitemap.rb +39 -0
  30. data/lib/qwerty/engine.rb +0 -1
  31. data/lib/qwerty/version.rb +1 -1
  32. data/lib/qwerty.rb +40 -3
  33. data/lib/tasks/qwerty_tasks.rake +9 -2
  34. data/test/dummy/app/views/cms/blog.html.erb +10 -0
  35. data/test/dummy/config/sitemap.rb +4 -4
  36. data/test/dummy/db/schema.rb +1 -15
  37. data/test/dummy/log/development.log +31645 -0
  38. data/test/dummy/tmp/dragonfly/cache/meta/08/583d3580bdba862155e60de9a00668e59daf9a +0 -0
  39. data/test/dummy/tmp/dragonfly/cache/meta/09/828a2e2227c8ee400355ae1a23ad2bd790141d +0 -0
  40. data/test/dummy/tmp/dragonfly/cache/meta/0d/3d65cfd83d3144d664a407c58772a9af580f2c +0 -0
  41. data/test/dummy/tmp/dragonfly/cache/meta/1f/f07ad344a1cb0b8ec31186f4dc9db0839ad627 +0 -0
  42. data/test/dummy/tmp/dragonfly/cache/meta/31/2c7a5054f251c184a219299e46d5dd6f0730cd +0 -0
  43. data/test/dummy/tmp/dragonfly/cache/meta/33/fd8b6a50207f556064a867cd45a5a913fc39e6 +0 -0
  44. data/test/dummy/tmp/dragonfly/cache/meta/36/a1e2bafc0b1be17cdfbcc85af2c1ddbdc97274 +0 -0
  45. data/test/dummy/tmp/dragonfly/cache/meta/51/d20274bbbbb01e6fa7dcdd39776bfb0a001dda +0 -0
  46. data/test/dummy/tmp/dragonfly/cache/meta/5b/4beef5209ea5ca056828b4b61d413f586dc689 +0 -0
  47. data/test/dummy/tmp/dragonfly/cache/meta/5e/f7d5756119e2b71e82ea878824891efc8d4e98 +0 -0
  48. data/test/dummy/tmp/dragonfly/cache/meta/64/41ffd938beeeae87f4cb84ed8cc2dc89d7ebc0 +0 -0
  49. data/test/dummy/tmp/dragonfly/cache/meta/66/4c2f6718656261fba53eae83feecda49a4fe27 +0 -0
  50. data/test/dummy/tmp/dragonfly/cache/meta/66/f44aba1428593600ff0e47ea6aa54362e39a59 +0 -0
  51. data/test/dummy/tmp/dragonfly/cache/meta/6c/e61baa71dc8133c47f88feebb2dc25158461f0 +0 -0
  52. data/test/dummy/tmp/dragonfly/cache/meta/6d/d387d4d65cd8d6d331d45659f28626df019f06 +0 -0
  53. data/test/dummy/tmp/dragonfly/cache/meta/75/868cd14b8d420dcd4ef44afcd20722ad7a1c3f +0 -0
  54. data/test/dummy/tmp/dragonfly/cache/meta/77/08cd91d09e6cc0e0393e02a0fb2e0205cf34af +0 -0
  55. data/test/dummy/tmp/dragonfly/cache/meta/77/89d929429830411758a64c37875ee16224640d +0 -0
  56. data/test/dummy/tmp/dragonfly/cache/meta/7c/14b32e4e029b0200d54b210b4148be0349e72c +0 -0
  57. data/test/dummy/tmp/dragonfly/cache/meta/7f/0b8b6f8f34b458916f99a528f4cab40107490d +0 -0
  58. data/test/dummy/tmp/dragonfly/cache/meta/80/5841ac20acdd8dd41460c8346294abc5c4dd8f +0 -0
  59. data/test/dummy/tmp/dragonfly/cache/meta/81/5c4edaf06b6f561037f8424878bc479644cfe2 +0 -0
  60. data/test/dummy/tmp/dragonfly/cache/meta/87/6f1ac29d9a3be64d8ec07d988ee2f7e9210a8c +0 -0
  61. data/test/dummy/tmp/dragonfly/cache/meta/9b/1e5d2a62e4e1c014350ded8b89e08731e51e12 +0 -0
  62. data/test/dummy/tmp/dragonfly/cache/meta/a0/ca7d61a5e5763e257e13dcbc2b0f11abfd607c +0 -0
  63. data/test/dummy/tmp/dragonfly/cache/meta/a6/415b21bb312e94f5386bebaf0b9dd96f102a4c +0 -0
  64. data/test/dummy/tmp/dragonfly/cache/meta/ae/67c778b4cac5a750af11726e141b1c44969772 +0 -0
  65. data/test/dummy/tmp/dragonfly/cache/meta/bc/3d6a023e30186fa647759d74acd8538ec159d9 +0 -0
  66. data/test/dummy/tmp/dragonfly/cache/meta/c2/630081ff80175138d240306b29a05a5557fe32 +0 -0
  67. data/test/dummy/tmp/dragonfly/cache/meta/df/91db539ca547413619d0dadb1e773568d66321 +0 -0
  68. data/test/dummy/tmp/dragonfly/cache/meta/e7/6a8134e4f01b53cb7ab6551c68f0c44faac748 +0 -0
  69. data/test/dummy/tmp/dragonfly/cache/meta/ee/fe74949a8c2a0bbc077385a12944d9f98a12e0 +0 -0
  70. data/test/dummy/tmp/dragonfly/cache/meta/ef/f08311365a487d92cc4a5a33a327b00fa4a576 +0 -0
  71. data/test/dummy/tmp/dragonfly/cache/meta/f9/67ac04386c59253bd80f4034d18af166cc5691 +0 -0
  72. data/test/dummy/tmp/dragonfly/cache/meta/ff/d5f8f0d3f33df0282fc5c47f8761d3f328806c +0 -0
  73. metadata +67 -324
  74. data/app/assets/javascripts/ckeditor/CHANGES.html +0 -1433
  75. data/app/assets/javascripts/ckeditor/INSTALL.html +0 -92
  76. data/app/assets/javascripts/ckeditor/LICENSE.html +0 -1327
  77. data/app/assets/javascripts/ckeditor/adapters/jquery.js +0 -6
  78. data/app/assets/javascripts/ckeditor/ckeditor.js +0 -149
  79. data/app/assets/javascripts/ckeditor/ckeditor.pack +0 -211
  80. data/app/assets/javascripts/ckeditor/ckeditor_basic.js +0 -8
  81. data/app/assets/javascripts/ckeditor/ckeditor_basic_source.js +0 -20
  82. data/app/assets/javascripts/ckeditor/ckeditor_source.js +0 -35
  83. data/app/assets/javascripts/ckeditor/config.js +0 -78
  84. data/app/assets/javascripts/ckeditor/contents.css +0 -25
  85. data/app/assets/javascripts/ckeditor/filebrowser/images/gal_add.jpg +0 -0
  86. data/app/assets/javascripts/ckeditor/filebrowser/images/gal_add.png +0 -0
  87. data/app/assets/javascripts/ckeditor/filebrowser/images/gal_del.png +0 -0
  88. data/app/assets/javascripts/ckeditor/filebrowser/images/gal_more.gif +0 -0
  89. data/app/assets/javascripts/ckeditor/filebrowser/images/preloader.gif +0 -0
  90. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/ckfnothumb.gif +0 -0
  91. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/mp3.gif +0 -0
  92. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/pdf.gif +0 -0
  93. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/rar.gif +0 -0
  94. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/swf.gif +0 -0
  95. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/xls.gif +0 -0
  96. data/app/assets/javascripts/ckeditor/filebrowser/javascripts/application.js +0 -222
  97. data/app/assets/javascripts/ckeditor/filebrowser/javascripts/fileuploader.js +0 -1301
  98. data/app/assets/javascripts/ckeditor/filebrowser/javascripts/jquery.js +0 -18
  99. data/app/assets/javascripts/ckeditor/filebrowser/javascripts/jquery.tmpl.js +0 -10
  100. data/app/assets/javascripts/ckeditor/filebrowser/javascripts/rails.js +0 -363
  101. data/app/assets/javascripts/ckeditor/filebrowser/stylesheets/uploader.css +0 -117
  102. data/app/assets/javascripts/ckeditor/images/spacer.gif +0 -0
  103. data/app/assets/javascripts/ckeditor/lang/_languages.js +0 -6
  104. data/app/assets/javascripts/ckeditor/lang/_translationstatus.txt +0 -61
  105. data/app/assets/javascripts/ckeditor/lang/af.js +0 -6
  106. data/app/assets/javascripts/ckeditor/lang/ar.js +0 -6
  107. data/app/assets/javascripts/ckeditor/lang/bg.js +0 -6
  108. data/app/assets/javascripts/ckeditor/lang/bn.js +0 -6
  109. data/app/assets/javascripts/ckeditor/lang/bs.js +0 -6
  110. data/app/assets/javascripts/ckeditor/lang/ca.js +0 -6
  111. data/app/assets/javascripts/ckeditor/lang/cs.js +0 -6
  112. data/app/assets/javascripts/ckeditor/lang/cy.js +0 -6
  113. data/app/assets/javascripts/ckeditor/lang/da.js +0 -6
  114. data/app/assets/javascripts/ckeditor/lang/de.js +0 -6
  115. data/app/assets/javascripts/ckeditor/lang/el.js +0 -6
  116. data/app/assets/javascripts/ckeditor/lang/en-au.js +0 -6
  117. data/app/assets/javascripts/ckeditor/lang/en-ca.js +0 -6
  118. data/app/assets/javascripts/ckeditor/lang/en-gb.js +0 -6
  119. data/app/assets/javascripts/ckeditor/lang/en.js +0 -6
  120. data/app/assets/javascripts/ckeditor/lang/eo.js +0 -6
  121. data/app/assets/javascripts/ckeditor/lang/es.js +0 -6
  122. data/app/assets/javascripts/ckeditor/lang/et.js +0 -6
  123. data/app/assets/javascripts/ckeditor/lang/eu.js +0 -6
  124. data/app/assets/javascripts/ckeditor/lang/fa.js +0 -6
  125. data/app/assets/javascripts/ckeditor/lang/fi.js +0 -6
  126. data/app/assets/javascripts/ckeditor/lang/fo.js +0 -6
  127. data/app/assets/javascripts/ckeditor/lang/fr-ca.js +0 -6
  128. data/app/assets/javascripts/ckeditor/lang/fr.js +0 -6
  129. data/app/assets/javascripts/ckeditor/lang/gl.js +0 -6
  130. data/app/assets/javascripts/ckeditor/lang/gu.js +0 -6
  131. data/app/assets/javascripts/ckeditor/lang/he.js +0 -6
  132. data/app/assets/javascripts/ckeditor/lang/hi.js +0 -6
  133. data/app/assets/javascripts/ckeditor/lang/hr.js +0 -6
  134. data/app/assets/javascripts/ckeditor/lang/hu.js +0 -6
  135. data/app/assets/javascripts/ckeditor/lang/is.js +0 -6
  136. data/app/assets/javascripts/ckeditor/lang/it.js +0 -6
  137. data/app/assets/javascripts/ckeditor/lang/ja.js +0 -6
  138. data/app/assets/javascripts/ckeditor/lang/ka.js +0 -6
  139. data/app/assets/javascripts/ckeditor/lang/km.js +0 -6
  140. data/app/assets/javascripts/ckeditor/lang/ko.js +0 -6
  141. data/app/assets/javascripts/ckeditor/lang/lt.js +0 -6
  142. data/app/assets/javascripts/ckeditor/lang/lv.js +0 -6
  143. data/app/assets/javascripts/ckeditor/lang/mn.js +0 -6
  144. data/app/assets/javascripts/ckeditor/lang/ms.js +0 -6
  145. data/app/assets/javascripts/ckeditor/lang/nb.js +0 -6
  146. data/app/assets/javascripts/ckeditor/lang/nl.js +0 -6
  147. data/app/assets/javascripts/ckeditor/lang/no.js +0 -6
  148. data/app/assets/javascripts/ckeditor/lang/pl.js +0 -6
  149. data/app/assets/javascripts/ckeditor/lang/pt-br.js +0 -6
  150. data/app/assets/javascripts/ckeditor/lang/pt.js +0 -6
  151. data/app/assets/javascripts/ckeditor/lang/ro.js +0 -6
  152. data/app/assets/javascripts/ckeditor/lang/ru.js +0 -6
  153. data/app/assets/javascripts/ckeditor/lang/sk.js +0 -6
  154. data/app/assets/javascripts/ckeditor/lang/sl.js +0 -6
  155. data/app/assets/javascripts/ckeditor/lang/sr-latn.js +0 -6
  156. data/app/assets/javascripts/ckeditor/lang/sr.js +0 -6
  157. data/app/assets/javascripts/ckeditor/lang/sv.js +0 -6
  158. data/app/assets/javascripts/ckeditor/lang/th.js +0 -6
  159. data/app/assets/javascripts/ckeditor/lang/tr.js +0 -6
  160. data/app/assets/javascripts/ckeditor/lang/uk.js +0 -6
  161. data/app/assets/javascripts/ckeditor/lang/vi.js +0 -6
  162. data/app/assets/javascripts/ckeditor/lang/zh-cn.js +0 -6
  163. data/app/assets/javascripts/ckeditor/lang/zh.js +0 -6
  164. data/app/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +0 -7
  165. data/app/assets/javascripts/ckeditor/plugins/a11yhelp/lang/en.js +0 -6
  166. data/app/assets/javascripts/ckeditor/plugins/a11yhelp/lang/he.js +0 -6
  167. data/app/assets/javascripts/ckeditor/plugins/about/dialogs/about.js +0 -6
  168. data/app/assets/javascripts/ckeditor/plugins/about/dialogs/logo_ckeditor.png +0 -0
  169. data/app/assets/javascripts/ckeditor/plugins/adobeair/plugin.js +0 -6
  170. data/app/assets/javascripts/ckeditor/plugins/ajax/plugin.js +0 -6
  171. data/app/assets/javascripts/ckeditor/plugins/attachment/dialogs/attachment.js +0 -1
  172. data/app/assets/javascripts/ckeditor/plugins/attachment/images/attachment.png +0 -0
  173. data/app/assets/javascripts/ckeditor/plugins/attachment/lang/en.js +0 -10
  174. data/app/assets/javascripts/ckeditor/plugins/attachment/lang/ru.js +0 -10
  175. data/app/assets/javascripts/ckeditor/plugins/attachment/lang/uk.js +0 -10
  176. data/app/assets/javascripts/ckeditor/plugins/attachment/plugin.js +0 -1
  177. data/app/assets/javascripts/ckeditor/plugins/autogrow/plugin.js +0 -6
  178. data/app/assets/javascripts/ckeditor/plugins/bbcode/plugin.js +0 -9
  179. data/app/assets/javascripts/ckeditor/plugins/clipboard/dialogs/paste.js +0 -7
  180. data/app/assets/javascripts/ckeditor/plugins/colordialog/dialogs/colordialog.js +0 -7
  181. data/app/assets/javascripts/ckeditor/plugins/devtools/lang/en.js +0 -6
  182. data/app/assets/javascripts/ckeditor/plugins/devtools/plugin.js +0 -6
  183. data/app/assets/javascripts/ckeditor/plugins/dialog/dialogDefinition.js +0 -4
  184. data/app/assets/javascripts/ckeditor/plugins/div/dialogs/div.js +0 -8
  185. data/app/assets/javascripts/ckeditor/plugins/docprops/dialogs/docprops.js +0 -10
  186. data/app/assets/javascripts/ckeditor/plugins/docprops/plugin.js +0 -6
  187. data/app/assets/javascripts/ckeditor/plugins/embed/dialogs/embed.js +0 -1
  188. data/app/assets/javascripts/ckeditor/plugins/embed/images/embed.png +0 -0
  189. data/app/assets/javascripts/ckeditor/plugins/embed/lang/en.js +0 -9
  190. data/app/assets/javascripts/ckeditor/plugins/embed/lang/ru.js +0 -9
  191. data/app/assets/javascripts/ckeditor/plugins/embed/lang/uk.js +0 -9
  192. data/app/assets/javascripts/ckeditor/plugins/embed/plugin.js +0 -1
  193. data/app/assets/javascripts/ckeditor/plugins/find/dialogs/find.js +0 -10
  194. data/app/assets/javascripts/ckeditor/plugins/flash/dialogs/flash.js +0 -9
  195. data/app/assets/javascripts/ckeditor/plugins/flash/images/placeholder.png +0 -0
  196. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/button.js +0 -6
  197. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/checkbox.js +0 -6
  198. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/form.js +0 -6
  199. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/hiddenfield.js +0 -6
  200. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/radio.js +0 -6
  201. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/select.js +0 -9
  202. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/textarea.js +0 -6
  203. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/textfield.js +0 -6
  204. data/app/assets/javascripts/ckeditor/plugins/forms/images/hiddenfield.gif +0 -0
  205. data/app/assets/javascripts/ckeditor/plugins/iframe/dialogs/iframe.js +0 -7
  206. data/app/assets/javascripts/ckeditor/plugins/iframe/images/placeholder.png +0 -0
  207. data/app/assets/javascripts/ckeditor/plugins/iframedialog/plugin.js +0 -6
  208. data/app/assets/javascripts/ckeditor/plugins/image/dialogs/image.js +0 -13
  209. data/app/assets/javascripts/ckeditor/plugins/link/dialogs/anchor.js +0 -6
  210. data/app/assets/javascripts/ckeditor/plugins/link/dialogs/link.js +0 -12
  211. data/app/assets/javascripts/ckeditor/plugins/link/images/anchor.gif +0 -0
  212. data/app/assets/javascripts/ckeditor/plugins/liststyle/dialogs/liststyle.js +0 -7
  213. data/app/assets/javascripts/ckeditor/plugins/pagebreak/images/pagebreak.gif +0 -0
  214. data/app/assets/javascripts/ckeditor/plugins/pastefromword/filter/default.js +0 -11
  215. data/app/assets/javascripts/ckeditor/plugins/pastetext/dialogs/pastetext.js +0 -6
  216. data/app/assets/javascripts/ckeditor/plugins/placeholder/dialogs/placeholder.js +0 -6
  217. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/en.js +0 -6
  218. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/he.js +0 -6
  219. data/app/assets/javascripts/ckeditor/plugins/placeholder/placeholder.gif +0 -0
  220. data/app/assets/javascripts/ckeditor/plugins/placeholder/plugin.js +0 -6
  221. data/app/assets/javascripts/ckeditor/plugins/scayt/dialogs/options.js +0 -8
  222. data/app/assets/javascripts/ckeditor/plugins/scayt/dialogs/toolbar.css +0 -6
  223. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_address.png +0 -0
  224. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_blockquote.png +0 -0
  225. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_div.png +0 -0
  226. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h1.png +0 -0
  227. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h2.png +0 -0
  228. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h3.png +0 -0
  229. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h4.png +0 -0
  230. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h5.png +0 -0
  231. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h6.png +0 -0
  232. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_p.png +0 -0
  233. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_pre.png +0 -0
  234. data/app/assets/javascripts/ckeditor/plugins/smiley/dialogs/smiley.js +0 -7
  235. data/app/assets/javascripts/ckeditor/plugins/smiley/images/angel_smile.gif +0 -0
  236. data/app/assets/javascripts/ckeditor/plugins/smiley/images/angry_smile.gif +0 -0
  237. data/app/assets/javascripts/ckeditor/plugins/smiley/images/broken_heart.gif +0 -0
  238. data/app/assets/javascripts/ckeditor/plugins/smiley/images/confused_smile.gif +0 -0
  239. data/app/assets/javascripts/ckeditor/plugins/smiley/images/cry_smile.gif +0 -0
  240. data/app/assets/javascripts/ckeditor/plugins/smiley/images/devil_smile.gif +0 -0
  241. data/app/assets/javascripts/ckeditor/plugins/smiley/images/embaressed_smile.gif +0 -0
  242. data/app/assets/javascripts/ckeditor/plugins/smiley/images/envelope.gif +0 -0
  243. data/app/assets/javascripts/ckeditor/plugins/smiley/images/heart.gif +0 -0
  244. data/app/assets/javascripts/ckeditor/plugins/smiley/images/kiss.gif +0 -0
  245. data/app/assets/javascripts/ckeditor/plugins/smiley/images/lightbulb.gif +0 -0
  246. data/app/assets/javascripts/ckeditor/plugins/smiley/images/omg_smile.gif +0 -0
  247. data/app/assets/javascripts/ckeditor/plugins/smiley/images/regular_smile.gif +0 -0
  248. data/app/assets/javascripts/ckeditor/plugins/smiley/images/sad_smile.gif +0 -0
  249. data/app/assets/javascripts/ckeditor/plugins/smiley/images/shades_smile.gif +0 -0
  250. data/app/assets/javascripts/ckeditor/plugins/smiley/images/teeth_smile.gif +0 -0
  251. data/app/assets/javascripts/ckeditor/plugins/smiley/images/thumbs_down.gif +0 -0
  252. data/app/assets/javascripts/ckeditor/plugins/smiley/images/thumbs_up.gif +0 -0
  253. data/app/assets/javascripts/ckeditor/plugins/smiley/images/tounge_smile.gif +0 -0
  254. data/app/assets/javascripts/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif +0 -0
  255. data/app/assets/javascripts/ckeditor/plugins/smiley/images/wink_smile.gif +0 -0
  256. data/app/assets/javascripts/ckeditor/plugins/specialchar/dialogs/specialchar.js +0 -7
  257. data/app/assets/javascripts/ckeditor/plugins/specialchar/lang/en.js +0 -6
  258. data/app/assets/javascripts/ckeditor/plugins/styles/styles/default.js +0 -6
  259. data/app/assets/javascripts/ckeditor/plugins/stylesheetparser/plugin.js +0 -6
  260. data/app/assets/javascripts/ckeditor/plugins/table/dialogs/table.js +0 -9
  261. data/app/assets/javascripts/ckeditor/plugins/tableresize/plugin.js +0 -7
  262. data/app/assets/javascripts/ckeditor/plugins/tabletools/dialogs/tableCell.js +0 -8
  263. data/app/assets/javascripts/ckeditor/plugins/templates/dialogs/templates.js +0 -7
  264. data/app/assets/javascripts/ckeditor/plugins/templates/templates/default.js +0 -6
  265. data/app/assets/javascripts/ckeditor/plugins/templates/templates/images/template1.gif +0 -0
  266. data/app/assets/javascripts/ckeditor/plugins/templates/templates/images/template2.gif +0 -0
  267. data/app/assets/javascripts/ckeditor/plugins/templates/templates/images/template3.gif +0 -0
  268. data/app/assets/javascripts/ckeditor/plugins/uicolor/dialogs/uicolor.js +0 -7
  269. data/app/assets/javascripts/ckeditor/plugins/uicolor/lang/en.js +0 -6
  270. data/app/assets/javascripts/ckeditor/plugins/uicolor/lang/he.js +0 -6
  271. data/app/assets/javascripts/ckeditor/plugins/uicolor/plugin.js +0 -6
  272. data/app/assets/javascripts/ckeditor/plugins/uicolor/uicolor.gif +0 -0
  273. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/assets/hue_bg.png +0 -0
  274. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png +0 -0
  275. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/assets/picker_mask.png +0 -0
  276. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png +0 -0
  277. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/assets/yui.css +0 -6
  278. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/yui.js +0 -76
  279. data/app/assets/javascripts/ckeditor/plugins/wsc/dialogs/ciframe.html +0 -49
  280. data/app/assets/javascripts/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +0 -52
  281. data/app/assets/javascripts/ckeditor/plugins/wsc/dialogs/wsc.css +0 -6
  282. data/app/assets/javascripts/ckeditor/plugins/wsc/dialogs/wsc.js +0 -7
  283. data/app/assets/javascripts/ckeditor/plugins/xml/plugin.js +0 -6
  284. data/app/assets/javascripts/ckeditor/skins/kama/dialog.css +0 -10
  285. data/app/assets/javascripts/ckeditor/skins/kama/editor.css +0 -13
  286. data/app/assets/javascripts/ckeditor/skins/kama/icons.png +0 -0
  287. data/app/assets/javascripts/ckeditor/skins/kama/icons_rtl.png +0 -0
  288. data/app/assets/javascripts/ckeditor/skins/kama/images/dialog_sides.gif +0 -0
  289. data/app/assets/javascripts/ckeditor/skins/kama/images/dialog_sides.png +0 -0
  290. data/app/assets/javascripts/ckeditor/skins/kama/images/dialog_sides_rtl.png +0 -0
  291. data/app/assets/javascripts/ckeditor/skins/kama/images/mini.gif +0 -0
  292. data/app/assets/javascripts/ckeditor/skins/kama/images/noimage.png +0 -0
  293. data/app/assets/javascripts/ckeditor/skins/kama/images/sprites.png +0 -0
  294. data/app/assets/javascripts/ckeditor/skins/kama/images/sprites_ie6.png +0 -0
  295. data/app/assets/javascripts/ckeditor/skins/kama/images/toolbar_start.gif +0 -0
  296. data/app/assets/javascripts/ckeditor/skins/kama/skin.js +0 -7
  297. data/app/assets/javascripts/ckeditor/skins/kama/templates.css +0 -6
  298. data/app/assets/javascripts/ckeditor/skins/office2003/dialog.css +0 -9
  299. data/app/assets/javascripts/ckeditor/skins/office2003/editor.css +0 -14
  300. data/app/assets/javascripts/ckeditor/skins/office2003/icons.png +0 -0
  301. data/app/assets/javascripts/ckeditor/skins/office2003/icons_rtl.png +0 -0
  302. data/app/assets/javascripts/ckeditor/skins/office2003/images/dialog_sides.gif +0 -0
  303. data/app/assets/javascripts/ckeditor/skins/office2003/images/dialog_sides.png +0 -0
  304. data/app/assets/javascripts/ckeditor/skins/office2003/images/dialog_sides_rtl.png +0 -0
  305. data/app/assets/javascripts/ckeditor/skins/office2003/images/mini.gif +0 -0
  306. data/app/assets/javascripts/ckeditor/skins/office2003/images/noimage.png +0 -0
  307. data/app/assets/javascripts/ckeditor/skins/office2003/images/sprites.png +0 -0
  308. data/app/assets/javascripts/ckeditor/skins/office2003/images/sprites_ie6.png +0 -0
  309. data/app/assets/javascripts/ckeditor/skins/office2003/skin.js +0 -6
  310. data/app/assets/javascripts/ckeditor/skins/office2003/templates.css +0 -6
  311. data/app/assets/javascripts/ckeditor/skins/v2/dialog.css +0 -9
  312. data/app/assets/javascripts/ckeditor/skins/v2/editor.css +0 -13
  313. data/app/assets/javascripts/ckeditor/skins/v2/icons.png +0 -0
  314. data/app/assets/javascripts/ckeditor/skins/v2/icons_rtl.png +0 -0
  315. data/app/assets/javascripts/ckeditor/skins/v2/images/dialog_sides.gif +0 -0
  316. data/app/assets/javascripts/ckeditor/skins/v2/images/dialog_sides.png +0 -0
  317. data/app/assets/javascripts/ckeditor/skins/v2/images/dialog_sides_rtl.png +0 -0
  318. data/app/assets/javascripts/ckeditor/skins/v2/images/mini.gif +0 -0
  319. data/app/assets/javascripts/ckeditor/skins/v2/images/noimage.png +0 -0
  320. data/app/assets/javascripts/ckeditor/skins/v2/images/sprites.png +0 -0
  321. data/app/assets/javascripts/ckeditor/skins/v2/images/sprites_ie6.png +0 -0
  322. data/app/assets/javascripts/ckeditor/skins/v2/images/toolbar_start.gif +0 -0
  323. data/app/assets/javascripts/ckeditor/skins/v2/skin.js +0 -6
  324. data/app/assets/javascripts/ckeditor/skins/v2/templates.css +0 -6
  325. data/app/assets/javascripts/ckeditor/themes/default/theme.js +0 -8
  326. data/app/models/ckeditor/asset.rb +0 -4
  327. data/app/models/ckeditor/attachment_file.rb +0 -15
  328. data/app/models/ckeditor/picture.rb +0 -13
  329. data/config/initializers/ckeditor.rb +0 -18
  330. data/db/migrate/20110919190859_create_ckeditor_assets.rb +0 -26
  331. data/test/dummy/public/ckeditor_assets/attachments/2/p1010062.jpg +0 -0
  332. data/test/dummy/public/ckeditor_assets/pictures/1/content_member_9440972.jpeg +0 -0
  333. data/test/dummy/public/ckeditor_assets/pictures/1/original_member_9440972.jpeg +0 -0
  334. data/test/dummy/public/ckeditor_assets/pictures/1/thumb_member_9440972.jpeg +0 -0
  335. data/test/dummy/public/ckeditor_assets/pictures/3/content_p1010062.jpg +0 -0
  336. data/test/dummy/public/ckeditor_assets/pictures/3/original_p1010062.jpg +0 -0
  337. data/test/dummy/public/ckeditor_assets/pictures/3/thumb_p1010062.jpg +0 -0
  338. data/test/dummy/tmp/pids/server.pid +0 -1
@@ -1,1301 +0,0 @@
1
- /**
2
- * http://github.com/valums/file-uploader
3
- *
4
- * Multiple file upload component with progress-bar, drag-and-drop.
5
- * © 2010 Andrew Valums ( andrew(at)valums.com )
6
- *
7
- * Licensed under GNU GPL 2 or later, see license.txt.
8
- */
9
-
10
- //
11
- // Helper functions
12
- //
13
-
14
- var qq = qq || {};
15
-
16
- /**
17
- * Adds all missing properties from second obj to first obj
18
- */
19
- qq.extend = function(first, second){
20
- for (var prop in second){
21
- first[prop] = second[prop];
22
- }
23
- };
24
-
25
- /**
26
- * Searches for a given element in the array, returns -1 if it is not present.
27
- * @param {Number} [from] The index at which to begin the search
28
- */
29
- qq.indexOf = function(arr, elt, from){
30
- if (arr.indexOf) return arr.indexOf(elt, from);
31
-
32
- from = from || 0;
33
- var len = arr.length;
34
-
35
- if (from < 0) from += len;
36
-
37
- for (; from < len; from++){
38
- if (from in arr && arr[from] === elt){
39
- return from;
40
- }
41
- }
42
- return -1;
43
- };
44
-
45
- qq.getUniqueId = (function(){
46
- var id = 0;
47
- return function(){ return id++; };
48
- })();
49
-
50
- //
51
- // Events
52
-
53
- qq.attach = function(element, type, fn){
54
- if (element.addEventListener){
55
- element.addEventListener(type, fn, false);
56
- } else if (element.attachEvent){
57
- element.attachEvent('on' + type, fn);
58
- }
59
- };
60
- qq.detach = function(element, type, fn){
61
- if (element.removeEventListener){
62
- element.removeEventListener(type, fn, false);
63
- } else if (element.attachEvent){
64
- element.detachEvent('on' + type, fn);
65
- }
66
- };
67
-
68
- qq.preventDefault = function(e){
69
- if (e.preventDefault){
70
- e.preventDefault();
71
- } else{
72
- e.returnValue = false;
73
- }
74
- };
75
-
76
- //
77
- // Node manipulations
78
-
79
- /**
80
- * Insert node a before node b.
81
- */
82
- qq.insertBefore = function(a, b){
83
- b.parentNode.insertBefore(a, b);
84
- };
85
- qq.remove = function(element){
86
- element.parentNode.removeChild(element);
87
- };
88
-
89
- qq.contains = function(parent, descendant){
90
- // compareposition returns false in this case
91
- if (parent == descendant) return true;
92
-
93
- if (parent.contains){
94
- return parent.contains(descendant);
95
- } else {
96
- return !!(descendant.compareDocumentPosition(parent) & 8);
97
- }
98
- };
99
-
100
- /**
101
- * Creates and returns element from html string
102
- * Uses innerHTML to create an element
103
- */
104
- qq.toElement = (function(){
105
- var div = document.createElement('div');
106
- return function(html){
107
- div.innerHTML = html;
108
- var element = div.firstChild;
109
- div.removeChild(element);
110
- return element;
111
- };
112
- })();
113
-
114
- //
115
- // Node properties and attributes
116
-
117
- /**
118
- * Sets styles for an element.
119
- * Fixes opacity in IE6-8.
120
- */
121
- qq.css = function(element, styles){
122
- if (styles.opacity != null){
123
- if (typeof element.style.opacity != 'string' && typeof(element.filters) != 'undefined'){
124
- styles.filter = 'alpha(opacity=' + Math.round(100 * styles.opacity) + ')';
125
- }
126
- }
127
- qq.extend(element.style, styles);
128
- };
129
- qq.hasClass = function(element, name){
130
- var re = new RegExp('(^| )' + name + '( |$)');
131
- return re.test(element.className);
132
- };
133
- qq.addClass = function(element, name){
134
- if (!qq.hasClass(element, name)){
135
- element.className += ' ' + name;
136
- }
137
- };
138
- qq.removeClass = function(element, name){
139
- var re = new RegExp('(^| )' + name + '( |$)');
140
- element.className = element.className.replace(re, ' ').replace(/^\s+|\s+$/g, "");
141
- };
142
- qq.setText = function(element, text){
143
- element.innerText = text;
144
- element.textContent = text;
145
- };
146
-
147
- //
148
- // Selecting elements
149
-
150
- qq.children = function(element){
151
- var children = [],
152
- child = element.firstChild;
153
-
154
- while (child){
155
- if (child.nodeType == 1){
156
- children.push(child);
157
- }
158
- child = child.nextSibling;
159
- }
160
-
161
- return children;
162
- };
163
-
164
- qq.getByClass = function(element, className){
165
- if (element.querySelectorAll){
166
- return element.querySelectorAll('.' + className);
167
- }
168
-
169
- var result = [];
170
- var candidates = element.getElementsByTagName("*");
171
- var len = candidates.length;
172
-
173
- for (var i = 0; i < len; i++){
174
- if (qq.hasClass(candidates[i], className)){
175
- result.push(candidates[i]);
176
- }
177
- }
178
- return result;
179
- };
180
-
181
- /**
182
- * obj2url() takes a json-object as argument and generates
183
- * a querystring. pretty much like jQuery.param()
184
- *
185
- * how to use:
186
- *
187
- * `qq.obj2url({a:'b',c:'d'},'http://any.url/upload?otherParam=value');`
188
- *
189
- * will result in:
190
- *
191
- * `http://any.url/upload?otherParam=value&a=b&c=d`
192
- *
193
- * @param Object JSON-Object
194
- * @param String current querystring-part
195
- * @return String encoded querystring
196
- */
197
- qq.obj2url = function(obj, temp, prefixDone){
198
- var uristrings = [],
199
- prefix = '&',
200
- add = function(nextObj, i){
201
- var nextTemp = temp
202
- ? (/\[\]$/.test(temp)) // prevent double-encoding
203
- ? temp
204
- : temp+'['+i+']'
205
- : i;
206
- if ((nextTemp != 'undefined') && (i != 'undefined')) {
207
- uristrings.push(
208
- (typeof nextObj === 'object')
209
- ? qq.obj2url(nextObj, nextTemp, true)
210
- : (Object.prototype.toString.call(nextObj) === '[object Function]')
211
- ? encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj())
212
- : encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj)
213
- );
214
- }
215
- };
216
-
217
- if (!prefixDone && temp) {
218
- prefix = (/\?/.test(temp)) ? (/\?$/.test(temp)) ? '' : '&' : '?';
219
- uristrings.push(temp);
220
- uristrings.push(qq.obj2url(obj));
221
- } else if ((Object.prototype.toString.call(obj) === '[object Array]') && (typeof obj != 'undefined') ) {
222
- // we wont use a for-in-loop on an array (performance)
223
- for (var i = 0, len = obj.length; i < len; ++i){
224
- add(obj[i], i);
225
- }
226
- } else if ((typeof obj != 'undefined') && (obj !== null) && (typeof obj === "object")){
227
- // for anything else but a scalar, we will use for-in-loop
228
- for (var i in obj){
229
- add(obj[i], i);
230
- }
231
- } else {
232
- uristrings.push(encodeURIComponent(temp) + '=' + encodeURIComponent(obj));
233
- }
234
-
235
- return uristrings.join(prefix)
236
- .replace(/^&/, '')
237
- .replace(/%20/g, '+');
238
- };
239
-
240
- //
241
- //
242
- // Uploader Classes
243
- //
244
- //
245
-
246
- var qq = qq || {};
247
-
248
- /**
249
- * Creates upload button, validates upload, but doesn't create file list or dd.
250
- */
251
- qq.FileUploaderBasic = function(o){
252
- this._options = {
253
- // set to true to see the server response
254
- debug: false,
255
- action: '/server/upload',
256
- params: {},
257
- button: null,
258
- multiple: true,
259
- maxConnections: 3,
260
- method: 'POST',
261
- fieldName: 'qqfile',
262
- // validation
263
- allowedExtensions: [],
264
- sizeLimit: 0,
265
- minSizeLimit: 0,
266
- maxFilesCount: 0, // 0 - no limit, works only in multiple mode
267
- minFilesCount: 0, // 0 - no limit, works only in multiple mode
268
- // events
269
- // return false to cancel submit
270
- onSubmit: function(id, fileName){},
271
- onProgress: function(id, fileName, loaded, total){},
272
- onComplete: function(id, fileName, responseJSON){},
273
- onCancel: function(id, fileName){},
274
- // messages
275
- messages: {
276
- typeError: "{file} has invalid extension. Only {extensions} are allowed.",
277
- sizeError: "{file} is too large, maximum file size is {sizeLimit}.",
278
- minSizeError: "{file} is too small, minimum file size is {minSizeLimit}.",
279
- emptyError: "{file} is empty, please select files again without it.",
280
- onLeave: "The files are being uploaded, if you leave now the upload will be cancelled.",
281
- maxFilesError: "You must select less then {maxFilesCount} files.",
282
- minFilesError: "You must select more then {minFilesCount} files."
283
- },
284
- showMessage: function(message){
285
- alert(message);
286
- }
287
- };
288
- qq.extend(this._options, o);
289
-
290
- // number of files being uploaded
291
- this._filesInProgress = 0;
292
- // number of files was processed
293
- this._filesUploaded = 0;
294
- this._handler = this._createUploadHandler();
295
-
296
- if (this._options.button){
297
- this._button = this._createUploadButton(this._options.button);
298
- }
299
-
300
- this._preventLeaveInProgress();
301
- };
302
-
303
- qq.FileUploaderBasic.prototype = {
304
- setParams: function(params){
305
- this._options.params = params;
306
- },
307
- getInProgress: function(){
308
- return this._filesInProgress;
309
- },
310
- _createUploadButton: function(element){
311
- var self = this;
312
-
313
- return new qq.UploadButton({
314
- element: element,
315
- multiple: this._options.multiple && qq.UploadHandlerXhr.isSupported(),
316
- onChange: function(input){
317
- self._onInputChange(input);
318
- }
319
- });
320
- },
321
- _createUploadHandler: function(){
322
- var self = this,
323
- handlerClass;
324
-
325
- if(qq.UploadHandlerXhr.isSupported()){
326
- handlerClass = 'UploadHandlerXhr';
327
- } else {
328
- handlerClass = 'UploadHandlerForm';
329
- }
330
-
331
- var handler = new qq[handlerClass]({
332
- debug: this._options.debug,
333
- action: this._options.action,
334
- maxConnections: this._options.maxConnections,
335
- fieldName: this._options.fieldName,
336
- method: this._options.method,
337
- onProgress: function(id, fileName, loaded, total){
338
- self._onProgress(id, fileName, loaded, total);
339
- self._options.onProgress(id, fileName, loaded, total);
340
- },
341
- onComplete: function(id, fileName, result){
342
- self._onComplete(id, fileName, result);
343
- self._options.onComplete(id, fileName, result);
344
- },
345
- onCancel: function(id, fileName){
346
- self._onCancel(id, fileName);
347
- self._options.onCancel(id, fileName);
348
- }
349
- });
350
-
351
- return handler;
352
- },
353
- _preventLeaveInProgress: function(){
354
- var self = this;
355
-
356
- qq.attach(window, 'beforeunload', function(e){
357
- if (!self._filesInProgress){return;}
358
-
359
- var e = e || window.event;
360
- // for ie, ff
361
- e.returnValue = self._options.messages.onLeave;
362
- // for webkit
363
- return self._options.messages.onLeave;
364
- });
365
- },
366
- _onSubmit: function(id, fileName){
367
- this._filesInProgress++;
368
- },
369
- _onProgress: function(id, fileName, loaded, total){
370
- },
371
- _onComplete: function(id, fileName, result){
372
- this._filesInProgress--;
373
- if (result.error){
374
- this._options.showMessage(result.error);
375
- } else {
376
- this._filesUploaded++;
377
- }
378
- },
379
- _onCancel: function(id, fileName){
380
- this._filesInProgress--;
381
- },
382
- _onInputChange: function(input){
383
- if (this._handler instanceof qq.UploadHandlerXhr){
384
- this._uploadFileList(input.files);
385
- } else {
386
- if (this._validateFile(input)){
387
- this._uploadFile(input);
388
- }
389
- }
390
- this._button.reset();
391
- },
392
- _uploadFileList: function(files){
393
- if ( this._validateFiles(files) ) {
394
- for (var i=0; i<files.length; i++){
395
- this._uploadFile(files[i]);
396
- }
397
- }
398
- },
399
- _uploadFile: function(fileContainer){
400
- var id = this._handler.add(fileContainer);
401
- var fileName = this._handler.getName(id);
402
-
403
- if (this._options.onSubmit(id, fileName) !== false){
404
- this._onSubmit(id, fileName);
405
- this._handler.upload(id, this._options.params);
406
- }
407
- },
408
- _validateFiles: function(files){
409
- var uploadedCount = this._filesUploaded + files.length;
410
-
411
- if (this._options.maxFilesCount > 0) {
412
- if ( uploadedCount > this._options.maxFilesCount) {
413
- this._error('maxFilesError', 'name');
414
- return false;
415
- }
416
- }
417
-
418
- if (this._options.minFilesCount > 0) {
419
- if ( uploadedCount < this._options.minFilesCount) {
420
- this._error('minFilesError', 'name');
421
- return false;
422
- }
423
- }
424
-
425
- for (var i=0; i<files.length; i++){
426
- if ( !this._validateFile(files[i])){
427
- return false;
428
- }
429
- }
430
-
431
- return true;
432
- },
433
- _validateFile: function(file){
434
- var name, size;
435
-
436
- if (file.value){
437
- // it is a file input
438
- // get input value and remove path to normalize
439
- name = file.value.replace(/.*(\/|\\)/, "");
440
- } else {
441
- // fix missing properties in Safari
442
- name = file.fileName != null ? file.fileName : file.name;
443
- size = file.fileSize != null ? file.fileSize : file.size;
444
- }
445
-
446
- if (! this._isAllowedExtension(name)){
447
- this._error('typeError', name);
448
- return false;
449
-
450
- } else if (size === 0){
451
- this._error('emptyError', name);
452
- return false;
453
-
454
- } else if (size && this._options.sizeLimit && size > this._options.sizeLimit){
455
- this._error('sizeError', name);
456
- return false;
457
-
458
- } else if (size && size < this._options.minSizeLimit){
459
- this._error('minSizeError', name);
460
- return false;
461
- }
462
-
463
- return true;
464
- },
465
- _error: function(code, fileName){
466
- var message = this._options.messages[code];
467
- function r(name, replacement){ message = message.replace(name, replacement); }
468
-
469
- r('{file}', this._formatFileName(fileName));
470
- r('{extensions}', this._options.allowedExtensions.join(', '));
471
- r('{sizeLimit}', this._formatSize(this._options.sizeLimit));
472
- r('{minSizeLimit}', this._formatSize(this._options.minSizeLimit));
473
- r('{maxFilesCount}', this._options.maxFilesCount);
474
- r('{minFilesCount}', this._options.minFilesCount);
475
-
476
- this._options.showMessage(message);
477
- },
478
- _formatFileName: function(name){
479
- if (name.length > 33){
480
- name = name.slice(0, 19) + '...' + name.slice(-13);
481
- }
482
- return name;
483
- },
484
- _isAllowedExtension: function(fileName){
485
- var ext = (-1 !== fileName.indexOf('.')) ? fileName.replace(/.*[.]/, '').toLowerCase() : '';
486
- var allowed = this._options.allowedExtensions;
487
-
488
- if (!allowed.length){return true;}
489
-
490
- for (var i=0; i<allowed.length; i++){
491
- if (allowed[i].toLowerCase() == ext){ return true;}
492
- }
493
-
494
- return false;
495
- },
496
- _formatSize: function(bytes){
497
- var i = -1;
498
- do {
499
- bytes = bytes / 1024;
500
- i++;
501
- } while (bytes > 99);
502
-
503
- return Math.max(bytes, 0.1).toFixed(1) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
504
- }
505
- };
506
-
507
-
508
- /**
509
- * Class that creates upload widget with drag-and-drop and file list
510
- * @inherits qq.FileUploaderBasic
511
- */
512
- qq.FileUploader = function(o){
513
- // call parent constructor
514
- qq.FileUploaderBasic.apply(this, arguments);
515
-
516
- // additional options
517
- qq.extend(this._options, {
518
- element: null,
519
- // if set, will be used instead of qq-upload-list in template
520
- listElement: null,
521
-
522
- template: '<div class="qq-uploader">' +
523
- '<div class="qq-upload-drop-area"><span>Drop files here to upload</span></div>' +
524
- '<div class="qq-upload-button">Upload a file</div>' +
525
- '<ul class="qq-upload-list"></ul>' +
526
- '</div>',
527
-
528
- // template for one item in file list
529
- fileTemplate: '<li>' +
530
- '<span class="qq-upload-file"></span>' +
531
- '<span class="qq-upload-spinner"></span>' +
532
- '<span class="qq-upload-size"></span>' +
533
- '<a class="qq-upload-cancel" href="#">Cancel</a>' +
534
- '<span class="qq-upload-failed-text">Failed</span>' +
535
- '</li>',
536
-
537
- classes: {
538
- // used to get elements from templates
539
- button: 'qq-upload-button',
540
- drop: 'qq-upload-drop-area',
541
- dropActive: 'qq-upload-drop-area-active',
542
- list: 'qq-upload-list',
543
-
544
- file: 'qq-upload-file',
545
- spinner: 'qq-upload-spinner',
546
- size: 'qq-upload-size',
547
- cancel: 'qq-upload-cancel',
548
-
549
- // added to list item when upload completes
550
- // used in css to hide progress spinner
551
- success: 'qq-upload-success',
552
- fail: 'qq-upload-fail'
553
- }
554
- });
555
- // overwrite options with user supplied
556
- qq.extend(this._options, o);
557
-
558
- this._element = this._options.element;
559
- this._element.innerHTML = this._options.template;
560
- this._listElement = this._options.listElement || this._find(this._element, 'list');
561
-
562
- this._classes = this._options.classes;
563
-
564
- this._button = this._createUploadButton(this._find(this._element, 'button'));
565
-
566
- this._bindCancelEvent();
567
- this._setupDragDrop();
568
- };
569
-
570
- // inherit from Basic Uploader
571
- qq.extend(qq.FileUploader.prototype, qq.FileUploaderBasic.prototype);
572
-
573
- qq.extend(qq.FileUploader.prototype, {
574
- /**
575
- * Gets one of the elements listed in this._options.classes
576
- **/
577
- _find: function(parent, type){
578
- var element = qq.getByClass(parent, this._options.classes[type])[0];
579
- if (!element){
580
- throw new Error('element not found ' + type);
581
- }
582
-
583
- return element;
584
- },
585
- _setupDragDrop: function(){
586
- var self = this,
587
- dropArea = this._find(this._element, 'drop');
588
-
589
- var dz = new qq.UploadDropZone({
590
- element: dropArea,
591
- onEnter: function(e){
592
- qq.addClass(dropArea, self._classes.dropActive);
593
- e.stopPropagation();
594
- },
595
- onLeave: function(e){
596
- e.stopPropagation();
597
- },
598
- onLeaveNotDescendants: function(e){
599
- qq.removeClass(dropArea, self._classes.dropActive);
600
- },
601
- onDrop: function(e){
602
- dropArea.style.display = 'none';
603
- qq.removeClass(dropArea, self._classes.dropActive);
604
- self._uploadFileList(e.dataTransfer.files);
605
- }
606
- });
607
-
608
- dropArea.style.display = 'none';
609
-
610
- qq.attach(document, 'dragenter', function(e){
611
- if (!dz._isValidFileDrag(e)) return;
612
-
613
- dropArea.style.display = 'block';
614
- });
615
- qq.attach(document, 'dragleave', function(e){
616
- if (!dz._isValidFileDrag(e)) return;
617
-
618
- var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);
619
- // only fire when leaving document out
620
- if ( ! relatedTarget || relatedTarget.nodeName == "HTML"){
621
- dropArea.style.display = 'none';
622
- }
623
- });
624
- },
625
- _onSubmit: function(id, fileName){
626
- qq.FileUploaderBasic.prototype._onSubmit.apply(this, arguments);
627
- this._addToList(id, fileName);
628
- },
629
- _onProgress: function(id, fileName, loaded, total){
630
- qq.FileUploaderBasic.prototype._onProgress.apply(this, arguments);
631
-
632
- var item = this._getItemByFileId(id);
633
- var size = this._find(item, 'size');
634
- size.style.display = 'inline';
635
-
636
- var text;
637
- if (loaded != total){
638
- text = Math.round(loaded / total * 100) + '% from ' + this._formatSize(total);
639
- } else {
640
- text = this._formatSize(total);
641
- }
642
-
643
- qq.setText(size, text);
644
- },
645
- _onComplete: function(id, fileName, result){
646
- qq.FileUploaderBasic.prototype._onComplete.apply(this, arguments);
647
-
648
- // mark completed
649
- var item = this._getItemByFileId(id);
650
- qq.remove(this._find(item, 'cancel'));
651
- qq.remove(this._find(item, 'spinner'));
652
-
653
- if (result.success){
654
- qq.addClass(item, this._classes.success);
655
- } else {
656
- qq.addClass(item, this._classes.fail);
657
- }
658
- },
659
- _addToList: function(id, fileName){
660
- var item = qq.toElement(this._options.fileTemplate);
661
- item.qqFileId = id;
662
-
663
- var fileElement = this._find(item, 'file');
664
- qq.setText(fileElement, this._formatFileName(fileName));
665
- this._find(item, 'size').style.display = 'none';
666
-
667
- this._listElement.appendChild(item);
668
- },
669
- _getItemByFileId: function(id){
670
- var item = this._listElement.firstChild;
671
-
672
- // there can't be txt nodes in dynamically created list
673
- // and we can use nextSibling
674
- while (item){
675
- if (item.qqFileId == id) return item;
676
- item = item.nextSibling;
677
- }
678
- },
679
- /**
680
- * delegate click event for cancel link
681
- **/
682
- _bindCancelEvent: function(){
683
- var self = this,
684
- list = this._listElement;
685
-
686
- qq.attach(list, 'click', function(e){
687
- e = e || window.event;
688
- var target = e.target || e.srcElement;
689
-
690
- if (qq.hasClass(target, self._classes.cancel)){
691
- qq.preventDefault(e);
692
-
693
- var item = target.parentNode;
694
- self._handler.cancel(item.qqFileId);
695
- qq.remove(item);
696
- }
697
- });
698
- }
699
- });
700
-
701
- qq.UploadDropZone = function(o){
702
- this._options = {
703
- element: null,
704
- onEnter: function(e){},
705
- onLeave: function(e){},
706
- // is not fired when leaving element by hovering descendants
707
- onLeaveNotDescendants: function(e){},
708
- onDrop: function(e){}
709
- };
710
- qq.extend(this._options, o);
711
-
712
- this._element = this._options.element;
713
-
714
- this._disableDropOutside();
715
- this._attachEvents();
716
- };
717
-
718
- qq.UploadDropZone.prototype = {
719
- _disableDropOutside: function(e){
720
- // run only once for all instances
721
- if (!qq.UploadDropZone.dropOutsideDisabled ){
722
-
723
- qq.attach(document, 'dragover', function(e){
724
- if (e.dataTransfer){
725
- e.dataTransfer.dropEffect = 'none';
726
- e.preventDefault();
727
- }
728
- });
729
-
730
- qq.UploadDropZone.dropOutsideDisabled = true;
731
- }
732
- },
733
- _attachEvents: function(){
734
- var self = this;
735
-
736
- qq.attach(self._element, 'dragover', function(e){
737
- if (!self._isValidFileDrag(e)) return;
738
-
739
- var effect = e.dataTransfer.effectAllowed;
740
- if (effect == 'move' || effect == 'linkMove'){
741
- e.dataTransfer.dropEffect = 'move'; // for FF (only move allowed)
742
- } else {
743
- e.dataTransfer.dropEffect = 'copy'; // for Chrome
744
- }
745
-
746
- e.stopPropagation();
747
- e.preventDefault();
748
- });
749
-
750
- qq.attach(self._element, 'dragenter', function(e){
751
- if (!self._isValidFileDrag(e)) return;
752
-
753
- self._options.onEnter(e);
754
- });
755
-
756
- qq.attach(self._element, 'dragleave', function(e){
757
- if (!self._isValidFileDrag(e)) return;
758
-
759
- self._options.onLeave(e);
760
-
761
- var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);
762
- // do not fire when moving a mouse over a descendant
763
- if (qq.contains(this, relatedTarget)) return;
764
-
765
- self._options.onLeaveNotDescendants(e);
766
- });
767
-
768
- qq.attach(self._element, 'drop', function(e){
769
- if (!self._isValidFileDrag(e)) return;
770
-
771
- e.preventDefault();
772
- self._options.onDrop(e);
773
- });
774
- },
775
- _isValidFileDrag: function(e){
776
- var dt = e.dataTransfer,
777
- // do not check dt.types.contains in webkit, because it crashes safari 4
778
- isWebkit = navigator.userAgent.indexOf("AppleWebKit") > -1;
779
-
780
- // dt.effectAllowed is none in Safari 5
781
- // dt.types.contains check is for firefox
782
- return dt && dt.effectAllowed != 'none' &&
783
- (dt.files || (!isWebkit && dt.types.contains && dt.types.contains('Files')));
784
-
785
- }
786
- };
787
-
788
- qq.UploadButton = function(o){
789
- this._options = {
790
- element: null,
791
- // if set to true adds multiple attribute to file input
792
- multiple: false,
793
- // name attribute of file input
794
- name: 'file',
795
- onChange: function(input){},
796
- hoverClass: 'qq-upload-button-hover',
797
- focusClass: 'qq-upload-button-focus'
798
- };
799
-
800
- qq.extend(this._options, o);
801
-
802
- this._element = this._options.element;
803
-
804
- // make button suitable container for input
805
- qq.css(this._element, {
806
- position: 'relative',
807
- overflow: 'hidden',
808
- // Make sure browse button is in the right side
809
- // in Internet Explorer
810
- direction: 'ltr'
811
- });
812
-
813
- this._input = this._createInput();
814
- };
815
-
816
- qq.UploadButton.prototype = {
817
- /* returns file input element */
818
- getInput: function(){
819
- return this._input;
820
- },
821
- /* cleans/recreates the file input */
822
- reset: function(){
823
- if (this._input.parentNode){
824
- qq.remove(this._input);
825
- }
826
-
827
- qq.removeClass(this._element, this._options.focusClass);
828
- this._input = this._createInput();
829
- },
830
- _createInput: function(){
831
- var input = document.createElement("input");
832
-
833
- if (this._options.multiple){
834
- input.setAttribute("multiple", "multiple");
835
- }
836
-
837
- input.setAttribute("type", "file");
838
- input.setAttribute("name", this._options.name);
839
-
840
- qq.css(input, {
841
- position: 'absolute',
842
- // in Opera only 'browse' button
843
- // is clickable and it is located at
844
- // the right side of the input
845
- right: 0,
846
- top: 0,
847
- fontFamily: 'Arial',
848
- // 4 persons reported this, the max values that worked for them were 243, 236, 236, 118
849
- fontSize: '118px',
850
- margin: 0,
851
- padding: 0,
852
- cursor: 'pointer',
853
- opacity: 0
854
- });
855
-
856
- this._element.appendChild(input);
857
-
858
- var self = this;
859
- qq.attach(input, 'change', function(){
860
- self._options.onChange(input);
861
- });
862
-
863
- qq.attach(input, 'mouseover', function(){
864
- qq.addClass(self._element, self._options.hoverClass);
865
- });
866
- qq.attach(input, 'mouseout', function(){
867
- qq.removeClass(self._element, self._options.hoverClass);
868
- });
869
- qq.attach(input, 'focus', function(){
870
- qq.addClass(self._element, self._options.focusClass);
871
- });
872
- qq.attach(input, 'blur', function(){
873
- qq.removeClass(self._element, self._options.focusClass);
874
- });
875
-
876
- // IE and Opera, unfortunately have 2 tab stops on file input
877
- // which is unacceptable in our case, disable keyboard access
878
- if (window.attachEvent){
879
- // it is IE or Opera
880
- input.setAttribute('tabIndex', "-1");
881
- }
882
-
883
- return input;
884
- }
885
- };
886
-
887
- /**
888
- * Class for uploading files, uploading itself is handled by child classes
889
- */
890
- qq.UploadHandlerAbstract = function(o){
891
- this._options = {
892
- debug: false,
893
- action: '/upload.php',
894
- method: 'POST',
895
- fieldName: 'qqfile',
896
- // maximum number of concurrent uploads
897
- maxConnections: 999,
898
- onProgress: function(id, fileName, loaded, total){},
899
- onComplete: function(id, fileName, response){},
900
- onCancel: function(id, fileName){}
901
- };
902
- qq.extend(this._options, o);
903
-
904
- this._queue = [];
905
- // params for files in queue
906
- this._params = [];
907
- };
908
- qq.UploadHandlerAbstract.prototype = {
909
- log: function(str){
910
- if (this._options.debug && window.console) console.log('[uploader] ' + str);
911
- },
912
- /**
913
- * Adds file or file input to the queue
914
- * @returns id
915
- **/
916
- add: function(file){},
917
- /**
918
- * Sends the file identified by id and additional query params to the server
919
- */
920
- upload: function(id, params){
921
- var len = this._queue.push(id);
922
-
923
- var copy = {};
924
- qq.extend(copy, params);
925
- this._params[id] = copy;
926
-
927
- // if too many active uploads, wait...
928
- if (len <= this._options.maxConnections){
929
- this._upload(id, this._params[id]);
930
- }
931
- },
932
- /**
933
- * Cancels file upload by id
934
- */
935
- cancel: function(id){
936
- this._cancel(id);
937
- this._dequeue(id);
938
- },
939
- /**
940
- * Cancells all uploads
941
- */
942
- cancelAll: function(){
943
- for (var i=0; i<this._queue.length; i++){
944
- this._cancel(this._queue[i]);
945
- }
946
- this._queue = [];
947
- },
948
- /**
949
- * Returns name of the file identified by id
950
- */
951
- getName: function(id){},
952
- /**
953
- * Returns size of the file identified by id
954
- */
955
- getSize: function(id){},
956
- /**
957
- * Returns id of files being uploaded or
958
- * waiting for their turn
959
- */
960
- getQueue: function(){
961
- return this._queue;
962
- },
963
- /**
964
- * Actual upload method
965
- */
966
- _upload: function(id){},
967
- /**
968
- * Actual cancel method
969
- */
970
- _cancel: function(id){},
971
- /**
972
- * Removes element from queue, starts upload of next
973
- */
974
- _dequeue: function(id){
975
- var i = qq.indexOf(this._queue, id);
976
- this._queue.splice(i, 1);
977
-
978
- var max = this._options.maxConnections;
979
-
980
- if (this._queue.length >= max && i < max){
981
- var nextId = this._queue[max-1];
982
- this._upload(nextId, this._params[nextId]);
983
- }
984
- }
985
- };
986
-
987
- /**
988
- * Class for uploading files using form and iframe
989
- * @inherits qq.UploadHandlerAbstract
990
- */
991
- qq.UploadHandlerForm = function(o){
992
- qq.UploadHandlerAbstract.apply(this, arguments);
993
-
994
- this._inputs = {};
995
- };
996
- // @inherits qq.UploadHandlerAbstract
997
- qq.extend(qq.UploadHandlerForm.prototype, qq.UploadHandlerAbstract.prototype);
998
-
999
- qq.extend(qq.UploadHandlerForm.prototype, {
1000
- add: function(fileInput){
1001
- fileInput.setAttribute('name', this._options.fieldName);
1002
- var id = 'qq-upload-handler-iframe' + qq.getUniqueId();
1003
-
1004
- this._inputs[id] = fileInput;
1005
-
1006
- // remove file input from DOM
1007
- if (fileInput.parentNode){
1008
- qq.remove(fileInput);
1009
- }
1010
-
1011
- return id;
1012
- },
1013
- getName: function(id){
1014
- // get input value and remove path to normalize
1015
- return this._inputs[id].value.replace(/.*(\/|\\)/, "");
1016
- },
1017
- _cancel: function(id){
1018
- this._options.onCancel(id, this.getName(id));
1019
-
1020
- delete this._inputs[id];
1021
-
1022
- var iframe = document.getElementById(id);
1023
- if (iframe){
1024
- // to cancel request set src to something else
1025
- // we use src="javascript:false;" because it doesn't
1026
- // trigger ie6 prompt on https
1027
- iframe.setAttribute('src', 'javascript:false;');
1028
-
1029
- qq.remove(iframe);
1030
- }
1031
- },
1032
- _upload: function(id, params){
1033
- var input = this._inputs[id];
1034
-
1035
- if (!input){
1036
- throw new Error('file with passed id was not added, or already uploaded or cancelled');
1037
- }
1038
-
1039
- var fileName = this.getName(id);
1040
-
1041
- var iframe = this._createIframe(id);
1042
- var form = this._createForm(iframe, params);
1043
- form.appendChild(input);
1044
-
1045
- var self = this;
1046
- this._attachLoadEvent(iframe, function(){
1047
- self.log('iframe loaded');
1048
-
1049
- var response = self._getIframeContentJSON(iframe);
1050
-
1051
- self._options.onComplete(id, fileName, response);
1052
- self._dequeue(id);
1053
-
1054
- delete self._inputs[id];
1055
- // timeout added to fix busy state in FF3.6
1056
- setTimeout(function(){
1057
- qq.remove(iframe);
1058
- }, 1);
1059
- });
1060
-
1061
- form.submit();
1062
- qq.remove(form);
1063
-
1064
- return id;
1065
- },
1066
- _attachLoadEvent: function(iframe, callback){
1067
- qq.attach(iframe, 'load', function(){
1068
- // when we remove iframe from dom
1069
- // the request stops, but in IE load
1070
- // event fires
1071
- if (!iframe.parentNode){
1072
- return;
1073
- }
1074
-
1075
- // fixing Opera 10.53
1076
- if (iframe.contentDocument &&
1077
- iframe.contentDocument.body &&
1078
- iframe.contentDocument.body.innerHTML == "false"){
1079
- // In Opera event is fired second time
1080
- // when body.innerHTML changed from false
1081
- // to server response approx. after 1 sec
1082
- // when we upload file with iframe
1083
- return;
1084
- }
1085
-
1086
- callback();
1087
- });
1088
- },
1089
- /**
1090
- * Returns json object received by iframe from server.
1091
- */
1092
- _getIframeContentJSON: function(iframe){
1093
- // iframe.contentWindow.document - for IE<7
1094
- var doc = iframe.contentDocument ? iframe.contentDocument: iframe.contentWindow.document,
1095
- response;
1096
-
1097
- this.log("converting iframe's innerHTML to JSON");
1098
- this.log("innerHTML = " + doc.body.innerHTML);
1099
-
1100
- try {
1101
- response = eval("(" + doc.body.innerHTML + ")");
1102
- } catch(err){
1103
- response = {};
1104
- }
1105
-
1106
- return response;
1107
- },
1108
- /**
1109
- * Creates iframe with unique name
1110
- */
1111
- _createIframe: function(id){
1112
- // We can't use following code as the name attribute
1113
- // won't be properly registered in IE6, and new window
1114
- // on form submit will open
1115
- // var iframe = document.createElement('iframe');
1116
- // iframe.setAttribute('name', id);
1117
-
1118
- var iframe = qq.toElement('<iframe src="javascript:false;" name="' + id + '" />');
1119
- // src="javascript:false;" removes ie6 prompt on https
1120
-
1121
- iframe.setAttribute('id', id);
1122
-
1123
- iframe.style.display = 'none';
1124
- document.body.appendChild(iframe);
1125
-
1126
- return iframe;
1127
- },
1128
- /**
1129
- * Creates form, that will be submitted to iframe
1130
- */
1131
- _createForm: function(iframe, params){
1132
- // We can't use the following code in IE6
1133
- // var form = document.createElement('form');
1134
- // form.setAttribute('method', 'post');
1135
- // form.setAttribute('enctype', 'multipart/form-data');
1136
- // Because in this case file won't be attached to request
1137
- var form = qq.toElement('<form enctype="multipart/form-data"></form>');
1138
-
1139
- var queryString = qq.obj2url(params, this._options.action);
1140
-
1141
- form.setAttribute('method', this._options.method);
1142
- form.setAttribute('action', queryString);
1143
- form.setAttribute('target', iframe.name);
1144
- form.style.display = 'none';
1145
-
1146
- // Rails CSRFProtection
1147
- var token = $('meta[name="csrf-token"]').attr('content');
1148
- var param = $('meta[name="csrf-param"]').attr('content');
1149
- var input = qq.toElement('<input type="hidden" />');
1150
-
1151
- input.setAttribute('name', param);
1152
- input.setAttribute('value', token);
1153
-
1154
- form.appendChild(input);
1155
- document.body.appendChild(form);
1156
-
1157
- return form;
1158
- }
1159
- });
1160
-
1161
- /**
1162
- * Class for uploading files using xhr
1163
- * @inherits qq.UploadHandlerAbstract
1164
- */
1165
- qq.UploadHandlerXhr = function(o){
1166
- qq.UploadHandlerAbstract.apply(this, arguments);
1167
-
1168
- this._files = [];
1169
- this._xhrs = [];
1170
-
1171
- // current loaded size in bytes for each file
1172
- this._loaded = [];
1173
- };
1174
-
1175
- // static method
1176
- qq.UploadHandlerXhr.isSupported = function(){
1177
- var input = document.createElement('input');
1178
- input.type = 'file';
1179
-
1180
- return (
1181
- 'multiple' in input &&
1182
- typeof File != "undefined" &&
1183
- typeof (new XMLHttpRequest()).upload != "undefined" );
1184
- };
1185
-
1186
- // @inherits qq.UploadHandlerAbstract
1187
- qq.extend(qq.UploadHandlerXhr.prototype, qq.UploadHandlerAbstract.prototype)
1188
-
1189
- qq.extend(qq.UploadHandlerXhr.prototype, {
1190
- /**
1191
- * Adds file to the queue
1192
- * Returns id to use with upload, cancel
1193
- **/
1194
- add: function(file){
1195
- if (!(file instanceof File)){
1196
- throw new Error('Passed obj in not a File (in qq.UploadHandlerXhr)');
1197
- }
1198
-
1199
- return this._files.push(file) - 1;
1200
- },
1201
- getName: function(id){
1202
- var file = this._files[id];
1203
- // fix missing name in Safari 4
1204
- return file.fileName != null ? file.fileName : file.name;
1205
- },
1206
- getSize: function(id){
1207
- var file = this._files[id];
1208
- return file.fileSize != null ? file.fileSize : file.size;
1209
- },
1210
- /**
1211
- * Returns uploaded bytes for file identified by id
1212
- */
1213
- getLoaded: function(id){
1214
- return this._loaded[id] || 0;
1215
- },
1216
- /**
1217
- * Sends the file identified by id and additional query params to the server
1218
- * @param {Object} params name-value string pairs
1219
- */
1220
- _upload: function(id, params){
1221
- var file = this._files[id],
1222
- name = this.getName(id),
1223
- size = this.getSize(id);
1224
-
1225
- this._loaded[id] = 0;
1226
-
1227
- var xhr = this._xhrs[id] = new XMLHttpRequest();
1228
- var self = this;
1229
-
1230
- xhr.upload.onprogress = function(e){
1231
- if (e.lengthComputable){
1232
- self._loaded[id] = e.loaded;
1233
- self._options.onProgress(id, name, e.loaded, e.total);
1234
- }
1235
- };
1236
-
1237
- xhr.onreadystatechange = function(){
1238
- if (xhr.readyState == 4){
1239
- self._onComplete(id, xhr);
1240
- }
1241
- };
1242
-
1243
- // build query string
1244
- params = params || {};
1245
- params[this._options.fieldName] = name;
1246
- var queryString = qq.obj2url(params, this._options.action);
1247
-
1248
- xhr.open(this._options.method, queryString, true);
1249
- xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
1250
- xhr.setRequestHeader("X-File-Name", encodeURIComponent(name));
1251
- xhr.setRequestHeader('X-File-Size', size);
1252
- xhr.setRequestHeader('X-File-Type', file.type);
1253
- xhr.setRequestHeader("Content-Type", "application/octet-stream");
1254
-
1255
- // Rails CSRFProtection
1256
- if ($.rails) $.rails.CSRFProtection(xhr);
1257
-
1258
- xhr.send(file);
1259
- },
1260
- _onComplete: function(id, xhr){
1261
- // the request was aborted/cancelled
1262
- if (!this._files[id]) return;
1263
-
1264
- var name = this.getName(id);
1265
- var size = this.getSize(id);
1266
-
1267
- this._options.onProgress(id, name, size, size);
1268
-
1269
- if ([200, 201].indexOf( xhr.status ) > -1){
1270
- this.log("xhr - server response received");
1271
- this.log("responseText = " + xhr.responseText);
1272
-
1273
- var response;
1274
-
1275
- try {
1276
- response = eval("(" + xhr.responseText + ")");
1277
- } catch(err){
1278
- response = {};
1279
- }
1280
-
1281
- this._options.onComplete(id, name, response);
1282
-
1283
- } else {
1284
- this._options.onComplete(id, name, {});
1285
- }
1286
-
1287
- this._files[id] = null;
1288
- this._xhrs[id] = null;
1289
- this._dequeue(id);
1290
- },
1291
- _cancel: function(id){
1292
- this._options.onCancel(id, this.getName(id));
1293
-
1294
- this._files[id] = null;
1295
-
1296
- if (this._xhrs[id]){
1297
- this._xhrs[id].abort();
1298
- this._xhrs[id] = null;
1299
- }
1300
- }
1301
- });