qwerty 0.0.1.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (664) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +16 -0
  3. data/Rakefile +39 -0
  4. data/app/assets/images/qwerty/admin/icons/down.png +0 -0
  5. data/app/assets/images/qwerty/admin/icons/up.png +0 -0
  6. data/app/assets/javascripts/application.js +8 -0
  7. data/app/assets/javascripts/ckeditor/CHANGES.html +1433 -0
  8. data/app/assets/javascripts/ckeditor/INSTALL.html +92 -0
  9. data/app/assets/javascripts/ckeditor/LICENSE.html +1327 -0
  10. data/app/assets/javascripts/ckeditor/adapters/jquery.js +6 -0
  11. data/app/assets/javascripts/ckeditor/ckeditor.js +149 -0
  12. data/app/assets/javascripts/ckeditor/ckeditor.pack +211 -0
  13. data/app/assets/javascripts/ckeditor/ckeditor_basic.js +8 -0
  14. data/app/assets/javascripts/ckeditor/ckeditor_basic_source.js +20 -0
  15. data/app/assets/javascripts/ckeditor/ckeditor_source.js +35 -0
  16. data/app/assets/javascripts/ckeditor/config.js +78 -0
  17. data/app/assets/javascripts/ckeditor/contents.css +25 -0
  18. data/app/assets/javascripts/ckeditor/filebrowser/images/gal_add.jpg +0 -0
  19. data/app/assets/javascripts/ckeditor/filebrowser/images/gal_add.png +0 -0
  20. data/app/assets/javascripts/ckeditor/filebrowser/images/gal_del.png +0 -0
  21. data/app/assets/javascripts/ckeditor/filebrowser/images/gal_more.gif +0 -0
  22. data/app/assets/javascripts/ckeditor/filebrowser/images/preloader.gif +0 -0
  23. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/ckfnothumb.gif +0 -0
  24. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/mp3.gif +0 -0
  25. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/pdf.gif +0 -0
  26. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/rar.gif +0 -0
  27. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/swf.gif +0 -0
  28. data/app/assets/javascripts/ckeditor/filebrowser/images/thumbs/xls.gif +0 -0
  29. data/app/assets/javascripts/ckeditor/filebrowser/javascripts/application.js +222 -0
  30. data/app/assets/javascripts/ckeditor/filebrowser/javascripts/fileuploader.js +1301 -0
  31. data/app/assets/javascripts/ckeditor/filebrowser/javascripts/jquery.js +18 -0
  32. data/app/assets/javascripts/ckeditor/filebrowser/javascripts/jquery.tmpl.js +10 -0
  33. data/app/assets/javascripts/ckeditor/filebrowser/javascripts/rails.js +363 -0
  34. data/app/assets/javascripts/ckeditor/filebrowser/stylesheets/uploader.css +117 -0
  35. data/app/assets/javascripts/ckeditor/images/spacer.gif +0 -0
  36. data/app/assets/javascripts/ckeditor/lang/_languages.js +6 -0
  37. data/app/assets/javascripts/ckeditor/lang/_translationstatus.txt +61 -0
  38. data/app/assets/javascripts/ckeditor/lang/af.js +6 -0
  39. data/app/assets/javascripts/ckeditor/lang/ar.js +6 -0
  40. data/app/assets/javascripts/ckeditor/lang/bg.js +6 -0
  41. data/app/assets/javascripts/ckeditor/lang/bn.js +6 -0
  42. data/app/assets/javascripts/ckeditor/lang/bs.js +6 -0
  43. data/app/assets/javascripts/ckeditor/lang/ca.js +6 -0
  44. data/app/assets/javascripts/ckeditor/lang/cs.js +6 -0
  45. data/app/assets/javascripts/ckeditor/lang/cy.js +6 -0
  46. data/app/assets/javascripts/ckeditor/lang/da.js +6 -0
  47. data/app/assets/javascripts/ckeditor/lang/de.js +6 -0
  48. data/app/assets/javascripts/ckeditor/lang/el.js +6 -0
  49. data/app/assets/javascripts/ckeditor/lang/en-au.js +6 -0
  50. data/app/assets/javascripts/ckeditor/lang/en-ca.js +6 -0
  51. data/app/assets/javascripts/ckeditor/lang/en-gb.js +6 -0
  52. data/app/assets/javascripts/ckeditor/lang/en.js +6 -0
  53. data/app/assets/javascripts/ckeditor/lang/eo.js +6 -0
  54. data/app/assets/javascripts/ckeditor/lang/es.js +6 -0
  55. data/app/assets/javascripts/ckeditor/lang/et.js +6 -0
  56. data/app/assets/javascripts/ckeditor/lang/eu.js +6 -0
  57. data/app/assets/javascripts/ckeditor/lang/fa.js +6 -0
  58. data/app/assets/javascripts/ckeditor/lang/fi.js +6 -0
  59. data/app/assets/javascripts/ckeditor/lang/fo.js +6 -0
  60. data/app/assets/javascripts/ckeditor/lang/fr-ca.js +6 -0
  61. data/app/assets/javascripts/ckeditor/lang/fr.js +6 -0
  62. data/app/assets/javascripts/ckeditor/lang/gl.js +6 -0
  63. data/app/assets/javascripts/ckeditor/lang/gu.js +6 -0
  64. data/app/assets/javascripts/ckeditor/lang/he.js +6 -0
  65. data/app/assets/javascripts/ckeditor/lang/hi.js +6 -0
  66. data/app/assets/javascripts/ckeditor/lang/hr.js +6 -0
  67. data/app/assets/javascripts/ckeditor/lang/hu.js +6 -0
  68. data/app/assets/javascripts/ckeditor/lang/is.js +6 -0
  69. data/app/assets/javascripts/ckeditor/lang/it.js +6 -0
  70. data/app/assets/javascripts/ckeditor/lang/ja.js +6 -0
  71. data/app/assets/javascripts/ckeditor/lang/ka.js +6 -0
  72. data/app/assets/javascripts/ckeditor/lang/km.js +6 -0
  73. data/app/assets/javascripts/ckeditor/lang/ko.js +6 -0
  74. data/app/assets/javascripts/ckeditor/lang/lt.js +6 -0
  75. data/app/assets/javascripts/ckeditor/lang/lv.js +6 -0
  76. data/app/assets/javascripts/ckeditor/lang/mn.js +6 -0
  77. data/app/assets/javascripts/ckeditor/lang/ms.js +6 -0
  78. data/app/assets/javascripts/ckeditor/lang/nb.js +6 -0
  79. data/app/assets/javascripts/ckeditor/lang/nl.js +6 -0
  80. data/app/assets/javascripts/ckeditor/lang/no.js +6 -0
  81. data/app/assets/javascripts/ckeditor/lang/pl.js +6 -0
  82. data/app/assets/javascripts/ckeditor/lang/pt-br.js +6 -0
  83. data/app/assets/javascripts/ckeditor/lang/pt.js +6 -0
  84. data/app/assets/javascripts/ckeditor/lang/ro.js +6 -0
  85. data/app/assets/javascripts/ckeditor/lang/ru.js +6 -0
  86. data/app/assets/javascripts/ckeditor/lang/sk.js +6 -0
  87. data/app/assets/javascripts/ckeditor/lang/sl.js +6 -0
  88. data/app/assets/javascripts/ckeditor/lang/sr-latn.js +6 -0
  89. data/app/assets/javascripts/ckeditor/lang/sr.js +6 -0
  90. data/app/assets/javascripts/ckeditor/lang/sv.js +6 -0
  91. data/app/assets/javascripts/ckeditor/lang/th.js +6 -0
  92. data/app/assets/javascripts/ckeditor/lang/tr.js +6 -0
  93. data/app/assets/javascripts/ckeditor/lang/uk.js +6 -0
  94. data/app/assets/javascripts/ckeditor/lang/vi.js +6 -0
  95. data/app/assets/javascripts/ckeditor/lang/zh-cn.js +6 -0
  96. data/app/assets/javascripts/ckeditor/lang/zh.js +6 -0
  97. data/app/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +7 -0
  98. data/app/assets/javascripts/ckeditor/plugins/a11yhelp/lang/en.js +6 -0
  99. data/app/assets/javascripts/ckeditor/plugins/a11yhelp/lang/he.js +6 -0
  100. data/app/assets/javascripts/ckeditor/plugins/about/dialogs/about.js +6 -0
  101. data/app/assets/javascripts/ckeditor/plugins/about/dialogs/logo_ckeditor.png +0 -0
  102. data/app/assets/javascripts/ckeditor/plugins/adobeair/plugin.js +6 -0
  103. data/app/assets/javascripts/ckeditor/plugins/ajax/plugin.js +6 -0
  104. data/app/assets/javascripts/ckeditor/plugins/attachment/dialogs/attachment.js +1 -0
  105. data/app/assets/javascripts/ckeditor/plugins/attachment/images/attachment.png +0 -0
  106. data/app/assets/javascripts/ckeditor/plugins/attachment/lang/en.js +10 -0
  107. data/app/assets/javascripts/ckeditor/plugins/attachment/lang/ru.js +10 -0
  108. data/app/assets/javascripts/ckeditor/plugins/attachment/lang/uk.js +10 -0
  109. data/app/assets/javascripts/ckeditor/plugins/attachment/plugin.js +1 -0
  110. data/app/assets/javascripts/ckeditor/plugins/autogrow/plugin.js +6 -0
  111. data/app/assets/javascripts/ckeditor/plugins/bbcode/plugin.js +9 -0
  112. data/app/assets/javascripts/ckeditor/plugins/clipboard/dialogs/paste.js +7 -0
  113. data/app/assets/javascripts/ckeditor/plugins/colordialog/dialogs/colordialog.js +7 -0
  114. data/app/assets/javascripts/ckeditor/plugins/devtools/lang/en.js +6 -0
  115. data/app/assets/javascripts/ckeditor/plugins/devtools/plugin.js +6 -0
  116. data/app/assets/javascripts/ckeditor/plugins/dialog/dialogDefinition.js +4 -0
  117. data/app/assets/javascripts/ckeditor/plugins/div/dialogs/div.js +8 -0
  118. data/app/assets/javascripts/ckeditor/plugins/docprops/dialogs/docprops.js +10 -0
  119. data/app/assets/javascripts/ckeditor/plugins/docprops/plugin.js +6 -0
  120. data/app/assets/javascripts/ckeditor/plugins/embed/dialogs/embed.js +1 -0
  121. data/app/assets/javascripts/ckeditor/plugins/embed/images/embed.png +0 -0
  122. data/app/assets/javascripts/ckeditor/plugins/embed/lang/en.js +9 -0
  123. data/app/assets/javascripts/ckeditor/plugins/embed/lang/ru.js +9 -0
  124. data/app/assets/javascripts/ckeditor/plugins/embed/lang/uk.js +9 -0
  125. data/app/assets/javascripts/ckeditor/plugins/embed/plugin.js +1 -0
  126. data/app/assets/javascripts/ckeditor/plugins/find/dialogs/find.js +10 -0
  127. data/app/assets/javascripts/ckeditor/plugins/flash/dialogs/flash.js +9 -0
  128. data/app/assets/javascripts/ckeditor/plugins/flash/images/placeholder.png +0 -0
  129. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/button.js +6 -0
  130. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/checkbox.js +6 -0
  131. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/form.js +6 -0
  132. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/hiddenfield.js +6 -0
  133. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/radio.js +6 -0
  134. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/select.js +9 -0
  135. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/textarea.js +6 -0
  136. data/app/assets/javascripts/ckeditor/plugins/forms/dialogs/textfield.js +6 -0
  137. data/app/assets/javascripts/ckeditor/plugins/forms/images/hiddenfield.gif +0 -0
  138. data/app/assets/javascripts/ckeditor/plugins/iframe/dialogs/iframe.js +7 -0
  139. data/app/assets/javascripts/ckeditor/plugins/iframe/images/placeholder.png +0 -0
  140. data/app/assets/javascripts/ckeditor/plugins/iframedialog/plugin.js +6 -0
  141. data/app/assets/javascripts/ckeditor/plugins/image/dialogs/image.js +13 -0
  142. data/app/assets/javascripts/ckeditor/plugins/link/dialogs/anchor.js +6 -0
  143. data/app/assets/javascripts/ckeditor/plugins/link/dialogs/link.js +12 -0
  144. data/app/assets/javascripts/ckeditor/plugins/link/images/anchor.gif +0 -0
  145. data/app/assets/javascripts/ckeditor/plugins/liststyle/dialogs/liststyle.js +7 -0
  146. data/app/assets/javascripts/ckeditor/plugins/pagebreak/images/pagebreak.gif +0 -0
  147. data/app/assets/javascripts/ckeditor/plugins/pastefromword/filter/default.js +11 -0
  148. data/app/assets/javascripts/ckeditor/plugins/pastetext/dialogs/pastetext.js +6 -0
  149. data/app/assets/javascripts/ckeditor/plugins/placeholder/dialogs/placeholder.js +6 -0
  150. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/en.js +6 -0
  151. data/app/assets/javascripts/ckeditor/plugins/placeholder/lang/he.js +6 -0
  152. data/app/assets/javascripts/ckeditor/plugins/placeholder/placeholder.gif +0 -0
  153. data/app/assets/javascripts/ckeditor/plugins/placeholder/plugin.js +6 -0
  154. data/app/assets/javascripts/ckeditor/plugins/scayt/dialogs/options.js +8 -0
  155. data/app/assets/javascripts/ckeditor/plugins/scayt/dialogs/toolbar.css +6 -0
  156. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_address.png +0 -0
  157. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_blockquote.png +0 -0
  158. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_div.png +0 -0
  159. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h1.png +0 -0
  160. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h2.png +0 -0
  161. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h3.png +0 -0
  162. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h4.png +0 -0
  163. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h5.png +0 -0
  164. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_h6.png +0 -0
  165. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_p.png +0 -0
  166. data/app/assets/javascripts/ckeditor/plugins/showblocks/images/block_pre.png +0 -0
  167. data/app/assets/javascripts/ckeditor/plugins/smiley/dialogs/smiley.js +7 -0
  168. data/app/assets/javascripts/ckeditor/plugins/smiley/images/angel_smile.gif +0 -0
  169. data/app/assets/javascripts/ckeditor/plugins/smiley/images/angry_smile.gif +0 -0
  170. data/app/assets/javascripts/ckeditor/plugins/smiley/images/broken_heart.gif +0 -0
  171. data/app/assets/javascripts/ckeditor/plugins/smiley/images/confused_smile.gif +0 -0
  172. data/app/assets/javascripts/ckeditor/plugins/smiley/images/cry_smile.gif +0 -0
  173. data/app/assets/javascripts/ckeditor/plugins/smiley/images/devil_smile.gif +0 -0
  174. data/app/assets/javascripts/ckeditor/plugins/smiley/images/embaressed_smile.gif +0 -0
  175. data/app/assets/javascripts/ckeditor/plugins/smiley/images/envelope.gif +0 -0
  176. data/app/assets/javascripts/ckeditor/plugins/smiley/images/heart.gif +0 -0
  177. data/app/assets/javascripts/ckeditor/plugins/smiley/images/kiss.gif +0 -0
  178. data/app/assets/javascripts/ckeditor/plugins/smiley/images/lightbulb.gif +0 -0
  179. data/app/assets/javascripts/ckeditor/plugins/smiley/images/omg_smile.gif +0 -0
  180. data/app/assets/javascripts/ckeditor/plugins/smiley/images/regular_smile.gif +0 -0
  181. data/app/assets/javascripts/ckeditor/plugins/smiley/images/sad_smile.gif +0 -0
  182. data/app/assets/javascripts/ckeditor/plugins/smiley/images/shades_smile.gif +0 -0
  183. data/app/assets/javascripts/ckeditor/plugins/smiley/images/teeth_smile.gif +0 -0
  184. data/app/assets/javascripts/ckeditor/plugins/smiley/images/thumbs_down.gif +0 -0
  185. data/app/assets/javascripts/ckeditor/plugins/smiley/images/thumbs_up.gif +0 -0
  186. data/app/assets/javascripts/ckeditor/plugins/smiley/images/tounge_smile.gif +0 -0
  187. data/app/assets/javascripts/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif +0 -0
  188. data/app/assets/javascripts/ckeditor/plugins/smiley/images/wink_smile.gif +0 -0
  189. data/app/assets/javascripts/ckeditor/plugins/specialchar/dialogs/specialchar.js +7 -0
  190. data/app/assets/javascripts/ckeditor/plugins/specialchar/lang/en.js +6 -0
  191. data/app/assets/javascripts/ckeditor/plugins/styles/styles/default.js +6 -0
  192. data/app/assets/javascripts/ckeditor/plugins/stylesheetparser/plugin.js +6 -0
  193. data/app/assets/javascripts/ckeditor/plugins/table/dialogs/table.js +9 -0
  194. data/app/assets/javascripts/ckeditor/plugins/tableresize/plugin.js +7 -0
  195. data/app/assets/javascripts/ckeditor/plugins/tabletools/dialogs/tableCell.js +8 -0
  196. data/app/assets/javascripts/ckeditor/plugins/templates/dialogs/templates.js +7 -0
  197. data/app/assets/javascripts/ckeditor/plugins/templates/templates/default.js +6 -0
  198. data/app/assets/javascripts/ckeditor/plugins/templates/templates/images/template1.gif +0 -0
  199. data/app/assets/javascripts/ckeditor/plugins/templates/templates/images/template2.gif +0 -0
  200. data/app/assets/javascripts/ckeditor/plugins/templates/templates/images/template3.gif +0 -0
  201. data/app/assets/javascripts/ckeditor/plugins/uicolor/dialogs/uicolor.js +7 -0
  202. data/app/assets/javascripts/ckeditor/plugins/uicolor/lang/en.js +6 -0
  203. data/app/assets/javascripts/ckeditor/plugins/uicolor/lang/he.js +6 -0
  204. data/app/assets/javascripts/ckeditor/plugins/uicolor/plugin.js +6 -0
  205. data/app/assets/javascripts/ckeditor/plugins/uicolor/uicolor.gif +0 -0
  206. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/assets/hue_bg.png +0 -0
  207. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png +0 -0
  208. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/assets/picker_mask.png +0 -0
  209. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png +0 -0
  210. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/assets/yui.css +6 -0
  211. data/app/assets/javascripts/ckeditor/plugins/uicolor/yui/yui.js +76 -0
  212. data/app/assets/javascripts/ckeditor/plugins/wsc/dialogs/ciframe.html +49 -0
  213. data/app/assets/javascripts/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +52 -0
  214. data/app/assets/javascripts/ckeditor/plugins/wsc/dialogs/wsc.css +6 -0
  215. data/app/assets/javascripts/ckeditor/plugins/wsc/dialogs/wsc.js +7 -0
  216. data/app/assets/javascripts/ckeditor/plugins/xml/plugin.js +6 -0
  217. data/app/assets/javascripts/ckeditor/skins/kama/dialog.css +10 -0
  218. data/app/assets/javascripts/ckeditor/skins/kama/editor.css +13 -0
  219. data/app/assets/javascripts/ckeditor/skins/kama/icons.png +0 -0
  220. data/app/assets/javascripts/ckeditor/skins/kama/icons_rtl.png +0 -0
  221. data/app/assets/javascripts/ckeditor/skins/kama/images/dialog_sides.gif +0 -0
  222. data/app/assets/javascripts/ckeditor/skins/kama/images/dialog_sides.png +0 -0
  223. data/app/assets/javascripts/ckeditor/skins/kama/images/dialog_sides_rtl.png +0 -0
  224. data/app/assets/javascripts/ckeditor/skins/kama/images/mini.gif +0 -0
  225. data/app/assets/javascripts/ckeditor/skins/kama/images/noimage.png +0 -0
  226. data/app/assets/javascripts/ckeditor/skins/kama/images/sprites.png +0 -0
  227. data/app/assets/javascripts/ckeditor/skins/kama/images/sprites_ie6.png +0 -0
  228. data/app/assets/javascripts/ckeditor/skins/kama/images/toolbar_start.gif +0 -0
  229. data/app/assets/javascripts/ckeditor/skins/kama/skin.js +7 -0
  230. data/app/assets/javascripts/ckeditor/skins/kama/templates.css +6 -0
  231. data/app/assets/javascripts/ckeditor/skins/office2003/dialog.css +9 -0
  232. data/app/assets/javascripts/ckeditor/skins/office2003/editor.css +14 -0
  233. data/app/assets/javascripts/ckeditor/skins/office2003/icons.png +0 -0
  234. data/app/assets/javascripts/ckeditor/skins/office2003/icons_rtl.png +0 -0
  235. data/app/assets/javascripts/ckeditor/skins/office2003/images/dialog_sides.gif +0 -0
  236. data/app/assets/javascripts/ckeditor/skins/office2003/images/dialog_sides.png +0 -0
  237. data/app/assets/javascripts/ckeditor/skins/office2003/images/dialog_sides_rtl.png +0 -0
  238. data/app/assets/javascripts/ckeditor/skins/office2003/images/mini.gif +0 -0
  239. data/app/assets/javascripts/ckeditor/skins/office2003/images/noimage.png +0 -0
  240. data/app/assets/javascripts/ckeditor/skins/office2003/images/sprites.png +0 -0
  241. data/app/assets/javascripts/ckeditor/skins/office2003/images/sprites_ie6.png +0 -0
  242. data/app/assets/javascripts/ckeditor/skins/office2003/skin.js +6 -0
  243. data/app/assets/javascripts/ckeditor/skins/office2003/templates.css +6 -0
  244. data/app/assets/javascripts/ckeditor/skins/v2/dialog.css +9 -0
  245. data/app/assets/javascripts/ckeditor/skins/v2/editor.css +13 -0
  246. data/app/assets/javascripts/ckeditor/skins/v2/icons.png +0 -0
  247. data/app/assets/javascripts/ckeditor/skins/v2/icons_rtl.png +0 -0
  248. data/app/assets/javascripts/ckeditor/skins/v2/images/dialog_sides.gif +0 -0
  249. data/app/assets/javascripts/ckeditor/skins/v2/images/dialog_sides.png +0 -0
  250. data/app/assets/javascripts/ckeditor/skins/v2/images/dialog_sides_rtl.png +0 -0
  251. data/app/assets/javascripts/ckeditor/skins/v2/images/mini.gif +0 -0
  252. data/app/assets/javascripts/ckeditor/skins/v2/images/noimage.png +0 -0
  253. data/app/assets/javascripts/ckeditor/skins/v2/images/sprites.png +0 -0
  254. data/app/assets/javascripts/ckeditor/skins/v2/images/sprites_ie6.png +0 -0
  255. data/app/assets/javascripts/ckeditor/skins/v2/images/toolbar_start.gif +0 -0
  256. data/app/assets/javascripts/ckeditor/skins/v2/skin.js +6 -0
  257. data/app/assets/javascripts/ckeditor/skins/v2/templates.css +6 -0
  258. data/app/assets/javascripts/ckeditor/themes/default/theme.js +8 -0
  259. data/app/assets/javascripts/documents.js +2 -0
  260. data/app/assets/javascripts/qwerty_admin/documents.js +2 -0
  261. data/app/assets/javascripts/qwerty_admin/nodes.js +2 -0
  262. data/app/assets/stylesheets/application.css +6 -0
  263. data/app/assets/stylesheets/qwerty_admin/base.css +5 -0
  264. data/app/assets/stylesheets/qwerty_admin/documents.css +0 -0
  265. data/app/assets/stylesheets/qwerty_admin/nodes.css +4 -0
  266. data/app/controllers/documents_controller.rb +50 -0
  267. data/app/controllers/qwerty_admin/base_controller.rb +8 -0
  268. data/app/controllers/qwerty_admin/documents_controller.rb +35 -0
  269. data/app/controllers/qwerty_admin/nodes_controller.rb +34 -0
  270. data/app/controllers/qwerty_base_controller.rb +6 -0
  271. data/app/helpers/documents_helper.rb +11 -0
  272. data/app/helpers/qwerty_admin/base_helper.rb +2 -0
  273. data/app/helpers/qwerty_admin/documents_helper.rb +2 -0
  274. data/app/helpers/qwerty_admin/nodes_helper.rb +2 -0
  275. data/app/helpers/qwerty_base_helper.rb +2 -0
  276. data/app/models/ckeditor/asset.rb +4 -0
  277. data/app/models/ckeditor/attachment_file.rb +15 -0
  278. data/app/models/ckeditor/picture.rb +13 -0
  279. data/app/models/document.rb +50 -0
  280. data/app/models/node/sugar.rb +30 -0
  281. data/app/models/node.rb +71 -0
  282. data/app/models/node_setting.rb +48 -0
  283. data/app/models/sitemap.rb +36 -0
  284. data/app/views/cms/show.html.erb +32 -0
  285. data/app/views/layouts/application.html.erb +72 -0
  286. data/app/views/layouts/qwerty_admin.html.erb +51 -0
  287. data/app/views/qwerty_admin/documents/_document.html.erb +45 -0
  288. data/app/views/qwerty_admin/documents/_form.html.erb +42 -0
  289. data/app/views/qwerty_admin/documents/edit.html.erb +5 -0
  290. data/app/views/qwerty_admin/documents/index.html.erb +34 -0
  291. data/app/views/qwerty_admin/documents/new.html.erb +5 -0
  292. data/app/views/qwerty_admin/documents/show.html.erb +35 -0
  293. data/app/views/qwerty_admin/nodes/_form.html.erb +28 -0
  294. data/app/views/qwerty_admin/nodes/_node.html.erb +15 -0
  295. data/app/views/qwerty_admin/nodes/edit.html.erb +5 -0
  296. data/app/views/qwerty_admin/nodes/index.html.erb +10 -0
  297. data/app/views/qwerty_admin/nodes/new.html.erb +5 -0
  298. data/config/environment.rb +0 -0
  299. data/config/initializers/ckeditor.rb +18 -0
  300. data/config/initializers/dragonfly.rb +1 -0
  301. data/config/initializers/simple_form.rb +15 -0
  302. data/config/routes.rb +26 -0
  303. data/db/migrate/20110909144240_create_nodes.rb +13 -0
  304. data/db/migrate/20110909144300_create_documents.rb +16 -0
  305. data/db/migrate/20110909144805_create_node_settings.rb +14 -0
  306. data/db/migrate/20110915174533_node_setting_typecasting.rb +9 -0
  307. data/db/migrate/20110915190140_node_ancestry.rb +9 -0
  308. data/db/migrate/20110919130646_document_extra_fields.rb +17 -0
  309. data/db/migrate/20110919175405_document_meta_fields.rb +15 -0
  310. data/db/migrate/20110919190859_create_ckeditor_assets.rb +26 -0
  311. data/db/migrate/20110922113655_document_image_alt.rb +9 -0
  312. data/db/migrate/20110922185424_document_template.rb +9 -0
  313. data/db/seed.rb +2 -0
  314. data/lib/qwerty/allow_auth.rb +7 -0
  315. data/lib/qwerty/deny_auth.rb +7 -0
  316. data/lib/qwerty/engine.rb +5 -0
  317. data/lib/qwerty/lipsum.rb +35 -0
  318. data/lib/qwerty/version.rb +3 -0
  319. data/lib/qwerty.rb +28 -0
  320. data/lib/tasks/qwerty_tasks.rake +5 -0
  321. data/test/dummy/Rakefile +7 -0
  322. data/test/dummy/app/controllers/application_controller.rb +3 -0
  323. data/test/dummy/app/helpers/application_helper.rb +2 -0
  324. data/test/dummy/config/application.rb +45 -0
  325. data/test/dummy/config/boot.rb +10 -0
  326. data/test/dummy/config/database.yml +24 -0
  327. data/test/dummy/config/environment.rb +5 -0
  328. data/test/dummy/config/environments/development.rb +30 -0
  329. data/test/dummy/config/environments/production.rb +60 -0
  330. data/test/dummy/config/environments/test.rb +42 -0
  331. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  332. data/test/dummy/config/initializers/inflections.rb +10 -0
  333. data/test/dummy/config/initializers/mime_types.rb +5 -0
  334. data/test/dummy/config/initializers/secret_token.rb +7 -0
  335. data/test/dummy/config/initializers/session_store.rb +8 -0
  336. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  337. data/test/dummy/config/locales/en.yml +5 -0
  338. data/test/dummy/config/routes.rb +58 -0
  339. data/test/dummy/config/sitemap.rb +51 -0
  340. data/test/dummy/config.ru +4 -0
  341. data/test/dummy/db/development.sqlite3 +0 -0
  342. data/test/dummy/db/schema.rb +80 -0
  343. data/test/dummy/log/development.log +66134 -0
  344. data/test/dummy/public/404.html +26 -0
  345. data/test/dummy/public/422.html +26 -0
  346. data/test/dummy/public/500.html +26 -0
  347. data/test/dummy/public/ckeditor_assets/attachments/2/p1010062.jpg +0 -0
  348. data/test/dummy/public/ckeditor_assets/pictures/1/content_member_9440972.jpeg +0 -0
  349. data/test/dummy/public/ckeditor_assets/pictures/1/original_member_9440972.jpeg +0 -0
  350. data/test/dummy/public/ckeditor_assets/pictures/1/thumb_member_9440972.jpeg +0 -0
  351. data/test/dummy/public/ckeditor_assets/pictures/3/content_p1010062.jpg +0 -0
  352. data/test/dummy/public/ckeditor_assets/pictures/3/original_p1010062.jpg +0 -0
  353. data/test/dummy/public/ckeditor_assets/pictures/3/thumb_p1010062.jpg +0 -0
  354. data/test/dummy/public/favicon.ico +0 -0
  355. data/test/dummy/script/rails +6 -0
  356. data/test/dummy/tmp/cache/assets/BDE/4D0/sprockets%2F311d16556d4f920021d040093c966028 +0 -0
  357. data/test/dummy/tmp/cache/assets/BEE/610/sprockets%2F9ca401c4946787b484734547031c5103 +0 -0
  358. data/test/dummy/tmp/cache/assets/C0C/410/sprockets%2F0458549c378353630d8464656e676ef6 +0 -0
  359. data/test/dummy/tmp/cache/assets/C10/0E0/sprockets%2F9e54dc493752b111413337f23033360d +0 -0
  360. data/test/dummy/tmp/cache/assets/C21/EC0/sprockets%2F1398d076e5760f608e00361c7b937033 +0 -0
  361. data/test/dummy/tmp/cache/assets/C4C/A20/sprockets%2F68214d7c6d2710159b107718743d1e4d +0 -0
  362. data/test/dummy/tmp/cache/assets/C56/370/sprockets%2F44e516819a1265e09ce775c124f31739 +0 -0
  363. data/test/dummy/tmp/cache/assets/C59/B40/sprockets%2Fc84747db707d581e4263412b7a395790 +0 -0
  364. data/test/dummy/tmp/cache/assets/C67/810/sprockets%2F922fd3026b350641aa1538f652b3f120 +0 -0
  365. data/test/dummy/tmp/cache/assets/C6B/670/sprockets%2F0183084bcf7e5125202ba334159382cc +0 -0
  366. data/test/dummy/tmp/cache/assets/C75/A20/sprockets%2Fb494025290020aeb38c56e8f17b44147 +0 -0
  367. data/test/dummy/tmp/cache/assets/C7A/010/sprockets%2F286345c22bee252f4c144a43977c9113 +0 -0
  368. data/test/dummy/tmp/cache/assets/C7E/380/sprockets%2F67e35841692a097ec02be71a162138f4 +0 -0
  369. data/test/dummy/tmp/cache/assets/C7F/A80/sprockets%2F88ff149f8505a00960e9c215d80035d0 +0 -0
  370. data/test/dummy/tmp/cache/assets/C84/110/sprockets%2F607cb3bb8d12865a79940464a048f239 +0 -0
  371. data/test/dummy/tmp/cache/assets/C87/400/sprockets%2F330b0ed89724739f6e40e29f53005d76 +0 -0
  372. data/test/dummy/tmp/cache/assets/C88/040/sprockets%2F9c83928a34bc422081c784992ef131f4 +0 -0
  373. data/test/dummy/tmp/cache/assets/C89/2F0/sprockets%2F94dba97434f3147a95c57f118058a940 +0 -0
  374. data/test/dummy/tmp/cache/assets/C8A/A70/sprockets%2F1cac4566e97f982516545e402607ae83 +0 -0
  375. data/test/dummy/tmp/cache/assets/C8B/580/sprockets%2F68543590e73c9934289a122dd65c36bb +0 -0
  376. data/test/dummy/tmp/cache/assets/C8D/400/sprockets%2Fc30656a43a37db4d10fb450243b06312 +0 -0
  377. data/test/dummy/tmp/cache/assets/C9C/CE0/sprockets%2F7461b7410d4ec3105d71f4e42b50308d +0 -0
  378. data/test/dummy/tmp/cache/assets/C9E/BA0/sprockets%2F8d90fe613410226318bb7b050ae25a76 +0 -0
  379. data/test/dummy/tmp/cache/assets/CA8/AA0/sprockets%2F439a2b1b28b105e731fd58712e256f45 +0 -0
  380. data/test/dummy/tmp/cache/assets/CAB/AE0/sprockets%2F028fb517982c7010d201fcd88934c5a5 +0 -0
  381. data/test/dummy/tmp/cache/assets/CAC/580/sprockets%2F35e06ad8c8087d002c808a608933f41d +0 -0
  382. data/test/dummy/tmp/cache/assets/CAE/310/sprockets%2F014ed726e92570c181a618db4b039c98 +0 -0
  383. data/test/dummy/tmp/cache/assets/CB0/6A0/sprockets%2F9c579b207d73833720c2a096ae025e9c +0 -0
  384. data/test/dummy/tmp/cache/assets/CB8/680/sprockets%2F5abaa5243061a513d5a0456b1f108d04 +0 -0
  385. data/test/dummy/tmp/cache/assets/CBE/420/sprockets%2F169ec906f26ff645078942ee431b168a +0 -0
  386. data/test/dummy/tmp/cache/assets/CBE/D60/sprockets%2F001ccd7449d98279b377b8d168e1274e +0 -0
  387. data/test/dummy/tmp/cache/assets/CC9/8D0/sprockets%2F1917e845e733759a8e3635c4ea3b97e8 +0 -0
  388. data/test/dummy/tmp/cache/assets/CCD/AA0/sprockets%2F9764a41d0730101411d9bda28ddb4a59 +0 -0
  389. data/test/dummy/tmp/cache/assets/CD1/DE0/sprockets%2F866e64f9268a26b808f585d9794aa81d +0 -0
  390. data/test/dummy/tmp/cache/assets/CD2/6E0/sprockets%2F49709b8010a17ad8ce04a3683ac6306d +0 -0
  391. data/test/dummy/tmp/cache/assets/CD3/740/sprockets%2F2c7745404c11f4e2b8e8591043a8bad0 +0 -0
  392. data/test/dummy/tmp/cache/assets/CD5/0F0/sprockets%2F38203a3abdd568f50ff08426315e80a5 +0 -0
  393. data/test/dummy/tmp/cache/assets/CD5/240/sprockets%2F8d783b81ac804a06d2171a75d2b4653c +0 -0
  394. data/test/dummy/tmp/cache/assets/CD5/610/sprockets%2Fb27392311c7db818d8c1fa08e30055c6 +0 -0
  395. data/test/dummy/tmp/cache/assets/CD6/C20/sprockets%2Fb8340ca5274524b0057417fe4d6f51cf +0 -0
  396. data/test/dummy/tmp/cache/assets/CD7/DE0/sprockets%2F4720f20e2b75f217ee197e7c50211b7e +0 -0
  397. data/test/dummy/tmp/cache/assets/CDF/3E0/sprockets%2F2fc85a2f075e63902a10640d968f5e2d +0 -0
  398. data/test/dummy/tmp/cache/assets/CE0/540/sprockets%2Fc355333ce37ace3a93e33b777c508608 +0 -0
  399. data/test/dummy/tmp/cache/assets/CE4/500/sprockets%2F16f65934b8aba4865072d41b267f3df5 +0 -0
  400. data/test/dummy/tmp/cache/assets/CE4/F80/sprockets%2Fc20b73a65ec677bf944467e29e01815a +0 -0
  401. data/test/dummy/tmp/cache/assets/CE6/670/sprockets%2F552338bdd216cf38c296665da29b6c72 +0 -0
  402. data/test/dummy/tmp/cache/assets/CE7/250/sprockets%2F365ffc773f538508666e32f201adb7a6 +0 -0
  403. data/test/dummy/tmp/cache/assets/CE9/E20/sprockets%2Fa60330f52bfa7476d7e79890c83e0e09 +0 -0
  404. data/test/dummy/tmp/cache/assets/CEB/B50/sprockets%2F25de688e596bf489043eaa01e949323a +0 -0
  405. data/test/dummy/tmp/cache/assets/CEC/760/sprockets%2F7e948c4f7d40843f90fb9cc1a1582057 +0 -0
  406. data/test/dummy/tmp/cache/assets/CF5/D10/sprockets%2Fed4f070a60c671b413546930a0bb2ce3 +0 -0
  407. data/test/dummy/tmp/cache/assets/CF7/360/sprockets%2F0d709f9c69de297f27b94c9f122d6831 +0 -0
  408. data/test/dummy/tmp/cache/assets/CFA/BC0/sprockets%2F5d2090a6bfa80d525522e8301c152edd +0 -0
  409. data/test/dummy/tmp/cache/assets/CFE/7B0/sprockets%2F62ee8b041b2d600cd601774e02ec53d8 +0 -0
  410. data/test/dummy/tmp/cache/assets/CFF/930/sprockets%2F09983bf571e99e8eff86325de42b1675 +0 -0
  411. data/test/dummy/tmp/cache/assets/D01/040/sprockets%2Fea215190e12741a67f81ae56c1dea337 +0 -0
  412. data/test/dummy/tmp/cache/assets/D03/F30/sprockets%2F41234b771cd781f506a2a0cf86ba08e5 +0 -0
  413. data/test/dummy/tmp/cache/assets/D05/A20/sprockets%2F8ea654085dec00b630f25102f89a1c7e +0 -0
  414. data/test/dummy/tmp/cache/assets/D0D/420/sprockets%2F36e003dc889f6f3f1242c6e9d1d0317a +0 -0
  415. data/test/dummy/tmp/cache/assets/D0D/660/sprockets%2Fb92af6b373409b8a2ac47cb29766f222 +0 -0
  416. data/test/dummy/tmp/cache/assets/D0D/FA0/sprockets%2Ffbd47d3b5405c8861169b5520fbc083e +0 -0
  417. data/test/dummy/tmp/cache/assets/D11/150/sprockets%2F2720b8f492d06b6d6b1724bc9cd941c9 +0 -0
  418. data/test/dummy/tmp/cache/assets/D11/1B0/sprockets%2Fb99c3678b42e004148d0868cedbe026c +0 -0
  419. data/test/dummy/tmp/cache/assets/D11/ED0/sprockets%2Ff7a8ed05241fef8b135024d51b94945e +0 -0
  420. data/test/dummy/tmp/cache/assets/D12/4F0/sprockets%2F7a26fb379fadbc24f94c345b30535287 +0 -0
  421. data/test/dummy/tmp/cache/assets/D15/8A0/sprockets%2F9b1ffb38905305577fcd88fc00c802b6 +0 -0
  422. data/test/dummy/tmp/cache/assets/D16/B10/sprockets%2Ff7f68a65b09f33f4561a4a3950eb32e8 +0 -0
  423. data/test/dummy/tmp/cache/assets/D17/130/sprockets%2F21b812e14954cfecf0cc7c64863b8829 +0 -0
  424. data/test/dummy/tmp/cache/assets/D18/010/sprockets%2F9a67ed918a54c52374df7097405cb4bc +0 -0
  425. data/test/dummy/tmp/cache/assets/D18/440/sprockets%2F45b53a8779090b1fea7e934296f7bc1a +0 -0
  426. data/test/dummy/tmp/cache/assets/D18/EB0/sprockets%2F9d5f5d6c6950d28b4df7c625190811da +0 -0
  427. data/test/dummy/tmp/cache/assets/D1B/BE0/sprockets%2Fab5f94041a5bd95b912e8839d86b736b +0 -0
  428. data/test/dummy/tmp/cache/assets/D1C/560/sprockets%2F00201c441ba9a9563b174185caa0bdea +0 -0
  429. data/test/dummy/tmp/cache/assets/D1C/DB0/sprockets%2Ffd38d829bdf04f189d1d55ec69209340 +0 -0
  430. data/test/dummy/tmp/cache/assets/D1D/2A0/sprockets%2Fe168814999aedd80caf58d82323a0f74 +0 -0
  431. data/test/dummy/tmp/cache/assets/D1D/A70/sprockets%2Ffd060d6fea64355d7e8438565a90ab79 +0 -0
  432. data/test/dummy/tmp/cache/assets/D1E/6D0/sprockets%2F4c9abb81479c230cdc309966f9cc9834 +0 -0
  433. data/test/dummy/tmp/cache/assets/D21/6C0/sprockets%2F634a6cf1fd591b98c81ca4f66b652994 +0 -0
  434. data/test/dummy/tmp/cache/assets/D24/150/sprockets%2Fd58600176d5cb1eeb26024be20a40c7b +0 -0
  435. data/test/dummy/tmp/cache/assets/D26/840/sprockets%2Fc76bba255c7bd803b4e027313e6ad021 +0 -0
  436. data/test/dummy/tmp/cache/assets/D2C/830/sprockets%2F9cc457340b3a52c2fe7a0c75b01a27a8 +0 -0
  437. data/test/dummy/tmp/cache/assets/D2C/EE0/sprockets%2F562208e38f8ac1f9762cc94f4ef89c66 +0 -0
  438. data/test/dummy/tmp/cache/assets/D2E/160/sprockets%2F1dae7e48d3c1c24b3ac21e6930a51755 +0 -0
  439. data/test/dummy/tmp/cache/assets/D2F/890/sprockets%2Ff7505e99736cf7d6bd254b28b8974d7e +0 -0
  440. data/test/dummy/tmp/cache/assets/D30/D90/sprockets%2Fb8f58f84f7f906a29cf39760854c1ec8 +0 -0
  441. data/test/dummy/tmp/cache/assets/D32/6E0/sprockets%2Fe0bcc2425fab37d22290d720d8ef8415 +0 -0
  442. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  443. data/test/dummy/tmp/cache/assets/D33/4C0/sprockets%2Fcb9a7d05043e30311d5f3e7fb81194eb +0 -0
  444. data/test/dummy/tmp/cache/assets/D33/EB0/sprockets%2F1446b0b73eb60c1bfb78f4360513ddf6 +0 -0
  445. data/test/dummy/tmp/cache/assets/D35/800/sprockets%2F6eb4a3dacdd7542329494a7403cf4c04 +0 -0
  446. data/test/dummy/tmp/cache/assets/D35/950/sprockets%2F4c67cda11e05b84b2fff1271368b810f +0 -0
  447. data/test/dummy/tmp/cache/assets/D36/280/sprockets%2F6bd1f83e30273b110d8ac69038f1e7fa +0 -0
  448. data/test/dummy/tmp/cache/assets/D36/2E0/sprockets%2F41224a1b9e52c2b3d964f0a8dc6e09a8 +0 -0
  449. data/test/dummy/tmp/cache/assets/D37/EF0/sprockets%2F80b76c20dee353677b8da0ae803f33e1 +0 -0
  450. data/test/dummy/tmp/cache/assets/D38/9D0/sprockets%2F87b12063ea5fc0a254088ce1c892c7db +0 -0
  451. data/test/dummy/tmp/cache/assets/D39/5A0/sprockets%2Ff5d437ae42ef7df4b02d603f3692a413 +0 -0
  452. data/test/dummy/tmp/cache/assets/D3B/870/sprockets%2Fbc3648fb40b4085ee6b5afd479c22342 +0 -0
  453. data/test/dummy/tmp/cache/assets/D3C/8B0/sprockets%2F16408de6b85cc18b54edca73276dc143 +0 -0
  454. data/test/dummy/tmp/cache/assets/D3C/C60/sprockets%2F9ad34c607b32e90c43d3e7aebb576571 +0 -0
  455. data/test/dummy/tmp/cache/assets/D3F/030/sprockets%2Fd440c4b05ed0e12af58669f0c46c579d +0 -0
  456. data/test/dummy/tmp/cache/assets/D41/7F0/sprockets%2Fb236a9f4da15f7e9309e61d64c4e0f06 +0 -0
  457. data/test/dummy/tmp/cache/assets/D43/570/sprockets%2Fb490975b508fa73db3c0df9210fa39f8 +0 -0
  458. data/test/dummy/tmp/cache/assets/D45/3A0/sprockets%2Fd3a8b586f381ac437c3673d2ab0fe886 +0 -0
  459. data/test/dummy/tmp/cache/assets/D47/4A0/sprockets%2Fc9e62f7d0fb7f20004a8f08ed9d65725 +0 -0
  460. data/test/dummy/tmp/cache/assets/D49/810/sprockets%2F58e93e8065b1d7ebb281e2651962fbfc +0 -0
  461. data/test/dummy/tmp/cache/assets/D49/ED0/sprockets%2Ff4d29a55977c0e5ae3484ea6c2ad4657 +0 -0
  462. data/test/dummy/tmp/cache/assets/D4B/D40/sprockets%2F5fae926de30c648264e4c5fb9d09492b +0 -0
  463. data/test/dummy/tmp/cache/assets/D50/900/sprockets%2F6c8e56f2d88ee948dbd9b5365124b1b4 +0 -0
  464. data/test/dummy/tmp/cache/assets/D50/B10/sprockets%2F9758a22f2df38dae88c25246d1fd6f73 +0 -0
  465. data/test/dummy/tmp/cache/assets/D50/EC0/sprockets%2Fb6190193bb523598adba6894899fecea +0 -0
  466. data/test/dummy/tmp/cache/assets/D52/0D0/sprockets%2F1e9871b6efe36e72795998502daab0fd +0 -0
  467. data/test/dummy/tmp/cache/assets/D53/4A0/sprockets%2F4d4e07b2c68be65d62efc4728f478e38 +0 -0
  468. data/test/dummy/tmp/cache/assets/D54/3F0/sprockets%2F1ddc697da6d01003513c3eddb2230b6f +0 -0
  469. data/test/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +0 -0
  470. data/test/dummy/tmp/cache/assets/D56/7F0/sprockets%2F82c200adea1fd64ca48b7280c1c5172b +0 -0
  471. data/test/dummy/tmp/cache/assets/D58/BB0/sprockets%2F3962e2936f79b20e77cf14ed8cf8ff51 +0 -0
  472. data/test/dummy/tmp/cache/assets/D59/520/sprockets%2F83d4ec4e5f2ac1c2b0b7353d50320f5c +0 -0
  473. data/test/dummy/tmp/cache/assets/D5A/AB0/sprockets%2F372189f24bd2fa7c98e9b87b9fa178a8 +0 -0
  474. data/test/dummy/tmp/cache/assets/D5B/D20/sprockets%2F1910a944e3a4b4aab20f1f7ddb36527d +0 -0
  475. data/test/dummy/tmp/cache/assets/D5C/0B0/sprockets%2F67f5b0fa70009fce3a2ab0ec47d43730 +0 -0
  476. data/test/dummy/tmp/cache/assets/D5C/660/sprockets%2Fc8ce9c92534d5b688cb78873ab3f7f28 +0 -0
  477. data/test/dummy/tmp/cache/assets/D5C/E70/sprockets%2Fbe7fe4a67e5cb7897818836d4506efc4 +0 -0
  478. data/test/dummy/tmp/cache/assets/D5F/E50/sprockets%2Fe0c1efda752b0a4bf1a9d96234b22943 +0 -0
  479. data/test/dummy/tmp/cache/assets/D63/D60/sprockets%2F5be58d292d69530da023d07ede4aa33c +0 -0
  480. data/test/dummy/tmp/cache/assets/D6A/AE0/sprockets%2F53d6cfe0033a01e79e8b0edff282d382 +0 -0
  481. data/test/dummy/tmp/cache/assets/D6C/DE0/sprockets%2F0f44fde84ce5e309312bc6c4ff10728c +0 -0
  482. data/test/dummy/tmp/cache/assets/D6D/6D0/sprockets%2F580810d4c6e48f4ea8aa92ba9aaa3828 +0 -0
  483. data/test/dummy/tmp/cache/assets/D75/730/sprockets%2F9552cd68a860be264158d61eedaa66bf +0 -0
  484. data/test/dummy/tmp/cache/assets/D75/890/sprockets%2F0b391ab1d7496516ec38b8ff4f8d33be +0 -0
  485. data/test/dummy/tmp/cache/assets/D76/1D0/sprockets%2F81ee83473f2dc8f215bc19b2de37e3b9 +0 -0
  486. data/test/dummy/tmp/cache/assets/D77/CC0/sprockets%2F2f3c6a31d7e596f39e74751cccbf21f5 +0 -0
  487. data/test/dummy/tmp/cache/assets/D78/FC0/sprockets%2Feea9f4eb87db37fc1f4852b91302817d +0 -0
  488. data/test/dummy/tmp/cache/assets/D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 +0 -0
  489. data/test/dummy/tmp/cache/assets/D84/740/sprockets%2F91d64ad24d49c65bb8fd59fb5776d70f +0 -0
  490. data/test/dummy/tmp/cache/assets/D87/900/sprockets%2Ffe2af6a88486755788ef36046fadba5e +0 -0
  491. data/test/dummy/tmp/cache/assets/D89/700/sprockets%2F99213cf7c36ff7c75dfeb875f1d0588b +0 -0
  492. data/test/dummy/tmp/cache/assets/D8B/710/sprockets%2F18688d5b9ad2e9ee3c99f1fd7f03c872 +0 -0
  493. data/test/dummy/tmp/cache/assets/D8E/1E0/sprockets%2Fbf3d1fe102ec44134f5cd4427bd3e8b1 +0 -0
  494. data/test/dummy/tmp/cache/assets/D92/8E0/sprockets%2Fb0e2b0c077a83b9f21c59bde03d44ef4 +0 -0
  495. data/test/dummy/tmp/cache/assets/D92/F60/sprockets%2Fbc58389eadd867e5b57b89c92bc8963e +0 -0
  496. data/test/dummy/tmp/cache/assets/D96/DE0/sprockets%2F51c47cc6ec633ad52c52e57182fdecb0 +0 -0
  497. data/test/dummy/tmp/cache/assets/D9A/CB0/sprockets%2F91ab4aaa9e772164ba8a744c65ecab76 +0 -0
  498. data/test/dummy/tmp/cache/assets/D9C/410/sprockets%2F8b2d367c1b8dc92c17bcac7c36af1971 +0 -0
  499. data/test/dummy/tmp/cache/assets/D9C/D80/sprockets%2F8b11a8fd930b5eadd58b9e2dc2523f17 +0 -0
  500. data/test/dummy/tmp/cache/assets/D9F/1F0/sprockets%2F1da9f517db0b6b474c57f7c74c5d2ab7 +0 -0
  501. data/test/dummy/tmp/cache/assets/DA0/630/sprockets%2Ff59a4ccd0896af3cec2179f0b2817cc2 +0 -0
  502. data/test/dummy/tmp/cache/assets/DA0/A90/sprockets%2F38ccaad5b5ca95079568aaabf9157b72 +0 -0
  503. data/test/dummy/tmp/cache/assets/DA0/BF0/sprockets%2Fba8192bb45ac9f5668ed47dfdc1d2512 +0 -0
  504. data/test/dummy/tmp/cache/assets/DA0/F80/sprockets%2F2855b4dfd7f7154ae74ac4ed85bb433a +0 -0
  505. data/test/dummy/tmp/cache/assets/DA2/CC0/sprockets%2F9cc592e1e03a480f97b7f36e2be70cdb +0 -0
  506. data/test/dummy/tmp/cache/assets/DA3/450/sprockets%2Fadbd33c8699d2fd56903b1cf66de207b +0 -0
  507. data/test/dummy/tmp/cache/assets/DA3/C00/sprockets%2Fd8bf48f3482c1f1917b6e007ffb8cc0d +0 -0
  508. data/test/dummy/tmp/cache/assets/DA4/C00/sprockets%2Ff792a72a4b0cfcb23a49927e298fb5cd +0 -0
  509. data/test/dummy/tmp/cache/assets/DA5/660/sprockets%2F4fc47a92c03dfa1768fda7b8e4ef2822 +0 -0
  510. data/test/dummy/tmp/cache/assets/DAB/720/sprockets%2Ffde1e8b346c4513c94e7d94fbd8c67b0 +0 -0
  511. data/test/dummy/tmp/cache/assets/DAC/ED0/sprockets%2Fe5426f71dffe4762c8faad05f890c65c +0 -0
  512. data/test/dummy/tmp/cache/assets/DB2/130/sprockets%2F646dea1c956d67dbfed9c8656f2670bb +0 -0
  513. data/test/dummy/tmp/cache/assets/DB2/3A0/sprockets%2F1d88ecba6d031d6ee29ffb5ef9874906 +0 -0
  514. data/test/dummy/tmp/cache/assets/DB2/900/sprockets%2F2f0372a25fdede516d5a2afbd4b3c100 +0 -0
  515. data/test/dummy/tmp/cache/assets/DB5/D30/sprockets%2Fa14a0cc51baa7132ab9c8f0b99a912cd +0 -0
  516. data/test/dummy/tmp/cache/assets/DB6/260/sprockets%2F472beffc68fb9e59623f21f91edfc546 +0 -0
  517. data/test/dummy/tmp/cache/assets/DB7/4C0/sprockets%2F0e9f81e64a27e86fbb7969f2a4ff4cb7 +0 -0
  518. data/test/dummy/tmp/cache/assets/DC2/D00/sprockets%2F1e633d7de336bd8bf5fea00e101d61fe +0 -0
  519. data/test/dummy/tmp/cache/assets/DC5/BF0/sprockets%2Fc0de69af1ee5606ceaf01dc6c46c1850 +0 -0
  520. data/test/dummy/tmp/cache/assets/DC7/7F0/sprockets%2Fd07dad14b06b063b7288e9bf68eb1dbb +0 -0
  521. data/test/dummy/tmp/cache/assets/DCE/2F0/sprockets%2F79d9c914093bfa09fd0d312f1cfdccf2 +0 -0
  522. data/test/dummy/tmp/cache/assets/DCF/6B0/sprockets%2F7a7ee808b774fa10dbacb6dbf79404e3 +0 -0
  523. data/test/dummy/tmp/cache/assets/DD1/B20/sprockets%2F53b5cdebe10ee9593ac070ee36f8f1d7 +0 -0
  524. data/test/dummy/tmp/cache/assets/DD2/1E0/sprockets%2F8db8160d9519ffa45c4cfa60cce87cb1 +0 -0
  525. data/test/dummy/tmp/cache/assets/DD4/710/sprockets%2F5496d239a661dcfcbac8f1ea993f3a0f +0 -0
  526. data/test/dummy/tmp/cache/assets/DD4/E40/sprockets%2Fec35368ec5e2dcbb814891bfbf94b51d +0 -0
  527. data/test/dummy/tmp/cache/assets/DD5/110/sprockets%2Fffc56a910d1cfefb2872c1379f91ac5f +0 -0
  528. data/test/dummy/tmp/cache/assets/DD6/260/sprockets%2F9eb469e2ec6d1ea639be1a5dfd3990b2 +0 -0
  529. data/test/dummy/tmp/cache/assets/DDD/710/sprockets%2F3cccf767b189d7e7f1e13f13790cdfed +0 -0
  530. data/test/dummy/tmp/cache/assets/DE0/490/sprockets%2Ff0fc479a83e9539db2d65edaf96df32a +0 -0
  531. data/test/dummy/tmp/cache/assets/DEB/0E0/sprockets%2F0ca4738d4bc33f23fcac201d38cbbfc8 +0 -0
  532. data/test/dummy/tmp/cache/assets/DEB/170/sprockets%2Fdea4e31c9262d2b70ebe32d6d0f22ecb +0 -0
  533. data/test/dummy/tmp/cache/assets/DED/9E0/sprockets%2Fdaccdeeaa07426dea5dde08b57512234 +0 -0
  534. data/test/dummy/tmp/cache/assets/DF1/4E0/sprockets%2Ff862c60d998967cc9eec5ababb69e98d +0 -0
  535. data/test/dummy/tmp/cache/assets/DF8/430/sprockets%2Fc2b9a5d3ce6c2dbfc0e2719bed22477d +0 -0
  536. data/test/dummy/tmp/cache/assets/DFC/880/sprockets%2Faeb6bac75bb3a8ff2aa5dd29007778c8 +0 -0
  537. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  538. data/test/dummy/tmp/cache/assets/E09/DF0/sprockets%2F36ef9cfea609a926571ddc3f7b06fcaf +0 -0
  539. data/test/dummy/tmp/cache/assets/E1B/750/sprockets%2Fda4a4b2cd44e31ee2cc3f9ec1fb1940b +0 -0
  540. data/test/dummy/tmp/cache/assets/E25/100/sprockets%2Faabf8c2cfd993050bdbeee5350c59b2b +0 -0
  541. data/test/dummy/tmp/cache/assets/E29/DA0/sprockets%2F085e2ef3fa66a0811b9ebc56d3beeceb +0 -0
  542. data/test/dummy/tmp/cache/assets/E35/A00/sprockets%2F3b6df3346f6fc5b9bbea28eae84fbe52 +0 -0
  543. data/test/dummy/tmp/cache/assets/E38/BA0/sprockets%2F0766d39ddcac557ed7bb1cfc6db69ef2 +0 -0
  544. data/test/dummy/tmp/cache/assets/E3B/980/sprockets%2Fd5a26ef3fd0755e8bbac9fe05fe7e4d7 +0 -0
  545. data/test/dummy/tmp/cache/assets/E3C/B30/sprockets%2Fcd4f66618ff5feb98ac3ce0bb26da9c9 +0 -0
  546. data/test/dummy/tmp/cache/assets/E53/590/sprockets%2Fcbefebb7e0390fbb1116a666cdeffa07 +0 -0
  547. data/test/dummy/tmp/cache/assets/E82/EB0/sprockets%2Fae4e8fc2dcd3a15f5b0a0ed945abd5ee +0 -0
  548. data/test/dummy/tmp/cache/assets/E8A/760/sprockets%2Ff70dde2a9e5ce6faaf045b9ae1c37dcc +0 -0
  549. data/test/dummy/tmp/cache/assets/E8C/070/sprockets%2F0cf1e93bfbd1c7afde52ffd72e0b66de +0 -0
  550. data/test/dummy/tmp/dragonfly/cache/body/03/eb3b0b849bb3e4bfeccacb05a55c6390cda15c +42 -0
  551. data/test/dummy/tmp/dragonfly/cache/body/07/8165f0f6b32937fddce91b5243a25cc39c75ad +150 -0
  552. data/test/dummy/tmp/dragonfly/cache/body/0d/3c95d8ceec588177a8c7e316ef01525f73d24d +14 -0
  553. data/test/dummy/tmp/dragonfly/cache/body/10/4ba2e7b7368c124e23143ab9648288368c78c5 +10 -0
  554. data/test/dummy/tmp/dragonfly/cache/body/10/82b7c75ddade9dce4df7b6d3787e94fd7c3272 +7 -0
  555. data/test/dummy/tmp/dragonfly/cache/body/12/139478cdc8419701c49d64aaa4acc724acae48 +12 -0
  556. data/test/dummy/tmp/dragonfly/cache/body/13/b758f2813676b52fb469b302599f18382368fd +7 -0
  557. data/test/dummy/tmp/dragonfly/cache/body/1c/88ec9e82fc2e0ef8a8179d60c77257d42aff74 +14 -0
  558. data/test/dummy/tmp/dragonfly/cache/body/20/701ae50a0ef8711e59bf9a156c100a1b7638d2 +0 -0
  559. data/test/dummy/tmp/dragonfly/cache/body/22/cd6d21c677a1cff079c5654bed58927239cacf +79 -0
  560. data/test/dummy/tmp/dragonfly/cache/body/36/1dd588cb23da637742baed804ccf4c59f8465f +14 -0
  561. data/test/dummy/tmp/dragonfly/cache/body/3c/1bb177cade2d463575b2795c5e57f7c4dbd696 +9353 -0
  562. data/test/dummy/tmp/dragonfly/cache/body/3c/ac4eb011fe38be14b2f75f3c5e4b702c021daa +7 -0
  563. data/test/dummy/tmp/dragonfly/cache/body/3e/f63b348d8ad48be7f3d8869f255af8d5d8b19f +8982 -0
  564. data/test/dummy/tmp/dragonfly/cache/body/42/05c52ebce4d502612c4b2f58818b1db0fec23b +7 -0
  565. data/test/dummy/tmp/dragonfly/cache/body/42/0c43d2d5b965a64dd3bf88454edc90d15ec636 +0 -0
  566. data/test/dummy/tmp/dragonfly/cache/body/48/253a67c3277035c2e01b70c2c3eb13762c6ff5 +0 -0
  567. data/test/dummy/tmp/dragonfly/cache/body/54/064bc3ca8d19cc634620d102713820646c9966 +10 -0
  568. data/test/dummy/tmp/dragonfly/cache/body/58/604de8cd96eab50d5bd4f2e095439c92cc1ab4 +66 -0
  569. data/test/dummy/tmp/dragonfly/cache/body/5c/4bb95bbbe3b68f6c67591a601e29524f33bd67 +0 -0
  570. data/test/dummy/tmp/dragonfly/cache/body/5f/d9282e72652fc95ea52dcc22f0efca123e4301 +1 -0
  571. data/test/dummy/tmp/dragonfly/cache/body/61/97eb13b4254f77f16833e1a9a8640e939d574c +0 -0
  572. data/test/dummy/tmp/dragonfly/cache/body/65/2c69de0c859d6215239dd06cc4fd54c5a0e632 +5 -0
  573. data/test/dummy/tmp/dragonfly/cache/body/66/53f8900fd565805cad6fd4fbcdc037b83fa938 +14 -0
  574. data/test/dummy/tmp/dragonfly/cache/body/6e/0b2440383d4bb4165efa618c5475470d43ab6e +8 -0
  575. data/test/dummy/tmp/dragonfly/cache/body/71/37f667e905abafb79868df92647c49af5552d3 +7 -0
  576. data/test/dummy/tmp/dragonfly/cache/body/74/a915f04ea303b6b1488fedcc3095a1dc216319 +46 -0
  577. data/test/dummy/tmp/dragonfly/cache/body/76/116d7ed02e8dab5c22e3b872559e5f351c4711 +10 -0
  578. data/test/dummy/tmp/dragonfly/cache/body/79/31af4ea1434ad6dba1c6a04315b23a2d0179c2 +0 -0
  579. data/test/dummy/tmp/dragonfly/cache/body/95/1fda6329351be36f185c1b7a5c1fcb6104ac26 +0 -0
  580. data/test/dummy/tmp/dragonfly/cache/body/95/f49275feb57d8ff1d87081d61ab707c9e23e1e +0 -0
  581. data/test/dummy/tmp/dragonfly/cache/body/99/b4dd5966c85ab90c361f3c129e4815f2282930 +1 -0
  582. data/test/dummy/tmp/dragonfly/cache/body/9a/01cd24640b519c2010cbf049bc6ccae4df3435 +26 -0
  583. data/test/dummy/tmp/dragonfly/cache/body/a1/16a69d513fb5d0b7530af579cab48c168536aa +9 -0
  584. data/test/dummy/tmp/dragonfly/cache/body/a1/d3d5a6ed952ccf4816b4a96d4767ce9bae8164 +5 -0
  585. data/test/dummy/tmp/dragonfly/cache/body/a3/6b28298dfba53475f7380d97ff873cf1248b97 +0 -0
  586. data/test/dummy/tmp/dragonfly/cache/body/a8/ea7f8211495d554e031941d005c8f7216fd68d +6 -0
  587. data/test/dummy/tmp/dragonfly/cache/body/aa/76cb03685d000103614b53fcdec6abd3312d78 +0 -0
  588. data/test/dummy/tmp/dragonfly/cache/body/ab/0ba7805258dfaffd12d7b27d2c72007bc85faf +42 -0
  589. data/test/dummy/tmp/dragonfly/cache/body/ad/382f97923c8dde85f5aad622c5f5c97d5b27d6 +1 -0
  590. data/test/dummy/tmp/dragonfly/cache/body/af/a8ef1a031e27a61d44c342608f287bafd54883 +0 -0
  591. data/test/dummy/tmp/dragonfly/cache/body/b1/6b131f227893150771f7d9af11475b680aebc9 +0 -0
  592. data/test/dummy/tmp/dragonfly/cache/body/b5/ca9f4350c61d1d1d2b23b3928cc54bf09999c5 +13 -0
  593. data/test/dummy/tmp/dragonfly/cache/body/b8/9f78c0a6db0f90cc13c5a358470f15d21b0f0e +79 -0
  594. data/test/dummy/tmp/dragonfly/cache/body/b9/eb3403996af30a4498a7d6b773266509ad8ad6 +10 -0
  595. data/test/dummy/tmp/dragonfly/cache/body/c2/d1fe276d6e527c155855e99dc19d239b6d71f3 +7 -0
  596. data/test/dummy/tmp/dragonfly/cache/body/c3/eac7335df76a2becf45783dc21a8d626453554 +42 -0
  597. data/test/dummy/tmp/dragonfly/cache/body/c9/c706a9b9d061158816815765de368764242445 +11 -0
  598. data/test/dummy/tmp/dragonfly/cache/body/cc/2b40f0a2ef5eb22d777d81575a9020898bc459 +10 -0
  599. data/test/dummy/tmp/dragonfly/cache/body/d4/2659abf79929384348c3dc39a7a6c150d5939d +41 -0
  600. data/test/dummy/tmp/dragonfly/cache/body/d5/73b73186cdf4007c9714beafccdf0862b87c18 +7 -0
  601. data/test/dummy/tmp/dragonfly/cache/body/d8/30591de37575f1d8fa38f84b3060269db5a549 +42 -0
  602. data/test/dummy/tmp/dragonfly/cache/body/ea/8830a670f9a4513c7c67d8b577072ac01afc93 +12 -0
  603. data/test/dummy/tmp/dragonfly/cache/body/fc/93e44494bc4b2a53ecf1d3e95aa2d8a01339ed +364 -0
  604. data/test/dummy/tmp/dragonfly/cache/body/fd/ab0053425ba609387dffb0e2529a8feacc3906 +0 -0
  605. data/test/dummy/tmp/dragonfly/cache/meta/04/cfe66775dd062d8e8ed54c63d7d7578156fcd9 +0 -0
  606. data/test/dummy/tmp/dragonfly/cache/meta/07/91fb614e455267f3a19da4218688c3d05b0cab +0 -0
  607. data/test/dummy/tmp/dragonfly/cache/meta/08/583d3580bdba862155e60de9a00668e59daf9a +0 -0
  608. data/test/dummy/tmp/dragonfly/cache/meta/09/828a2e2227c8ee400355ae1a23ad2bd790141d +0 -0
  609. data/test/dummy/tmp/dragonfly/cache/meta/0d/3d65cfd83d3144d664a407c58772a9af580f2c +0 -0
  610. data/test/dummy/tmp/dragonfly/cache/meta/1f/f07ad344a1cb0b8ec31186f4dc9db0839ad627 +0 -0
  611. data/test/dummy/tmp/dragonfly/cache/meta/26/1464d915347774c08b1ddf6d305783e3acfadb +0 -0
  612. data/test/dummy/tmp/dragonfly/cache/meta/26/73bb640eaad736de2ea11327abb3567f79c9fd +0 -0
  613. data/test/dummy/tmp/dragonfly/cache/meta/29/9a9ad069bc6d828e0d5f55644877ce9b62cb23 +0 -0
  614. data/test/dummy/tmp/dragonfly/cache/meta/33/fd8b6a50207f556064a867cd45a5a913fc39e6 +0 -0
  615. data/test/dummy/tmp/dragonfly/cache/meta/35/89edfe429efa98a23e7f9add3cfa1ef33a8b71 +0 -0
  616. data/test/dummy/tmp/dragonfly/cache/meta/3f/f1f94c6b5c03ff4cf81cb23bfc60912c894b6f +0 -0
  617. data/test/dummy/tmp/dragonfly/cache/meta/51/d20274bbbbb01e6fa7dcdd39776bfb0a001dda +0 -0
  618. data/test/dummy/tmp/dragonfly/cache/meta/54/49e130b5f21a7d1fb0bf87bdccf473caa28fb4 +0 -0
  619. data/test/dummy/tmp/dragonfly/cache/meta/5e/f7d5756119e2b71e82ea878824891efc8d4e98 +0 -0
  620. data/test/dummy/tmp/dragonfly/cache/meta/64/41ffd938beeeae87f4cb84ed8cc2dc89d7ebc0 +0 -0
  621. data/test/dummy/tmp/dragonfly/cache/meta/66/4c2f6718656261fba53eae83feecda49a4fe27 +0 -0
  622. data/test/dummy/tmp/dragonfly/cache/meta/66/f44aba1428593600ff0e47ea6aa54362e39a59 +0 -0
  623. data/test/dummy/tmp/dragonfly/cache/meta/75/868cd14b8d420dcd4ef44afcd20722ad7a1c3f +0 -0
  624. data/test/dummy/tmp/dragonfly/cache/meta/77/08cd91d09e6cc0e0393e02a0fb2e0205cf34af +0 -0
  625. data/test/dummy/tmp/dragonfly/cache/meta/78/5c03964addee8fda74d871c638fef44ca37a1a +0 -0
  626. data/test/dummy/tmp/dragonfly/cache/meta/7c/14b32e4e029b0200d54b210b4148be0349e72c +0 -0
  627. data/test/dummy/tmp/dragonfly/cache/meta/7f/0b8b6f8f34b458916f99a528f4cab40107490d +0 -0
  628. data/test/dummy/tmp/dragonfly/cache/meta/80/5841ac20acdd8dd41460c8346294abc5c4dd8f +0 -0
  629. data/test/dummy/tmp/dragonfly/cache/meta/87/6f1ac29d9a3be64d8ec07d988ee2f7e9210a8c +0 -0
  630. data/test/dummy/tmp/dragonfly/cache/meta/98/09f92ae5a13229558457833b859d1fc4073a75 +0 -0
  631. data/test/dummy/tmp/dragonfly/cache/meta/9b/1e5d2a62e4e1c014350ded8b89e08731e51e12 +0 -0
  632. data/test/dummy/tmp/dragonfly/cache/meta/a0/ca7d61a5e5763e257e13dcbc2b0f11abfd607c +0 -0
  633. data/test/dummy/tmp/dragonfly/cache/meta/a6/415b21bb312e94f5386bebaf0b9dd96f102a4c +0 -0
  634. data/test/dummy/tmp/dragonfly/cache/meta/ae/67c778b4cac5a750af11726e141b1c44969772 +0 -0
  635. data/test/dummy/tmp/dragonfly/cache/meta/bb/64ca9507b7fbb26b5b3085afb8e23beb15dd58 +0 -0
  636. data/test/dummy/tmp/dragonfly/cache/meta/bc/3d6a023e30186fa647759d74acd8538ec159d9 +0 -0
  637. data/test/dummy/tmp/dragonfly/cache/meta/c1/7387f13692af4744efe3e2c05fb5839092ec45 +0 -0
  638. data/test/dummy/tmp/dragonfly/cache/meta/dc/bf7c1fa5b5862d792109822d457a6be23e2fd5 +0 -0
  639. data/test/dummy/tmp/dragonfly/cache/meta/ee/fe74949a8c2a0bbc077385a12944d9f98a12e0 +0 -0
  640. data/test/dummy/tmp/dragonfly/cache/meta/f9/67ac04386c59253bd80f4034d18af166cc5691 +0 -0
  641. data/test/dummy/tmp/dragonfly/cache/meta/fa/a85df3e67eaadf710176efbe0c3b1807db0824 +0 -0
  642. data/test/dummy/tmp/dragonfly/cache/meta/fe/97fd48b64023fee9cc7d8a12f0f1e9097058da +0 -0
  643. data/test/dummy/tmp/dragonfly/cache/meta/ff/d5f8f0d3f33df0282fc5c47f8761d3f328806c +0 -0
  644. data/test/dummy/tmp/pids/server.pid +1 -0
  645. data/test/fixtures/documents.yml +11 -0
  646. data/test/fixtures/node_settings.yml +11 -0
  647. data/test/fixtures/nodes.yml +11 -0
  648. data/test/functional/documents_controller_test.rb +7 -0
  649. data/test/functional/qwerty_admin/base_controller_test.rb +7 -0
  650. data/test/functional/qwerty_admin/documents_controller_test.rb +7 -0
  651. data/test/functional/qwerty_admin/nodes_controller_test.rb +7 -0
  652. data/test/functional/qwerty_base_controller_test.rb +7 -0
  653. data/test/integration/navigation_test.rb +10 -0
  654. data/test/qwerty_test.rb +7 -0
  655. data/test/test_helper.rb +10 -0
  656. data/test/unit/document_test.rb +7 -0
  657. data/test/unit/helpers/documents_helper_test.rb +4 -0
  658. data/test/unit/helpers/qwerty_admin/base_helper_test.rb +4 -0
  659. data/test/unit/helpers/qwerty_admin/documents_helper_test.rb +4 -0
  660. data/test/unit/helpers/qwerty_admin/nodes_helper_test.rb +4 -0
  661. data/test/unit/helpers/qwerty_base_helper_test.rb +4 -0
  662. data/test/unit/node_setting_test.rb +7 -0
  663. data/test/unit/node_test.rb +7 -0
  664. metadata +1195 -0
@@ -0,0 +1,1301 @@
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
+ });