muck-blogs 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (549) hide show
  1. data/.gitignore +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +51 -0
  4. data/Rakefile +90 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/muck/blogs_controller.rb +38 -0
  7. data/app/controllers/muck/posts_controller.rb +42 -0
  8. data/app/helpers/muck_blogs_helper.rb +4 -0
  9. data/app/views/activity_templates/_post.html.erb +3 -0
  10. data/app/views/blogs/_blog.html.erb +0 -0
  11. data/app/views/blogs/_post.html.erb +0 -0
  12. data/app/views/blogs/index.html.erb +1 -0
  13. data/app/views/blogs/show.html.erb +1 -0
  14. data/app/views/posts/_post.html.erb +4 -0
  15. data/app/views/posts/index.html.erb +2 -0
  16. data/app/views/posts/show.html.erb +0 -0
  17. data/config/muck_blogs_routes.rb +6 -0
  18. data/db/migrate/20090808165453_create_blogs.rb +16 -0
  19. data/install.rb +1 -0
  20. data/lib/active_record/acts/muck_blog.rb +67 -0
  21. data/lib/active_record/acts/muck_blogable.rb +37 -0
  22. data/lib/active_record/acts/muck_post.rb +32 -0
  23. data/lib/muck_blogs.rb +7 -0
  24. data/lib/muck_blogs/initialize_routes.rb +8 -0
  25. data/lib/muck_blogs/tasks.rb +28 -0
  26. data/locales/en.yml +6 -0
  27. data/muck-blogs.gemspec +655 -0
  28. data/rails/init.rb +4 -0
  29. data/tasks/muck_comments_tasks.rake +1 -0
  30. data/test/rails_root/.gitignore +8 -0
  31. data/test/rails_root/.rake_tasks +103 -0
  32. data/test/rails_root/Capfile +3 -0
  33. data/test/rails_root/Rakefile +16 -0
  34. data/test/rails_root/app/controllers/application_controller.rb +22 -0
  35. data/test/rails_root/app/controllers/default_controller.rb +7 -0
  36. data/test/rails_root/app/helpers/application_helper.rb +3 -0
  37. data/test/rails_root/app/models/.keep +0 -0
  38. data/test/rails_root/app/models/activity.rb +3 -0
  39. data/test/rails_root/app/models/blog.rb +3 -0
  40. data/test/rails_root/app/models/comment.rb +3 -0
  41. data/test/rails_root/app/models/content.rb +9 -0
  42. data/test/rails_root/app/models/content_permission.rb +3 -0
  43. data/test/rails_root/app/models/content_translation.rb +3 -0
  44. data/test/rails_root/app/models/user.rb +7 -0
  45. data/test/rails_root/app/models/user_session.rb +2 -0
  46. data/test/rails_root/app/views/default/index.html.erb +0 -0
  47. data/test/rails_root/app/views/layouts/default.html.erb +26 -0
  48. data/test/rails_root/config/amazon_s3.yml +14 -0
  49. data/test/rails_root/config/boot.rb +109 -0
  50. data/test/rails_root/config/database.yml +23 -0
  51. data/test/rails_root/config/environment.rb +31 -0
  52. data/test/rails_root/config/environments/cucumber.rb +38 -0
  53. data/test/rails_root/config/environments/development.rb +19 -0
  54. data/test/rails_root/config/environments/production.rb +1 -0
  55. data/test/rails_root/config/environments/test.rb +42 -0
  56. data/test/rails_root/config/global_config.yml +80 -0
  57. data/test/rails_root/config/initializers/inflections.rb +10 -0
  58. data/test/rails_root/config/initializers/mime_types.rb +5 -0
  59. data/test/rails_root/config/initializers/requires.rb +13 -0
  60. data/test/rails_root/config/initializers/session_store.rb +8 -0
  61. data/test/rails_root/config/routes.rb +9 -0
  62. data/test/rails_root/db/.keep +0 -0
  63. data/test/rails_root/db/migrate/20090320174818_create_muck_permissions_and_roles.rb +16 -0
  64. data/test/rails_root/db/migrate/20090402033319_add_muck_activities.rb +36 -0
  65. data/test/rails_root/db/migrate/20090402234137_create_languages.rb +18 -0
  66. data/test/rails_root/db/migrate/20090426041056_create_countries.rb +15 -0
  67. data/test/rails_root/db/migrate/20090426041103_create_states.rb +18 -0
  68. data/test/rails_root/db/migrate/20090602041838_create_users.rb +39 -0
  69. data/test/rails_root/db/migrate/20090608073052_create_friends.rb +16 -0
  70. data/test/rails_root/db/migrate/20090613173314_create_comments.rb +24 -0
  71. data/test/rails_root/db/migrate/20090703055724_add_contents.rb +49 -0
  72. data/test/rails_root/db/migrate/20090704220055_create_slugs.rb +18 -0
  73. data/test/rails_root/db/migrate/20090704220120_acts_as_taggable_on_migration.rb +29 -0
  74. data/test/rails_root/db/migrate/20090730044139_add_comment_cache.rb +9 -0
  75. data/test/rails_root/db/migrate/20090730074858_add_comment_count_to_users.rb +9 -0
  76. data/test/rails_root/db/migrate/20090730154102_allow_null_user.rb +9 -0
  77. data/test/rails_root/db/migrate/20090806230610_add_layout_to_contents.rb +9 -0
  78. data/test/rails_root/db/migrate/20090808165453_create_blogs.rb +16 -0
  79. data/test/rails_root/db/schema.rb +226 -0
  80. data/test/rails_root/features/comments.feature +21 -0
  81. data/test/rails_root/features/step_definitions/comment_steps.rb +11 -0
  82. data/test/rails_root/features/step_definitions/common_steps.rb +93 -0
  83. data/test/rails_root/features/step_definitions/webrat_steps.rb +128 -0
  84. data/test/rails_root/features/support/env.rb +49 -0
  85. data/test/rails_root/features/support/paths.rb +33 -0
  86. data/test/rails_root/lib/tasks/cucumber.rake +20 -0
  87. data/test/rails_root/public/.htaccess +40 -0
  88. data/test/rails_root/public/404.html +30 -0
  89. data/test/rails_root/public/422.html +30 -0
  90. data/test/rails_root/public/500.html +30 -0
  91. data/test/rails_root/public/dispatch.rb +10 -0
  92. data/test/rails_root/public/favicon.ico +0 -0
  93. data/test/rails_root/public/images/arrow_left.gif +0 -0
  94. data/test/rails_root/public/images/arrow_right.gif +0 -0
  95. data/test/rails_root/public/images/fancybox/fancy_closebox.png +0 -0
  96. data/test/rails_root/public/images/fancybox/fancy_left.png +0 -0
  97. data/test/rails_root/public/images/fancybox/fancy_progress.png +0 -0
  98. data/test/rails_root/public/images/fancybox/fancy_right.png +0 -0
  99. data/test/rails_root/public/images/fancybox/fancy_shadow_e.png +0 -0
  100. data/test/rails_root/public/images/fancybox/fancy_shadow_n.png +0 -0
  101. data/test/rails_root/public/images/fancybox/fancy_shadow_ne.png +0 -0
  102. data/test/rails_root/public/images/fancybox/fancy_shadow_nw.png +0 -0
  103. data/test/rails_root/public/images/fancybox/fancy_shadow_s.png +0 -0
  104. data/test/rails_root/public/images/fancybox/fancy_shadow_se.png +0 -0
  105. data/test/rails_root/public/images/fancybox/fancy_shadow_sw.png +0 -0
  106. data/test/rails_root/public/images/fancybox/fancy_shadow_w.png +0 -0
  107. data/test/rails_root/public/images/fancybox/fancy_title_left.png +0 -0
  108. data/test/rails_root/public/images/fancybox/fancy_title_main.png +0 -0
  109. data/test/rails_root/public/images/fancybox/fancy_title_right.png +0 -0
  110. data/test/rails_root/public/images/icons/accept.png +0 -0
  111. data/test/rails_root/public/images/icons/add.png +0 -0
  112. data/test/rails_root/public/images/icons/delete.png +0 -0
  113. data/test/rails_root/public/images/icons/vote.png +0 -0
  114. data/test/rails_root/public/images/loading.gif +0 -0
  115. data/test/rails_root/public/images/nothing.png +0 -0
  116. data/test/rails_root/public/images/profile_default.jpg +0 -0
  117. data/test/rails_root/public/images/rails.png +0 -0
  118. data/test/rails_root/public/images/spinner.gif +0 -0
  119. data/test/rails_root/public/images/sprites.png +0 -0
  120. data/test/rails_root/public/javascripts/application.js +2 -0
  121. data/test/rails_root/public/javascripts/builder.js +136 -0
  122. data/test/rails_root/public/javascripts/controls.js +963 -0
  123. data/test/rails_root/public/javascripts/dragdrop.js +972 -0
  124. data/test/rails_root/public/javascripts/effects.js +1120 -0
  125. data/test/rails_root/public/javascripts/fancyzoom.min.js +1 -0
  126. data/test/rails_root/public/javascripts/jquery/jquery-ui.js +273 -0
  127. data/test/rails_root/public/javascripts/jquery/jquery.easing.js +1 -0
  128. data/test/rails_root/public/javascripts/jquery/jquery.fancybox.js +9 -0
  129. data/test/rails_root/public/javascripts/jquery/jquery.form.js +637 -0
  130. data/test/rails_root/public/javascripts/jquery/jquery.jgrowl.js +2 -0
  131. data/test/rails_root/public/javascripts/jquery/jquery.js +19 -0
  132. data/test/rails_root/public/javascripts/jquery/jquery.tips.js +69 -0
  133. data/test/rails_root/public/javascripts/muck.js +80 -0
  134. data/test/rails_root/public/javascripts/muck_activities.js +108 -0
  135. data/test/rails_root/public/javascripts/prototype.js +4225 -0
  136. data/test/rails_root/public/javascripts/scriptaculous.js +58 -0
  137. data/test/rails_root/public/javascripts/slider.js +277 -0
  138. data/test/rails_root/public/javascripts/sound.js +60 -0
  139. data/test/rails_root/public/javascripts/tiny_mce/langs/en.js +154 -0
  140. data/test/rails_root/public/javascripts/tiny_mce/license.txt +504 -0
  141. data/test/rails_root/public/javascripts/tiny_mce/plugins/advfiletoo/css/advfile.css +34 -0
  142. data/test/rails_root/public/javascripts/tiny_mce/plugins/advfiletoo/editor_plugin.js +55 -0
  143. data/test/rails_root/public/javascripts/tiny_mce/plugins/advfiletoo/editor_plugin_src.js +55 -0
  144. data/test/rails_root/public/javascripts/tiny_mce/plugins/advfiletoo/file.htm +139 -0
  145. data/test/rails_root/public/javascripts/tiny_mce/plugins/advfiletoo/js/functions.js +286 -0
  146. data/test/rails_root/public/javascripts/tiny_mce/plugins/advfiletoo/langs/en_dlg.js +48 -0
  147. data/test/rails_root/public/javascripts/tiny_mce/plugins/advhr/css/advhr.css +5 -0
  148. data/test/rails_root/public/javascripts/tiny_mce/plugins/advhr/editor_plugin.js +1 -0
  149. data/test/rails_root/public/javascripts/tiny_mce/plugins/advhr/editor_plugin_src.js +54 -0
  150. data/test/rails_root/public/javascripts/tiny_mce/plugins/advhr/js/rule.js +43 -0
  151. data/test/rails_root/public/javascripts/tiny_mce/plugins/advhr/langs/en_dlg.js +5 -0
  152. data/test/rails_root/public/javascripts/tiny_mce/plugins/advhr/rule.htm +63 -0
  153. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimage/css/advimage.css +13 -0
  154. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimage/editor_plugin.js +1 -0
  155. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimage/editor_plugin_src.js +47 -0
  156. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimage/image.htm +238 -0
  157. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimage/img/sample.gif +0 -0
  158. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimage/js/image.js +441 -0
  159. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimage/langs/en_dlg.js +43 -0
  160. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimagetoo/css/advimage.css +32 -0
  161. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimagetoo/editor_plugin.js +53 -0
  162. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimagetoo/editor_plugin_src.js +53 -0
  163. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimagetoo/image.htm +303 -0
  164. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimagetoo/img/sample.gif +0 -0
  165. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimagetoo/js/functions.js +593 -0
  166. data/test/rails_root/public/javascripts/tiny_mce/plugins/advimagetoo/langs/en_dlg.js +44 -0
  167. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlink/css/advlink.css +8 -0
  168. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlink/editor_plugin.js +1 -0
  169. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlink/editor_plugin_src.js +58 -0
  170. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlink/js/advlink.js +527 -0
  171. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlink/langs/en_dlg.js +52 -0
  172. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlink/link.htm +339 -0
  173. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlinktoo/css/advlink.css +8 -0
  174. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlinktoo/editor_plugin.js +58 -0
  175. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlinktoo/editor_plugin_src.js +58 -0
  176. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlinktoo/js/advlink.js +548 -0
  177. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlinktoo/langs/en_dlg.js +52 -0
  178. data/test/rails_root/public/javascripts/tiny_mce/plugins/advlinktoo/link.htm +344 -0
  179. data/test/rails_root/public/javascripts/tiny_mce/plugins/autosave/editor_plugin.js +1 -0
  180. data/test/rails_root/public/javascripts/tiny_mce/plugins/autosave/editor_plugin_src.js +51 -0
  181. data/test/rails_root/public/javascripts/tiny_mce/plugins/bbcode/editor_plugin.js +1 -0
  182. data/test/rails_root/public/javascripts/tiny_mce/plugins/bbcode/editor_plugin_src.js +117 -0
  183. data/test/rails_root/public/javascripts/tiny_mce/plugins/compat2x/editor_plugin.js +1 -0
  184. data/test/rails_root/public/javascripts/tiny_mce/plugins/compat2x/editor_plugin_src.js +616 -0
  185. data/test/rails_root/public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin.js +1 -0
  186. data/test/rails_root/public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js +95 -0
  187. data/test/rails_root/public/javascripts/tiny_mce/plugins/directionality/editor_plugin.js +1 -0
  188. data/test/rails_root/public/javascripts/tiny_mce/plugins/directionality/editor_plugin_src.js +79 -0
  189. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/editor_plugin.js +1 -0
  190. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/editor_plugin_src.js +40 -0
  191. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/emotions.htm +41 -0
  192. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-cool.gif +0 -0
  193. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-cry.gif +0 -0
  194. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif +0 -0
  195. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif +0 -0
  196. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-frown.gif +0 -0
  197. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif +0 -0
  198. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif +0 -0
  199. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif +0 -0
  200. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif +0 -0
  201. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif +0 -0
  202. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-smile.gif +0 -0
  203. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif +0 -0
  204. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif +0 -0
  205. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif +0 -0
  206. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-wink.gif +0 -0
  207. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/img/smiley-yell.gif +0 -0
  208. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/js/emotions.js +22 -0
  209. data/test/rails_root/public/javascripts/tiny_mce/plugins/emotions/langs/en_dlg.js +20 -0
  210. data/test/rails_root/public/javascripts/tiny_mce/plugins/example/dialog.htm +27 -0
  211. data/test/rails_root/public/javascripts/tiny_mce/plugins/example/editor_plugin.js +1 -0
  212. data/test/rails_root/public/javascripts/tiny_mce/plugins/example/editor_plugin_src.js +81 -0
  213. data/test/rails_root/public/javascripts/tiny_mce/plugins/example/img/example.gif +0 -0
  214. data/test/rails_root/public/javascripts/tiny_mce/plugins/example/js/dialog.js +19 -0
  215. data/test/rails_root/public/javascripts/tiny_mce/plugins/example/langs/en.js +3 -0
  216. data/test/rails_root/public/javascripts/tiny_mce/plugins/example/langs/en_dlg.js +3 -0
  217. data/test/rails_root/public/javascripts/tiny_mce/plugins/fullpage/css/fullpage.css +182 -0
  218. data/test/rails_root/public/javascripts/tiny_mce/plugins/fullpage/editor_plugin.js +1 -0
  219. data/test/rails_root/public/javascripts/tiny_mce/plugins/fullpage/editor_plugin_src.js +142 -0
  220. data/test/rails_root/public/javascripts/tiny_mce/plugins/fullpage/fullpage.htm +577 -0
  221. data/test/rails_root/public/javascripts/tiny_mce/plugins/fullpage/js/fullpage.js +461 -0
  222. data/test/rails_root/public/javascripts/tiny_mce/plugins/fullpage/langs/en_dlg.js +85 -0
  223. data/test/rails_root/public/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -0
  224. data/test/rails_root/public/javascripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js +145 -0
  225. data/test/rails_root/public/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +111 -0
  226. data/test/rails_root/public/javascripts/tiny_mce/plugins/iespell/editor_plugin.js +1 -0
  227. data/test/rails_root/public/javascripts/tiny_mce/plugins/iespell/editor_plugin_src.js +51 -0
  228. data/test/rails_root/public/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
  229. data/test/rails_root/public/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +632 -0
  230. data/test/rails_root/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  231. data/test/rails_root/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  232. data/test/rails_root/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  233. data/test/rails_root/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  234. data/test/rails_root/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  235. data/test/rails_root/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  236. data/test/rails_root/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  237. data/test/rails_root/public/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
  238. data/test/rails_root/public/javascripts/tiny_mce/plugins/inlinepopups/template.htm +387 -0
  239. data/test/rails_root/public/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin.js +1 -0
  240. data/test/rails_root/public/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js +80 -0
  241. data/test/rails_root/public/javascripts/tiny_mce/plugins/layer/editor_plugin.js +1 -0
  242. data/test/rails_root/public/javascripts/tiny_mce/plugins/layer/editor_plugin_src.js +209 -0
  243. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/css/content.css +6 -0
  244. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/css/media.css +16 -0
  245. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/editor_plugin.js +1 -0
  246. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/editor_plugin_src.js +374 -0
  247. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/img/flash.gif +0 -0
  248. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/img/quicktime.gif +0 -0
  249. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/img/realmedia.gif +0 -0
  250. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/img/shockwave.gif +0 -0
  251. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/img/trans.gif +0 -0
  252. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/img/windowsmedia.gif +0 -0
  253. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/js/embed.js +73 -0
  254. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/js/media.js +628 -0
  255. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/langs/en_dlg.js +103 -0
  256. data/test/rails_root/public/javascripts/tiny_mce/plugins/media/media.htm +824 -0
  257. data/test/rails_root/public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin.js +1 -0
  258. data/test/rails_root/public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js +50 -0
  259. data/test/rails_root/public/javascripts/tiny_mce/plugins/noneditable/editor_plugin.js +1 -0
  260. data/test/rails_root/public/javascripts/tiny_mce/plugins/noneditable/editor_plugin_src.js +87 -0
  261. data/test/rails_root/public/javascripts/tiny_mce/plugins/pagebreak/css/content.css +1 -0
  262. data/test/rails_root/public/javascripts/tiny_mce/plugins/pagebreak/editor_plugin.js +1 -0
  263. data/test/rails_root/public/javascripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js +74 -0
  264. data/test/rails_root/public/javascripts/tiny_mce/plugins/pagebreak/img/pagebreak.gif +0 -0
  265. data/test/rails_root/public/javascripts/tiny_mce/plugins/pagebreak/img/trans.gif +0 -0
  266. data/test/rails_root/public/javascripts/tiny_mce/plugins/paste/blank.htm +22 -0
  267. data/test/rails_root/public/javascripts/tiny_mce/plugins/paste/css/blank.css +14 -0
  268. data/test/rails_root/public/javascripts/tiny_mce/plugins/paste/css/pasteword.css +3 -0
  269. data/test/rails_root/public/javascripts/tiny_mce/plugins/paste/editor_plugin.js +1 -0
  270. data/test/rails_root/public/javascripts/tiny_mce/plugins/paste/editor_plugin_src.js +394 -0
  271. data/test/rails_root/public/javascripts/tiny_mce/plugins/paste/js/pastetext.js +42 -0
  272. data/test/rails_root/public/javascripts/tiny_mce/plugins/paste/js/pasteword.js +56 -0
  273. data/test/rails_root/public/javascripts/tiny_mce/plugins/paste/langs/en_dlg.js +5 -0
  274. data/test/rails_root/public/javascripts/tiny_mce/plugins/paste/pastetext.htm +34 -0
  275. data/test/rails_root/public/javascripts/tiny_mce/plugins/paste/pasteword.htm +29 -0
  276. data/test/rails_root/public/javascripts/tiny_mce/plugins/preview/editor_plugin.js +1 -0
  277. data/test/rails_root/public/javascripts/tiny_mce/plugins/preview/editor_plugin_src.js +50 -0
  278. data/test/rails_root/public/javascripts/tiny_mce/plugins/preview/example.html +28 -0
  279. data/test/rails_root/public/javascripts/tiny_mce/plugins/preview/jscripts/embed.js +73 -0
  280. data/test/rails_root/public/javascripts/tiny_mce/plugins/preview/preview.html +19 -0
  281. data/test/rails_root/public/javascripts/tiny_mce/plugins/print/editor_plugin.js +1 -0
  282. data/test/rails_root/public/javascripts/tiny_mce/plugins/print/editor_plugin_src.js +31 -0
  283. data/test/rails_root/public/javascripts/tiny_mce/plugins/safari/blank.htm +1 -0
  284. data/test/rails_root/public/javascripts/tiny_mce/plugins/safari/editor_plugin.js +1 -0
  285. data/test/rails_root/public/javascripts/tiny_mce/plugins/safari/editor_plugin_src.js +545 -0
  286. data/test/rails_root/public/javascripts/tiny_mce/plugins/save/editor_plugin.js +1 -0
  287. data/test/rails_root/public/javascripts/tiny_mce/plugins/save/editor_plugin_src.js +98 -0
  288. data/test/rails_root/public/javascripts/tiny_mce/plugins/searchreplace/css/searchreplace.css +6 -0
  289. data/test/rails_root/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin.js +1 -0
  290. data/test/rails_root/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js +54 -0
  291. data/test/rails_root/public/javascripts/tiny_mce/plugins/searchreplace/js/searchreplace.js +126 -0
  292. data/test/rails_root/public/javascripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js +16 -0
  293. data/test/rails_root/public/javascripts/tiny_mce/plugins/searchreplace/searchreplace.htm +105 -0
  294. data/test/rails_root/public/javascripts/tiny_mce/plugins/spellchecker/css/content.css +1 -0
  295. data/test/rails_root/public/javascripts/tiny_mce/plugins/spellchecker/editor_plugin.js +1 -0
  296. data/test/rails_root/public/javascripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js +338 -0
  297. data/test/rails_root/public/javascripts/tiny_mce/plugins/spellchecker/img/wline.gif +0 -0
  298. data/test/rails_root/public/javascripts/tiny_mce/plugins/style/css/props.css +13 -0
  299. data/test/rails_root/public/javascripts/tiny_mce/plugins/style/editor_plugin.js +1 -0
  300. data/test/rails_root/public/javascripts/tiny_mce/plugins/style/editor_plugin_src.js +52 -0
  301. data/test/rails_root/public/javascripts/tiny_mce/plugins/style/js/props.js +641 -0
  302. data/test/rails_root/public/javascripts/tiny_mce/plugins/style/langs/en_dlg.js +63 -0
  303. data/test/rails_root/public/javascripts/tiny_mce/plugins/style/props.htm +731 -0
  304. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/cell.htm +184 -0
  305. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/css/cell.css +17 -0
  306. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/css/row.css +25 -0
  307. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/css/table.css +13 -0
  308. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/editor_plugin.js +1 -0
  309. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/editor_plugin_src.js +1115 -0
  310. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/js/cell.js +269 -0
  311. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/js/merge_cells.js +29 -0
  312. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/js/row.js +212 -0
  313. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/js/table.js +410 -0
  314. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/langs/en_dlg.js +74 -0
  315. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/merge_cells.htm +38 -0
  316. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/row.htm +161 -0
  317. data/test/rails_root/public/javascripts/tiny_mce/plugins/table/table.htm +193 -0
  318. data/test/rails_root/public/javascripts/tiny_mce/plugins/template/blank.htm +12 -0
  319. data/test/rails_root/public/javascripts/tiny_mce/plugins/template/css/template.css +23 -0
  320. data/test/rails_root/public/javascripts/tiny_mce/plugins/template/editor_plugin.js +1 -0
  321. data/test/rails_root/public/javascripts/tiny_mce/plugins/template/editor_plugin_src.js +156 -0
  322. data/test/rails_root/public/javascripts/tiny_mce/plugins/template/js/template.js +106 -0
  323. data/test/rails_root/public/javascripts/tiny_mce/plugins/template/langs/en_dlg.js +15 -0
  324. data/test/rails_root/public/javascripts/tiny_mce/plugins/template/template.htm +39 -0
  325. data/test/rails_root/public/javascripts/tiny_mce/plugins/visualchars/editor_plugin.js +1 -0
  326. data/test/rails_root/public/javascripts/tiny_mce/plugins/visualchars/editor_plugin_src.js +73 -0
  327. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/abbr.htm +149 -0
  328. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/acronym.htm +149 -0
  329. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/attributes.htm +154 -0
  330. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/cite.htm +149 -0
  331. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css +11 -0
  332. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/css/popup.css +9 -0
  333. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/del.htm +170 -0
  334. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js +1 -0
  335. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js +136 -0
  336. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/ins.htm +170 -0
  337. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js +25 -0
  338. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js +25 -0
  339. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js +123 -0
  340. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/cite.js +25 -0
  341. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/del.js +60 -0
  342. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js +228 -0
  343. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/ins.js +59 -0
  344. data/test/rails_root/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js +32 -0
  345. data/test/rails_root/public/javascripts/tiny_mce/templates/bio.htm +31 -0
  346. data/test/rails_root/public/javascripts/tiny_mce/templates/country.htm +59 -0
  347. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/about.htm +56 -0
  348. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/anchor.htm +32 -0
  349. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/charmap.htm +54 -0
  350. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/color_picker.htm +76 -0
  351. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -0
  352. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/editor_template_src.js +1147 -0
  353. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/image.htm +86 -0
  354. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  355. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
  356. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/js/about.js +72 -0
  357. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/js/anchor.js +37 -0
  358. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/js/charmap.js +325 -0
  359. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/js/color_picker.js +253 -0
  360. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/js/image.js +245 -0
  361. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/js/link.js +155 -0
  362. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/js/source_editor.js +62 -0
  363. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/langs/en.js +62 -0
  364. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +51 -0
  365. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/link.htm +64 -0
  366. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/default/content.css +32 -0
  367. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +114 -0
  368. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  369. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  370. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  371. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  372. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  373. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  374. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +215 -0
  375. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +32 -0
  376. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +113 -0
  377. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  378. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  379. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  380. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +215 -0
  381. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  382. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  383. data/test/rails_root/public/javascripts/tiny_mce/themes/advanced/source_editor.htm +32 -0
  384. data/test/rails_root/public/javascripts/tiny_mce/themes/simple/editor_template.js +1 -0
  385. data/test/rails_root/public/javascripts/tiny_mce/themes/simple/editor_template_src.js +85 -0
  386. data/test/rails_root/public/javascripts/tiny_mce/themes/simple/img/icons.gif +0 -0
  387. data/test/rails_root/public/javascripts/tiny_mce/themes/simple/langs/en.js +11 -0
  388. data/test/rails_root/public/javascripts/tiny_mce/themes/simple/skins/default/content.css +25 -0
  389. data/test/rails_root/public/javascripts/tiny_mce/themes/simple/skins/default/ui.css +32 -0
  390. data/test/rails_root/public/javascripts/tiny_mce/themes/simple/skins/o2k7/content.css +17 -0
  391. data/test/rails_root/public/javascripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png +0 -0
  392. data/test/rails_root/public/javascripts/tiny_mce/themes/simple/skins/o2k7/ui.css +35 -0
  393. data/test/rails_root/public/javascripts/tiny_mce/tiny_mce.js +1 -0
  394. data/test/rails_root/public/javascripts/tiny_mce/tiny_mce_popup.js +294 -0
  395. data/test/rails_root/public/javascripts/tiny_mce/tiny_mce_src.js +11059 -0
  396. data/test/rails_root/public/javascripts/tiny_mce/utils/editable_selects.js +69 -0
  397. data/test/rails_root/public/javascripts/tiny_mce/utils/form_utils.js +199 -0
  398. data/test/rails_root/public/javascripts/tiny_mce/utils/mctabs.js +76 -0
  399. data/test/rails_root/public/javascripts/tiny_mce/utils/validate.js +219 -0
  400. data/test/rails_root/public/javascripts/tiny_mce_helper.js +73 -0
  401. data/test/rails_root/public/robots.txt +1 -0
  402. data/test/rails_root/public/stylesheets/.keep +0 -0
  403. data/test/rails_root/public/stylesheets/admin.css +12 -0
  404. data/test/rails_root/public/stylesheets/blueprint/ie.css +26 -0
  405. data/test/rails_root/public/stylesheets/blueprint/liquid_screen.css +203 -0
  406. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/icons/cross.png +0 -0
  407. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/icons/key.png +0 -0
  408. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/icons/tick.png +0 -0
  409. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/readme.txt +32 -0
  410. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/screen.css +97 -0
  411. data/test/rails_root/public/stylesheets/blueprint/plugins/fancy-type/readme.txt +14 -0
  412. data/test/rails_root/public/stylesheets/blueprint/plugins/fancy-type/screen.css +71 -0
  413. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/doc.png +0 -0
  414. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/email.png +0 -0
  415. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/external.png +0 -0
  416. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/feed.png +0 -0
  417. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/im.png +0 -0
  418. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/pdf.png +0 -0
  419. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/visited.png +0 -0
  420. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/xls.png +0 -0
  421. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/readme.txt +18 -0
  422. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/screen.css +40 -0
  423. data/test/rails_root/public/stylesheets/blueprint/plugins/liquid/liquid.css +134 -0
  424. data/test/rails_root/public/stylesheets/blueprint/plugins/liquid/src/liquid.css +197 -0
  425. data/test/rails_root/public/stylesheets/blueprint/plugins/rtl/readme.txt +10 -0
  426. data/test/rails_root/public/stylesheets/blueprint/plugins/rtl/screen.css +109 -0
  427. data/test/rails_root/public/stylesheets/blueprint/print.css +30 -0
  428. data/test/rails_root/public/stylesheets/blueprint/screen.css +251 -0
  429. data/test/rails_root/public/stylesheets/blueprint/sprite.css +1 -0
  430. data/test/rails_root/public/stylesheets/blueprint/src/forms.css +49 -0
  431. data/test/rails_root/public/stylesheets/blueprint/src/grid.css +213 -0
  432. data/test/rails_root/public/stylesheets/blueprint/src/grid.png +0 -0
  433. data/test/rails_root/public/stylesheets/blueprint/src/ie.css +59 -0
  434. data/test/rails_root/public/stylesheets/blueprint/src/print.css +85 -0
  435. data/test/rails_root/public/stylesheets/blueprint/src/reset.css +38 -0
  436. data/test/rails_root/public/stylesheets/blueprint/src/typography.css +105 -0
  437. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png +0 -0
  438. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_diagonals-thick_15_444444_40x40.png +0 -0
  439. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_100_f0f0f0_1x400.png +0 -0
  440. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_50_99c2ff_1x400.png +0 -0
  441. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_55_fbf5d0_1x400.png +0 -0
  442. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_80_e6e6e6_1x400.png +0 -0
  443. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  444. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_highlight-hard_100_f9f9f9_1x100.png +0 -0
  445. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_highlight-soft_100_e7eef3_1x100.png +0 -0
  446. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_222222_256x240.png +0 -0
  447. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_2694e8_256x240.png +0 -0
  448. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_2e83ff_256x240.png +0 -0
  449. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_72a7cf_256x240.png +0 -0
  450. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_888888_256x240.png +0 -0
  451. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_cd0a0a_256x240.png +0 -0
  452. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_ffffff_256x240.png +0 -0
  453. data/test/rails_root/public/stylesheets/jquery/cupertino/jquery-ui-1.7.1.custom.css +404 -0
  454. data/test/rails_root/public/stylesheets/jquery/jquery.fancybox.css +44 -0
  455. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  456. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
  457. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
  458. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
  459. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  460. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
  461. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
  462. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
  463. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_217bc0_256x240.png +0 -0
  464. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_2e83ff_256x240.png +0 -0
  465. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_469bdd_256x240.png +0 -0
  466. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_6da8d5_256x240.png +0 -0
  467. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_cd0a0a_256x240.png +0 -0
  468. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_d8e7f3_256x240.png +0 -0
  469. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_f9bd01_256x240.png +0 -0
  470. data/test/rails_root/public/stylesheets/jquery/redmond/jquery-ui-1.7.1.custom.css +404 -0
  471. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  472. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  473. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  474. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  475. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  476. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  477. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  478. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  479. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_222222_256x240.png +0 -0
  480. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  481. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_454545_256x240.png +0 -0
  482. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_888888_256x240.png +0 -0
  483. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  484. data/test/rails_root/public/stylesheets/jquery/smoothness/jquery-ui-1.7.1.custom.css +404 -0
  485. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  486. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  487. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  488. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  489. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  490. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  491. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  492. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  493. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  494. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  495. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  496. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  497. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  498. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  499. data/test/rails_root/public/stylesheets/jquery/ui-lightness/jquery-ui-1.7.1.custom.css +404 -0
  500. data/test/rails_root/public/stylesheets/reset.css +0 -0
  501. data/test/rails_root/public/stylesheets/styles.css +84 -0
  502. data/test/rails_root/public/stylesheets/themes/blue/styles.css +1 -0
  503. data/test/rails_root/public/stylesheets/themes/red/styles.css +1 -0
  504. data/test/rails_root/script/about +3 -0
  505. data/test/rails_root/script/breakpointer +3 -0
  506. data/test/rails_root/script/console +3 -0
  507. data/test/rails_root/script/create_project.rb +52 -0
  508. data/test/rails_root/script/cucumber +8 -0
  509. data/test/rails_root/script/dbconsole +3 -0
  510. data/test/rails_root/script/destroy +3 -0
  511. data/test/rails_root/script/generate +3 -0
  512. data/test/rails_root/script/performance/benchmarker +3 -0
  513. data/test/rails_root/script/performance/profiler +3 -0
  514. data/test/rails_root/script/performance/request +3 -0
  515. data/test/rails_root/script/plugin +3 -0
  516. data/test/rails_root/script/process/inspector +3 -0
  517. data/test/rails_root/script/process/reaper +3 -0
  518. data/test/rails_root/script/process/spawner +3 -0
  519. data/test/rails_root/script/runner +3 -0
  520. data/test/rails_root/script/server +3 -0
  521. data/test/rails_root/test/factories.rb +82 -0
  522. data/test/rails_root/test/functional/.keep +0 -0
  523. data/test/rails_root/test/functional/blogs_controller_test.rb +48 -0
  524. data/test/rails_root/test/functional/posts_controller_test.rb +71 -0
  525. data/test/rails_root/test/mocks/development/.keep +0 -0
  526. data/test/rails_root/test/mocks/test/.keep +0 -0
  527. data/test/rails_root/test/shoulda_macros/controller.rb +49 -0
  528. data/test/rails_root/test/shoulda_macros/forms.rb +32 -0
  529. data/test/rails_root/test/shoulda_macros/models.rb +50 -0
  530. data/test/rails_root/test/shoulda_macros/pagination.rb +53 -0
  531. data/test/rails_root/test/shoulda_macros/plugins.rb +34 -0
  532. data/test/rails_root/test/test_helper.rb +56 -0
  533. data/test/rails_root/test/unit/.keep +0 -0
  534. data/test/rails_root/test/unit/blog_test.rb +28 -0
  535. data/test/rails_root/test/unit/user_test.rb +15 -0
  536. data/test/rails_root/vendor/plugins/ssl_requirement/README +43 -0
  537. data/test/rails_root/vendor/plugins/ssl_requirement/lib/ssl_requirement.rb +62 -0
  538. data/test/rails_root/vendor/plugins/ssl_requirement/test/ssl_requirement_test.rb +132 -0
  539. data/test/rails_root/vendor/plugins/validation_reflection/CHANGELOG +24 -0
  540. data/test/rails_root/vendor/plugins/validation_reflection/LICENSE +20 -0
  541. data/test/rails_root/vendor/plugins/validation_reflection/README +64 -0
  542. data/test/rails_root/vendor/plugins/validation_reflection/Rakefile +22 -0
  543. data/test/rails_root/vendor/plugins/validation_reflection/about.yml +7 -0
  544. data/test/rails_root/vendor/plugins/validation_reflection/init.rb +8 -0
  545. data/test/rails_root/vendor/plugins/validation_reflection/lib/boiler_plate/validation_reflection.rb +129 -0
  546. data/test/rails_root/vendor/plugins/validation_reflection/test/test_helper.rb +36 -0
  547. data/test/rails_root/vendor/plugins/validation_reflection/test/validation_reflection_test.rb +126 -0
  548. data/uninstall.rb +1 -0
  549. metadata +690 -0
