muck-contents 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (528) hide show
  1. data/.document +5 -0
  2. data/.gitignore +5 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +112 -0
  5. data/Rakefile +101 -0
  6. data/VERSION +1 -0
  7. data/app/controllers/admin/muck/contents_controller.rb +15 -0
  8. data/app/controllers/muck/contents_controller.rb +186 -0
  9. data/app/helpers/muck_contents_helper.rb +22 -0
  10. data/app/views/admin/contents/index.html.erb +28 -0
  11. data/app/views/contents/_admin.html.erb +7 -0
  12. data/app/views/contents/_form.html.erb +13 -0
  13. data/app/views/contents/edit.html.erb +6 -0
  14. data/app/views/contents/new.html.erb +5 -0
  15. data/app/views/contents/show.html.erb +5 -0
  16. data/config/muck_contents_routes.rb +8 -0
  17. data/db/migrate/20090703055724_add_contents.rb +49 -0
  18. data/db/migrate/20090806230610_add_layout_to_contents.rb +9 -0
  19. data/db/migrate/20090808005918_add_scope_index_to_slugs.rb +9 -0
  20. data/db/migrate/20090808175401_add_contents_comment_counter_cache.rb +9 -0
  21. data/lib/action_controller/acts/muck_content_handler.rb +84 -0
  22. data/lib/active_record/acts/muck_content.rb +313 -0
  23. data/lib/active_record/acts/muck_content_permission.rb +38 -0
  24. data/lib/active_record/acts/muck_content_translation.rb +40 -0
  25. data/lib/muck_contents/initialize_routes.rb +8 -0
  26. data/lib/muck_contents/tasks.rb +28 -0
  27. data/lib/muck_contents.rb +38 -0
  28. data/locales/en.yml +31 -0
  29. data/muck-contents.gemspec +641 -0
  30. data/public/javascripts/tiny_mce/langs/en.js +154 -0
  31. data/public/javascripts/tiny_mce/license.txt +504 -0
  32. data/public/javascripts/tiny_mce/plugins/advfiletoo/css/advfile.css +34 -0
  33. data/public/javascripts/tiny_mce/plugins/advfiletoo/editor_plugin.js +55 -0
  34. data/public/javascripts/tiny_mce/plugins/advfiletoo/editor_plugin_src.js +55 -0
  35. data/public/javascripts/tiny_mce/plugins/advfiletoo/file.htm +139 -0
  36. data/public/javascripts/tiny_mce/plugins/advfiletoo/img/upload.gif +0 -0
  37. data/public/javascripts/tiny_mce/plugins/advfiletoo/js/functions.js +286 -0
  38. data/public/javascripts/tiny_mce/plugins/advfiletoo/langs/en_dlg.js +48 -0
  39. data/public/javascripts/tiny_mce/plugins/advhr/css/advhr.css +5 -0
  40. data/public/javascripts/tiny_mce/plugins/advhr/editor_plugin.js +1 -0
  41. data/public/javascripts/tiny_mce/plugins/advhr/editor_plugin_src.js +54 -0
  42. data/public/javascripts/tiny_mce/plugins/advhr/js/rule.js +43 -0
  43. data/public/javascripts/tiny_mce/plugins/advhr/langs/en_dlg.js +5 -0
  44. data/public/javascripts/tiny_mce/plugins/advhr/rule.htm +63 -0
  45. data/public/javascripts/tiny_mce/plugins/advimage/css/advimage.css +13 -0
  46. data/public/javascripts/tiny_mce/plugins/advimage/editor_plugin.js +1 -0
  47. data/public/javascripts/tiny_mce/plugins/advimage/editor_plugin_src.js +47 -0
  48. data/public/javascripts/tiny_mce/plugins/advimage/image.htm +238 -0
  49. data/public/javascripts/tiny_mce/plugins/advimage/img/sample.gif +0 -0
  50. data/public/javascripts/tiny_mce/plugins/advimage/js/image.js +441 -0
  51. data/public/javascripts/tiny_mce/plugins/advimage/langs/en_dlg.js +43 -0
  52. data/public/javascripts/tiny_mce/plugins/advimagetoo/css/advimage.css +32 -0
  53. data/public/javascripts/tiny_mce/plugins/advimagetoo/editor_plugin.js +53 -0
  54. data/public/javascripts/tiny_mce/plugins/advimagetoo/editor_plugin_src.js +53 -0
  55. data/public/javascripts/tiny_mce/plugins/advimagetoo/image.htm +303 -0
  56. data/public/javascripts/tiny_mce/plugins/advimagetoo/img/sample.gif +0 -0
  57. data/public/javascripts/tiny_mce/plugins/advimagetoo/js/functions.js +593 -0
  58. data/public/javascripts/tiny_mce/plugins/advimagetoo/langs/en_dlg.js +44 -0
  59. data/public/javascripts/tiny_mce/plugins/advlink/css/advlink.css +8 -0
  60. data/public/javascripts/tiny_mce/plugins/advlink/editor_plugin.js +1 -0
  61. data/public/javascripts/tiny_mce/plugins/advlink/editor_plugin_src.js +58 -0
  62. data/public/javascripts/tiny_mce/plugins/advlink/js/advlink.js +527 -0
  63. data/public/javascripts/tiny_mce/plugins/advlink/langs/en_dlg.js +52 -0
  64. data/public/javascripts/tiny_mce/plugins/advlink/link.htm +339 -0
  65. data/public/javascripts/tiny_mce/plugins/advlinktoo/css/advlink.css +8 -0
  66. data/public/javascripts/tiny_mce/plugins/advlinktoo/editor_plugin.js +58 -0
  67. data/public/javascripts/tiny_mce/plugins/advlinktoo/editor_plugin_src.js +58 -0
  68. data/public/javascripts/tiny_mce/plugins/advlinktoo/js/advlink.js +548 -0
  69. data/public/javascripts/tiny_mce/plugins/advlinktoo/langs/en_dlg.js +52 -0
  70. data/public/javascripts/tiny_mce/plugins/advlinktoo/link.htm +344 -0
  71. data/public/javascripts/tiny_mce/plugins/autosave/editor_plugin.js +1 -0
  72. data/public/javascripts/tiny_mce/plugins/autosave/editor_plugin_src.js +51 -0
  73. data/public/javascripts/tiny_mce/plugins/bbcode/editor_plugin.js +1 -0
  74. data/public/javascripts/tiny_mce/plugins/bbcode/editor_plugin_src.js +117 -0
  75. data/public/javascripts/tiny_mce/plugins/compat2x/editor_plugin.js +1 -0
  76. data/public/javascripts/tiny_mce/plugins/compat2x/editor_plugin_src.js +616 -0
  77. data/public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin.js +1 -0
  78. data/public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js +95 -0
  79. data/public/javascripts/tiny_mce/plugins/directionality/editor_plugin.js +1 -0
  80. data/public/javascripts/tiny_mce/plugins/directionality/editor_plugin_src.js +79 -0
  81. data/public/javascripts/tiny_mce/plugins/emotions/editor_plugin.js +1 -0
  82. data/public/javascripts/tiny_mce/plugins/emotions/editor_plugin_src.js +40 -0
  83. data/public/javascripts/tiny_mce/plugins/emotions/emotions.htm +41 -0
  84. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-cool.gif +0 -0
  85. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-cry.gif +0 -0
  86. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif +0 -0
  87. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif +0 -0
  88. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-frown.gif +0 -0
  89. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif +0 -0
  90. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif +0 -0
  91. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif +0 -0
  92. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif +0 -0
  93. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif +0 -0
  94. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-smile.gif +0 -0
  95. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif +0 -0
  96. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif +0 -0
  97. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif +0 -0
  98. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-wink.gif +0 -0
  99. data/public/javascripts/tiny_mce/plugins/emotions/img/smiley-yell.gif +0 -0
  100. data/public/javascripts/tiny_mce/plugins/emotions/js/emotions.js +22 -0
  101. data/public/javascripts/tiny_mce/plugins/emotions/langs/en_dlg.js +20 -0
  102. data/public/javascripts/tiny_mce/plugins/example/dialog.htm +27 -0
  103. data/public/javascripts/tiny_mce/plugins/example/editor_plugin.js +1 -0
  104. data/public/javascripts/tiny_mce/plugins/example/editor_plugin_src.js +81 -0
  105. data/public/javascripts/tiny_mce/plugins/example/img/example.gif +0 -0
  106. data/public/javascripts/tiny_mce/plugins/example/js/dialog.js +19 -0
  107. data/public/javascripts/tiny_mce/plugins/example/langs/en.js +3 -0
  108. data/public/javascripts/tiny_mce/plugins/example/langs/en_dlg.js +3 -0
  109. data/public/javascripts/tiny_mce/plugins/fullpage/css/fullpage.css +182 -0
  110. data/public/javascripts/tiny_mce/plugins/fullpage/editor_plugin.js +1 -0
  111. data/public/javascripts/tiny_mce/plugins/fullpage/editor_plugin_src.js +142 -0
  112. data/public/javascripts/tiny_mce/plugins/fullpage/fullpage.htm +577 -0
  113. data/public/javascripts/tiny_mce/plugins/fullpage/js/fullpage.js +461 -0
  114. data/public/javascripts/tiny_mce/plugins/fullpage/langs/en_dlg.js +85 -0
  115. data/public/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -0
  116. data/public/javascripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js +145 -0
  117. data/public/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +111 -0
  118. data/public/javascripts/tiny_mce/plugins/iespell/editor_plugin.js +1 -0
  119. data/public/javascripts/tiny_mce/plugins/iespell/editor_plugin_src.js +51 -0
  120. data/public/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
  121. data/public/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +632 -0
  122. data/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  123. data/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  124. data/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  125. data/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  126. data/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  127. data/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  128. data/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  129. data/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
  130. data/public/javascripts/tiny_mce/plugins/inlinepopups/template.htm +387 -0
  131. data/public/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin.js +1 -0
  132. data/public/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js +80 -0
  133. data/public/javascripts/tiny_mce/plugins/layer/editor_plugin.js +1 -0
  134. data/public/javascripts/tiny_mce/plugins/layer/editor_plugin_src.js +209 -0
  135. data/public/javascripts/tiny_mce/plugins/media/css/content.css +6 -0
  136. data/public/javascripts/tiny_mce/plugins/media/css/media.css +16 -0
  137. data/public/javascripts/tiny_mce/plugins/media/editor_plugin.js +1 -0
  138. data/public/javascripts/tiny_mce/plugins/media/editor_plugin_src.js +374 -0
  139. data/public/javascripts/tiny_mce/plugins/media/img/flash.gif +0 -0
  140. data/public/javascripts/tiny_mce/plugins/media/img/quicktime.gif +0 -0
  141. data/public/javascripts/tiny_mce/plugins/media/img/realmedia.gif +0 -0
  142. data/public/javascripts/tiny_mce/plugins/media/img/shockwave.gif +0 -0
  143. data/public/javascripts/tiny_mce/plugins/media/img/trans.gif +0 -0
  144. data/public/javascripts/tiny_mce/plugins/media/img/windowsmedia.gif +0 -0
  145. data/public/javascripts/tiny_mce/plugins/media/js/embed.js +73 -0
  146. data/public/javascripts/tiny_mce/plugins/media/js/media.js +628 -0
  147. data/public/javascripts/tiny_mce/plugins/media/langs/en_dlg.js +103 -0
  148. data/public/javascripts/tiny_mce/plugins/media/media.htm +824 -0
  149. data/public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin.js +1 -0
  150. data/public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js +50 -0
  151. data/public/javascripts/tiny_mce/plugins/noneditable/editor_plugin.js +1 -0
  152. data/public/javascripts/tiny_mce/plugins/noneditable/editor_plugin_src.js +87 -0
  153. data/public/javascripts/tiny_mce/plugins/pagebreak/css/content.css +1 -0
  154. data/public/javascripts/tiny_mce/plugins/pagebreak/editor_plugin.js +1 -0
  155. data/public/javascripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js +74 -0
  156. data/public/javascripts/tiny_mce/plugins/pagebreak/img/pagebreak.gif +0 -0
  157. data/public/javascripts/tiny_mce/plugins/pagebreak/img/trans.gif +0 -0
  158. data/public/javascripts/tiny_mce/plugins/paste/blank.htm +22 -0
  159. data/public/javascripts/tiny_mce/plugins/paste/css/blank.css +14 -0
  160. data/public/javascripts/tiny_mce/plugins/paste/css/pasteword.css +3 -0
  161. data/public/javascripts/tiny_mce/plugins/paste/editor_plugin.js +1 -0
  162. data/public/javascripts/tiny_mce/plugins/paste/editor_plugin_src.js +394 -0
  163. data/public/javascripts/tiny_mce/plugins/paste/js/pastetext.js +42 -0
  164. data/public/javascripts/tiny_mce/plugins/paste/js/pasteword.js +56 -0
  165. data/public/javascripts/tiny_mce/plugins/paste/langs/en_dlg.js +5 -0
  166. data/public/javascripts/tiny_mce/plugins/paste/pastetext.htm +34 -0
  167. data/public/javascripts/tiny_mce/plugins/paste/pasteword.htm +29 -0
  168. data/public/javascripts/tiny_mce/plugins/preview/editor_plugin.js +1 -0
  169. data/public/javascripts/tiny_mce/plugins/preview/editor_plugin_src.js +50 -0
  170. data/public/javascripts/tiny_mce/plugins/preview/example.html +28 -0
  171. data/public/javascripts/tiny_mce/plugins/preview/jscripts/embed.js +73 -0
  172. data/public/javascripts/tiny_mce/plugins/preview/preview.html +19 -0
  173. data/public/javascripts/tiny_mce/plugins/print/editor_plugin.js +1 -0
  174. data/public/javascripts/tiny_mce/plugins/print/editor_plugin_src.js +31 -0
  175. data/public/javascripts/tiny_mce/plugins/safari/blank.htm +1 -0
  176. data/public/javascripts/tiny_mce/plugins/safari/editor_plugin.js +1 -0
  177. data/public/javascripts/tiny_mce/plugins/safari/editor_plugin_src.js +545 -0
  178. data/public/javascripts/tiny_mce/plugins/save/editor_plugin.js +1 -0
  179. data/public/javascripts/tiny_mce/plugins/save/editor_plugin_src.js +98 -0
  180. data/public/javascripts/tiny_mce/plugins/searchreplace/css/searchreplace.css +6 -0
  181. data/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin.js +1 -0
  182. data/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js +54 -0
  183. data/public/javascripts/tiny_mce/plugins/searchreplace/js/searchreplace.js +126 -0
  184. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js +16 -0
  185. data/public/javascripts/tiny_mce/plugins/searchreplace/searchreplace.htm +105 -0
  186. data/public/javascripts/tiny_mce/plugins/spellchecker/css/content.css +1 -0
  187. data/public/javascripts/tiny_mce/plugins/spellchecker/editor_plugin.js +1 -0
  188. data/public/javascripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js +338 -0
  189. data/public/javascripts/tiny_mce/plugins/spellchecker/img/wline.gif +0 -0
  190. data/public/javascripts/tiny_mce/plugins/style/css/props.css +13 -0
  191. data/public/javascripts/tiny_mce/plugins/style/editor_plugin.js +1 -0
  192. data/public/javascripts/tiny_mce/plugins/style/editor_plugin_src.js +52 -0
  193. data/public/javascripts/tiny_mce/plugins/style/js/props.js +641 -0
  194. data/public/javascripts/tiny_mce/plugins/style/langs/en_dlg.js +63 -0
  195. data/public/javascripts/tiny_mce/plugins/style/props.htm +731 -0
  196. data/public/javascripts/tiny_mce/plugins/table/cell.htm +184 -0
  197. data/public/javascripts/tiny_mce/plugins/table/css/cell.css +17 -0
  198. data/public/javascripts/tiny_mce/plugins/table/css/row.css +25 -0
  199. data/public/javascripts/tiny_mce/plugins/table/css/table.css +13 -0
  200. data/public/javascripts/tiny_mce/plugins/table/editor_plugin.js +1 -0
  201. data/public/javascripts/tiny_mce/plugins/table/editor_plugin_src.js +1115 -0
  202. data/public/javascripts/tiny_mce/plugins/table/js/cell.js +269 -0
  203. data/public/javascripts/tiny_mce/plugins/table/js/merge_cells.js +29 -0
  204. data/public/javascripts/tiny_mce/plugins/table/js/row.js +212 -0
  205. data/public/javascripts/tiny_mce/plugins/table/js/table.js +410 -0
  206. data/public/javascripts/tiny_mce/plugins/table/langs/en_dlg.js +74 -0
  207. data/public/javascripts/tiny_mce/plugins/table/merge_cells.htm +38 -0
  208. data/public/javascripts/tiny_mce/plugins/table/row.htm +161 -0
  209. data/public/javascripts/tiny_mce/plugins/table/table.htm +193 -0
  210. data/public/javascripts/tiny_mce/plugins/template/blank.htm +12 -0
  211. data/public/javascripts/tiny_mce/plugins/template/css/template.css +23 -0
  212. data/public/javascripts/tiny_mce/plugins/template/editor_plugin.js +1 -0
  213. data/public/javascripts/tiny_mce/plugins/template/editor_plugin_src.js +156 -0
  214. data/public/javascripts/tiny_mce/plugins/template/js/template.js +106 -0
  215. data/public/javascripts/tiny_mce/plugins/template/langs/en_dlg.js +15 -0
  216. data/public/javascripts/tiny_mce/plugins/template/template.htm +39 -0
  217. data/public/javascripts/tiny_mce/plugins/visualchars/editor_plugin.js +1 -0
  218. data/public/javascripts/tiny_mce/plugins/visualchars/editor_plugin_src.js +73 -0
  219. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/abbr.htm +149 -0
  220. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/acronym.htm +149 -0
  221. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/attributes.htm +154 -0
  222. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/cite.htm +149 -0
  223. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css +11 -0
  224. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/css/popup.css +9 -0
  225. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/del.htm +170 -0
  226. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js +1 -0
  227. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js +136 -0
  228. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/ins.htm +170 -0
  229. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js +25 -0
  230. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js +25 -0
  231. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js +123 -0
  232. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/cite.js +25 -0
  233. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/del.js +60 -0
  234. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js +228 -0
  235. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/ins.js +59 -0
  236. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js +32 -0
  237. data/public/javascripts/tiny_mce/templates/bio.htm +31 -0
  238. data/public/javascripts/tiny_mce/templates/country.htm +59 -0
  239. data/public/javascripts/tiny_mce/themes/advanced/about.htm +56 -0
  240. data/public/javascripts/tiny_mce/themes/advanced/anchor.htm +32 -0
  241. data/public/javascripts/tiny_mce/themes/advanced/charmap.htm +54 -0
  242. data/public/javascripts/tiny_mce/themes/advanced/color_picker.htm +76 -0
  243. data/public/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -0
  244. data/public/javascripts/tiny_mce/themes/advanced/editor_template_src.js +1147 -0
  245. data/public/javascripts/tiny_mce/themes/advanced/image.htm +86 -0
  246. data/public/javascripts/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  247. data/public/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
  248. data/public/javascripts/tiny_mce/themes/advanced/js/about.js +72 -0
  249. data/public/javascripts/tiny_mce/themes/advanced/js/anchor.js +37 -0
  250. data/public/javascripts/tiny_mce/themes/advanced/js/charmap.js +325 -0
  251. data/public/javascripts/tiny_mce/themes/advanced/js/color_picker.js +253 -0
  252. data/public/javascripts/tiny_mce/themes/advanced/js/image.js +245 -0
  253. data/public/javascripts/tiny_mce/themes/advanced/js/link.js +155 -0
  254. data/public/javascripts/tiny_mce/themes/advanced/js/source_editor.js +62 -0
  255. data/public/javascripts/tiny_mce/themes/advanced/langs/en.js +62 -0
  256. data/public/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +51 -0
  257. data/public/javascripts/tiny_mce/themes/advanced/link.htm +64 -0
  258. data/public/javascripts/tiny_mce/themes/advanced/skins/default/content.css +32 -0
  259. data/public/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +114 -0
  260. data/public/javascripts/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  261. data/public/javascripts/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  262. data/public/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  263. data/public/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  264. data/public/javascripts/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  265. data/public/javascripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  266. data/public/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +215 -0
  267. data/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +32 -0
  268. data/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +113 -0
  269. data/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  270. data/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  271. data/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  272. data/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +215 -0
  273. data/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  274. data/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  275. data/public/javascripts/tiny_mce/themes/advanced/source_editor.htm +32 -0
  276. data/public/javascripts/tiny_mce/themes/simple/editor_template.js +1 -0
  277. data/public/javascripts/tiny_mce/themes/simple/editor_template_src.js +85 -0
  278. data/public/javascripts/tiny_mce/themes/simple/img/icons.gif +0 -0
  279. data/public/javascripts/tiny_mce/themes/simple/langs/en.js +11 -0
  280. data/public/javascripts/tiny_mce/themes/simple/skins/default/content.css +25 -0
  281. data/public/javascripts/tiny_mce/themes/simple/skins/default/ui.css +32 -0
  282. data/public/javascripts/tiny_mce/themes/simple/skins/o2k7/content.css +17 -0
  283. data/public/javascripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png +0 -0
  284. data/public/javascripts/tiny_mce/themes/simple/skins/o2k7/ui.css +35 -0
  285. data/public/javascripts/tiny_mce/tiny_mce.js +1 -0
  286. data/public/javascripts/tiny_mce/tiny_mce_popup.js +294 -0
  287. data/public/javascripts/tiny_mce/tiny_mce_src.js +11059 -0
  288. data/public/javascripts/tiny_mce/utils/editable_selects.js +69 -0
  289. data/public/javascripts/tiny_mce/utils/form_utils.js +199 -0
  290. data/public/javascripts/tiny_mce/utils/mctabs.js +76 -0
  291. data/public/javascripts/tiny_mce/utils/validate.js +219 -0
  292. data/public/javascripts/tiny_mce_helper.js +73 -0
  293. data/rails/init.rb +24 -0
  294. data/tasks/muck_contents_tasks.rake +1 -0
  295. data/test/rails_root/.gitignore +8 -0
  296. data/test/rails_root/.rake_tasks +103 -0
  297. data/test/rails_root/Capfile +3 -0
  298. data/test/rails_root/Rakefile +18 -0
  299. data/test/rails_root/app/controllers/application_controller.rb +22 -0
  300. data/test/rails_root/app/controllers/contents_controller.rb +3 -0
  301. data/test/rails_root/app/controllers/default_controller.rb +7 -0
  302. data/test/rails_root/app/helpers/application_helper.rb +3 -0
  303. data/test/rails_root/app/models/.keep +0 -0
  304. data/test/rails_root/app/models/comment.rb +5 -0
  305. data/test/rails_root/app/models/content.rb +7 -0
  306. data/test/rails_root/app/models/content_permission.rb +3 -0
  307. data/test/rails_root/app/models/content_translation.rb +3 -0
  308. data/test/rails_root/app/models/user.rb +12 -0
  309. data/test/rails_root/app/models/user_session.rb +2 -0
  310. data/test/rails_root/app/views/default/index.html.erb +0 -0
  311. data/test/rails_root/app/views/layouts/_not_a_template.html.erb +1 -0
  312. data/test/rails_root/app/views/layouts/default.html.erb +26 -0
  313. data/test/rails_root/config/amazon_s3.yml +14 -0
  314. data/test/rails_root/config/boot.rb +109 -0
  315. data/test/rails_root/config/database.yml +19 -0
  316. data/test/rails_root/config/environment.rb +33 -0
  317. data/test/rails_root/config/environments/cucumber.rb +22 -0
  318. data/test/rails_root/config/environments/development.rb +19 -0
  319. data/test/rails_root/config/environments/production.rb +1 -0
  320. data/test/rails_root/config/environments/test.rb +46 -0
  321. data/test/rails_root/config/global_config.yml +80 -0
  322. data/test/rails_root/config/initializers/inflections.rb +10 -0
  323. data/test/rails_root/config/initializers/mime_types.rb +5 -0
  324. data/test/rails_root/config/initializers/requires.rb +13 -0
  325. data/test/rails_root/config/initializers/session_store.rb +8 -0
  326. data/test/rails_root/config/routes.rb +6 -0
  327. data/test/rails_root/db/.keep +0 -0
  328. data/test/rails_root/db/migrate/20090320174818_create_muck_permissions_and_roles.rb +16 -0
  329. data/test/rails_root/db/migrate/20090402033319_add_muck_activities.rb +36 -0
  330. data/test/rails_root/db/migrate/20090602041838_create_users.rb +39 -0
  331. data/test/rails_root/db/migrate/20090608073052_create_friends.rb +16 -0
  332. data/test/rails_root/db/migrate/20090613173314_create_comments.rb +24 -0
  333. data/test/rails_root/db/migrate/20090703055724_add_contents.rb +49 -0
  334. data/test/rails_root/db/migrate/20090704220055_create_slugs.rb +18 -0
  335. data/test/rails_root/db/migrate/20090704220120_acts_as_taggable_on_migration.rb +29 -0
  336. data/test/rails_root/db/migrate/20090730154102_allow_null_user.rb +9 -0
  337. data/test/rails_root/db/migrate/20090806230610_add_layout_to_contents.rb +9 -0
  338. data/test/rails_root/db/migrate/20090808005918_add_scope_index_to_slugs.rb +9 -0
  339. data/test/rails_root/db/migrate/20090808175401_add_contents_comment_counter_cache.rb +9 -0
  340. data/test/rails_root/db/schema.rb +186 -0
  341. data/test/rails_root/features/step_definitions/common_steps.rb +99 -0
  342. data/test/rails_root/features/step_definitions/content_steps.rb +15 -0
  343. data/test/rails_root/features/step_definitions/webrat_steps.rb +128 -0
  344. data/test/rails_root/features/support/env.rb +49 -0
  345. data/test/rails_root/features/support/paths.rb +27 -0
  346. data/test/rails_root/features/view_contents.feature +29 -0
  347. data/test/rails_root/lib/tasks/cucumber.rake +20 -0
  348. data/test/rails_root/public/.htaccess +40 -0
  349. data/test/rails_root/public/404.html +30 -0
  350. data/test/rails_root/public/422.html +30 -0
  351. data/test/rails_root/public/500.html +30 -0
  352. data/test/rails_root/public/dispatch.rb +10 -0
  353. data/test/rails_root/public/favicon.ico +0 -0
  354. data/test/rails_root/public/images/arrow_left.gif +0 -0
  355. data/test/rails_root/public/images/arrow_right.gif +0 -0
  356. data/test/rails_root/public/images/icons/accept.png +0 -0
  357. data/test/rails_root/public/images/icons/add.png +0 -0
  358. data/test/rails_root/public/images/icons/delete.png +0 -0
  359. data/test/rails_root/public/images/icons/vote.png +0 -0
  360. data/test/rails_root/public/images/loading.gif +0 -0
  361. data/test/rails_root/public/images/profile_default.jpg +0 -0
  362. data/test/rails_root/public/images/rails.png +0 -0
  363. data/test/rails_root/public/images/spinner.gif +0 -0
  364. data/test/rails_root/public/images/sprites.png +0 -0
  365. data/test/rails_root/public/javascripts/application.js +2 -0
  366. data/test/rails_root/public/javascripts/builder.js +136 -0
  367. data/test/rails_root/public/javascripts/controls.js +963 -0
  368. data/test/rails_root/public/javascripts/dragdrop.js +972 -0
  369. data/test/rails_root/public/javascripts/effects.js +1120 -0
  370. data/test/rails_root/public/javascripts/fancyzoom.min.js +1 -0
  371. data/test/rails_root/public/javascripts/jquery/jquery-ui.js +273 -0
  372. data/test/rails_root/public/javascripts/jquery/jquery.form.js +637 -0
  373. data/test/rails_root/public/javascripts/jquery/jquery.jgrowl.js +2 -0
  374. data/test/rails_root/public/javascripts/jquery/jquery.js +19 -0
  375. data/test/rails_root/public/javascripts/jquery/jquery.tips.js +69 -0
  376. data/test/rails_root/public/javascripts/muck.js +76 -0
  377. data/test/rails_root/public/javascripts/muck_activities.js +108 -0
  378. data/test/rails_root/public/javascripts/prototype.js +4225 -0
  379. data/test/rails_root/public/javascripts/scriptaculous.js +58 -0
  380. data/test/rails_root/public/javascripts/slider.js +277 -0
  381. data/test/rails_root/public/javascripts/sound.js +60 -0
  382. data/test/rails_root/public/robots.txt +1 -0
  383. data/test/rails_root/public/stylesheets/.keep +0 -0
  384. data/test/rails_root/public/stylesheets/admin.css +12 -0
  385. data/test/rails_root/public/stylesheets/blueprint/ie.css +26 -0
  386. data/test/rails_root/public/stylesheets/blueprint/liquid_screen.css +203 -0
  387. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/icons/cross.png +0 -0
  388. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/icons/key.png +0 -0
  389. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/icons/tick.png +0 -0
  390. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/readme.txt +32 -0
  391. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/screen.css +97 -0
  392. data/test/rails_root/public/stylesheets/blueprint/plugins/fancy-type/readme.txt +14 -0
  393. data/test/rails_root/public/stylesheets/blueprint/plugins/fancy-type/screen.css +71 -0
  394. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/doc.png +0 -0
  395. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/email.png +0 -0
  396. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/external.png +0 -0
  397. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/feed.png +0 -0
  398. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/im.png +0 -0
  399. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/pdf.png +0 -0
  400. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/visited.png +0 -0
  401. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/xls.png +0 -0
  402. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/readme.txt +18 -0
  403. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/screen.css +40 -0
  404. data/test/rails_root/public/stylesheets/blueprint/plugins/liquid/liquid.css +134 -0
  405. data/test/rails_root/public/stylesheets/blueprint/plugins/liquid/src/liquid.css +197 -0
  406. data/test/rails_root/public/stylesheets/blueprint/plugins/rtl/readme.txt +10 -0
  407. data/test/rails_root/public/stylesheets/blueprint/plugins/rtl/screen.css +109 -0
  408. data/test/rails_root/public/stylesheets/blueprint/print.css +30 -0
  409. data/test/rails_root/public/stylesheets/blueprint/screen.css +251 -0
  410. data/test/rails_root/public/stylesheets/blueprint/sprite.css +1 -0
  411. data/test/rails_root/public/stylesheets/blueprint/src/forms.css +49 -0
  412. data/test/rails_root/public/stylesheets/blueprint/src/grid.css +213 -0
  413. data/test/rails_root/public/stylesheets/blueprint/src/grid.png +0 -0
  414. data/test/rails_root/public/stylesheets/blueprint/src/ie.css +59 -0
  415. data/test/rails_root/public/stylesheets/blueprint/src/print.css +85 -0
  416. data/test/rails_root/public/stylesheets/blueprint/src/reset.css +38 -0
  417. data/test/rails_root/public/stylesheets/blueprint/src/typography.css +105 -0
  418. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png +0 -0
  419. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_diagonals-thick_15_444444_40x40.png +0 -0
  420. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_100_f0f0f0_1x400.png +0 -0
  421. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_50_99c2ff_1x400.png +0 -0
  422. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_55_fbf5d0_1x400.png +0 -0
  423. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_80_e6e6e6_1x400.png +0 -0
  424. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  425. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_highlight-hard_100_f9f9f9_1x100.png +0 -0
  426. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_highlight-soft_100_e7eef3_1x100.png +0 -0
  427. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_222222_256x240.png +0 -0
  428. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_2694e8_256x240.png +0 -0
  429. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_2e83ff_256x240.png +0 -0
  430. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_72a7cf_256x240.png +0 -0
  431. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_888888_256x240.png +0 -0
  432. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_cd0a0a_256x240.png +0 -0
  433. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_ffffff_256x240.png +0 -0
  434. data/test/rails_root/public/stylesheets/jquery/cupertino/jquery-ui-1.7.1.custom.css +404 -0
  435. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  436. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
  437. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
  438. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
  439. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  440. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
  441. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
  442. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
  443. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_217bc0_256x240.png +0 -0
  444. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_2e83ff_256x240.png +0 -0
  445. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_469bdd_256x240.png +0 -0
  446. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_6da8d5_256x240.png +0 -0
  447. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_cd0a0a_256x240.png +0 -0
  448. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_d8e7f3_256x240.png +0 -0
  449. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_f9bd01_256x240.png +0 -0
  450. data/test/rails_root/public/stylesheets/jquery/redmond/jquery-ui-1.7.1.custom.css +404 -0
  451. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  452. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  453. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  454. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  455. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  456. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  457. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  458. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  459. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_222222_256x240.png +0 -0
  460. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  461. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_454545_256x240.png +0 -0
  462. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_888888_256x240.png +0 -0
  463. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  464. data/test/rails_root/public/stylesheets/jquery/smoothness/jquery-ui-1.7.1.custom.css +404 -0
  465. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  466. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  467. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  468. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  469. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  470. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  471. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  472. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  473. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  474. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  475. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  476. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  477. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  478. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  479. data/test/rails_root/public/stylesheets/jquery/ui-lightness/jquery-ui-1.7.1.custom.css +404 -0
  480. data/test/rails_root/public/stylesheets/reset.css +0 -0
  481. data/test/rails_root/public/stylesheets/styles.css +79 -0
  482. data/test/rails_root/script/about +3 -0
  483. data/test/rails_root/script/breakpointer +3 -0
  484. data/test/rails_root/script/console +3 -0
  485. data/test/rails_root/script/create_project.rb +52 -0
  486. data/test/rails_root/script/cucumber +8 -0
  487. data/test/rails_root/script/dbconsole +3 -0
  488. data/test/rails_root/script/destroy +3 -0
  489. data/test/rails_root/script/generate +3 -0
  490. data/test/rails_root/script/performance/benchmarker +3 -0
  491. data/test/rails_root/script/performance/profiler +3 -0
  492. data/test/rails_root/script/performance/request +3 -0
  493. data/test/rails_root/script/plugin +3 -0
  494. data/test/rails_root/script/process/inspector +3 -0
  495. data/test/rails_root/script/process/reaper +3 -0
  496. data/test/rails_root/script/process/spawner +3 -0
  497. data/test/rails_root/script/runner +3 -0
  498. data/test/rails_root/script/server +3 -0
  499. data/test/rails_root/test/factories.rb +139 -0
  500. data/test/rails_root/test/functional/.keep +0 -0
  501. data/test/rails_root/test/functional/contents_controller_test.rb +41 -0
  502. data/test/rails_root/test/integration/.keep +0 -0
  503. data/test/rails_root/test/mocks/development/.keep +0 -0
  504. data/test/rails_root/test/mocks/test/.keep +0 -0
  505. data/test/rails_root/test/shoulda_macros/controller.rb +49 -0
  506. data/test/rails_root/test/shoulda_macros/forms.rb +32 -0
  507. data/test/rails_root/test/shoulda_macros/models.rb +50 -0
  508. data/test/rails_root/test/shoulda_macros/pagination.rb +53 -0
  509. data/test/rails_root/test/shoulda_macros/plugins.rb +34 -0
  510. data/test/rails_root/test/test_helper.rb +55 -0
  511. data/test/rails_root/test/unit/.keep +0 -0
  512. data/test/rails_root/test/unit/content_permission_test.rb +30 -0
  513. data/test/rails_root/test/unit/content_test.rb +289 -0
  514. data/test/rails_root/test/unit/content_translation_test.rb +35 -0
  515. data/test/rails_root/test/unit/user_test.rb +12 -0
  516. data/test/rails_root/vendor/plugins/ssl_requirement/README +43 -0
  517. data/test/rails_root/vendor/plugins/ssl_requirement/lib/ssl_requirement.rb +62 -0
  518. data/test/rails_root/vendor/plugins/ssl_requirement/test/ssl_requirement_test.rb +132 -0
  519. data/test/rails_root/vendor/plugins/validation_reflection/CHANGELOG +24 -0
  520. data/test/rails_root/vendor/plugins/validation_reflection/LICENSE +20 -0
  521. data/test/rails_root/vendor/plugins/validation_reflection/README +64 -0
  522. data/test/rails_root/vendor/plugins/validation_reflection/Rakefile +22 -0
  523. data/test/rails_root/vendor/plugins/validation_reflection/about.yml +7 -0
  524. data/test/rails_root/vendor/plugins/validation_reflection/init.rb +8 -0
  525. data/test/rails_root/vendor/plugins/validation_reflection/lib/boiler_plate/validation_reflection.rb +129 -0
  526. data/test/rails_root/vendor/plugins/validation_reflection/test/test_helper.rb +36 -0
  527. data/test/rails_root/vendor/plugins/validation_reflection/test/validation_reflection_test.rb +126 -0
  528. metadata +705 -0