@@ -0,0 +1,184 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <title>{#table_dlg.cell_title}</title>
5
+ <script type="text/javascript" src="../../tiny_mce_popup.js"></script>
6
+ <script type="text/javascript" src="../../utils/mctabs.js"></script>
7
+ <script type="text/javascript" src="../../utils/form_utils.js"></script>
8
+ <script type="text/javascript" src="../../utils/editable_selects.js"></script>
9
+ <script type="text/javascript" src="js/cell.js"></script>
10
+ <link href="css/cell.css" rel="stylesheet" type="text/css" />
11
+ <base target="_self" />
12
+ </head>
13
+ <body id="tablecell" style="display: none">
14
+ <form onsubmit="updateAction();return false;" action="#">
15
+ <div class="tabs">
16
+ <ul>
17
+ <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li>
18
+ <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.advanced_tab}</a></span></li>
19
+ </ul>
20
+ </div>
21
+
22
+ <div class="panel_wrapper">
23
+ <div id="general_panel" class="panel current">
24
+ <fieldset>
25
+ <legend>{#table_dlg.general_props}</legend>
26
+
27
+ <table border="0" cellpadding="4" cellspacing="0">
28
+ <tr>
29
+ <td><label for="align">{#table_dlg.align}</label></td>
30
+ <td>
31
+ <select id="align" name="align" class="mceFocus">
32
+ <option value="">{#not_set}</option>
33
+ <option value="center">{#table_dlg.align_middle}</option>
34
+ <option value="left">{#table_dlg.align_left}</option>
35
+ <option value="right">{#table_dlg.align_right}</option>
36
+ </select>
37
+ </td>
38
+
39
+ <td><label for="celltype">{#table_dlg.cell_type}</label></td>
40
+ <td>
41
+ <select id="celltype" name="celltype">
42
+ <option value="td">{#table_dlg.td}</option>
43
+ <option value="th">{#table_dlg.th}</option>
44
+ </select>
45
+ </td>
46
+ </tr>
47
+
48
+ <tr>
49
+ <td><label for="valign">{#table_dlg.valign}</label></td>
50
+ <td>
51
+ <select id="valign" name="valign">
52
+ <option value="">{#not_set}</option>
53
+ <option value="top">{#table_dlg.align_top}</option>
54
+ <option value="middle">{#table_dlg.align_middle}</option>
55
+ <option value="bottom">{#table_dlg.align_bottom}</option>
56
+ </select>
57
+ </td>
58
+
59
+ <td><label for="scope">{#table_dlg.scope}</label></td>
60
+ <td>
61
+ <select id="scope" name="scope">
62
+ <option value="">{#not_set}</option>
63
+ <option value="col">{#table.col}</option>
64
+ <option value="row">{#table.row}</option>
65
+ <option value="rowgroup">{#table_dlg.rowgroup}</option>
66
+ <option value="colgroup">{#table_dlg.colgroup}</option>
67
+ </select>
68
+ </td>
69
+
70
+ </tr>
71
+
72
+ <tr>
73
+ <td><label for="width">{#table_dlg.width}</label></td>
74
+ <td><input id="width" name="width" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>
75
+
76
+ <td><label for="height">{#table_dlg.height}</label></td>
77
+ <td><input id="height" name="height" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>
78
+ </tr>
79
+
80
+ <tr id="styleSelectRow">
81
+ <td><label for="class">{#class_name}</label></td>
82
+ <td colspan="3">
83
+ <select id="class" name="class" class="mceEditableSelect">
84
+ <option value="" selected="selected">{#not_set}</option>
85
+ </select>
86
+ </td>
87
+ </tr>
88
+ </table>
89
+ </fieldset>
90
+ </div>
91
+
92
+ <div id="advanced_panel" class="panel">
93
+ <fieldset>
94
+ <legend>{#table_dlg.advanced_props}</legend>
95
+
96
+ <table border="0" cellpadding="0" cellspacing="4">
97
+ <tr>
98
+ <td class="column1"><label for="id">{#table_dlg.id}</label></td>
99
+ <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td>
100
+ </tr>
101
+
102
+ <tr>
103
+ <td><label for="style">{#table_dlg.style}</label></td>
104
+ <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td>
105
+ </tr>
106
+
107
+ <tr>
108
+ <td class="column1"><label for="dir">{#table_dlg.langdir}</label></td>
109
+ <td>
110
+ <select id="dir" name="dir" style="width: 200px">
111
+ <option value="">{#not_set}</option>
112
+ <option value="ltr">{#table_dlg.ltr}</option>
113
+ <option value="rtl">{#table_dlg.rtl}</option>
114
+ </select>
115
+ </td>
116
+ </tr>
117
+
118
+ <tr>
119
+ <td class="column1"><label for="lang">{#table_dlg.langcode}</label></td>
120
+ <td>
121
+ <input id="lang" name="lang" type="text" value="" style="width: 200px" />
122
+ </td>
123
+ </tr>
124
+
125
+ <tr>
126
+ <td class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td>
127
+ <td>
128
+ <table border="0" cellpadding="0" cellspacing="0">
129
+ <tr>
130
+ <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>
131
+ <td id="backgroundimagebrowsercontainer">&nbsp;</td>
132
+ </tr>
133
+ </table>
134
+ </td>
135
+ </tr>
136
+
137
+ <tr>
138
+ <td class="column1"><label for="bordercolor">{#table_dlg.bordercolor}</label></td>
139
+ <td>
140
+ <table border="0" cellpadding="0" cellspacing="0">
141
+ <tr>
142
+ <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>
143
+ <td id="bordercolor_pickcontainer">&nbsp;</td>
144
+ </tr>
145
+ </table>
146
+ </td>
147
+ </tr>
148
+
149
+ <tr>
150
+ <td class="column1"><label for="bgcolor">{#table_dlg.bgcolor}</label></td>
151
+ <td>
152
+ <table border="0" cellpadding="0" cellspacing="0">
153
+ <tr>
154
+ <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>
155
+ <td id="bgcolor_pickcontainer">&nbsp;</td>
156
+ </tr>
157
+ </table>
158
+ </td>
159
+ </tr>
160
+ </table>
161
+ </fieldset>
162
+ </div>
163
+ </div>
164
+
165
+ <div class="mceActionPanel">
166
+ <div>
167
+ <select id="action" name="action">
168
+ <option value="cell">{#table_dlg.cell_cell}</option>
169
+ <option value="row">{#table_dlg.cell_row}</option>
170
+ <option value="all">{#table_dlg.cell_all}</option>
171
+ </select>
172
+ </div>
173
+
174
+ <div style="float: left">
175
+ <div><input type="submit" id="insert" name="insert" value="{#update}" /></div>
176
+ </div>
177
+
178
+ <div style="float: right">
179
+ <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
180
+ </div>
181
+ </div>
182
+ </form>
183
+ </body>
184
+ </html>
@@ -0,0 +1,17 @@
1
+ /* CSS file for cell dialog in the table plugin */
2
+
3
+ .panel_wrapper div.current {
4
+ height: 200px;
5
+ }
6
+
7
+ .advfield {
8
+ width: 200px;
9
+ }
10
+
11
+ #action {
12
+ margin-bottom: 3px;
13
+ }
14
+
15
+ #class {
16
+ width: 150px;
17
+ }
@@ -0,0 +1,25 @@
1
+ /* CSS file for row dialog in the table plugin */
2
+
3
+ .panel_wrapper div.current {
4
+ height: 200px;
5
+ }
6
+
7
+ .advfield {
8
+ width: 200px;
9
+ }
10
+
11
+ #action {
12
+ margin-bottom: 3px;
13
+ }
14
+
15
+ #rowtype,#align,#valign,#class,#height {
16
+ width: 150px;
17
+ }
18
+
19
+ #height {
20
+ width: 50px;
21
+ }
22
+
23
+ .col2 {
24
+ padding-left: 20px;
25
+ }
@@ -0,0 +1,13 @@
1
+ /* CSS file for table dialog in the table plugin */
2
+
3
+ .panel_wrapper div.current {
4
+ height: 245px;
5
+ }
6
+
7
+ .advfield {
8
+ width: 200px;
9
+ }
10
+
11
+ #class {
12
+ width: 150px;
13
+ }
@@ -0,0 +1 @@
1
+ (function(){var each=tinymce.each;tinymce.create('tinymce.plugins.TablePlugin',{init:function(ed,url){var t=this;t.editor=ed;t.url=url;each([['table','table.desc','mceInsertTable',true],['delete_table','table.del','mceTableDelete'],['delete_col','table.delete_col_desc','mceTableDeleteCol'],['delete_row','table.delete_row_desc','mceTableDeleteRow'],['col_after','table.col_after_desc','mceTableInsertColAfter'],['col_before','table.col_before_desc','mceTableInsertColBefore'],['row_after','table.row_after_desc','mceTableInsertRowAfter'],['row_before','table.row_before_desc','mceTableInsertRowBefore'],['row_props','table.row_desc','mceTableRowProps',true],['cell_props','table.cell_desc','mceTableCellProps',true],['split_cells','table.split_cells_desc','mceTableSplitCells',true],['merge_cells','table.merge_cells_desc','mceTableMergeCells',true]],function(c){ed.addButton(c[0],{title:c[1],cmd:c[2],ui:c[3]});});ed.onInit.add(function(){if(ed&&ed.plugins.contextmenu){ed.plugins.contextmenu.onContextMenu.add(function(th,m,e){var sm,se=ed.selection,el=se.getNode()||ed.getBody();if(ed.dom.getParent(e,'td')||ed.dom.getParent(e,'th')){m.removeAll();if(el.nodeName=='A'&&!ed.dom.getAttrib(el,'name')){m.add({title:'advanced.link_desc',icon:'link',cmd:ed.plugins.advlink?'mceAdvLink':'mceLink',ui:true});m.add({title:'advanced.unlink_desc',icon:'unlink',cmd:'UnLink'});m.addSeparator();}if(el.nodeName=='IMG'&&el.className.indexOf('mceItem')==-1){m.add({title:'advanced.image_desc',icon:'image',cmd:ed.plugins.advimage?'mceAdvImage':'mceImage',ui:true});m.addSeparator();}m.add({title:'table.desc',icon:'table',cmd:'mceInsertTable',ui:true,value:{action:'insert'}});m.add({title:'table.props_desc',icon:'table_props',cmd:'mceInsertTable',ui:true});m.add({title:'table.del',icon:'delete_table',cmd:'mceTableDelete',ui:true});m.addSeparator();sm=m.addMenu({title:'table.cell'});sm.add({title:'table.cell_desc',icon:'cell_props',cmd:'mceTableCellProps',ui:true});sm.add({title:'table.split_cells_desc',icon:'split_cells',cmd:'mceTableSplitCells',ui:true});sm.add({title:'table.merge_cells_desc',icon:'merge_cells',cmd:'mceTableMergeCells',ui:true});sm=m.addMenu({title:'table.row'});sm.add({title:'table.row_desc',icon:'row_props',cmd:'mceTableRowProps',ui:true});sm.add({title:'table.row_before_desc',icon:'row_before',cmd:'mceTableInsertRowBefore'});sm.add({title:'table.row_after_desc',icon:'row_after',cmd:'mceTableInsertRowAfter'});sm.add({title:'table.delete_row_desc',icon:'delete_row',cmd:'mceTableDeleteRow'});sm.addSeparator();sm.add({title:'table.cut_row_desc',icon:'cut',cmd:'mceTableCutRow'});sm.add({title:'table.copy_row_desc',icon:'copy',cmd:'mceTableCopyRow'});sm.add({title:'table.paste_row_before_desc',icon:'paste',cmd:'mceTablePasteRowBefore'});sm.add({title:'table.paste_row_after_desc',icon:'paste',cmd:'mceTablePasteRowAfter'});sm=m.addMenu({title:'table.col'});sm.add({title:'table.col_before_desc',icon:'col_before',cmd:'mceTableInsertColBefore'});sm.add({title:'table.col_after_desc',icon:'col_after',cmd:'mceTableInsertColAfter'});sm.add({title:'table.delete_col_desc',icon:'delete_col',cmd:'mceTableDeleteCol'});}else m.add({title:'table.desc',icon:'table',cmd:'mceInsertTable',ui:true});});}});ed.onKeyDown.add(function(ed,e){if(e.keyCode==9&&ed.dom.getParent(ed.selection.getNode(),'TABLE')){if(!tinymce.isGecko&&!tinymce.isOpera){tinyMCE.execInstanceCommand(ed.editorId,"mceTableMoveToNextRow",true);return tinymce.dom.Event.cancel(e);}ed.undoManager.add();}});if(!tinymce.isIE){if(ed.getParam('table_selection',true)){ed.onClick.add(function(ed,e){e=e.target;if(e.nodeName==='TABLE')ed.selection.select(e);});}}ed.onNodeChange.add(function(ed,cm,n){var p=ed.dom.getParent(n,'td,th,caption');cm.setActive('table',n.nodeName==='TABLE'||!!p);if(p&&p.nodeName==='CAPTION')p=null;cm.setDisabled('delete_table',!p);cm.setDisabled('delete_col',!p);cm.setDisabled('delete_table',!p);cm.setDisabled('delete_row',!p);cm.setDisabled('col_after',!p);cm.setDisabled('col_before',!p);cm.setDisabled('row_after',!p);cm.setDisabled('row_before',!p);cm.setDisabled('row_props',!p);cm.setDisabled('cell_props',!p);cm.setDisabled('split_cells',!p||(parseInt(ed.dom.getAttrib(p,'colspan','1'))<2&&parseInt(ed.dom.getAttrib(p,'rowspan','1'))<2));cm.setDisabled('merge_cells',!p);});if(!tinymce.isIE){ed.onBeforeSetContent.add(function(ed,o){if(o.initial)o.content=o.content.replace(/<(td|th)([^>]+|)>\s*<\/(td|th)>/g,tinymce.isOpera?'<$1$2>&nbsp;</$1>':'<$1$2><br mce_bogus="1" /></$1>');});}},execCommand:function(cmd,ui,val){var ed=this.editor,b;switch(cmd){case"mceTableMoveToNextRow":case"mceInsertTable":case"mceTableRowProps":case"mceTableCellProps":case"mceTableSplitCells":case"mceTableMergeCells":case"mceTableInsertRowBefore":case"mceTableInsertRowAfter":case"mceTableDeleteRow":case"mceTableInsertColBefore":case"mceTableInsertColAfter":case"mceTableDeleteCol":case"mceTableCutRow":case"mceTableCopyRow":case"mceTablePasteRowBefore":case"mceTablePasteRowAfter":case"mceTableDelete":ed.execCommand('mceBeginUndoLevel');this._doExecCommand(cmd,ui,val);ed.execCommand('mceEndUndoLevel');return true;}return false;},getInfo:function(){return{longname:'Tables',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_doExecCommand:function(command,user_interface,value){var inst=this.editor,ed=inst,url=this.url;var focusElm=inst.selection.getNode();var trElm=inst.dom.getParent(focusElm,"tr");var tdElm=inst.dom.getParent(focusElm,"td,th");var tableElm=inst.dom.getParent(focusElm,"table");var doc=inst.contentWindow.document;var tableBorder=tableElm?tableElm.getAttribute("border"):"";if(trElm&&tdElm==null)tdElm=trElm.cells[0];function inArray(ar,v){for(var i=0;i<ar.length;i++){if(ar[i].length>0&&inArray(ar[i],v))return true;if(ar[i]==v)return true;}return false;}function select(dx,dy){var td;grid=getTableGrid(tableElm);dx=dx||0;dy=dy||0;dx=Math.max(cpos.cellindex+dx,0);dy=Math.max(cpos.rowindex+dy,0);inst.execCommand('mceRepaint');td=getCell(grid,dy,dx);if(td){inst.selection.select(td.firstChild||td);inst.selection.collapse(1);}};function makeTD(){var newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';}function getColRowSpan(td){var colspan=inst.dom.getAttrib(td,"colspan");var rowspan=inst.dom.getAttrib(td,"rowspan");colspan=colspan==""?1:parseInt(colspan);rowspan=rowspan==""?1:parseInt(rowspan);return{colspan:colspan,rowspan:rowspan};}function getCellPos(grid,td){var x,y;for(y=0;y<grid.length;y++){for(x=0;x<grid[y].length;x++){if(grid[y][x]==td)return{cellindex:x,rowindex:y};}}return null;}function getCell(grid,row,col){if(grid[row]&&grid[row][col])return grid[row][col];return null;}function getNextCell(table,cell){var cells=[],x=0,i,j,cell,nextCell;for(i=0;i<table.rows.length;i++)for(j=0;j<table.rows[i].cells.length;j++,x++)cells[x]=table.rows[i].cells[j];for(i=0;i<cells.length;i++)if(cells[i]==cell)if(nextCell=cells[i+1])return nextCell;}function getTableGrid(table){var grid=[],rows=table.rows,x,y,td,sd,xstart,x2,y2;for(y=0;y<rows.length;y++){for(x=0;x<rows[y].cells.length;x++){td=rows[y].cells[x];sd=getColRowSpan(td);for(xstart=x;grid[y]&&grid[y][xstart];xstart++);for(y2=y;y2<y+sd['rowspan'];y2++){if(!grid[y2])grid[y2]=[];for(x2=xstart;x2<xstart+sd['colspan'];x2++)grid[y2][x2]=td;}}}return grid;}function trimRow(table,tr,td,new_tr){var grid=getTableGrid(table),cpos=getCellPos(grid,td);var cells,lastElm;if(new_tr.cells.length!=tr.childNodes.length){cells=tr.childNodes;lastElm=null;for(var x=0;td=getCell(grid,cpos.rowindex,x);x++){var remove=true;var sd=getColRowSpan(td);if(inArray(cells,td)){new_tr.childNodes[x]._delete=true;}else if((lastElm==null||td!=lastElm)&&sd.colspan>1){for(var i=x;i<x+td.colSpan;i++)new_tr.childNodes[i]._delete=true;}if((lastElm==null||td!=lastElm)&&sd.rowspan>1)td.rowSpan=sd.rowspan+1;lastElm=td;}deleteMarked(tableElm);}}function prevElm(node,name){while((node=node.previousSibling)!=null){if(node.nodeName==name)return node;}return null;}function nextElm(node,names){var namesAr=names.split(',');while((node=node.nextSibling)!=null){for(var i=0;i<namesAr.length;i++){if(node.nodeName.toLowerCase()==namesAr[i].toLowerCase())return node;}}return null;}function deleteMarked(tbl){if(tbl.rows==0)return;var tr=tbl.rows[0];do{var next=nextElm(tr,"TR");if(tr._delete){tr.parentNode.removeChild(tr);continue;}var td=tr.cells[0];if(td.cells>1){do{var nexttd=nextElm(td,"TD,TH");if(td._delete)td.parentNode.removeChild(td);}while((td=nexttd)!=null);}}while((tr=next)!=null);}function addRows(td_elm,tr_elm,rowspan){td_elm.rowSpan=1;var trNext=nextElm(tr_elm,"TR");for(var i=1;i<rowspan&&trNext;i++){var newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';if(tinymce.isIE)trNext.insertBefore(newTD,trNext.cells(td_elm.cellIndex));else trNext.insertBefore(newTD,trNext.cells[td_elm.cellIndex]);trNext=nextElm(trNext,"TR");}}function copyRow(doc,table,tr){var grid=getTableGrid(table);var newTR=tr.cloneNode(false);var cpos=getCellPos(grid,tr.cells[0]);var lastCell=null;var tableBorder=inst.dom.getAttrib(table,"border");var tdElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){var newTD=null;if(lastCell!=tdElm){for(var i=0;i<tr.cells.length;i++){if(tdElm==tr.cells[i]){newTD=tdElm.cloneNode(true);break;}}}if(newTD==null){newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';}newTD.colSpan=1;newTD.rowSpan=1;newTR.appendChild(newTD);lastCell=tdElm;}return newTR;}switch(command){case"mceTableMoveToNextRow":var nextCell=getNextCell(tableElm,tdElm);if(!nextCell){inst.execCommand("mceTableInsertRowAfter",tdElm);nextCell=getNextCell(tableElm,tdElm);}inst.selection.select(nextCell);inst.selection.collapse(true);return true;case"mceTableRowProps":if(trElm==null)return true;if(user_interface){inst.windowManager.open({url:url+'/row.htm',width:400+parseInt(inst.getLang('table.rowprops_delta_width',0)),height:295+parseInt(inst.getLang('table.rowprops_delta_height',0)),inline:1},{plugin_url:url});}return true;case"mceTableCellProps":if(tdElm==null)return true;if(user_interface){inst.windowManager.open({url:url+'/cell.htm',width:400+parseInt(inst.getLang('table.cellprops_delta_width',0)),height:295+parseInt(inst.getLang('table.cellprops_delta_height',0)),inline:1},{plugin_url:url});}return true;case"mceInsertTable":if(user_interface){inst.windowManager.open({url:url+'/table.htm',width:400+parseInt(inst.getLang('table.table_delta_width',0)),height:320+parseInt(inst.getLang('table.table_delta_height',0)),inline:1},{plugin_url:url,action:value?value.action:0});}return true;case"mceTableDelete":var table=inst.dom.getParent(inst.selection.getNode(),"table");if(table){table.parentNode.removeChild(table);inst.execCommand('mceRepaint');}return true;case"mceTableSplitCells":case"mceTableMergeCells":case"mceTableInsertRowBefore":case"mceTableInsertRowAfter":case"mceTableDeleteRow":case"mceTableInsertColBefore":case"mceTableInsertColAfter":case"mceTableDeleteCol":case"mceTableCutRow":case"mceTableCopyRow":case"mceTablePasteRowBefore":case"mceTablePasteRowAfter":if(!tableElm)return true;if(trElm&&tableElm!=trElm.parentNode)tableElm=trElm.parentNode;if(tableElm&&trElm){switch(command){case"mceTableCutRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);inst.execCommand("mceTableDeleteRow");break;case"mceTableCopyRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);break;case"mceTablePasteRowBefore":if(!trElm||!tdElm)return true;var newTR=inst.tableRowClipboard.cloneNode(true);var prevTR=prevElm(trElm,"TR");if(prevTR!=null)trimRow(tableElm,prevTR,prevTR.cells[0],newTR);trElm.parentNode.insertBefore(newTR,trElm);break;case"mceTablePasteRowAfter":if(!trElm||!tdElm)return true;var nextTR=nextElm(trElm,"TR");var newTR=inst.tableRowClipboard.cloneNode(true);trimRow(tableElm,trElm,tdElm,newTR);if(nextTR==null)trElm.parentNode.appendChild(newTR);else nextTR.parentNode.insertBefore(newTR,nextTR);break;case"mceTableInsertRowBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");var lastTDElm=null;cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['rowspan']==1){var newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD);}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm;}}trElm.parentNode.insertBefore(newTR,trElm);select(0,1);break;case"mceTableInsertRowAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['rowspan']==1){var newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD);}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm;}}if(newTR.hasChildNodes()){var nextTR=nextElm(trElm,"TR");if(nextTR)nextTR.parentNode.insertBefore(newTR,nextTR);else tableElm.appendChild(newTR);}select(0,1);break;case"mceTableDeleteRow":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);if(grid.length==1&&tableElm.nodeName=='TBODY'){inst.dom.remove(inst.dom.getParent(tableElm,"table"));return true;}var cells=trElm.cells;var nextTR=nextElm(trElm,"TR");for(var x=0;x<cells.length;x++){if(cells[x].rowSpan>1){var newTD=cells[x].cloneNode(true);var sd=getColRowSpan(cells[x]);newTD.rowSpan=sd.rowspan-1;var nextTD=nextTR.cells[x];if(nextTD==null)nextTR.appendChild(newTD);else nextTR.insertBefore(newTD,nextTD);}}var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd.rowspan>1){tdElm.rowSpan=sd.rowspan-1;}else{trElm=tdElm.parentNode;if(trElm.parentNode)trElm._delete=true;}lastTDElm=tdElm;}}deleteMarked(tableElm);select(0,-1);break;case"mceTableInsertColBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(inst.dom.getParent(tableElm,"table"));var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';newTD.rowSpan=tdElm.rowSpan;tdElm.parentNode.insertBefore(newTD,tdElm);}else tdElm.colSpan++;lastTDElm=tdElm;}}select();break;case"mceTableInsertColAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(inst.dom.getParent(tableElm,"table"));var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';newTD.rowSpan=tdElm.rowSpan;var nextTD=nextElm(tdElm,"TD,TH");if(nextTD==null)tdElm.parentNode.appendChild(newTD);else nextTD.parentNode.insertBefore(newTD,nextTD);}else tdElm.colSpan++;lastTDElm=tdElm;}}select(1);break;case"mceTableDeleteCol":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;if((grid.length>1&&grid[0].length<=1)&&tableElm.nodeName=='TBODY'){inst.dom.remove(inst.dom.getParent(tableElm,"table"));return true;}for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']>1)tdElm.colSpan=sd['colspan']-1;else{if(tdElm.parentNode)tdElm.parentNode.removeChild(tdElm);}lastTDElm=tdElm;}}select(-1);break;case"mceTableSplitCells":if(!trElm||!tdElm)return true;var spandata=getColRowSpan(tdElm);var colspan=spandata["colspan"];var rowspan=spandata["rowspan"];if(colspan>1||rowspan>1){tdElm.colSpan=1;for(var i=1;i<colspan;i++){var newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';trElm.insertBefore(newTD,nextElm(tdElm,"TD,TH"));if(rowspan>1)addRows(newTD,trElm,rowspan);}addRows(tdElm,trElm,rowspan);}tableElm=inst.dom.getParent(inst.selection.getNode(),"table");break;case"mceTableMergeCells":var rows=[];var sel=inst.selection.getSel();var grid=getTableGrid(tableElm);if(tinymce.isIE||sel.rangeCount==1){if(user_interface){var sp=getColRowSpan(tdElm);inst.windowManager.open({url:url+'/merge_cells.htm',width:240+parseInt(inst.getLang('table.merge_cells_delta_width',0)),height:110+parseInt(inst.getLang('table.merge_cells_delta_height',0)),inline:1},{action:"update",numcols:sp.colspan,numrows:sp.rowspan,plugin_url:url});return true;}else{var numRows=parseInt(value['numrows']);var numCols=parseInt(value['numcols']);var cpos=getCellPos(grid,tdElm);if((""+numRows)=="NaN")numRows=1;if((""+numCols)=="NaN")numCols=1;var tRows=tableElm.rows;for(var y=cpos.rowindex;y<grid.length;y++){var rowCells=[];for(var x=cpos.cellindex;x<grid[y].length;x++){var td=getCell(grid,y,x);if(td&&!inArray(rows,td)&&!inArray(rowCells,td)){var cp=getCellPos(grid,td);if(cp.cellindex<cpos.cellindex+numCols&&cp.rowindex<cpos.rowindex+numRows)rowCells[rowCells.length]=td;}}if(rowCells.length>0)rows[rows.length]=rowCells;var td=getCell(grid,cpos.rowindex,cpos.cellindex);each(ed.dom.select('br',td),function(e,i){if(i>0&&ed.dom.getAttrib('mce_bogus'))ed.dom.remove(e);});}}}else{var cells=[];var sel=inst.selection.getSel();var lastTR=null;var curRow=null;var x1=-1,y1=-1,x2,y2;if(sel.rangeCount<2)return true;for(var i=0;i<sel.rangeCount;i++){var rng=sel.getRangeAt(i);var tdElm=rng.startContainer.childNodes[rng.startOffset];if(!tdElm)break;if(tdElm.nodeName=="TD"||tdElm.nodeName=="TH")cells[cells.length]=tdElm;}var tRows=tableElm.rows;for(var y=0;y<tRows.length;y++){var rowCells=[];for(var x=0;x<tRows[y].cells.length;x++){var td=tRows[y].cells[x];for(var i=0;i<cells.length;i++){if(td==cells[i]){rowCells[rowCells.length]=td;}}}if(rowCells.length>0)rows[rows.length]=rowCells;}var curRow=[];var lastTR=null;for(var y=0;y<grid.length;y++){for(var x=0;x<grid[y].length;x++){grid[y][x]._selected=false;for(var i=0;i<cells.length;i++){if(grid[y][x]==cells[i]){if(x1==-1){x1=x;y1=y;}x2=x;y2=y;grid[y][x]._selected=true;}}}}for(var y=y1;y<=y2;y++){for(var x=x1;x<=x2;x++){if(!grid[y][x]._selected){alert("Invalid selection for merge.");return true;}}}}var rowSpan=1,colSpan=1;var lastRowSpan=-1;for(var y=0;y<rows.length;y++){var rowColSpan=0;for(var x=0;x<rows[y].length;x++){var sd=getColRowSpan(rows[y][x]);rowColSpan+=sd['colspan'];if(lastRowSpan!=-1&&sd['rowspan']!=lastRowSpan){alert("Invalid selection for merge.");return true;}lastRowSpan=sd['rowspan'];}if(rowColSpan>colSpan)colSpan=rowColSpan;lastRowSpan=-1;}var lastColSpan=-1;for(var x=0;x<rows[0].length;x++){var colRowSpan=0;for(var y=0;y<rows.length;y++){var sd=getColRowSpan(rows[y][x]);colRowSpan+=sd['rowspan'];if(lastColSpan!=-1&&sd['colspan']!=lastColSpan){alert("Invalid selection for merge.");return true;}lastColSpan=sd['colspan'];}if(colRowSpan>rowSpan)rowSpan=colRowSpan;lastColSpan=-1;}tdElm=rows[0][0];tdElm.rowSpan=rowSpan;tdElm.colSpan=colSpan;for(var y=0;y<rows.length;y++){for(var x=0;x<rows[y].length;x++){var html=rows[y][x].innerHTML;var chk=html.replace(/[ \t\r\n]/g,"");if(chk!="<br/>"&&chk!="<br>"&&chk!='<br mce_bogus="1"/>'&&(x+y>0))tdElm.innerHTML+=html;if(rows[y][x]!=tdElm&&!rows[y][x]._deleted){var cpos=getCellPos(grid,rows[y][x]);var tr=rows[y][x].parentNode;tr.removeChild(rows[y][x]);rows[y][x]._deleted=true;if(!tr.hasChildNodes()){tr.parentNode.removeChild(tr);var lastCell=null;for(var x=0;cellElm=getCell(grid,cpos.rowindex,x);x++){if(cellElm!=lastCell&&cellElm.rowSpan>1)cellElm.rowSpan--;lastCell=cellElm;}if(tdElm.rowSpan>1)tdElm.rowSpan--;}}}}each(ed.dom.select('br',tdElm),function(e,i){if(i>0&&ed.dom.getAttrib(e,'mce_bogus'))ed.dom.remove(e);});break;}tableElm=inst.dom.getParent(inst.selection.getNode(),"table");inst.addVisual(tableElm);inst.nodeChanged();}return true;}return false;}});tinymce.PluginManager.add('table',tinymce.plugins.TablePlugin);})();
@@ -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
+ })();