@@ -0,0 +1,1115 @@
1
+ /**
2
+ * $Id: editor_plugin_src.js 916 2008-09-03 08:57:45Z spocke $
3
+ *
4
+ * @author Moxiecode
5
+ * @copyright Copyright � 2004-2008, Moxiecode Systems AB, All rights reserved.
6
+ */
7
+
8
+ (function() {
9
+ var each = tinymce.each;
10
+
11
+ tinymce.create('tinymce.plugins.TablePlugin', {
12
+ init : function(ed, url) {
13
+ var t = this;
14
+
15
+ t.editor = ed;
16
+ t.url = url;
17
+
18
+ // Register buttons
19
+ each([
20
+ ['table', 'table.desc', 'mceInsertTable', true],
21
+ ['delete_table', 'table.del', 'mceTableDelete'],
22
+ ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'],
23
+ ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'],
24
+ ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'],
25
+ ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'],
26
+ ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'],
27
+ ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'],
28
+ ['row_props', 'table.row_desc', 'mceTableRowProps', true],
29
+ ['cell_props', 'table.cell_desc', 'mceTableCellProps', true],
30
+ ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true],
31
+ ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true]
32
+ ], function(c) {
33
+ ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});
34
+ });
35
+
36
+ ed.onInit.add(function() {
37
+ if (ed && ed.plugins.contextmenu) {
38
+ ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {
39
+ var sm, se = ed.selection, el = se.getNode() || ed.getBody();
40
+
41
+ if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th')) {
42
+ m.removeAll();
43
+
44
+ if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) {
45
+ m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});
46
+ m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});
47
+ m.addSeparator();
48
+ }
49
+
50
+ if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) {
51
+ m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});
52
+ m.addSeparator();
53
+ }
54
+
55
+ m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true, value : {action : 'insert'}});
56
+ m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable', ui : true});
57
+ m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete', ui : true});
58
+ m.addSeparator();
59
+
60
+ // Cell menu
61
+ sm = m.addMenu({title : 'table.cell'});
62
+ sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps', ui : true});
63
+ sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells', ui : true});
64
+ sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells', ui : true});
65
+
66
+ // Row menu
67
+ sm = m.addMenu({title : 'table.row'});
68
+ sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps', ui : true});
69
+ sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'});
70
+ sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'});
71
+ sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'});
72
+ sm.addSeparator();
73
+ sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'});
74
+ sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'});
75
+ sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'});
76
+ sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'});
77
+
78
+ // Column menu
79
+ sm = m.addMenu({title : 'table.col'});
80
+ sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'});
81
+ sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'});
82
+ sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'});
83
+ } else
84
+ m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true});
85
+ });
86
+ }
87
+ });
88
+
89
+ // Add undo level when new rows are created using the tab key
90
+ ed.onKeyDown.add(function(ed, e) {
91
+ if (e.keyCode == 9 && ed.dom.getParent(ed.selection.getNode(), 'TABLE')) {
92
+ if (!tinymce.isGecko && !tinymce.isOpera) {
93
+ tinyMCE.execInstanceCommand(ed.editorId, "mceTableMoveToNextRow", true);
94
+ return tinymce.dom.Event.cancel(e);
95
+ }
96
+
97
+ ed.undoManager.add();
98
+ }
99
+ });
100
+
101
+ // Select whole table is a table border is clicked
102
+ if (!tinymce.isIE) {
103
+ if (ed.getParam('table_selection', true)) {
104
+ ed.onClick.add(function(ed, e) {
105
+ e = e.target;
106
+
107
+ if (e.nodeName === 'TABLE')
108
+ ed.selection.select(e);
109
+ });
110
+ }
111
+ }
112
+
113
+ ed.onNodeChange.add(function(ed, cm, n) {
114
+ var p = ed.dom.getParent(n, 'td,th,caption');
115
+
116
+ cm.setActive('table', n.nodeName === 'TABLE' || !!p);
117
+ if (p && p.nodeName === 'CAPTION')
118
+ p = null;
119
+
120
+ cm.setDisabled('delete_table', !p);
121
+ cm.setDisabled('delete_col', !p);
122
+ cm.setDisabled('delete_table', !p);
123
+ cm.setDisabled('delete_row', !p);
124
+ cm.setDisabled('col_after', !p);
125
+ cm.setDisabled('col_before', !p);
126
+ cm.setDisabled('row_after', !p);
127
+ cm.setDisabled('row_before', !p);
128
+ cm.setDisabled('row_props', !p);
129
+ cm.setDisabled('cell_props', !p);
130
+ cm.setDisabled('split_cells', !p || (parseInt(ed.dom.getAttrib(p, 'colspan', '1')) < 2 && parseInt(ed.dom.getAttrib(p, 'rowspan', '1')) < 2));
131
+ cm.setDisabled('merge_cells', !p);
132
+ });
133
+
134
+ // Padd empty table cells
135
+ if (!tinymce.isIE) {
136
+ ed.onBeforeSetContent.add(function(ed, o) {
137
+ if (o.initial)
138
+ o.content = o.content.replace(/<(td|th)([^>]+|)>\s*<\/(td|th)>/g, tinymce.isOpera ? '<$1$2>&nbsp;</$1>' : '<$1$2><br mce_bogus="1" /></$1>');
139
+ });
140
+ }
141
+ },
142
+
143
+ execCommand : function(cmd, ui, val) {
144
+ var ed = this.editor, b;
145
+
146
+ // Is table command
147
+ switch (cmd) {
148
+ case "mceTableMoveToNextRow":
149
+ case "mceInsertTable":
150
+ case "mceTableRowProps":
151
+ case "mceTableCellProps":
152
+ case "mceTableSplitCells":
153
+ case "mceTableMergeCells":
154
+ case "mceTableInsertRowBefore":
155
+ case "mceTableInsertRowAfter":
156
+ case "mceTableDeleteRow":
157
+ case "mceTableInsertColBefore":
158
+ case "mceTableInsertColAfter":
159
+ case "mceTableDeleteCol":
160
+ case "mceTableCutRow":
161
+ case "mceTableCopyRow":
162
+ case "mceTablePasteRowBefore":
163
+ case "mceTablePasteRowAfter":
164
+ case "mceTableDelete":
165
+ ed.execCommand('mceBeginUndoLevel');
166
+ this._doExecCommand(cmd, ui, val);
167
+ ed.execCommand('mceEndUndoLevel');
168
+
169
+ return true;
170
+ }
171
+
172
+ // Pass to next handler in chain
173
+ return false;
174
+ },
175
+
176
+ getInfo : function() {
177
+ return {
178
+ longname : 'Tables',
179
+ author : 'Moxiecode Systems AB',
180
+ authorurl : 'http://tinymce.moxiecode.com',
181
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table',
182
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
183
+ };
184
+ },
185
+
186
+ // Private plugin internal methods
187
+
188
+ /**
189
+ * Executes the table commands.
190
+ */
191
+ _doExecCommand : function(command, user_interface, value) {
192
+ var inst = this.editor, ed = inst, url = this.url;
193
+ var focusElm = inst.selection.getNode();
194
+ var trElm = inst.dom.getParent(focusElm, "tr");
195
+ var tdElm = inst.dom.getParent(focusElm, "td,th");
196
+ var tableElm = inst.dom.getParent(focusElm, "table");
197
+ var doc = inst.contentWindow.document;
198
+ var tableBorder = tableElm ? tableElm.getAttribute("border") : "";
199
+
200
+ // Get first TD if no TD found
201
+ if (trElm && tdElm == null)
202
+ tdElm = trElm.cells[0];
203
+
204
+ function inArray(ar, v) {
205
+ for (var i=0; i<ar.length; i++) {
206
+ // Is array
207
+ if (ar[i].length > 0 && inArray(ar[i], v))
208
+ return true;
209
+
210
+ // Found value
211
+ if (ar[i] == v)
212
+ return true;
213
+ }
214
+
215
+ return false;
216
+ }
217
+
218
+ function select(dx, dy) {
219
+ var td;
220
+
221
+ grid = getTableGrid(tableElm);
222
+ dx = dx || 0;
223
+ dy = dy || 0;
224
+ dx = Math.max(cpos.cellindex + dx, 0);
225
+ dy = Math.max(cpos.rowindex + dy, 0);
226
+
227
+ // Recalculate grid and select
228
+ inst.execCommand('mceRepaint');
229
+ td = getCell(grid, dy, dx);
230
+
231
+ if (td) {
232
+ inst.selection.select(td.firstChild || td);
233
+ inst.selection.collapse(1);
234
+ }
235
+ };
236
+
237
+ function makeTD() {
238
+ var newTD = doc.createElement("td");
239
+
240
+ if (!tinymce.isIE)
241
+ newTD.innerHTML = '<br mce_bogus="1"/>';
242
+ }
243
+
244
+ function getColRowSpan(td) {
245
+ var colspan = inst.dom.getAttrib(td, "colspan");
246
+ var rowspan = inst.dom.getAttrib(td, "rowspan");
247
+
248
+ colspan = colspan == "" ? 1 : parseInt(colspan);
249
+ rowspan = rowspan == "" ? 1 : parseInt(rowspan);
250
+
251
+ return {colspan : colspan, rowspan : rowspan};
252
+ }
253
+
254
+ function getCellPos(grid, td) {
255
+ var x, y;
256
+
257
+ for (y=0; y<grid.length; y++) {
258
+ for (x=0; x<grid[y].length; x++) {
259
+ if (grid[y][x] == td)
260
+ return {cellindex : x, rowindex : y};
261
+ }
262
+ }
263
+
264
+ return null;
265
+ }
266
+
267
+ function getCell(grid, row, col) {
268
+ if (grid[row] && grid[row][col])
269
+ return grid[row][col];
270
+
271
+ return null;
272
+ }
273
+
274
+ function getNextCell(table, cell) {
275
+ var cells = [], x = 0, i, j, cell, nextCell;
276
+
277
+ for (i = 0; i < table.rows.length; i++)
278
+ for (j = 0; j < table.rows[i].cells.length; j++, x++)
279
+ cells[x] = table.rows[i].cells[j];
280
+
281
+ for (i = 0; i < cells.length; i++)
282
+ if (cells[i] == cell)
283
+ if (nextCell = cells[i+1])
284
+ return nextCell;
285
+ }
286
+
287
+ function getTableGrid(table) {
288
+ var grid = [], rows = table.rows, x, y, td, sd, xstart, x2, y2;
289
+
290
+ for (y=0; y<rows.length; y++) {
291
+ for (x=0; x<rows[y].cells.length; x++) {
292
+ td = rows[y].cells[x];
293
+ sd = getColRowSpan(td);
294
+
295
+ // All ready filled
296
+ for (xstart = x; grid[y] && grid[y][xstart]; xstart++) ;
297
+
298
+ // Fill box
299
+ for (y2=y; y2<y+sd['rowspan']; y2++) {
300
+ if (!grid[y2])
301
+ grid[y2] = [];
302
+
303
+ for (x2=xstart; x2<xstart+sd['colspan']; x2++)
304
+ grid[y2][x2] = td;
305
+ }
306
+ }
307
+ }
308
+
309
+ return grid;
310
+ }
311
+
312
+ function trimRow(table, tr, td, new_tr) {
313
+ var grid = getTableGrid(table), cpos = getCellPos(grid, td);
314
+ var cells, lastElm;
315
+
316
+ // Time to crop away some
317
+ if (new_tr.cells.length != tr.childNodes.length) {
318
+ cells = tr.childNodes;
319
+ lastElm = null;
320
+
321
+ for (var x=0; td = getCell(grid, cpos.rowindex, x); x++) {
322
+ var remove = true;
323
+ var sd = getColRowSpan(td);
324
+
325
+ // Remove due to rowspan
326
+ if (inArray(cells, td)) {
327
+ new_tr.childNodes[x]._delete = true;
328
+ } else if ((lastElm == null || td != lastElm) && sd.colspan > 1) { // Remove due to colspan
329
+ for (var i=x; i<x+td.colSpan; i++)
330
+ new_tr.childNodes[i]._delete = true;
331
+ }
332
+
333
+ if ((lastElm == null || td != lastElm) && sd.rowspan > 1)
334
+ td.rowSpan = sd.rowspan + 1;
335
+
336
+ lastElm = td;
337
+ }
338
+
339
+ deleteMarked(tableElm);
340
+ }
341
+ }
342
+
343
+ function prevElm(node, name) {
344
+ while ((node = node.previousSibling) != null) {
345
+ if (node.nodeName == name)
346
+ return node;
347
+ }
348
+
349
+ return null;
350
+ }
351
+
352
+ function nextElm(node, names) {
353
+ var namesAr = names.split(',');
354
+
355
+ while ((node = node.nextSibling) != null) {
356
+ for (var i=0; i<namesAr.length; i++) {
357
+ if (node.nodeName.toLowerCase() == namesAr[i].toLowerCase() )
358
+ return node;
359
+ }
360
+ }
361
+
362
+ return null;
363
+ }
364
+
365
+ function deleteMarked(tbl) {
366
+ if (tbl.rows == 0)
367
+ return;
368
+
369
+ var tr = tbl.rows[0];
370
+ do {
371
+ var next = nextElm(tr, "TR");
372
+
373
+ // Delete row
374
+ if (tr._delete) {
375
+ tr.parentNode.removeChild(tr);
376
+ continue;
377
+ }
378
+
379
+ // Delete cells
380
+ var td = tr.cells[0];
381
+ if (td.cells > 1) {
382
+ do {
383
+ var nexttd = nextElm(td, "TD,TH");
384
+
385
+ if (td._delete)
386
+ td.parentNode.removeChild(td);
387
+ } while ((td = nexttd) != null);
388
+ }
389
+ } while ((tr = next) != null);
390
+ }
391
+
392
+ function addRows(td_elm, tr_elm, rowspan) {
393
+ // Add rows
394
+ td_elm.rowSpan = 1;
395
+ var trNext = nextElm(tr_elm, "TR");
396
+ for (var i=1; i<rowspan && trNext; i++) {
397
+ var newTD = doc.createElement("td");
398
+
399
+ if (!tinymce.isIE)
400
+ newTD.innerHTML = '<br mce_bogus="1"/>';
401
+
402
+ if (tinymce.isIE)
403
+ trNext.insertBefore(newTD, trNext.cells(td_elm.cellIndex));
404
+ else
405
+ trNext.insertBefore(newTD, trNext.cells[td_elm.cellIndex]);
406
+
407
+ trNext = nextElm(trNext, "TR");
408
+ }
409
+ }
410
+
411
+ function copyRow(doc, table, tr) {
412
+ var grid = getTableGrid(table);
413
+ var newTR = tr.cloneNode(false);
414
+ var cpos = getCellPos(grid, tr.cells[0]);
415
+ var lastCell = null;
416
+ var tableBorder = inst.dom.getAttrib(table, "border");
417
+ var tdElm = null;
418
+
419
+ for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
420
+ var newTD = null;
421
+
422
+ if (lastCell != tdElm) {
423
+ for (var i=0; i<tr.cells.length; i++) {
424
+ if (tdElm == tr.cells[i]) {
425
+ newTD = tdElm.cloneNode(true);
426
+ break;
427
+ }
428
+ }
429
+ }
430
+
431
+ if (newTD == null) {
432
+ newTD = doc.createElement("td");
433
+
434
+ if (!tinymce.isIE)
435
+ newTD.innerHTML = '<br mce_bogus="1"/>';
436
+ }
437
+
438
+ // Reset col/row span
439
+ newTD.colSpan = 1;
440
+ newTD.rowSpan = 1;
441
+
442
+ newTR.appendChild(newTD);
443
+
444
+ lastCell = tdElm;
445
+ }
446
+
447
+ return newTR;
448
+ }
449
+
450
+ // ---- Commands -----
451
+
452
+ // Handle commands
453
+ switch (command) {
454
+ case "mceTableMoveToNextRow":
455
+ var nextCell = getNextCell(tableElm, tdElm);
456
+
457
+ if (!nextCell) {
458
+ inst.execCommand("mceTableInsertRowAfter", tdElm);
459
+ nextCell = getNextCell(tableElm, tdElm);
460
+ }
461
+
462
+ inst.selection.select(nextCell);
463
+ inst.selection.collapse(true);
464
+
465
+ return true;
466
+
467
+ case "mceTableRowProps":
468
+ if (trElm == null)
469
+ return true;
470
+
471
+ if (user_interface) {
472
+ inst.windowManager.open({
473
+ url : url + '/row.htm',
474
+ width : 400 + parseInt(inst.getLang('table.rowprops_delta_width', 0)),
475
+ height : 295 + parseInt(inst.getLang('table.rowprops_delta_height', 0)),
476
+ inline : 1
477
+ }, {
478
+ plugin_url : url
479
+ });
480
+ }
481
+
482
+ return true;
483
+
484
+ case "mceTableCellProps":
485
+ if (tdElm == null)
486
+ return true;
487
+
488
+ if (user_interface) {
489
+ inst.windowManager.open({
490
+ url : url + '/cell.htm',
491
+ width : 400 + parseInt(inst.getLang('table.cellprops_delta_width', 0)),
492
+ height : 295 + parseInt(inst.getLang('table.cellprops_delta_height', 0)),
493
+ inline : 1
494
+ }, {
495
+ plugin_url : url
496
+ });
497
+ }
498
+
499
+ return true;
500
+
501
+ case "mceInsertTable":
502
+ if (user_interface) {
503
+ inst.windowManager.open({
504
+ url : url + '/table.htm',
505
+ width : 400 + parseInt(inst.getLang('table.table_delta_width', 0)),
506
+ height : 320 + parseInt(inst.getLang('table.table_delta_height', 0)),
507
+ inline : 1
508
+ }, {
509
+ plugin_url : url,
510
+ action : value ? value.action : 0
511
+ });
512
+ }
513
+
514
+ return true;
515
+
516
+ case "mceTableDelete":
517
+ var table = inst.dom.getParent(inst.selection.getNode(), "table");
518
+ if (table) {
519
+ table.parentNode.removeChild(table);
520
+ inst.execCommand('mceRepaint');
521
+ }
522
+ return true;
523
+
524
+ case "mceTableSplitCells":
525
+ case "mceTableMergeCells":
526
+ case "mceTableInsertRowBefore":
527
+ case "mceTableInsertRowAfter":
528
+ case "mceTableDeleteRow":
529
+ case "mceTableInsertColBefore":
530
+ case "mceTableInsertColAfter":
531
+ case "mceTableDeleteCol":
532
+ case "mceTableCutRow":
533
+ case "mceTableCopyRow":
534
+ case "mceTablePasteRowBefore":
535
+ case "mceTablePasteRowAfter":
536
+ // No table just return (invalid command)
537
+ if (!tableElm)
538
+ return true;
539
+
540
+ // Table has a tbody use that reference
541
+ // Changed logic by ApTest 2005.07.12 (www.aptest.com)
542
+ // Now lookk at the focused element and take its parentNode. That will be a tbody or a table.
543
+ if (trElm && tableElm != trElm.parentNode)
544
+ tableElm = trElm.parentNode;
545
+
546
+ if (tableElm && trElm) {
547
+ switch (command) {
548
+ case "mceTableCutRow":
549
+ if (!trElm || !tdElm)
550
+ return true;
551
+
552
+ inst.tableRowClipboard = copyRow(doc, tableElm, trElm);
553
+ inst.execCommand("mceTableDeleteRow");
554
+ break;
555
+
556
+ case "mceTableCopyRow":
557
+ if (!trElm || !tdElm)
558
+ return true;
559
+
560
+ inst.tableRowClipboard = copyRow(doc, tableElm, trElm);
561
+ break;
562
+
563
+ case "mceTablePasteRowBefore":
564
+ if (!trElm || !tdElm)
565
+ return true;
566
+
567
+ var newTR = inst.tableRowClipboard.cloneNode(true);
568
+
569
+ var prevTR = prevElm(trElm, "TR");
570
+ if (prevTR != null)
571
+ trimRow(tableElm, prevTR, prevTR.cells[0], newTR);
572
+
573
+ trElm.parentNode.insertBefore(newTR, trElm);
574
+ break;
575
+
576
+ case "mceTablePasteRowAfter":
577
+ if (!trElm || !tdElm)
578
+ return true;
579
+
580
+ var nextTR = nextElm(trElm, "TR");
581
+ var newTR = inst.tableRowClipboard.cloneNode(true);
582
+
583
+ trimRow(tableElm, trElm, tdElm, newTR);
584
+
585
+ if (nextTR == null)
586
+ trElm.parentNode.appendChild(newTR);
587
+ else
588
+ nextTR.parentNode.insertBefore(newTR, nextTR);
589
+
590
+ break;
591
+
592
+ case "mceTableInsertRowBefore":
593
+ if (!trElm || !tdElm)
594
+ return true;
595
+
596
+ var grid = getTableGrid(tableElm);
597
+ var cpos = getCellPos(grid, tdElm);
598
+ var newTR = doc.createElement("tr");
599
+ var lastTDElm = null;
600
+
601
+ cpos.rowindex--;
602
+ if (cpos.rowindex < 0)
603
+ cpos.rowindex = 0;
604
+
605
+ // Create cells
606
+ for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
607
+ if (tdElm != lastTDElm) {
608
+ var sd = getColRowSpan(tdElm);
609
+
610
+ if (sd['rowspan'] == 1) {
611
+ var newTD = doc.createElement("td");
612
+
613
+ if (!tinymce.isIE)
614
+ newTD.innerHTML = '<br mce_bogus="1"/>';
615
+
616
+ newTD.colSpan = tdElm.colSpan;
617
+
618
+ newTR.appendChild(newTD);
619
+ } else
620
+ tdElm.rowSpan = sd['rowspan'] + 1;
621
+
622
+ lastTDElm = tdElm;
623
+ }
624
+ }
625
+
626
+ trElm.parentNode.insertBefore(newTR, trElm);
627
+ select(0, 1);
628
+ break;
629
+
630
+ case "mceTableInsertRowAfter":
631
+ if (!trElm || !tdElm)
632
+ return true;
633
+
634
+ var grid = getTableGrid(tableElm);
635
+ var cpos = getCellPos(grid, tdElm);
636
+ var newTR = doc.createElement("tr");
637
+ var lastTDElm = null;
638
+
639
+ // Create cells
640
+ for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
641
+ if (tdElm != lastTDElm) {
642
+ var sd = getColRowSpan(tdElm);
643
+
644
+ if (sd['rowspan'] == 1) {
645
+ var newTD = doc.createElement("td");
646
+
647
+ if (!tinymce.isIE)
648
+ newTD.innerHTML = '<br mce_bogus="1"/>';
649
+
650
+ newTD.colSpan = tdElm.colSpan;
651
+
652
+ newTR.appendChild(newTD);
653
+ } else
654
+ tdElm.rowSpan = sd['rowspan'] + 1;
655
+
656
+ lastTDElm = tdElm;
657
+ }
658
+ }
659
+
660
+ if (newTR.hasChildNodes()) {
661
+ var nextTR = nextElm(trElm, "TR");
662
+ if (nextTR)
663
+ nextTR.parentNode.insertBefore(newTR, nextTR);
664
+ else
665
+ tableElm.appendChild(newTR);
666
+ }
667
+
668
+ select(0, 1);
669
+ break;
670
+
671
+ case "mceTableDeleteRow":
672
+ if (!trElm || !tdElm)
673
+ return true;
674
+
675
+ var grid = getTableGrid(tableElm);
676
+ var cpos = getCellPos(grid, tdElm);
677
+
678
+ // Only one row, remove whole table
679
+ if (grid.length == 1 && tableElm.nodeName == 'TBODY') {
680
+ inst.dom.remove(inst.dom.getParent(tableElm, "table"));
681
+ return true;
682
+ }
683
+
684
+ // Move down row spanned cells
685
+ var cells = trElm.cells;
686
+ var nextTR = nextElm(trElm, "TR");
687
+ for (var x=0; x<cells.length; x++) {
688
+ if (cells[x].rowSpan > 1) {
689
+ var newTD = cells[x].cloneNode(true);
690
+ var sd = getColRowSpan(cells[x]);
691
+
692
+ newTD.rowSpan = sd.rowspan - 1;
693
+
694
+ var nextTD = nextTR.cells[x];
695
+
696
+ if (nextTD == null)
697
+ nextTR.appendChild(newTD);
698
+ else
699
+ nextTR.insertBefore(newTD, nextTD);
700
+ }
701
+ }
702
+
703
+ // Delete cells
704
+ var lastTDElm = null;
705
+ for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
706
+ if (tdElm != lastTDElm) {
707
+ var sd = getColRowSpan(tdElm);
708
+
709
+ if (sd.rowspan > 1) {
710
+ tdElm.rowSpan = sd.rowspan - 1;
711
+ } else {
712
+ trElm = tdElm.parentNode;
713
+
714
+ if (trElm.parentNode)
715
+ trElm._delete = true;
716
+ }
717
+
718
+ lastTDElm = tdElm;
719
+ }
720
+ }
721
+
722
+ deleteMarked(tableElm);
723
+
724
+ select(0, -1);
725
+ break;
726
+
727
+ case "mceTableInsertColBefore":
728
+ if (!trElm || !tdElm)
729
+ return true;
730
+
731
+ var grid = getTableGrid(inst.dom.getParent(tableElm, "table"));
732
+ var cpos = getCellPos(grid, tdElm);
733
+ var lastTDElm = null;
734
+
735
+ for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
736
+ if (tdElm != lastTDElm) {
737
+ var sd = getColRowSpan(tdElm);
738
+
739
+ if (sd['colspan'] == 1) {
740
+ var newTD = doc.createElement(tdElm.nodeName);
741
+
742
+ if (!tinymce.isIE)
743
+ newTD.innerHTML = '<br mce_bogus="1"/>';
744
+
745
+ newTD.rowSpan = tdElm.rowSpan;
746
+
747
+ tdElm.parentNode.insertBefore(newTD, tdElm);
748
+ } else
749
+ tdElm.colSpan++;
750
+
751
+ lastTDElm = tdElm;
752
+ }
753
+ }
754
+
755
+ select();
756
+ break;
757
+
758
+ case "mceTableInsertColAfter":
759
+ if (!trElm || !tdElm)
760
+ return true;
761
+
762
+ var grid = getTableGrid(inst.dom.getParent(tableElm, "table"));
763
+ var cpos = getCellPos(grid, tdElm);
764
+ var lastTDElm = null;
765
+
766
+ for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
767
+ if (tdElm != lastTDElm) {
768
+ var sd = getColRowSpan(tdElm);
769
+
770
+ if (sd['colspan'] == 1) {
771
+ var newTD = doc.createElement(tdElm.nodeName);
772
+
773
+ if (!tinymce.isIE)
774
+ newTD.innerHTML = '<br mce_bogus="1"/>';
775
+
776
+ newTD.rowSpan = tdElm.rowSpan;
777
+
778
+ var nextTD = nextElm(tdElm, "TD,TH");
779
+ if (nextTD == null)
780
+ tdElm.parentNode.appendChild(newTD);
781
+ else
782
+ nextTD.parentNode.insertBefore(newTD, nextTD);
783
+ } else
784
+ tdElm.colSpan++;
785
+
786
+ lastTDElm = tdElm;
787
+ }
788
+ }
789
+
790
+ select(1);
791
+ break;
792
+
793
+ case "mceTableDeleteCol":
794
+ if (!trElm || !tdElm)
795
+ return true;
796
+
797
+ var grid = getTableGrid(tableElm);
798
+ var cpos = getCellPos(grid, tdElm);
799
+ var lastTDElm = null;
800
+
801
+ // Only one col, remove whole table
802
+ if ((grid.length > 1 && grid[0].length <= 1) && tableElm.nodeName == 'TBODY') {
803
+ inst.dom.remove(inst.dom.getParent(tableElm, "table"));
804
+ return true;
805
+ }
806
+
807
+ // Delete cells
808
+ for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
809
+ if (tdElm != lastTDElm) {
810
+ var sd = getColRowSpan(tdElm);
811
+
812
+ if (sd['colspan'] > 1)
813
+ tdElm.colSpan = sd['colspan'] - 1;
814
+ else {
815
+ if (tdElm.parentNode)
816
+ tdElm.parentNode.removeChild(tdElm);
817
+ }
818
+
819
+ lastTDElm = tdElm;
820
+ }
821
+ }
822
+
823
+ select(-1);
824
+ break;
825
+
826
+ case "mceTableSplitCells":
827
+ if (!trElm || !tdElm)
828
+ return true;
829
+
830
+ var spandata = getColRowSpan(tdElm);
831
+
832
+ var colspan = spandata["colspan"];
833
+ var rowspan = spandata["rowspan"];
834
+
835
+ // Needs splitting
836
+ if (colspan > 1 || rowspan > 1) {
837
+ // Generate cols
838
+ tdElm.colSpan = 1;
839
+ for (var i=1; i<colspan; i++) {
840
+ var newTD = doc.createElement("td");
841
+
842
+ if (!tinymce.isIE)
843
+ newTD.innerHTML = '<br mce_bogus="1"/>';
844
+
845
+ trElm.insertBefore(newTD, nextElm(tdElm, "TD,TH"));
846
+
847
+ if (rowspan > 1)
848
+ addRows(newTD, trElm, rowspan);
849
+ }
850
+
851
+ addRows(tdElm, trElm, rowspan);
852
+ }
853
+
854
+ // Apply visual aids
855
+ tableElm = inst.dom.getParent(inst.selection.getNode(), "table");
856
+ break;
857
+
858
+ case "mceTableMergeCells":
859
+ var rows = [];
860
+ var sel = inst.selection.getSel();
861
+ var grid = getTableGrid(tableElm);
862
+
863
+ if (tinymce.isIE || sel.rangeCount == 1) {
864
+ if (user_interface) {
865
+ // Setup template
866
+ var sp = getColRowSpan(tdElm);
867
+
868
+ inst.windowManager.open({
869
+ url : url + '/merge_cells.htm',
870
+ width : 240 + parseInt(inst.getLang('table.merge_cells_delta_width', 0)),
871
+ height : 110 + parseInt(inst.getLang('table.merge_cells_delta_height', 0)),
872
+ inline : 1
873
+ }, {
874
+ action : "update",
875
+ numcols : sp.colspan,
876
+ numrows : sp.rowspan,
877
+ plugin_url : url
878
+ });
879
+
880
+ return true;
881
+ } else {
882
+ var numRows = parseInt(value['numrows']);
883
+ var numCols = parseInt(value['numcols']);
884
+ var cpos = getCellPos(grid, tdElm);
885
+
886
+ if (("" + numRows) == "NaN")
887
+ numRows = 1;
888
+
889
+ if (("" + numCols) == "NaN")
890
+ numCols = 1;
891
+
892
+ // Get rows and cells
893
+ var tRows = tableElm.rows;
894
+ for (var y=cpos.rowindex; y<grid.length; y++) {
895
+ var rowCells = [];
896
+
897
+ for (var x=cpos.cellindex; x<grid[y].length; x++) {
898
+ var td = getCell(grid, y, x);
899
+
900
+ if (td && !inArray(rows, td) && !inArray(rowCells, td)) {
901
+ var cp = getCellPos(grid, td);
902
+
903
+ // Within range
904
+ if (cp.cellindex < cpos.cellindex+numCols && cp.rowindex < cpos.rowindex+numRows)
905
+ rowCells[rowCells.length] = td;
906
+ }
907
+ }
908
+
909
+ if (rowCells.length > 0)
910
+ rows[rows.length] = rowCells;
911
+
912
+ var td = getCell(grid, cpos.rowindex, cpos.cellindex);
913
+ each(ed.dom.select('br', td), function(e, i) {
914
+ if (i > 0 && ed.dom.getAttrib('mce_bogus'))
915
+ ed.dom.remove(e);
916
+ });
917
+ }
918
+
919
+ //return true;
920
+ }
921
+ } else {
922
+ var cells = [];
923
+ var sel = inst.selection.getSel();
924
+ var lastTR = null;
925
+ var curRow = null;
926
+ var x1 = -1, y1 = -1, x2, y2;
927
+
928
+ // Only one cell selected, whats the point?
929
+ if (sel.rangeCount < 2)
930
+ return true;
931
+
932
+ // Get all selected cells
933
+ for (var i=0; i<sel.rangeCount; i++) {
934
+ var rng = sel.getRangeAt(i);
935
+ var tdElm = rng.startContainer.childNodes[rng.startOffset];
936
+
937
+ if (!tdElm)
938
+ break;
939
+
940
+ if (tdElm.nodeName == "TD" || tdElm.nodeName == "TH")
941
+ cells[cells.length] = tdElm;
942
+ }
943
+
944
+ // Get rows and cells
945
+ var tRows = tableElm.rows;
946
+ for (var y=0; y<tRows.length; y++) {
947
+ var rowCells = [];
948
+
949
+ for (var x=0; x<tRows[y].cells.length; x++) {
950
+ var td = tRows[y].cells[x];
951
+
952
+ for (var i=0; i<cells.length; i++) {
953
+ if (td == cells[i]) {
954
+ rowCells[rowCells.length] = td;
955
+ }
956
+ }
957
+ }
958
+
959
+ if (rowCells.length > 0)
960
+ rows[rows.length] = rowCells;
961
+ }
962
+
963
+ // Find selected cells in grid and box
964
+ var curRow = [];
965
+ var lastTR = null;
966
+ for (var y=0; y<grid.length; y++) {
967
+ for (var x=0; x<grid[y].length; x++) {
968
+ grid[y][x]._selected = false;
969
+
970
+ for (var i=0; i<cells.length; i++) {
971
+ if (grid[y][x] == cells[i]) {
972
+ // Get start pos
973
+ if (x1 == -1) {
974
+ x1 = x;
975
+ y1 = y;
976
+ }
977
+
978
+ // Get end pos
979
+ x2 = x;
980
+ y2 = y;
981
+
982
+ grid[y][x]._selected = true;
983
+ }
984
+ }
985
+ }
986
+ }
987
+
988
+ // Is there gaps, if so deny
989
+ for (var y=y1; y<=y2; y++) {
990
+ for (var x=x1; x<=x2; x++) {
991
+ if (!grid[y][x]._selected) {
992
+ alert("Invalid selection for merge.");
993
+ return true;
994
+ }
995
+ }
996
+ }
997
+ }
998
+
999
+ // Validate selection and get total rowspan and colspan
1000
+ var rowSpan = 1, colSpan = 1;
1001
+
1002
+ // Validate horizontal and get total colspan
1003
+ var lastRowSpan = -1;
1004
+ for (var y=0; y<rows.length; y++) {
1005
+ var rowColSpan = 0;
1006
+
1007
+ for (var x=0; x<rows[y].length; x++) {
1008
+ var sd = getColRowSpan(rows[y][x]);
1009
+
1010
+ rowColSpan += sd['colspan'];
1011
+
1012
+ if (lastRowSpan != -1 && sd['rowspan'] != lastRowSpan) {
1013
+ alert("Invalid selection for merge.");
1014
+ return true;
1015
+ }
1016
+
1017
+ lastRowSpan = sd['rowspan'];
1018
+ }
1019
+
1020
+ if (rowColSpan > colSpan)
1021
+ colSpan = rowColSpan;
1022
+
1023
+ lastRowSpan = -1;
1024
+ }
1025
+
1026
+ // Validate vertical and get total rowspan
1027
+ var lastColSpan = -1;
1028
+ for (var x=0; x<rows[0].length; x++) {
1029
+ var colRowSpan = 0;
1030
+
1031
+ for (var y=0; y<rows.length; y++) {
1032
+ var sd = getColRowSpan(rows[y][x]);
1033
+
1034
+ colRowSpan += sd['rowspan'];
1035
+
1036
+ if (lastColSpan != -1 && sd['colspan'] != lastColSpan) {
1037
+ alert("Invalid selection for merge.");
1038
+ return true;
1039
+ }
1040
+
1041
+ lastColSpan = sd['colspan'];
1042
+ }
1043
+
1044
+ if (colRowSpan > rowSpan)
1045
+ rowSpan = colRowSpan;
1046
+
1047
+ lastColSpan = -1;
1048
+ }
1049
+
1050
+ // Setup td
1051
+ tdElm = rows[0][0];
1052
+ tdElm.rowSpan = rowSpan;
1053
+ tdElm.colSpan = colSpan;
1054
+
1055
+ // Merge cells
1056
+ for (var y=0; y<rows.length; y++) {
1057
+ for (var x=0; x<rows[y].length; x++) {
1058
+ var html = rows[y][x].innerHTML;
1059
+ var chk = html.replace(/[ \t\r\n]/g, "");
1060
+
1061
+ if (chk != "<br/>" && chk != "<br>" && chk != '<br mce_bogus="1"/>' && (x+y > 0))
1062
+ tdElm.innerHTML += html;
1063
+
1064
+ // Not current cell
1065
+ if (rows[y][x] != tdElm && !rows[y][x]._deleted) {
1066
+ var cpos = getCellPos(grid, rows[y][x]);
1067
+ var tr = rows[y][x].parentNode;
1068
+
1069
+ tr.removeChild(rows[y][x]);
1070
+ rows[y][x]._deleted = true;
1071
+
1072
+ // Empty TR, remove it
1073
+ if (!tr.hasChildNodes()) {
1074
+ tr.parentNode.removeChild(tr);
1075
+
1076
+ var lastCell = null;
1077
+ for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) {
1078
+ if (cellElm != lastCell && cellElm.rowSpan > 1)
1079
+ cellElm.rowSpan--;
1080
+
1081
+ lastCell = cellElm;
1082
+ }
1083
+
1084
+ if (tdElm.rowSpan > 1)
1085
+ tdElm.rowSpan--;
1086
+ }
1087
+ }
1088
+ }
1089
+ }
1090
+
1091
+ // Remove all but one bogus br
1092
+ each(ed.dom.select('br', tdElm), function(e, i) {
1093
+ if (i > 0 && ed.dom.getAttrib(e, 'mce_bogus'))
1094
+ ed.dom.remove(e);
1095
+ });
1096
+
1097
+ break;
1098
+ }
1099
+
1100
+ tableElm = inst.dom.getParent(inst.selection.getNode(), "table");
1101
+ inst.addVisual(tableElm);
1102
+ inst.nodeChanged();
1103
+ }
1104
+
1105
+ return true;
1106
+ }
1107
+
1108
+ // Pass to next handler in chain
1109
+ return false;
1110
+ }
1111
+ });
1112
+
1113
+ // Register plugin
1114
+ tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);
1115
+ })();