tiny_mce 0.1.1 → 0.1.2

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 (393) hide show
  1. data/CHANGELOG_PLUGIN.rdoc +4 -0
  2. data/CHANGELOG_TINYMCE +78 -7
  3. data/LICENSE +2 -2
  4. data/README.rdoc +36 -14
  5. data/Rakefile +1 -3
  6. data/SPELLCHECKING_PLUGIN.rdoc +3 -1
  7. data/VERSION +1 -1
  8. data/lib/tiny_mce.rb +2 -7
  9. data/lib/tiny_mce/assets/tiny_mce/langs/ar.js +95 -95
  10. data/lib/tiny_mce/assets/tiny_mce/langs/cs.js +13 -13
  11. data/lib/tiny_mce/assets/tiny_mce/langs/es.js +1 -1
  12. data/lib/tiny_mce/assets/tiny_mce/langs/fa.js +1 -1
  13. data/lib/tiny_mce/assets/tiny_mce/langs/fr.js +41 -41
  14. data/lib/tiny_mce/assets/tiny_mce/langs/he.js +93 -93
  15. data/lib/tiny_mce/assets/tiny_mce/langs/hu.js +10 -10
  16. data/lib/tiny_mce/assets/tiny_mce/langs/hy.js +157 -0
  17. data/lib/tiny_mce/assets/tiny_mce/langs/id.js +71 -71
  18. data/lib/tiny_mce/assets/tiny_mce/langs/ii.js +78 -70
  19. data/lib/tiny_mce/assets/tiny_mce/langs/ja.js +91 -99
  20. data/lib/tiny_mce/assets/tiny_mce/langs/lb.js +155 -0
  21. data/lib/tiny_mce/assets/tiny_mce/langs/pl.js +3 -3
  22. data/lib/tiny_mce/assets/tiny_mce/langs/ps.js +154 -0
  23. data/lib/tiny_mce/assets/tiny_mce/langs/pt.js +2 -2
  24. data/lib/tiny_mce/assets/tiny_mce/langs/ru.js +61 -59
  25. data/lib/tiny_mce/assets/tiny_mce/langs/sk.js +25 -25
  26. data/lib/tiny_mce/assets/tiny_mce/langs/th.js +1 -1
  27. data/lib/tiny_mce/assets/tiny_mce/langs/tr.js +51 -51
  28. data/lib/tiny_mce/assets/tiny_mce/langs/tw.js +2 -0
  29. data/lib/tiny_mce/assets/tiny_mce/langs/uk.js +7 -7
  30. data/lib/tiny_mce/assets/tiny_mce/langs/vi.js +17 -17
  31. data/lib/tiny_mce/assets/tiny_mce/langs/zu.js +162 -0
  32. data/lib/tiny_mce/assets/tiny_mce/plugins/advhr/editor_plugin_src.js +6 -3
  33. data/lib/tiny_mce/assets/tiny_mce/plugins/advhr/langs/ar_dlg.js +3 -3
  34. data/lib/tiny_mce/assets/tiny_mce/plugins/advhr/langs/he_dlg.js +3 -3
  35. data/lib/tiny_mce/assets/tiny_mce/plugins/advhr/langs/hy_dlg.js +5 -0
  36. data/lib/tiny_mce/assets/tiny_mce/plugins/advhr/langs/id_dlg.js +3 -3
  37. data/lib/tiny_mce/assets/tiny_mce/plugins/advhr/langs/ii_dlg.js +1 -1
  38. data/lib/tiny_mce/assets/tiny_mce/plugins/advhr/langs/ja_dlg.js +3 -3
  39. data/lib/tiny_mce/assets/tiny_mce/plugins/advhr/langs/lb_dlg.js +5 -0
  40. data/lib/tiny_mce/assets/tiny_mce/plugins/advhr/langs/ps_dlg.js +5 -0
  41. data/lib/tiny_mce/assets/tiny_mce/plugins/advhr/langs/zu_dlg.js +5 -0
  42. data/lib/tiny_mce/assets/tiny_mce/plugins/advhr/rule.htm +2 -7
  43. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/editor_plugin_src.js +6 -3
  44. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/image.htm +2 -7
  45. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/js/image.js +1 -1
  46. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/ar_dlg.js +41 -41
  47. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/de_dlg.js +1 -1
  48. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/fa_dlg.js +2 -2
  49. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/fr_dlg.js +14 -14
  50. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/he_dlg.js +37 -37
  51. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/hy_dlg.js +43 -0
  52. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/id_dlg.js +22 -22
  53. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/ii_dlg.js +24 -24
  54. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/ja_dlg.js +38 -38
  55. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/lb_dlg.js +43 -0
  56. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/ps_dlg.js +43 -0
  57. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/pt_dlg.js +1 -1
  58. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/ru_dlg.js +31 -31
  59. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/sk_dlg.js +2 -2
  60. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/th_dlg.js +1 -1
  61. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/tr_dlg.js +13 -13
  62. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/uk_dlg.js +1 -1
  63. data/lib/tiny_mce/assets/tiny_mce/plugins/advimage/langs/zu_dlg.js +43 -0
  64. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/editor_plugin_src.js +6 -3
  65. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/js/advlink.js +1 -1
  66. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/ar_dlg.js +49 -49
  67. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/fr_dlg.js +12 -12
  68. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/he_dlg.js +40 -40
  69. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/hy_dlg.js +52 -0
  70. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/id_dlg.js +32 -32
  71. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/ii_dlg.js +31 -31
  72. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/ja_dlg.js +49 -49
  73. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/lb_dlg.js +52 -0
  74. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/ps_dlg.js +52 -0
  75. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/pt_dlg.js +1 -1
  76. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/ru_dlg.js +38 -38
  77. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/sk_dlg.js +5 -5
  78. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/th_dlg.js +5 -5
  79. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/tr_dlg.js +23 -23
  80. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/uk_dlg.js +11 -11
  81. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/vi_dlg.js +1 -1
  82. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/langs/zu_dlg.js +52 -0
  83. data/lib/tiny_mce/assets/tiny_mce/plugins/advlink/link.htm +2 -7
  84. data/lib/tiny_mce/assets/tiny_mce/plugins/advlist/editor_plugin.js +1 -0
  85. data/lib/tiny_mce/assets/tiny_mce/plugins/advlist/editor_plugin_src.js +154 -0
  86. data/lib/tiny_mce/assets/tiny_mce/plugins/autoresize/editor_plugin_src.js +6 -3
  87. data/lib/tiny_mce/assets/tiny_mce/plugins/autosave/editor_plugin.js +1 -1
  88. data/lib/tiny_mce/assets/tiny_mce/plugins/autosave/editor_plugin_src.js +388 -17
  89. data/lib/tiny_mce/assets/tiny_mce/plugins/autosave/langs/en.js +4 -0
  90. data/lib/tiny_mce/assets/tiny_mce/plugins/bbcode/editor_plugin_src.js +6 -3
  91. data/lib/tiny_mce/assets/tiny_mce/plugins/contextmenu/editor_plugin_src.js +35 -3
  92. data/lib/tiny_mce/assets/tiny_mce/plugins/directionality/editor_plugin_src.js +6 -3
  93. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/editor_plugin.js +1 -1
  94. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/editor_plugin_src.js +8 -5
  95. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/ar_dlg.js +18 -18
  96. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/fr_dlg.js +3 -3
  97. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/he_dlg.js +18 -18
  98. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/hy_dlg.js +20 -0
  99. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/id_dlg.js +1 -1
  100. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/ii_dlg.js +3 -3
  101. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/ja_dlg.js +18 -18
  102. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/lb_dlg.js +20 -0
  103. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/ps_dlg.js +20 -0
  104. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/ru_dlg.js +18 -18
  105. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/sk_dlg.js +18 -18
  106. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/th_dlg.js +1 -1
  107. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/tr_dlg.js +12 -12
  108. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/vi_dlg.js +18 -18
  109. data/lib/tiny_mce/assets/tiny_mce/plugins/emotions/langs/zu_dlg.js +20 -0
  110. data/lib/tiny_mce/assets/tiny_mce/plugins/example/dialog.htm +2 -7
  111. data/lib/tiny_mce/assets/tiny_mce/plugins/example/editor_plugin_src.js +6 -3
  112. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/editor_plugin_src.js +6 -3
  113. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/fullpage.htm +2 -7
  114. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/js/fullpage.js +17 -7
  115. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/ar_dlg.js +78 -78
  116. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/fr_dlg.js +4 -4
  117. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/he_dlg.js +40 -40
  118. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/hy_dlg.js +85 -0
  119. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/ii_dlg.js +51 -51
  120. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/ja_dlg.js +75 -75
  121. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/lb_dlg.js +85 -0
  122. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/ps_dlg.js +85 -0
  123. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/pt_dlg.js +1 -1
  124. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/ru_dlg.js +54 -54
  125. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/tr_dlg.js +42 -42
  126. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/tw_dlg.js +3 -3
  127. data/lib/tiny_mce/assets/tiny_mce/plugins/fullpage/langs/zu_dlg.js +85 -0
  128. data/lib/tiny_mce/assets/tiny_mce/plugins/fullscreen/editor_plugin_src.js +6 -3
  129. data/lib/tiny_mce/assets/tiny_mce/plugins/fullscreen/fullscreen.htm +0 -1
  130. data/lib/tiny_mce/assets/tiny_mce/plugins/iespell/editor_plugin_src.js +6 -3
  131. data/lib/tiny_mce/assets/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +6 -3
  132. data/lib/tiny_mce/assets/tiny_mce/plugins/insertdatetime/editor_plugin_src.js +6 -3
  133. data/lib/tiny_mce/assets/tiny_mce/plugins/layer/editor_plugin_src.js +6 -3
  134. data/lib/tiny_mce/assets/tiny_mce/plugins/legacyoutput/editor_plugin.js +1 -0
  135. data/lib/tiny_mce/assets/tiny_mce/plugins/legacyoutput/editor_plugin_src.js +136 -0
  136. data/lib/tiny_mce/assets/tiny_mce/plugins/media/editor_plugin.js +1 -1
  137. data/lib/tiny_mce/assets/tiny_mce/plugins/media/editor_plugin_src.js +10 -7
  138. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/ar_dlg.js +86 -86
  139. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/cs_dlg.js +12 -12
  140. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/fr_dlg.js +15 -15
  141. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/he_dlg.js +24 -24
  142. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/hy_dlg.js +103 -0
  143. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/id_dlg.js +16 -16
  144. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/ii_dlg.js +70 -70
  145. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/ja_dlg.js +91 -91
  146. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/lb_dlg.js +103 -0
  147. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/ps_dlg.js +103 -0
  148. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/ru_dlg.js +88 -88
  149. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/sk_dlg.js +1 -1
  150. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/tr_dlg.js +44 -44
  151. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/uk_dlg.js +24 -24
  152. data/lib/tiny_mce/assets/tiny_mce/plugins/media/langs/zu_dlg.js +103 -0
  153. data/lib/tiny_mce/assets/tiny_mce/plugins/media/media.htm +2 -7
  154. data/lib/tiny_mce/assets/tiny_mce/plugins/nonbreaking/editor_plugin_src.js +6 -3
  155. data/lib/tiny_mce/assets/tiny_mce/plugins/noneditable/editor_plugin_src.js +6 -3
  156. data/lib/tiny_mce/assets/tiny_mce/plugins/pagebreak/editor_plugin_src.js +6 -3
  157. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/editor_plugin.js +1 -1
  158. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/editor_plugin_src.js +509 -111
  159. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/ar_dlg.js +3 -3
  160. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/fr_dlg.js +1 -1
  161. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/he_dlg.js +3 -3
  162. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/hy_dlg.js +5 -0
  163. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/id_dlg.js +2 -2
  164. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/ii_dlg.js +3 -3
  165. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/ja_dlg.js +3 -3
  166. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/lb_dlg.js +5 -0
  167. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/ps_dlg.js +5 -0
  168. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/ru_dlg.js +3 -3
  169. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/tr_dlg.js +3 -3
  170. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/langs/zu_dlg.js +5 -0
  171. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/pastetext.htm +2 -8
  172. data/lib/tiny_mce/assets/tiny_mce/plugins/paste/pasteword.htm +2 -8
  173. data/lib/tiny_mce/assets/tiny_mce/plugins/preview/editor_plugin_src.js +6 -3
  174. data/lib/tiny_mce/assets/tiny_mce/plugins/print/editor_plugin_src.js +6 -3
  175. data/lib/tiny_mce/assets/tiny_mce/plugins/save/editor_plugin_src.js +6 -3
  176. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/editor_plugin.js +1 -1
  177. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/editor_plugin_src.js +7 -4
  178. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/js/searchreplace.js +4 -0
  179. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/ar_dlg.js +14 -14
  180. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/fa_dlg.js +2 -2
  181. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/fr_dlg.js +10 -10
  182. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/he_dlg.js +14 -14
  183. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/hy_dlg.js +16 -0
  184. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/id_dlg.js +13 -13
  185. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/ii_dlg.js +11 -11
  186. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/ja_dlg.js +13 -13
  187. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/lb_dlg.js +16 -0
  188. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/pl_dlg.js +2 -2
  189. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/ps_dlg.js +16 -0
  190. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/ru_dlg.js +8 -8
  191. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/sk_dlg.js +11 -11
  192. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/tr_dlg.js +5 -5
  193. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/langs/zu_dlg.js +16 -0
  194. data/lib/tiny_mce/assets/tiny_mce/plugins/searchreplace/searchreplace.htm +4 -9
  195. data/lib/tiny_mce/assets/tiny_mce/plugins/spellchecker/editor_plugin_src.js +6 -3
  196. data/lib/tiny_mce/assets/tiny_mce/plugins/style/editor_plugin_src.js +6 -3
  197. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/ar_dlg.js +61 -61
  198. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/cs_dlg.js +1 -1
  199. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/fr_dlg.js +4 -4
  200. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/he_dlg.js +56 -56
  201. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/hy_dlg.js +63 -0
  202. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/ii_dlg.js +33 -33
  203. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/ja_dlg.js +59 -59
  204. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/lb_dlg.js +63 -0
  205. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/pl_dlg.js +1 -1
  206. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/ps_dlg.js +63 -0
  207. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/ru_dlg.js +21 -21
  208. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/sk_dlg.js +7 -7
  209. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/th_dlg.js +3 -3
  210. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/tr_dlg.js +18 -18
  211. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/tw_dlg.js +2 -2
  212. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/uk_dlg.js +19 -19
  213. data/lib/tiny_mce/assets/tiny_mce/plugins/style/langs/zu_dlg.js +63 -0
  214. data/lib/tiny_mce/assets/tiny_mce/plugins/style/props.htm +4 -8
  215. data/lib/tiny_mce/assets/tiny_mce/plugins/tabfocus/editor_plugin.js +1 -1
  216. data/lib/tiny_mce/assets/tiny_mce/plugins/tabfocus/editor_plugin_src.js +7 -4
  217. data/lib/tiny_mce/assets/tiny_mce/plugins/table/cell.htm +2 -7
  218. data/lib/tiny_mce/assets/tiny_mce/plugins/table/editor_plugin.js +1 -1
  219. data/lib/tiny_mce/assets/tiny_mce/plugins/table/editor_plugin_src.js +889 -973
  220. data/lib/tiny_mce/assets/tiny_mce/plugins/table/js/cell.js +40 -23
  221. data/lib/tiny_mce/assets/tiny_mce/plugins/table/js/merge_cells.js +18 -20
  222. data/lib/tiny_mce/assets/tiny_mce/plugins/table/js/row.js +47 -22
  223. data/lib/tiny_mce/assets/tiny_mce/plugins/table/js/table.js +17 -8
  224. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/ar_dlg.js +70 -70
  225. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/fr_dlg.js +14 -14
  226. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/he_dlg.js +56 -56
  227. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/hy_dlg.js +74 -0
  228. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/id_dlg.js +25 -25
  229. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/ii_dlg.js +54 -54
  230. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/ja_dlg.js +67 -67
  231. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/lb_dlg.js +74 -0
  232. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/ps_dlg.js +74 -0
  233. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/pt_dlg.js +1 -1
  234. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/ru_dlg.js +47 -47
  235. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/sk_dlg.js +2 -2
  236. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/tr_dlg.js +25 -25
  237. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/uk_dlg.js +22 -22
  238. data/lib/tiny_mce/assets/tiny_mce/plugins/table/langs/zu_dlg.js +74 -0
  239. data/lib/tiny_mce/assets/tiny_mce/plugins/table/merge_cells.htm +3 -8
  240. data/lib/tiny_mce/assets/tiny_mce/plugins/table/row.htm +2 -7
  241. data/lib/tiny_mce/assets/tiny_mce/plugins/table/table.htm +2 -7
  242. data/lib/tiny_mce/assets/tiny_mce/plugins/template/editor_plugin_src.js +6 -3
  243. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/ar_dlg.js +11 -11
  244. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/cs_dlg.js +4 -4
  245. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/es_dlg.js +1 -1
  246. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/fr_dlg.js +2 -2
  247. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/he_dlg.js +7 -7
  248. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/hy_dlg.js +15 -0
  249. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/id_dlg.js +6 -6
  250. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/ii_dlg.js +10 -10
  251. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/ja_dlg.js +11 -11
  252. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/lb_dlg.js +15 -0
  253. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/ps_dlg.js +15 -0
  254. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/ru_dlg.js +9 -9
  255. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/tr_dlg.js +5 -5
  256. data/lib/tiny_mce/assets/tiny_mce/plugins/template/langs/zu_dlg.js +15 -0
  257. data/lib/tiny_mce/assets/tiny_mce/plugins/template/template.htm +2 -8
  258. data/lib/tiny_mce/assets/tiny_mce/plugins/visualchars/editor_plugin_src.js +6 -3
  259. data/lib/tiny_mce/assets/tiny_mce/plugins/wordcount/editor_plugin_src.js +6 -3
  260. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/abbr.htm +3 -10
  261. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/acronym.htm +3 -10
  262. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/attributes.htm +2 -7
  263. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/cite.htm +3 -10
  264. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/del.htm +3 -11
  265. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/editor_plugin.js +1 -1
  266. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js +11 -3
  267. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/ins.htm +3 -11
  268. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/js/abbr.js +8 -5
  269. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/js/acronym.js +7 -4
  270. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/js/attributes.js +7 -4
  271. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/js/cite.js +7 -4
  272. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/js/del.js +7 -4
  273. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/js/element_common.js +8 -8
  274. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/js/ins.js +7 -4
  275. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/ar_dlg.js +30 -30
  276. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/cs_dlg.js +2 -2
  277. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js +6 -6
  278. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/he_dlg.js +27 -27
  279. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/hy_dlg.js +32 -0
  280. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/id_dlg.js +22 -22
  281. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/ii_dlg.js +14 -14
  282. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/ja_dlg.js +25 -25
  283. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/lb_dlg.js +32 -0
  284. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/pl_dlg.js +3 -3
  285. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/ps_dlg.js +32 -0
  286. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/ru_dlg.js +15 -15
  287. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/sk_dlg.js +2 -2
  288. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/th_dlg.js +5 -5
  289. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/tr_dlg.js +18 -18
  290. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/uk_dlg.js +9 -9
  291. data/lib/tiny_mce/assets/tiny_mce/plugins/xhtmlxtras/langs/zu_dlg.js +32 -0
  292. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/about.htm +1 -3
  293. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/anchor.htm +2 -7
  294. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/color_picker.htm +1 -3
  295. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/editor_template.js +1 -1
  296. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/editor_template_src.js +166 -169
  297. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/image.htm +2 -7
  298. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/img/icons.gif +0 -0
  299. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/js/anchor.js +7 -7
  300. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/js/charmap.js +10 -0
  301. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/js/image.js +2 -2
  302. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/ar.js +59 -61
  303. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/ar_dlg.js +49 -49
  304. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/cs.js +1 -1
  305. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/el.js +3 -1
  306. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/es.js +4 -4
  307. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/es_dlg.js +2 -2
  308. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/fa_dlg.js +1 -1
  309. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/fr.js +14 -17
  310. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/fr_dlg.js +17 -17
  311. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/he.js +57 -57
  312. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/he_dlg.js +49 -49
  313. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/hu.js +2 -2
  314. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/hu_dlg.js +4 -4
  315. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/hy.js +62 -0
  316. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/hy_dlg.js +51 -0
  317. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/id.js +5 -5
  318. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/id_dlg.js +13 -13
  319. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/ii.js +42 -40
  320. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/ii_dlg.js +28 -28
  321. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/it_dlg.js +5 -5
  322. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/ja.js +57 -59
  323. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/ja_dlg.js +48 -48
  324. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/lb.js +63 -0
  325. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/lb_dlg.js +51 -0
  326. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/pl.js +2 -2
  327. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/ps.js +62 -0
  328. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/ps_dlg.js +51 -0
  329. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/pt.js +5 -5
  330. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/ru.js +28 -28
  331. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/ru_dlg.js +37 -37
  332. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/sk.js +15 -15
  333. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/sk_dlg.js +19 -19
  334. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/th.js +4 -4
  335. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/th_dlg.js +4 -4
  336. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/tr.js +27 -27
  337. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/tr_dlg.js +17 -17
  338. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/tw.js +3 -3
  339. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/uk_dlg.js +6 -6
  340. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/vi.js +17 -17
  341. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/vi_dlg.js +1 -1
  342. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/zu.js +64 -0
  343. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/langs/zu_dlg.js +51 -0
  344. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/link.htm +2 -7
  345. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/skins/default/content.css +6 -3
  346. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/skins/default/dialog.css +4 -3
  347. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/skins/default/ui.css +4 -5
  348. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/skins/o2k7/content.css +6 -3
  349. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/skins/o2k7/dialog.css +3 -2
  350. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/skins/o2k7/ui.css +3 -3
  351. data/lib/tiny_mce/assets/tiny_mce/themes/advanced/source_editor.htm +2 -7
  352. data/lib/tiny_mce/assets/tiny_mce/themes/simple/editor_template_src.js +5 -5
  353. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/ar.js +9 -9
  354. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/he.js +8 -8
  355. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/hu.js +1 -1
  356. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/hy.js +11 -0
  357. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/ii.js +8 -8
  358. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/ja.js +9 -9
  359. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/lb.js +11 -0
  360. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/ps.js +11 -0
  361. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/ru.js +4 -4
  362. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/sk.js +4 -4
  363. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/tr.js +4 -4
  364. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/tw.js +1 -1
  365. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/vi.js +9 -9
  366. data/lib/tiny_mce/assets/tiny_mce/themes/simple/langs/zu.js +11 -0
  367. data/lib/tiny_mce/assets/tiny_mce/tiny_mce.js +1 -1
  368. data/lib/tiny_mce/assets/tiny_mce/tiny_mce_popup.js +1 -1
  369. data/lib/tiny_mce/assets/tiny_mce/tiny_mce_src.js +4684 -4107
  370. data/lib/tiny_mce/assets/tiny_mce/utils/editable_selects.js +5 -4
  371. data/lib/tiny_mce/assets/tiny_mce/utils/form_utils.js +5 -4
  372. data/lib/tiny_mce/assets/tiny_mce/utils/mctabs.js +5 -4
  373. data/lib/tiny_mce/assets/tiny_mce/utils/validate.js +5 -4
  374. data/lib/tiny_mce/base.rb +7 -19
  375. data/lib/tiny_mce/configuration.rb +98 -0
  376. data/lib/tiny_mce/exceptions.rb +14 -0
  377. data/lib/tiny_mce/helpers.rb +13 -49
  378. data/lib/tiny_mce/spell_checker.rb +0 -2
  379. data/lib/tiny_mce/valid_tinymce_options.yml +1 -6
  380. data/test/functional/full_tiny_mce_controller_test.rb +9 -12
  381. data/test/functional/multi_configuration_tiny_mce_controller_test.rb +58 -0
  382. data/test/functional/slim_tiny_mce_controller_test.rb +8 -5
  383. data/test/test_helper.rb +12 -0
  384. data/test/unit/configuration_test.rb +56 -0
  385. data/test/unit/helpers/tiny_mce_helper_test.rb +99 -97
  386. data/test/unit/tiny_mce_test.rb +1 -2
  387. data/tiny_mce.gemspec +79 -10
  388. metadata +88 -11
  389. data/lib/tiny_mce/assets/tiny_mce/plugins/safari/blank.htm +0 -1
  390. data/lib/tiny_mce/assets/tiny_mce/plugins/safari/editor_plugin.js +0 -1
  391. data/lib/tiny_mce/assets/tiny_mce/plugins/safari/editor_plugin_src.js +0 -438
  392. data/lib/tiny_mce/option_validator.rb +0 -35
  393. data/test/unit/options_validator_test.rb +0 -51
@@ -1,12 +1,12 @@
1
1
  tinyMCE.addI18n('sk.style_dlg',{
2
- title:"Editova\u0165 CSS \u0161t\u00FDl",
2
+ title:"Upravi\u0165 CSS",
3
3
  apply:"Aplikova\u0165",
4
4
  text_tab:"Text",
5
5
  background_tab:"Pozadie",
6
- block_tab:"Block",
6
+ block_tab:"Blok",
7
7
  box_tab:"Box",
8
- border_tab:"Border",
9
- list_tab:"List",
8
+ border_tab:"R\u00E1m\u010Dek",
9
+ list_tab:"Zoznam",
10
10
  positioning_tab:"Positioning",
11
11
  text_props:"Text",
12
12
  text_font:"Font",
@@ -14,10 +14,10 @@ text_size:"Ve\u013Ekos\u0165",
14
14
  text_weight:"Weight",
15
15
  text_style:"Style",
16
16
  text_variant:"Variant",
17
- text_lineheight:"Line height",
17
+ text_lineheight:"Odsadenie riadkov",
18
18
  text_case:"Case",
19
19
  text_color:"Farba",
20
- text_decoration:"Sekor\u00E1cia",
20
+ text_decoration:"Dekor\u00E1cia",
21
21
  text_overline:"overline",
22
22
  text_underline:"underline",
23
23
  text_striketrough:"strikethrough",
@@ -26,7 +26,7 @@ text_none:"\u017Eiadne",
26
26
  background_color:"Farba pozadia",
27
27
  background_image:"Obr\u00E1zok pozadia",
28
28
  background_repeat:"Repeat",
29
- background_attachment:"Attachment",
29
+ background_attachment:"Pr\u00EDloha",
30
30
  background_hpos:"Horizontal position",
31
31
  background_vpos:"Vertical position",
32
32
  block_wordspacing:"Word spacing",
@@ -14,7 +14,7 @@ text_size:"\u0E02\u0E19\u0E32\u0E14",
14
14
  text_weight:"\u0E19\u0E49\u0E33\u0E2B\u0E19\u0E31\u0E01",
15
15
  text_style:"\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A",
16
16
  text_variant:"Variant",
17
- text_lineheight:"\u0E04\u0E27\u0E32\u0E21\u0E2A\u0E39\u0E07\u0E02\u0E2D\u0E07\u0E1A\u0E31\u0E19\u0E17\u0E31\u0E14",
17
+ text_lineheight:"\u0E04\u0E27\u0E32\u0E21\u0E2A\u0E39\u0E07\u0E02\u0E2D\u0E07\u0E1A\u0E23\u0E23\u0E17\u0E31\u0E14",
18
18
  text_case:"Case",
19
19
  text_color:"\u0E2A\u0E35",
20
20
  text_decoration:"Decoration",
@@ -48,8 +48,8 @@ bottom:"\u0E25\u0E48\u0E32\u0E07",
48
48
  left:"\u0E0B\u0E49\u0E32\u0E22",
49
49
  margin:"Margin",
50
50
  style:"\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A",
51
- width:"Width",
52
- height:"Height",
51
+ width:"\u0E01\u0E27\u0E49\u0E32\u0E07",
52
+ height:"\u0E2A\u0E39\u0E07",
53
53
  color:"\u0E2A\u0E35",
54
54
  list_type:"Type",
55
55
  bullet_image:"Bullet image",
@@ -1,27 +1,27 @@
1
1
  tinyMCE.addI18n('tr.style_dlg',{
2
- title:"CSS Stili D\u00FCzenle",
2
+ title:"CSS Stilini D\u00FCzenle",
3
3
  apply:"Uygula",
4
4
  text_tab:"Metin",
5
5
  background_tab:"Arkaplan",
6
6
  block_tab:"Blok",
7
7
  box_tab:"Kutu",
8
8
  border_tab:"Kenarl\u0131k",
9
- list_tab:"Liste",
9
+ list_tab:"Listele",
10
10
  positioning_tab:"Konumland\u0131rma",
11
11
  text_props:"Metin",
12
- text_font:"Yaz\u0131 Tipi",
12
+ text_font:"Yaz\u0131 tipi",
13
13
  text_size:"Boyut",
14
14
  text_weight:"Kal\u0131nl\u0131k",
15
15
  text_style:"Stil",
16
16
  text_variant:"De\u011Fi\u015Fken",
17
- text_lineheight:"Sat\u0131r y\u00FCksekli\u011Fi",
18
- text_case:"B\u00FCy\u00FCk/k\u00FC\u00E7\u00FCk",
17
+ text_lineheight:"\u00C7izgi y\u00FCksekli\u011Fi",
18
+ text_case:"Ko\u015Ful",
19
19
  text_color:"Renk",
20
20
  text_decoration:"Dekorasyon",
21
- text_overline:"\u00DCst \u00E7izgi",
22
- text_underline:"Alt \u00E7izgi",
23
- text_striketrough:"Ortas\u0131 \u00E7izgili",
24
- text_blink:"yan\u0131p s\u00F6n",
21
+ text_overline:"\u00FCst \u00E7izgi",
22
+ text_underline:"alt \u00E7izgi",
23
+ text_striketrough:"\u00FCst\u00FC \u00E7izgili",
24
+ text_blink:"yan\u0131p s\u00F6nen",
25
25
  text_none:"hi\u00E7biri",
26
26
  background_color:"Arkaplan rengi",
27
27
  background_image:"Arkaplan resmi",
@@ -29,19 +29,19 @@ background_repeat:"Tekrarla",
29
29
  background_attachment:"Eklenti",
30
30
  background_hpos:"Yatay konum",
31
31
  background_vpos:"Dikey konum",
32
- block_wordspacing:"S\u00F6zc\u00FCk bo\u015Flu\u011Fu",
33
- block_letterspacing:"Harf bo\u015Flu\u011Fu",
32
+ block_wordspacing:"Kelime bo\u015Flu\u011Fu",
33
+ block_letterspacing:"harf bo\u015Flu\u011Fu",
34
34
  block_vertical_alignment:"Dikey hizalama",
35
- block_text_align:"Metin hizalama",
36
- block_text_indent:"Metin kayd\u0131rma",
35
+ block_text_align:"Metin hizala",
36
+ block_text_indent:"Metnin girintisini art\u0131r",
37
37
  block_whitespace:"Bo\u015Fluk",
38
- block_display:"G\u00F6r\u00FCnt\u00FCleme",
38
+ block_display:"G\u00F6r\u00FCnt\u00FCle",
39
39
  box_width:"Geni\u015Flik",
40
40
  box_height:"Y\u00FCkseklik",
41
41
  box_float:"Kayan",
42
42
  box_clear:"Serbest",
43
43
  padding:"Dolgu",
44
- same:"T\u00FCm\u00FC i\u00E7in ayn\u0131",
44
+ same:"T\u00FCm\u00FC i\u00E7in",
45
45
  top:"\u00DCst",
46
46
  right:"Sa\u011F",
47
47
  bottom:"Alt",
@@ -56,8 +56,8 @@ bullet_image:"Madde imi resmi",
56
56
  position:"Konum",
57
57
  positioning_type:"Tip",
58
58
  visibility:"G\u00F6r\u00FCn\u00FCrl\u00FCk",
59
- zindex:"Z-s\u0131ras\u0131",
59
+ zindex:"Z-indeksi",
60
60
  overflow:"Ta\u015Fma",
61
- placement:"Yerle\u015Ftirme",
62
- clip:"K\u0131rpma"
61
+ placement:"Yerle\u015Ftir",
62
+ clip:"K\u0131rp"
63
63
  });
@@ -9,13 +9,13 @@ border_tab:"\u908A\u6846",
9
9
  list_tab:"\u6E05\u55AE",
10
10
  positioning_tab:"\u4F4D\u7F6E",
11
11
  text_props:"\u6587\u5B57",
12
- text_font:"\u5B57\u9AD4",
12
+ text_font:"\u5B57\u578B",
13
13
  text_size:"\u5927\u5C0F",
14
14
  text_weight:"\u7C97\u7D30",
15
15
  text_style:"\u6A23\u5F0F",
16
16
  text_variant:"\u8B8A\u9AD4",
17
17
  text_lineheight:"\u884C\u9AD8",
18
- text_case:"\u5B57\u9AD4",
18
+ text_case:"\u5B57\u578B",
19
19
  text_color:"\u984F\u8272",
20
20
  text_decoration:"\u4FEE\u98FE",
21
21
  text_overline:"\u4E0A\u7AEF\u7DDA",
@@ -5,7 +5,7 @@ text_tab:"\u0422\u0435\u043A\u0441\u0442",
5
5
  background_tab:"\u0424\u043E\u043D",
6
6
  block_tab:"\u0411\u043B\u043E\u043A",
7
7
  box_tab:"Box",
8
- border_tab:"\u0413\u0440\u0430\u043D\u0438\u0446\u044F",
8
+ border_tab:"\u0420\u0430\u043C\u043A\u0430",
9
9
  list_tab:"\u0421\u043F\u0438\u0441\u043E\u043A",
10
10
  positioning_tab:"\u041F\u043E\u0437\u0438\u0446\u0456\u043E\u043D\u0443\u0432\u0430\u043D\u043D\u044F",
11
11
  text_props:"\u0422\u0435\u043A\u0441\u0442",
@@ -15,32 +15,32 @@ text_weight:"\u0422\u043E\u0432\u0449\u0438\u043D\u0430",
15
15
  text_style:"\u0421\u0442\u0438\u043B\u044C",
16
16
  text_variant:"Variant",
17
17
  text_lineheight:"\u0412\u0438\u0441\u043E\u0442\u0430 \u0440\u044F\u0434\u043A\u0443",
18
- text_case:"Case",
18
+ text_case:"\u0420\u0435\u0433\u0456\u0441\u0442\u0440",
19
19
  text_color:"\u041A\u043E\u043B\u0456\u0440",
20
20
  text_decoration:"\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u043D\u044F",
21
- text_overline:"\u0432\u0435\u0440\u0445\u043D\u044F \u0440\u0438\u0441\u043A\u0430",
22
- text_underline:"\u043D\u0438\u0436\u043D\u044F \u0440\u0438\u0441\u043A\u0430",
23
- text_striketrough:"\u0437\u0430\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u0438\u0439",
24
- text_blink:"\u043C\u0435\u0440\u0435\u0445\u0442\u0456\u043D\u043D\u044F",
25
- text_none:"\u043D\u0456\u0447\u043E\u0433\u043E",
21
+ text_overline:"\u0412\u0435\u0440\u0445\u043D\u044F \u0440\u0438\u0441\u043A\u0430",
22
+ text_underline:"\u041D\u0438\u0436\u043D\u044F \u0440\u0438\u0441\u043A\u0430",
23
+ text_striketrough:"\u0417\u0430\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u0438\u0439",
24
+ text_blink:"\u041C\u0435\u0440\u0435\u0445\u0442\u0456\u043D\u043D\u044F",
25
+ text_none:"\u041D\u0456\u0447\u043E\u0433\u043E",
26
26
  background_color:"\u041A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443",
27
27
  background_image:"\u0424\u043E\u043D\u043E\u0432\u0435 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F",
28
28
  background_repeat:"\u041F\u043E\u0432\u0442\u043E\u0440",
29
- background_attachment:"Attachment",
29
+ background_attachment:"\u0412\u043A\u043B\u0430\u0434\u0435\u043D\u043D\u044F",
30
30
  background_hpos:"\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0430 \u043F\u043E\u0437\u0438\u0446\u0456\u044F",
31
31
  background_vpos:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0430 \u043F\u043E\u0437\u0438\u0446\u0456\u044F",
32
32
  block_wordspacing:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F\u0438 \u043C\u0456\u0436 \u0441\u043B\u043E\u0432\u0430\u043C\u0438",
33
33
  block_letterspacing:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F\u0438 \u043C\u0456\u0436 \u043B\u0456\u0442\u0435\u0440\u0430\u043C\u0438",
34
34
  block_vertical_alignment:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0435 \u0432\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F",
35
35
  block_text_align:"\u0412\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F \u0442\u0435\u043A\u0441\u0442\u0443",
36
- block_text_indent:"Text indent",
37
- block_whitespace:"Whitespace",
38
- block_display:"Display",
36
+ block_text_indent:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F",
37
+ block_whitespace:"\u041F\u0440\u043E\u0431\u0456\u043B",
38
+ block_display:"\u041F\u043E\u043A\u0430\u0437",
39
39
  box_width:"\u0428\u0438\u0440\u0438\u043D\u0430",
40
40
  box_height:"\u0412\u0438\u0441\u043E\u0442\u0430",
41
- box_float:"Float",
42
- box_clear:"Clear",
43
- padding:"Padding",
41
+ box_float:"\u041F\u043B\u0430\u0432\u0430\u043D\u043D\u044F",
42
+ box_clear:"\u041E\u0447\u0438\u0441\u0442\u043A\u0430",
43
+ padding:"\u0412\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0439 \u0432\u0456\u0434\u0441\u0442\u0443\u043F",
44
44
  same:"\u041E\u0434\u043D\u0430\u043A\u043E\u0435 \u0434\u043B\u044F \u0432\u0441\u0456\u0445",
45
45
  top:"\u0412\u0433\u043E\u0440\u0443",
46
46
  right:"\u041F\u0440\u0430\u0432\u043E\u0440\u0443\u0447",
@@ -52,12 +52,12 @@ width:"\u0428\u0438\u0440\u0438\u043D\u0430",
52
52
  height:"\u0412\u0438\u0441\u043E\u0442\u0430",
53
53
  color:"\u041A\u043E\u043B\u0456\u0440",
54
54
  list_type:"\u0422\u0438\u043F",
55
- bullet_image:"Bullet image",
55
+ bullet_image:"\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u0432 \u0441\u043F\u0438\u0441\u043A\u0443",
56
56
  position:"\u041F\u043E\u0437\u0438\u0446\u0456\u044F",
57
57
  positioning_type:"\u0422\u0438\u043F",
58
58
  visibility:"\u0412\u0438\u0434\u0438\u043C\u0456\u0441\u0442\u044C",
59
- zindex:"Z-index",
60
- overflow:"Overflow",
61
- placement:"Placement",
62
- clip:"Clip"
59
+ zindex:"Z-\u0456\u043D\u0434\u0435\u043A\u0441",
60
+ overflow:"\u041F\u0435\u0440\u0435\u043F\u043E\u0432\u043D\u0435\u043D\u043D\u044F",
61
+ placement:"\u0420\u043E\u0437\u043C\u0456\u0449\u0435\u043D\u043D\u044F",
62
+ clip:"\u041E\u0431\u0440\u0456\u0437\u0430\u043D\u043D\u044F"
63
63
  });
@@ -0,0 +1,63 @@
1
+ tinyMCE.addI18n('zu.style_dlg',{
2
+ title:"\u7F16\u8F91CSS\u6837\u5F0F\u8868",
3
+ apply:"\u5E94\u7528",
4
+ text_tab:"\u6587\u5B57",
5
+ background_tab:"\u80CC\u666F",
6
+ block_tab:"\u5757",
7
+ box_tab:"\u7BB1\u578B",
8
+ border_tab:"\u8FB9\u6846",
9
+ list_tab:"\u5217\u8868",
10
+ positioning_tab:"\u4F4D\u7F6E",
11
+ text_props:"\u6587\u5B57",
12
+ text_font:"\u5B57\u4F53",
13
+ text_size:"\u5C3A\u5BF8",
14
+ text_weight:"\u5BBD\u5EA6",
15
+ text_style:"\u6837\u5F0F",
16
+ text_variant:"\u53D8\u4F53",
17
+ text_lineheight:"\u884C\u9AD8",
18
+ text_case:"\u5B57\u4F53",
19
+ text_color:"\u989C\u8272",
20
+ text_decoration:"\u4FEE\u9970",
21
+ text_overline:"\u4E0A\u5212\u7EBF",
22
+ text_underline:"\u5E95\u7EBF",
23
+ text_striketrough:"\u5220\u9664\u7EBF",
24
+ text_blink:"\u95EA\u70C1",
25
+ text_none:"\u65E0",
26
+ background_color:"\u80CC\u666F\u989C\u8272",
27
+ background_image:"\u80CC\u666F\u56FE\u7247",
28
+ background_repeat:"\u91CD\u590D",
29
+ background_attachment:"\u9644\u4EF6",
30
+ background_hpos:"\u5782\u76F4\u4F4D\u7F6E",
31
+ background_vpos:"\u6C34\u51C6\u4F4D\u7F6E",
32
+ block_wordspacing:"\u5355\u5B57\u95F4\u8DDD",
33
+ block_letterspacing:"\u5B57\u5143\u95F4\u8DDD",
34
+ block_vertical_alignment:"\u6C34\u51C6\u5BF9\u9F50\u65B9\u5F0F",
35
+ block_text_align:"\u6587\u5B57\u5BF9\u9F50",
36
+ block_text_indent:"\u6587\u5B57\u7F29\u6392",
37
+ block_whitespace:"\u7A7A\u767D",
38
+ block_display:"\u663E\u793A\u65B9\u5F0F",
39
+ box_width:"\u5BBD\u5EA6",
40
+ box_height:"\u9AD8\u5EA6",
41
+ box_float:"\u6D6E\u52A8",
42
+ box_clear:"\u6E05\u9664",
43
+ padding:"\u7559\u767D",
44
+ same:"\u5168\u90E8\u4E00\u6837",
45
+ top:"\u4E0A\u65B9",
46
+ right:"\u9760\u53F3",
47
+ bottom:"\u4E0B\u65B9",
48
+ left:"\u9760\u5DE6",
49
+ margin:"\u8FB9\u754C",
50
+ style:"\u6837\u5F0F",
51
+ width:"\u5BBD\u5EA6",
52
+ height:"\u9AD8\u5EA6",
53
+ color:"\u989C\u8272",
54
+ list_type:"\u7C7B\u578B",
55
+ bullet_image:"\u9879\u76EE\u56FE\u793A",
56
+ position:"\u56FE\u793A\u4F4D\u7F6E",
57
+ positioning_type:"\u7C7B\u578B",
58
+ visibility:"\u53EF\u89C1\u6027",
59
+ zindex:"Z\u8F74\u6DF1\u5EA6",
60
+ overflow:"\u6EA2\u51FA",
61
+ placement:"\u5E03\u7F6E",
62
+ clip:"\u526A\u8F91"
63
+ });
@@ -40,7 +40,7 @@
40
40
  <tr>
41
41
  <td><select id="text_size" name="text_size" class="mceEditableSelect"></select></td>
42
42
  <td>&nbsp;</td>
43
- <td><select id="text_size_measurement" name="text_size_measurement"></select></td>
43
+ <td><select id="text_size_measurement" name="text_size_measurement"></select></td>
44
44
  </tr>
45
45
  </table>
46
46
  </td>
@@ -710,15 +710,11 @@
710
710
 
711
711
  <div class="mceActionPanel">
712
712
  <div style="float: left">
713
- <div style="float: left"><input type="submit" id="insert" name="insert" value="{#update}" /></div>
714
-
715
- <div style="float: left">&nbsp;<input type="button" class="button" id="apply" name="apply" value="{#style_dlg.apply}" onClick="applyAction();" /></div>
716
- <br style="clear: both" />
713
+ <input type="submit" id="insert" name="insert" value="{#update}" />
714
+ <input type="button" class="button" id="apply" name="apply" value="{#style_dlg.apply}" onClick="applyAction();" />
717
715
  </div>
718
716
 
719
- <div style="float: right">
720
- <input type="button" id="cancel" name="cancel" value="{#cancel}" onClick="tinyMCEPopup.close();" />
721
- </div>
717
+ <input type="button" id="cancel" name="cancel" value="{#cancel}" onClick="tinyMCEPopup.close();" />
722
718
  </div>
723
719
  </form>
724
720
 
@@ -1 +1 @@
1
- (function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(i){o=c.getParent(l.id,"form");n=o.elements;if(o){d(n,function(s,r){if(s.id==l.id){j=r;return false}});if(i>0){for(m=j+1;m<n.length;m++){if(n[m].type!="hidden"){return n[m]}}}else{for(m=j-1;m>=0;m--){if(n[m].type!="hidden"){return n[m]}}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(l=tinymce.EditorManager.get(n.id||n.name)){l.focus()}else{window.setTimeout(function(){window.focus();n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}f.onInit.add(function(){d(c.select("a:first,a:last",f.getContainer()),function(i){a.add(i,"focus",function(){f.focus()})})})},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})();
1
+ (function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(i){o=c.getParent(l.id,"form");n=o.elements;if(o){d(n,function(s,r){if(s.id==l.id){j=r;return false}});if(i>0){for(m=j+1;m<n.length;m++){if(n[m].type!="hidden"){return n[m]}}}else{for(m=j-1;m>=0;m--){if(n[m].type!="hidden"){return n[m]}}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(l=tinymce.get(n.id||n.name)){l.focus()}else{window.setTimeout(function(){window.focus();n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}f.onInit.add(function(){d(c.select("a:first,a:last",f.getContainer()),function(i){a.add(i,"focus",function(){f.focus()})})})},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})();
@@ -1,8 +1,11 @@
1
1
  /**
2
- * $Id: editor_plugin_src.js 787 2008-04-10 11:40:57Z spocke $
2
+ * editor_plugin_src.js
3
3
  *
4
- * @author Moxiecode
5
- * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved.
4
+ * Copyright 2009, Moxiecode Systems AB
5
+ * Released under LGPL License.
6
+ *
7
+ * License: http://tinymce.moxiecode.com/license
8
+ * Contributing: http://tinymce.moxiecode.com/contributing
6
9
  */
7
10
 
8
11
  (function() {
@@ -68,7 +71,7 @@
68
71
  }
69
72
 
70
73
  if (el) {
71
- if (ed = tinymce.EditorManager.get(el.id || el.name))
74
+ if (ed = tinymce.get(el.id || el.name))
72
75
  ed.focus();
73
76
  else
74
77
  window.setTimeout(function() {window.focus();el.focus();}, 10);
@@ -170,13 +170,8 @@
170
170
  </select>
171
171
  </div>
172
172
 
173
- <div style="float: left">
174
- <div><input type="submit" id="insert" name="insert" value="{#update}" /></div>
175
- </div>
176
-
177
- <div style="float: right">
178
- <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
179
- </div>
173
+ <input type="submit" id="insert" name="insert" value="{#update}" />
174
+ <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
180
175
  </div>
181
176
  </form>
182
177
  </body>
@@ -1 +1 @@
1
- (function(){var b=tinymce.each;function a(d,e){var f=e.ownerDocument,c=f.createRange(),g;c.setStartBefore(e);c.setEnd(d.endContainer,d.endOffset);g=f.createElement("body");g.appendChild(c.cloneContents());return g.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}tinymce.create("tinymce.plugins.TablePlugin",{init:function(c,d){var e=this;e.editor=c;e.url=d;b([["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(f){c.addButton(f[0],{title:f[1],cmd:f[2],ui:f[3]})});if(c.getParam("inline_styles")){c.onPreProcess.add(function(f,h){var g=f.dom;b(g.select("table",h.node),function(j){var i;if(i=g.getAttrib(j,"width")){g.setStyle(j,"width",i);g.setAttrib(j,"width")}if(i=g.getAttrib(j,"height")){g.setStyle(j,"height",i);g.setAttrib(j,"height")}})})}c.onInit.add(function(){if(!tinymce.isIE&&c.getParam("forced_root_block")){function f(){var g=c.getBody().lastChild;if(g&&g.nodeName=="TABLE"){c.dom.add(c.getBody(),"p",null,'<br mce_bogus="1" />')}}if(tinymce.isGecko){c.onKeyDown.add(function(h,j){var g,i,k=h.dom;if(j.keyCode==37||j.keyCode==38){g=h.selection.getRng();i=k.getParent(g.startContainer,"table");if(i&&h.getBody().firstChild==i){if(a(g,i)){g=k.createRng();g.setStartBefore(i);g.setEndBefore(i);h.selection.setRng(g);j.preventDefault()}}}})}c.onKeyUp.add(f);c.onSetContent.add(f);c.onVisualAid.add(f);c.onPreProcess.add(function(g,i){var h=i.node.lastChild;if(h&&h.childNodes.length==1&&h.firstChild.nodeName=="BR"){g.dom.remove(h)}});f()}if(c&&c.plugins.contextmenu){c.plugins.contextmenu.onContextMenu.add(function(i,g,k){var l,j=c.selection,h=j.getNode()||c.getBody();if(c.dom.getParent(k,"td")||c.dom.getParent(k,"th")){g.removeAll();if(h.nodeName=="A"&&!c.dom.getAttrib(h,"name")){g.add({title:"advanced.link_desc",icon:"link",cmd:c.plugins.advlink?"mceAdvLink":"mceLink",ui:true});g.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});g.addSeparator()}if(h.nodeName=="IMG"&&h.className.indexOf("mceItem")==-1){g.add({title:"advanced.image_desc",icon:"image",cmd:c.plugins.advimage?"mceAdvImage":"mceImage",ui:true});g.addSeparator()}g.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",ui:true,value:{action:"insert"}});g.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable",ui:true});g.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete",ui:true});g.addSeparator();l=g.addMenu({title:"table.cell"});l.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps",ui:true});l.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells",ui:true});l.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells",ui:true});l=g.addMenu({title:"table.row"});l.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps",ui:true});l.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});l.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});l.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});l.addSeparator();l.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});l.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});l.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"});l.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"});l=g.addMenu({title:"table.col"});l.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});l.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});l.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{g.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",ui:true})}})}});c.onKeyDown.add(function(f,g){if(g.keyCode==9&&f.dom.getParent(f.selection.getNode(),"TABLE")){if(!tinymce.isGecko&&!tinymce.isOpera){tinyMCE.execInstanceCommand(f.editorId,"mceTableMoveToNextRow",true);return tinymce.dom.Event.cancel(g)}f.undoManager.add()}});if(!tinymce.isIE){if(c.getParam("table_selection",true)){c.onClick.add(function(f,g){g=g.target;if(g.nodeName==="TABLE"){f.selection.select(g)}})}}c.onNodeChange.add(function(g,f,i){var h=g.dom.getParent(i,"td,th,caption");f.setActive("table",i.nodeName==="TABLE"||!!h);if(h&&h.nodeName==="CAPTION"){h=null}f.setDisabled("delete_table",!h);f.setDisabled("delete_col",!h);f.setDisabled("delete_table",!h);f.setDisabled("delete_row",!h);f.setDisabled("col_after",!h);f.setDisabled("col_before",!h);f.setDisabled("row_after",!h);f.setDisabled("row_before",!h);f.setDisabled("row_props",!h);f.setDisabled("cell_props",!h);f.setDisabled("split_cells",!h||(parseInt(g.dom.getAttrib(h,"colspan","1"))<2&&parseInt(g.dom.getAttrib(h,"rowspan","1"))<2));f.setDisabled("merge_cells",!h)});if(!tinymce.isIE){c.onBeforeSetContent.add(function(f,g){if(g.initial){g.content=g.content.replace(/<(td|th)([^>]+|)>\s*<\/(td|th)>/g,tinymce.isOpera?"<$1$2>&nbsp;</$1>":'<$1$2><br mce_bogus="1" /></$1>')}})}},execCommand:function(f,e,g){var d=this.editor,c;switch(f){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":d.execCommand("mceBeginUndoLevel");this._doExecCommand(f,e,g);d.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(s,aa,af){var W=this.editor,av=W,h=this.url;var o=W.selection.getNode();var X=W.dom.getParent(o,"tr");var ar=W.dom.getParent(o,"td,th");var G=W.dom.getParent(o,"table");var l=W.contentWindow.document;var aw=G?G.getAttribute("border"):"";if(X&&ar==null){ar=X.cells[0]}function aq(y,x){for(var ay=0;ay<y.length;ay++){if(y[ay].length>0&&aq(y[ay],x)){return true}if(y[ay]==x){return true}}return false}function ak(x,i){var y;ae=f(G);x=x||0;i=i||0;x=Math.max(p.cellindex+x,0);i=Math.max(p.rowindex+i,0);W.execCommand("mceRepaint");y=e(ae,i,x);if(y){W.selection.select(y.firstChild||y);W.selection.collapse(1)}}function ai(){var i=l.createElement("td");if(!tinymce.isIE){i.innerHTML='<br mce_bogus="1"/>'}}function k(y){var x=W.dom.getAttrib(y,"colspan");var i=W.dom.getAttrib(y,"rowspan");x=x==""?1:parseInt(x);i=i==""?1:parseInt(i);return{colspan:x,rowspan:i}}function am(ay,aA){var i,az;for(az=0;az<ay.length;az++){for(i=0;i<ay[az].length;i++){if(ay[az][i]==aA){return{cellindex:i,rowindex:az}}}}return null}function e(x,y,i){if(x[y]&&x[y][i]){return x[y][i]}return null}function B(aD,ay){var aA=[],y=0,aB,az,ay,aC;for(aB=0;aB<aD.rows.length;aB++){for(az=0;az<aD.rows[aB].cells.length;az++,y++){aA[y]=aD.rows[aB].cells[az]}}for(aB=0;aB<aA.length;aB++){if(aA[aB]==ay){if(aC=aA[aB+1]){return aC}}}}function f(aF){var i=[],aG=aF.rows,aD,aC,az,aA,aE,ay,aB;for(aC=0;aC<aG.length;aC++){for(aD=0;aD<aG[aC].cells.length;aD++){az=aG[aC].cells[aD];aA=k(az);for(aE=aD;i[aC]&&i[aC][aE];aE++){}for(aB=aC;aB<aC+aA.rowspan;aB++){if(!i[aB]){i[aB]=[]}for(ay=aE;ay<aE+aA.colspan;ay++){i[aB][ay]=az}}}}return i}function n(aH,aE,az,ay){var y=f(aH),aG=am(y,az);var aI,aD;if(ay.cells.length!=aE.childNodes.length){aI=aE.childNodes;aD=null;for(var aF=0;az=e(y,aG.rowindex,aF);aF++){var aB=true;var aC=k(az);if(aq(aI,az)){ay.childNodes[aF]._delete=true}else{if((aD==null||az!=aD)&&aC.colspan>1){for(var aA=aF;aA<aF+az.colSpan;aA++){ay.childNodes[aA]._delete=true}}}if((aD==null||az!=aD)&&aC.rowspan>1){az.rowSpan=aC.rowspan+1}aD=az}C(G)}}function P(x,i){while((x=x.previousSibling)!=null){if(x.nodeName==i){return x}}return null}function ag(ay,az){var x=az.split(",");while((ay=ay.nextSibling)!=null){for(var y=0;y<x.length;y++){if(ay.nodeName.toLowerCase()==x[y].toLowerCase()){return ay}}}return null}function C(ay){if(ay.rows==0){return}var y=ay.rows[0];do{var x=ag(y,"TR");if(y._delete){y.parentNode.removeChild(y);continue}var az=y.cells[0];if(az.cells>1){do{var i=ag(az,"TD,TH");if(az._delete){az.parentNode.removeChild(az)}}while((az=i)!=null)}}while((y=x)!=null)}function q(ay,aB,aA){ay.rowSpan=1;var x=ag(aB,"TR");for(var az=1;az<aA&&x;az++){var y=l.createElement("td");if(!tinymce.isIE){y.innerHTML='<br mce_bogus="1"/>'}if(tinymce.isIE){x.insertBefore(y,x.cells(ay.cellIndex))}else{x.insertBefore(y,x.cells[ay.cellIndex])}x=ag(x,"TR")}}function T(aG,aI,aC){var y=f(aI);var ay=aC.cloneNode(false);var aH=am(y,aC.cells[0]);var aD=null;var aB=W.dom.getAttrib(aI,"border");var aA=null;for(var aF=0;aA=e(y,aH.rowindex,aF);aF++){var aE=null;if(aD!=aA){for(var az=0;az<aC.cells.length;az++){if(aA==aC.cells[az]){aE=aA.cloneNode(true);break}}}if(aE==null){aE=aG.createElement("td");if(!tinymce.isIE){aE.innerHTML='<br mce_bogus="1"/>'}}aE.colSpan=1;aE.rowSpan=1;ay.appendChild(aE);aD=aA}return ay}switch(s){case"mceTableMoveToNextRow":var M=B(G,ar);if(!M){W.execCommand("mceTableInsertRowAfter",ar);M=B(G,ar)}W.selection.select(M);W.selection.collapse(true);return true;case"mceTableRowProps":if(X==null){return true}if(aa){W.windowManager.open({url:h+"/row.htm",width:400+parseInt(W.getLang("table.rowprops_delta_width",0)),height:295+parseInt(W.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:h})}return true;case"mceTableCellProps":if(ar==null){return true}if(aa){W.windowManager.open({url:h+"/cell.htm",width:400+parseInt(W.getLang("table.cellprops_delta_width",0)),height:295+parseInt(W.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:h})}return true;case"mceInsertTable":if(aa){W.windowManager.open({url:h+"/table.htm",width:400+parseInt(W.getLang("table.table_delta_width",0)),height:320+parseInt(W.getLang("table.table_delta_height",0)),inline:1},{plugin_url:h,action:af?af.action:0})}return true;case"mceTableDelete":var H=W.dom.getParent(W.selection.getNode(),"table");if(H){H.parentNode.removeChild(H);W.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(!G){return true}if(X&&G!=X.parentNode){G=X.parentNode}if(G&&X){switch(s){case"mceTableCutRow":if(!X||!ar){return true}W.tableRowClipboard=T(l,G,X);W.execCommand("mceTableDeleteRow");break;case"mceTableCopyRow":if(!X||!ar){return true}W.tableRowClipboard=T(l,G,X);break;case"mceTablePasteRowBefore":if(!X||!ar){return true}var w=W.tableRowClipboard.cloneNode(true);var j=P(X,"TR");if(j!=null){n(G,j,j.cells[0],w)}X.parentNode.insertBefore(w,X);break;case"mceTablePasteRowAfter":if(!X||!ar){return true}var Y=ag(X,"TR");var w=W.tableRowClipboard.cloneNode(true);n(G,X,ar,w);if(Y==null){X.parentNode.appendChild(w)}else{Y.parentNode.insertBefore(w,Y)}break;case"mceTableInsertRowBefore":if(!X||!ar){return true}var ae=f(G);var p=am(ae,ar);var w=l.createElement("tr");var v=null;p.rowindex--;if(p.rowindex<0){p.rowindex=0}for(var ad=0;ar=e(ae,p.rowindex,ad);ad++){if(ar!=v){var F=k(ar);if(F.rowspan==1){var K=l.createElement("td");if(!tinymce.isIE){K.innerHTML='<br mce_bogus="1"/>'}K.colSpan=ar.colSpan;w.appendChild(K)}else{ar.rowSpan=F.rowspan+1}v=ar}}X.parentNode.insertBefore(w,X);ak(0,1);break;case"mceTableInsertRowAfter":if(!X||!ar){return true}var ae=f(G);var p=am(ae,ar);var w=l.createElement("tr");var v=null;for(var ad=0;ar=e(ae,p.rowindex,ad);ad++){if(ar!=v){var F=k(ar);if(F.rowspan==1){var K=l.createElement("td");if(!tinymce.isIE){K.innerHTML='<br mce_bogus="1"/>'}K.colSpan=ar.colSpan;w.appendChild(K)}else{ar.rowSpan=F.rowspan+1}v=ar}}if(w.hasChildNodes()){var Y=ag(X,"TR");if(Y){Y.parentNode.insertBefore(w,Y)}else{G.appendChild(w)}}ak(0,1);break;case"mceTableDeleteRow":if(!X||!ar){return true}var ae=f(G);var p=am(ae,ar);if(ae.length==1&&G.nodeName=="TBODY"){W.dom.remove(W.dom.getParent(G,"table"));return true}var E=X.cells;var Y=ag(X,"TR");for(var ad=0;ad<E.length;ad++){if(E[ad].rowSpan>1){var K=E[ad].cloneNode(true);var F=k(E[ad]);K.rowSpan=F.rowspan-1;var al=Y.cells[ad];if(al==null){Y.appendChild(K)}else{Y.insertBefore(K,al)}}}var v=null;for(var ad=0;ar=e(ae,p.rowindex,ad);ad++){if(ar!=v){var F=k(ar);if(F.rowspan>1){ar.rowSpan=F.rowspan-1}else{X=ar.parentNode;if(X.parentNode){X._delete=true}}v=ar}}C(G);ak(0,-1);break;case"mceTableInsertColBefore":if(!X||!ar){return true}var ae=f(W.dom.getParent(G,"table"));var p=am(ae,ar);var v=null;for(var ab=0;ar=e(ae,ab,p.cellindex);ab++){if(ar!=v){var F=k(ar);if(F.colspan==1){var K=l.createElement(ar.nodeName);if(!tinymce.isIE){K.innerHTML='<br mce_bogus="1"/>'}K.rowSpan=ar.rowSpan;ar.parentNode.insertBefore(K,ar)}else{ar.colSpan++}v=ar}}ak();break;case"mceTableInsertColAfter":if(!X||!ar){return true}var ae=f(W.dom.getParent(G,"table"));var p=am(ae,ar);var v=null;for(var ab=0;ar=e(ae,ab,p.cellindex);ab++){if(ar!=v){var F=k(ar);if(F.colspan==1){var K=l.createElement(ar.nodeName);if(!tinymce.isIE){K.innerHTML='<br mce_bogus="1"/>'}K.rowSpan=ar.rowSpan;var al=ag(ar,"TD,TH");if(al==null){ar.parentNode.appendChild(K)}else{al.parentNode.insertBefore(K,al)}}else{ar.colSpan++}v=ar}}ak(1);break;case"mceTableDeleteCol":if(!X||!ar){return true}var ae=f(G);var p=am(ae,ar);var v=null;if((ae.length>1&&ae[0].length<=1)&&G.nodeName=="TBODY"){W.dom.remove(W.dom.getParent(G,"table"));return true}for(var ab=0;ar=e(ae,ab,p.cellindex);ab++){if(ar!=v){var F=k(ar);if(F.colspan>1){ar.colSpan=F.colspan-1}else{if(ar.parentNode){ar.parentNode.removeChild(ar)}}v=ar}}ak(-1);break;case"mceTableSplitCells":if(!X||!ar){return true}var m=k(ar);var D=m.colspan;var I=m.rowspan;if(D>1||I>1){ar.colSpan=1;for(var an=1;an<D;an++){var K=l.createElement("td");if(!tinymce.isIE){K.innerHTML='<br mce_bogus="1"/>'}X.insertBefore(K,ag(ar,"TD,TH"));if(I>1){q(K,X,I)}}q(ar,X,I)}G=W.dom.getParent(W.selection.getNode(),"table");break;case"mceTableMergeCells":var ap=[];var S=W.selection.getSel();var ae=f(G);if(tinymce.isIE||S.rangeCount==1){if(aa){var u=k(ar);W.windowManager.open({url:h+"/merge_cells.htm",width:240+parseInt(W.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(W.getLang("table.merge_cells_delta_height",0)),inline:1},{action:"update",numcols:u.colspan,numrows:u.rowspan,plugin_url:h});return true}else{var V=parseInt(af.numrows);var d=parseInt(af.numcols);var p=am(ae,ar);if((""+V)=="NaN"){V=1}if((""+d)=="NaN"){d=1}var c=G.rows;for(var ab=p.rowindex;ab<ae.length;ab++){var ah=[];for(var ad=p.cellindex;ad<ae[ab].length;ad++){var g=e(ae,ab,ad);if(g&&!aq(ap,g)&&!aq(ah,g)){var O=am(ae,g);if(O.cellindex<p.cellindex+d&&O.rowindex<p.rowindex+V){ah[ah.length]=g}}}if(ah.length>0){ap[ap.length]=ah}var g=e(ae,p.rowindex,p.cellindex);b(av.dom.select("br",g),function(y,x){if(x>0&&av.dom.getAttrib("mce_bogus")){av.dom.remove(y)}})}}}else{var E=[];var S=W.selection.getSel();var Z=null;var ao=null;var A=-1,ax=-1,z,au;if(S.rangeCount<2){return true}for(var an=0;an<S.rangeCount;an++){var aj=S.getRangeAt(an);var ar=aj.startContainer.childNodes[aj.startOffset];if(!ar){break}if(ar.nodeName=="TD"||ar.nodeName=="TH"){E[E.length]=ar}}var c=G.rows;for(var ab=0;ab<c.length;ab++){var ah=[];for(var ad=0;ad<c[ab].cells.length;ad++){var g=c[ab].cells[ad];for(var an=0;an<E.length;an++){if(g==E[an]){ah[ah.length]=g}}}if(ah.length>0){ap[ap.length]=ah}}var ao=[];var Z=null;for(var ab=0;ab<ae.length;ab++){for(var ad=0;ad<ae[ab].length;ad++){ae[ab][ad]._selected=false;for(var an=0;an<E.length;an++){if(ae[ab][ad]==E[an]){if(A==-1){A=ad;ax=ab}z=ad;au=ab;ae[ab][ad]._selected=true}}}}for(var ab=ax;ab<=au;ab++){for(var ad=A;ad<=z;ad++){if(!ae[ab][ad]._selected){alert("Invalid selection for merge.");return true}}}}var t=1,r=1;var U=-1;for(var ab=0;ab<ap.length;ab++){var J=0;for(var ad=0;ad<ap[ab].length;ad++){var F=k(ap[ab][ad]);J+=F.colspan;if(U!=-1&&F.rowspan!=U){alert("Invalid selection for merge.");return true}U=F.rowspan}if(J>r){r=J}U=-1}var R=-1;for(var ad=0;ad<ap[0].length;ad++){var N=0;for(var ab=0;ab<ap.length;ab++){var F=k(ap[ab][ad]);N+=F.rowspan;if(R!=-1&&F.colspan!=R){alert("Invalid selection for merge.");return true}R=F.colspan}if(N>t){t=N}R=-1}ar=ap[0][0];ar.rowSpan=t;ar.colSpan=r;for(var ab=0;ab<ap.length;ab++){for(var ad=0;ad<ap[ab].length;ad++){var Q=ap[ab][ad].innerHTML;var L=Q.replace(/[ \t\r\n]/g,"");if(L!="<br/>"&&L!="<br>"&&L!='<br mce_bogus="1"/>'&&(ad+ab>0)){ar.innerHTML+=Q}if(ap[ab][ad]!=ar&&!ap[ab][ad]._deleted){var p=am(ae,ap[ab][ad]);var at=ap[ab][ad].parentNode;at.removeChild(ap[ab][ad]);ap[ab][ad]._deleted=true;if(!at.hasChildNodes()){at.parentNode.removeChild(at);var ac=null;for(var ad=0;cellElm=e(ae,p.rowindex,ad);ad++){if(cellElm!=ac&&cellElm.rowSpan>1){cellElm.rowSpan--}ac=cellElm}if(ar.rowSpan>1){ar.rowSpan--}}}}}b(av.dom.select("br",ar),function(y,x){if(x>0&&av.dom.getAttrib(y,"mce_bogus")){av.dom.remove(y)}});break}G=W.dom.getParent(W.selection.getNode(),"table");W.addVisual(G);W.nodeChanged()}return true}return false}});tinymce.PluginManager.add("table",tinymce.plugins.TablePlugin)})();
1
+ (function(b){var c=b.each;function a(E,D,H){var e,I,A,n;r();n=D.getParent(H.getStart(),"th,td");if(n){I=C(n);A=F();n=v(I.x,I.y)}function r(){var J=0;e=[];c(["thead","tbody","tfoot"],function(K){var L=D.select(K+" tr",E);c(L,function(M,N){N+=J;c(D.select("td,th",M),function(T,O){var P,Q,R,S;if(e[N]){while(e[N][O]){O++}}R=g(T,"rowspan");S=g(T,"colspan");for(Q=N;Q<N+R;Q++){if(!e[Q]){e[Q]=[]}for(P=O;P<O+S;P++){e[Q][P]={part:K,real:Q==N&&P==O,elm:T,rowspan:R,colspan:S}}}})});J+=L.length})}function v(J,L){var K;K=e[L];if(K){return K[J]}}function g(K,J){return parseInt(K.getAttribute(J)||1)}function h(J){return D.hasClass(J.elm,"mceSelected")||J==n}function j(){var J=[];c(E.rows,function(K){c(K.cells,function(L){if(D.hasClass(L,"mceSelected")||L==n.elm){J.push(K);return false}})});return J}function q(){var J=D.createRng();J.setStartAfter(E);J.setEndAfter(E);H.setRng(J);D.remove(E)}function d(J){var K;b.walk(J,function(M){var L;if(M.nodeType==3){c(D.getParents(M.parentNode,null,J).reverse(),function(N){N=N.cloneNode(false);if(!K){K=L=N}else{if(L){L.appendChild(N)}}L=N});if(L){L.innerHTML=b.isIE?"&nbsp;":'<br _mce_bogus="1" />'}return false}},"childNodes");J=J.cloneNode(false);J.rowSpan=J.colSpan=1;if(K){J.appendChild(K)}else{if(!b.isIE){J.innerHTML='<br _mce_bogus="1" />'}}return J}function p(){var J=D.createRng();c(D.select("tr",E),function(K){if(K.cells.length==0){D.remove(K)}});if(D.select("tr",E).length==0){J.setStartAfter(E);J.setEndAfter(E);H.setRng(J);D.remove(E);return}c(D.select("thead,tbody,tfoot",E),function(K){if(K.rows.length==0){D.remove(K)}});r();row=e[Math.min(e.length-1,I.y)];if(row){H.select(row[Math.min(row.length-1,I.x)].elm,true);H.collapse(true)}}function s(P,N,R,O){var M,K,J,L,Q;M=e[N][P].elm.parentNode;for(J=1;J<=R;J++){M=D.getNext(M,"tr");if(M){for(K=P;K>=0;K--){Q=e[N+J][K].elm;if(Q.parentNode==M){for(L=1;L<=O;L++){D.insertAfter(d(Q),Q)}break}}if(K==-1){for(L=1;L<=O;L++){M.insertBefore(d(M.cells[0]),M.cells[0])}}}}}function z(){c(e,function(J,K){c(J,function(M,L){var P,O,Q,N;if(h(M)){M=M.elm;P=g(M,"colspan");O=g(M,"rowspan");if(P>1||O>1){M.colSpan=M.rowSpan=1;for(N=0;N<P-1;N++){D.insertAfter(d(M),M)}s(L,K,O-1,P)}}})})}function o(R,O,U){var M,L,T,S,Q,N,P,J,R,K;if(R){pos=C(R);M=pos.x;L=pos.y;T=M+(O-1);S=L+(U-1)}else{M=I.x;L=I.y;T=A.x;S=A.y}P=v(M,L);J=v(T,S);if(P&&J&&P.part==J.part){z();r();P=v(M,L).elm;P.colSpan=(T-M)+1;P.rowSpan=(S-L)+1;for(N=L;N<=S;N++){for(Q=M;Q<=T;Q++){R=e[N][Q].elm;if(R!=P){K=b.grep(R.childNodes);c(K,function(W,V){if(W.nodeName!="BR"||V!=K.length-1){P.appendChild(W)}});D.remove(R)}}}p()}}function k(M){var J,O,L,N,P,Q,K,R;c(e,function(S,T){c(S,function(V,U){if(h(V)){V=V.elm;P=V.parentNode;Q=P.cloneNode(false);J=T;if(M){return false}}});if(M){return !J}});for(N=0;N<e[0].length;N++){O=e[J][N].elm;if(O!=L){if(!M){rowSpan=g(O,"rowspan");if(rowSpan>1){O.rowSpan=rowSpan+1;continue}}else{if(J>0&&e[J-1][N]){R=e[J-1][N].elm;rowSpan=g(R,"rowspan");if(rowSpan>1){R.rowSpan=rowSpan+1;continue}}}K=d(O);K.colSpan=O.colSpan;Q.appendChild(K);L=O}}if(Q.hasChildNodes()){if(!M){D.insertAfter(Q,P)}else{P.parentNode.insertBefore(Q,P)}}}function f(K){var L,J;c(e,function(M,N){c(M,function(P,O){if(h(P)){L=O;if(K){return false}}});if(K){return !L}});c(e,function(P,Q){var M=P[L].elm,N,O;if(M!=J){O=g(M,"colspan");N=g(M,"rowspan");if(O==1){if(!K){D.insertAfter(d(M),M);s(L,Q,N-1,O)}else{M.parentNode.insertBefore(d(M),M);s(L,Q,N-1,O)}}else{M.colSpan++}J=M}})}function m(){var J=[];c(e,function(K,L){c(K,function(N,M){if(h(N)&&b.inArray(J,M)===-1){c(e,function(Q){var O=Q[M].elm,P;P=g(O,"colspan");if(P>1){O.colSpan=P-1}else{D.remove(O)}});J.push(M)}})});p()}function l(){var K;function J(N){var M,O,L;M=D.getNext(N,"tr");c(N.cells,function(P){var Q=g(P,"rowspan");if(Q>1){P.rowSpan=Q-1;O=C(P);s(O.x,O.y,1,1)}});O=C(N.cells[0]);c(e[O.y],function(P){var Q;P=P.elm;if(P!=L){Q=g(P,"rowspan");if(Q<=1){D.remove(P)}else{P.rowSpan=Q-1}L=P}})}K=j();c(K.reverse(),function(L){J(L)});p()}function B(){var J=j();D.remove(J);p();return J}function G(){var J=j();c(J,function(L,K){J[K]=L.cloneNode(true)});return J}function w(L,K){var M=j(),J=M[K?0:M.length-1],N=J.cells.length;c(e,function(P){var O;N=0;c(P,function(R,Q){if(R.real){N+=R.colspan}if(R.elm.parentNode==J){O=1}});if(O){return false}});if(!K){L.reverse()}c(L,function(Q){var P=Q.cells.length,O;for(i=0;i<P;i++){O=Q.cells[i];O.colSpan=O.rowSpan=1}for(i=P;i<N;i++){Q.appendChild(d(Q.cells[P-1]))}for(i=N;i<P;i++){D.remove(Q.cells[i])}if(K){J.parentNode.insertBefore(Q,J)}else{D.insertAfter(Q,J)}})}function C(J){var K;c(e,function(L,M){c(L,function(O,N){if(O.elm==J){K={x:N,y:M};return false}});return !K});return K}function u(J){I=C(J)}function F(){var L,K,J;K=J=0;c(e,function(M,N){c(M,function(P,O){var R,Q;if(h(P)){P=e[N][O];if(O>K){K=O}if(N>J){J=N}if(P.real){R=P.colspan-1;Q=P.rowspan-1;if(R){if(O+R>K){K=O+R}}if(Q){if(N+Q>J){J=N+Q}}}}})});return{x:K,y:J}}function t(P){var M,L,R,Q,K,J,N,O;A=C(P);if(I&&A){M=Math.min(I.x,A.x);L=Math.min(I.y,A.y);R=Math.max(I.x,A.x);Q=Math.max(I.y,A.y);K=R;J=Q;for(y=L;y<=J;y++){P=e[y][M];if(!P.real){if(M-(P.colspan-1)<M){M-=P.colspan-1}}}for(x=M;x<=K;x++){P=e[L][x];if(!P.real){if(L-(P.rowspan-1)<L){L-=P.rowspan-1}}}for(y=L;y<=Q;y++){for(x=M;x<=R;x++){P=e[y][x];if(P.real){N=P.colspan-1;O=P.rowspan-1;if(N){if(x+N>K){K=x+N}}if(O){if(y+O>J){J=y+O}}}}}D.removeClass(D.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=L;y<=J;y++){for(x=M;x<=K;x++){D.addClass(e[y][x].elm,"mceSelected")}}}}b.extend(this,{deleteTable:q,split:z,merge:o,insertRow:k,insertCol:f,deleteCols:m,deleteRows:l,cutRows:B,copyRows:G,pasteRows:w,getPos:C,setStartCell:u,setEndCell:t})}b.create("tinymce.plugins.TablePlugin",{init:function(e,f){var d,j;function h(m){var l=e.selection,k=e.dom.getParent(m||l.getNode(),"table");if(k){return new a(k,e.dom,l)}}function g(){e.getBody().style.webkitUserSelect="";e.dom.removeClass(e.dom.select("td.mceSelected,th.mceSelected"),"mceSelected")}c([["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(k){e.addButton(k[0],{title:k[1],cmd:k[2],ui:k[3]})});if(!b.isIE){e.onClick.add(function(k,l){l=l.target;if(l.nodeName==="TABLE"){k.selection.select(l)}})}e.onNodeChange.add(function(l,k,o){var m;o=l.selection.getStart();m=l.dom.getParent(o,"td,th,caption");k.setActive("table",o.nodeName==="TABLE"||!!m);if(m&&m.nodeName==="CAPTION"){m=0}k.setDisabled("delete_table",!m);k.setDisabled("delete_col",!m);k.setDisabled("delete_table",!m);k.setDisabled("delete_row",!m);k.setDisabled("col_after",!m);k.setDisabled("col_before",!m);k.setDisabled("row_after",!m);k.setDisabled("row_before",!m);k.setDisabled("row_props",!m);k.setDisabled("cell_props",!m);k.setDisabled("split_cells",!m);k.setDisabled("merge_cells",!m)});e.onInit.add(function(l){var k,o,p=l.dom,m;d=l.windowManager;l.onMouseDown.add(function(q,r){if(r.button!=2){g();o=p.getParent(r.target,"td,th");k=p.getParent(o,"table")}});p.bind(l.getDoc(),"mouseover",function(t){var r,q,s=t.target;if(o&&(m||s!=o)&&(s.nodeName=="TD"||s.nodeName=="TH")){q=p.getParent(s,"table");if(q==k){if(!m){m=h(q);m.setStartCell(o);l.getBody().style.webkitUserSelect="none"}m.setEndCell(s)}r=l.selection.getSel();if(r.removeAllRanges){r.removeAllRanges()}else{r.empty()}t.preventDefault()}});l.onMouseUp.add(function(z,A){var r,t=z.selection,B,C=t.getSel(),q,u,s,w;if(o){if(m){z.getBody().style.webkitUserSelect=""}function v(D,F){var E=new b.dom.TreeWalker(D,D);do{if(D.nodeType==3&&b.trim(D.nodeValue).length!=0){if(F){r.setStart(D,0)}else{r.setEnd(D,D.nodeValue.length)}return}if(D.nodeName=="BR"){if(F){r.setStartBefore(D)}else{r.setEndBefore(D)}return}}while(D=(F?E.next():E.prev()))}B=p.select("td.mceSelected,th.mceSelected");if(B.length>0){r=p.createRng();u=B[0];w=B[B.length-1];v(u,1);q=new b.dom.TreeWalker(u,p.getParent(B[0],"table"));do{if(u.nodeName=="TD"||u.nodeName=="TH"){if(!p.hasClass(u,"mceSelected")){break}s=u}}while(u=q.next());v(s);t.setRng(r)}z.nodeChanged();o=m=k=null}});l.onKeyUp.add(function(q,r){g()});if(l&&l.plugins.contextmenu){l.plugins.contextmenu.onContextMenu.add(function(s,q,u){var v,t=l.selection,r=t.getNode()||l.getBody();if(l.dom.getParent(u,"td")||l.dom.getParent(u,"th")){q.removeAll();if(r.nodeName=="A"&&!l.dom.getAttrib(r,"name")){q.add({title:"advanced.link_desc",icon:"link",cmd:l.plugins.advlink?"mceAdvLink":"mceLink",ui:true});q.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});q.addSeparator()}if(r.nodeName=="IMG"&&r.className.indexOf("mceItem")==-1){q.add({title:"advanced.image_desc",icon:"image",cmd:l.plugins.advimage?"mceAdvImage":"mceImage",ui:true});q.addSeparator()}q.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});q.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});q.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});q.addSeparator();v=q.addMenu({title:"table.cell"});v.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});v.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});v.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});v=q.addMenu({title:"table.row"});v.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});v.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});v.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});v.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});v.addSeparator();v.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});v.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});v.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!j);v.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!j);v=q.addMenu({title:"table.col"});v.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});v.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});v.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{q.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(!b.isIE){function n(){var q;for(q=l.getBody().lastChild;q&&q.nodeType==3&&!q.nodeValue.length;q=q.previousSibling){}if(q&&q.nodeName=="TABLE"){l.dom.add(l.getBody(),"p",null,'<br mce_bogus="1" />')}}if(b.isGecko){l.onKeyDown.add(function(r,t){var q,s,u=r.dom;if(t.keyCode==37||t.keyCode==38){q=r.selection.getRng();s=u.getParent(q.startContainer,"table");if(s&&r.getBody().firstChild==s){if(isAtStart(q,s)){q=u.createRng();q.setStartBefore(s);q.setEndBefore(s);r.selection.setRng(q);t.preventDefault()}}}})}l.onKeyUp.add(n);l.onSetContent.add(n);l.onVisualAid.add(n);l.onPreProcess.add(function(q,s){var r=s.node.lastChild;if(r&&r.childNodes.length==1&&r.firstChild.nodeName=="BR"){q.dom.remove(r)}});n()}});c({mceTableSplitCells:function(k){k.split()},mceTableMergeCells:function(l){var m,n,k;k=e.dom.getParent(e.selection.getNode(),"th,td");if(k){m=k.rowSpan;n=k.colSpan}if(!e.dom.select("td.mceSelected,th.mceSelected").length){d.open({url:f+"/merge_cells.htm",width:240+parseInt(e.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(e.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:m,cols:n,onaction:function(o){l.merge(k,o.cols,o.rows)},plugin_url:f})}else{l.merge()}},mceTableInsertRowBefore:function(k){k.insertRow(true)},mceTableInsertRowAfter:function(k){k.insertRow()},mceTableInsertColBefore:function(k){k.insertCol(true)},mceTableInsertColAfter:function(k){k.insertCol()},mceTableDeleteCol:function(k){k.deleteCols()},mceTableDeleteRow:function(k){k.deleteRows()},mceTableCutRow:function(k){j=k.cutRows()},mceTableCopyRow:function(k){j=k.copyRows()},mceTablePasteRowBefore:function(k){k.pasteRows(j,true)},mceTablePasteRowAfter:function(k){k.pasteRows(j)},mceTableDelete:function(k){k.deleteTable()}},function(l,k){e.addCommand(k,function(){var m=h();if(m){l(m);e.execCommand("mceRepaint");g()}})});c({mceInsertTable:function(k){d.open({url:f+"/table.htm",width:400+parseInt(e.getLang("table.table_delta_width",0)),height:320+parseInt(e.getLang("table.table_delta_height",0)),inline:1},{plugin_url:f,action:k?k.action:0})},mceTableRowProps:function(){d.open({url:f+"/row.htm",width:400+parseInt(e.getLang("table.rowprops_delta_width",0)),height:295+parseInt(e.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:f})},mceTableCellProps:function(){d.open({url:f+"/cell.htm",width:400+parseInt(e.getLang("table.cellprops_delta_width",0)),height:295+parseInt(e.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:f})}},function(l,k){e.addCommand(k,function(m,n){l(n)})})}});b.PluginManager.add("table",b.plugins.TablePlugin)})(tinymce);
@@ -1,1202 +1,1118 @@
1
1
  /**
2
- * $Id: editor_plugin_src.js 1209 2009-08-20 12:35:10Z spocke $
2
+ * editor_plugin_src.js
3
3
  *
4
- * @author Moxiecode
5
- * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved.
4
+ * Copyright 2009, Moxiecode Systems AB
5
+ * Released under LGPL License.
6
+ *
7
+ * License: http://tinymce.moxiecode.com/license
8
+ * Contributing: http://tinymce.moxiecode.com/contributing
6
9
  */
7
10
 
8
- (function() {
11
+ (function(tinymce) {
9
12
  var each = tinymce.each;
10
13
 
11
- // Checks if the selection/caret is at the start of the specified block element
12
- function isAtStart(rng, par) {
13
- var doc = par.ownerDocument, rng2 = doc.createRange(), elm;
14
+ /**
15
+ * Table Grid class.
16
+ */
17
+ function TableGrid(table, dom, selection) {
18
+ var grid, startPos, endPos, selectedCell;
19
+
20
+ buildGrid();
21
+ selectedCell = dom.getParent(selection.getStart(), 'th,td');
22
+ if (selectedCell) {
23
+ startPos = getPos(selectedCell);
24
+ endPos = findEndPos();
25
+ selectedCell = getCell(startPos.x, startPos.y);
26
+ }
14
27
 
15
- rng2.setStartBefore(par);
16
- rng2.setEnd(rng.endContainer, rng.endOffset);
28
+ function buildGrid() {
29
+ var startY = 0;
17
30
 
18
- elm = doc.createElement('body');
19
- elm.appendChild(rng2.cloneContents());
31
+ grid = [];
20
32
 
21
- // Check for text characters of other elements that should be treated as content
22
- return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0;
23
- };
33
+ each(['thead', 'tbody', 'tfoot'], function(part) {
34
+ var rows = dom.select(part + ' tr', table);
24
35
 
25
- tinymce.create('tinymce.plugins.TablePlugin', {
26
- init : function(ed, url) {
27
- var t = this;
36
+ each(rows, function(tr, y) {
37
+ y += startY;
28
38
 
29
- t.editor = ed;
30
- t.url = url;
39
+ each(dom.select('td,th', tr), function(td, x) {
40
+ var x2, y2, rowspan, colspan;
31
41
 
32
- // Register buttons
33
- each([
34
- ['table', 'table.desc', 'mceInsertTable', true],
35
- ['delete_table', 'table.del', 'mceTableDelete'],
36
- ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'],
37
- ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'],
38
- ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'],
39
- ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'],
40
- ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'],
41
- ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'],
42
- ['row_props', 'table.row_desc', 'mceTableRowProps', true],
43
- ['cell_props', 'table.cell_desc', 'mceTableCellProps', true],
44
- ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true],
45
- ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true]
46
- ], function(c) {
47
- ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});
48
- });
49
-
50
- if (ed.getParam('inline_styles')) {
51
- // Force move of attribs to styles in strict mode
52
- ed.onPreProcess.add(function(ed, o) {
53
- var dom = ed.dom;
42
+ // Skip over existing cells produced by rowspan
43
+ if (grid[y]) {
44
+ while (grid[y][x])
45
+ x++;
46
+ }
54
47
 
55
- each(dom.select('table', o.node), function(n) {
56
- var v;
48
+ // Get col/rowspan from cell
49
+ rowspan = getSpanVal(td, 'rowspan');
50
+ colspan = getSpanVal(td, 'colspan');
57
51
 
58
- if (v = dom.getAttrib(n, 'width')) {
59
- dom.setStyle(n, 'width', v);
60
- dom.setAttrib(n, 'width');
61
- }
52
+ // Fill out rowspan/colspan right and down
53
+ for (y2 = y; y2 < y + rowspan; y2++) {
54
+ if (!grid[y2])
55
+ grid[y2] = [];
62
56
 
63
- if (v = dom.getAttrib(n, 'height')) {
64
- dom.setStyle(n, 'height', v);
65
- dom.setAttrib(n, 'height');
57
+ for (x2 = x; x2 < x + colspan; x2++) {
58
+ grid[y2][x2] = {
59
+ part : part,
60
+ real : y2 == y && x2 == x,
61
+ elm : td,
62
+ rowspan : rowspan,
63
+ colspan : colspan
64
+ };
65
+ }
66
66
  }
67
67
  });
68
68
  });
69
- }
70
69
 
71
- ed.onInit.add(function() {
72
- // Fixes an issue on Gecko where it's impossible to place the caret behind a table
73
- // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled
74
- if (!tinymce.isIE && ed.getParam('forced_root_block')) {
75
- function fixTableCaretPos() {
76
- var last = ed.getBody().lastChild;
70
+ startY += rows.length;
71
+ });
72
+ };
77
73
 
78
- if (last && last.nodeName == 'TABLE')
79
- ed.dom.add(ed.getBody(), 'p', null, '<br mce_bogus="1" />');
80
- };
74
+ function getCell(x, y) {
75
+ var row;
81
76
 
82
- // Fixes an bug where it's impossible to place the caret before a table in Gecko
83
- // this fix solves it by detecting when the caret is at the beginning of such a table
84
- // and then manually moves the caret infront of the table
85
- if (tinymce.isGecko) {
86
- ed.onKeyDown.add(function(ed, e) {
87
- var rng, table, dom = ed.dom;
77
+ row = grid[y];
78
+ if (row)
79
+ return row[x];
80
+ };
88
81
 
89
- // On gecko it's not possible to place the caret before a table
90
- if (e.keyCode == 37 || e.keyCode == 38) {
91
- rng = ed.selection.getRng();
92
- table = dom.getParent(rng.startContainer, 'table');
82
+ function getSpanVal(td, name) {
83
+ return parseInt(td.getAttribute(name) || 1);
84
+ };
93
85
 
94
- if (table && ed.getBody().firstChild == table) {
95
- if (isAtStart(rng, table)) {
96
- rng = dom.createRng();
97
-
98
- rng.setStartBefore(table);
99
- rng.setEndBefore(table);
86
+ function isCellSelected(cell) {
87
+ return dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell;
88
+ };
100
89
 
101
- ed.selection.setRng(rng);
90
+ function getSelectedRows() {
91
+ var rows = [];
102
92
 
103
- e.preventDefault();
104
- }
105
- }
106
- }
107
- });
93
+ each(table.rows, function(row) {
94
+ each(row.cells, function(cell) {
95
+ if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) {
96
+ rows.push(row);
97
+ return false;
108
98
  }
99
+ });
100
+ });
109
101
 
110
- ed.onKeyUp.add(fixTableCaretPos);
111
- ed.onSetContent.add(fixTableCaretPos);
112
- ed.onVisualAid.add(fixTableCaretPos);
102
+ return rows;
103
+ };
113
104
 
114
- ed.onPreProcess.add(function(ed, o) {
115
- var last = o.node.lastChild;
105
+ function deleteTable() {
106
+ var rng = dom.createRng();
116
107
 
117
- if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR')
118
- ed.dom.remove(last);
119
- });
108
+ rng.setStartAfter(table);
109
+ rng.setEndAfter(table);
120
110
 
121
- fixTableCaretPos();
122
- }
111
+ selection.setRng(rng);
123
112
 
124
- if (ed && ed.plugins.contextmenu) {
125
- ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {
126
- var sm, se = ed.selection, el = se.getNode() || ed.getBody();
113
+ dom.remove(table);
114
+ };
127
115
 
128
- if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th')) {
129
- m.removeAll();
116
+ function cloneCell(cell) {
117
+ var formatNode;
130
118
 
131
- if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) {
132
- m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});
133
- m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});
134
- m.addSeparator();
135
- }
119
+ // Clone formats
120
+ tinymce.walk(cell, function(node) {
121
+ var curNode;
136
122
 
137
- if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) {
138
- m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});
139
- m.addSeparator();
140
- }
123
+ if (node.nodeType == 3) {
124
+ each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) {
125
+ node = node.cloneNode(false);
141
126
 
142
- m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true, value : {action : 'insert'}});
143
- m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable', ui : true});
144
- m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete', ui : true});
145
- m.addSeparator();
146
-
147
- // Cell menu
148
- sm = m.addMenu({title : 'table.cell'});
149
- sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps', ui : true});
150
- sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells', ui : true});
151
- sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells', ui : true});
152
-
153
- // Row menu
154
- sm = m.addMenu({title : 'table.row'});
155
- sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps', ui : true});
156
- sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'});
157
- sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'});
158
- sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'});
159
- sm.addSeparator();
160
- sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'});
161
- sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'});
162
- sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'});
163
- sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'});
127
+ if (!formatNode)
128
+ formatNode = curNode = node;
129
+ else if (curNode)
130
+ curNode.appendChild(node);
164
131
 
165
- // Column menu
166
- sm = m.addMenu({title : 'table.col'});
167
- sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'});
168
- sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'});
169
- sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'});
170
- } else
171
- m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true});
132
+ curNode = node;
172
133
  });
173
- }
174
- });
175
134
 
176
- // Add undo level when new rows are created using the tab key
177
- ed.onKeyDown.add(function(ed, e) {
178
- if (e.keyCode == 9 && ed.dom.getParent(ed.selection.getNode(), 'TABLE')) {
179
- if (!tinymce.isGecko && !tinymce.isOpera) {
180
- tinyMCE.execInstanceCommand(ed.editorId, "mceTableMoveToNextRow", true);
181
- return tinymce.dom.Event.cancel(e);
182
- }
135
+ // Add something to the inner node
136
+ if (curNode)
137
+ curNode.innerHTML = tinymce.isIE ? '&nbsp;' : '<br _mce_bogus="1" />';
183
138
 
184
- ed.undoManager.add();
139
+ return false;
185
140
  }
186
- });
141
+ }, 'childNodes');
187
142
 
188
- // Select whole table is a table border is clicked
189
- if (!tinymce.isIE) {
190
- if (ed.getParam('table_selection', true)) {
191
- ed.onClick.add(function(ed, e) {
192
- e = e.target;
143
+ cell = cell.cloneNode(false);
144
+ cell.rowSpan = cell.colSpan = 1;
193
145
 
194
- if (e.nodeName === 'TABLE')
195
- ed.selection.select(e);
196
- });
197
- }
146
+ if (formatNode) {
147
+ cell.appendChild(formatNode);
148
+ } else {
149
+ if (!tinymce.isIE)
150
+ cell.innerHTML = '<br _mce_bogus="1" />';
198
151
  }
199
152
 
200
- ed.onNodeChange.add(function(ed, cm, n) {
201
- var p = ed.dom.getParent(n, 'td,th,caption');
153
+ return cell;
154
+ };
202
155
 
203
- cm.setActive('table', n.nodeName === 'TABLE' || !!p);
204
- if (p && p.nodeName === 'CAPTION')
205
- p = null;
156
+ function cleanup() {
157
+ var rng = dom.createRng();
206
158
 
207
- cm.setDisabled('delete_table', !p);
208
- cm.setDisabled('delete_col', !p);
209
- cm.setDisabled('delete_table', !p);
210
- cm.setDisabled('delete_row', !p);
211
- cm.setDisabled('col_after', !p);
212
- cm.setDisabled('col_before', !p);
213
- cm.setDisabled('row_after', !p);
214
- cm.setDisabled('row_before', !p);
215
- cm.setDisabled('row_props', !p);
216
- cm.setDisabled('cell_props', !p);
217
- cm.setDisabled('split_cells', !p || (parseInt(ed.dom.getAttrib(p, 'colspan', '1')) < 2 && parseInt(ed.dom.getAttrib(p, 'rowspan', '1')) < 2));
218
- cm.setDisabled('merge_cells', !p);
159
+ // Empty rows
160
+ each(dom.select('tr', table), function(tr) {
161
+ if (tr.cells.length == 0)
162
+ dom.remove(tr);
219
163
  });
220
164
 
221
- // Padd empty table cells
222
- if (!tinymce.isIE) {
223
- ed.onBeforeSetContent.add(function(ed, o) {
224
- if (o.initial)
225
- o.content = o.content.replace(/<(td|th)([^>]+|)>\s*<\/(td|th)>/g, tinymce.isOpera ? '<$1$2>&nbsp;</$1>' : '<$1$2><br mce_bogus="1" /></$1>');
226
- });
227
- }
228
- },
229
-
230
- execCommand : function(cmd, ui, val) {
231
- var ed = this.editor, b;
232
-
233
- // Is table command
234
- switch (cmd) {
235
- case "mceTableMoveToNextRow":
236
- case "mceInsertTable":
237
- case "mceTableRowProps":
238
- case "mceTableCellProps":
239
- case "mceTableSplitCells":
240
- case "mceTableMergeCells":
241
- case "mceTableInsertRowBefore":
242
- case "mceTableInsertRowAfter":
243
- case "mceTableDeleteRow":
244
- case "mceTableInsertColBefore":
245
- case "mceTableInsertColAfter":
246
- case "mceTableDeleteCol":
247
- case "mceTableCutRow":
248
- case "mceTableCopyRow":
249
- case "mceTablePasteRowBefore":
250
- case "mceTablePasteRowAfter":
251
- case "mceTableDelete":
252
- ed.execCommand('mceBeginUndoLevel');
253
- this._doExecCommand(cmd, ui, val);
254
- ed.execCommand('mceEndUndoLevel');
255
-
256
- return true;
165
+ // Empty table
166
+ if (dom.select('tr', table).length == 0) {
167
+ rng.setStartAfter(table);
168
+ rng.setEndAfter(table);
169
+ selection.setRng(rng);
170
+ dom.remove(table);
171
+ return;
257
172
  }
258
173
 
259
- // Pass to next handler in chain
260
- return false;
261
- },
262
-
263
- getInfo : function() {
264
- return {
265
- longname : 'Tables',
266
- author : 'Moxiecode Systems AB',
267
- authorurl : 'http://tinymce.moxiecode.com',
268
- infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table',
269
- version : tinymce.majorVersion + "." + tinymce.minorVersion
270
- };
271
- },
272
-
273
- // Private plugin internal methods
274
-
275
- /**
276
- * Executes the table commands.
277
- */
278
- _doExecCommand : function(command, user_interface, value) {
279
- var inst = this.editor, ed = inst, url = this.url;
280
- var focusElm = inst.selection.getNode();
281
- var trElm = inst.dom.getParent(focusElm, "tr");
282
- var tdElm = inst.dom.getParent(focusElm, "td,th");
283
- var tableElm = inst.dom.getParent(focusElm, "table");
284
- var doc = inst.contentWindow.document;
285
- var tableBorder = tableElm ? tableElm.getAttribute("border") : "";
286
-
287
- // Get first TD if no TD found
288
- if (trElm && tdElm == null)
289
- tdElm = trElm.cells[0];
290
-
291
- function inArray(ar, v) {
292
- for (var i=0; i<ar.length; i++) {
293
- // Is array
294
- if (ar[i].length > 0 && inArray(ar[i], v))
295
- return true;
296
-
297
- // Found value
298
- if (ar[i] == v)
299
- return true;
300
- }
174
+ // Empty header/body/footer
175
+ each(dom.select('thead,tbody,tfoot', table), function(part) {
176
+ if (part.rows.length == 0)
177
+ dom.remove(part);
178
+ });
179
+
180
+ // Restore selection to start position if it still exists
181
+ buildGrid();
301
182
 
302
- return false;
183
+ // Restore the selection to the closest table position
184
+ row = grid[Math.min(grid.length - 1, startPos.y)];
185
+ if (row) {
186
+ selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true);
187
+ selection.collapse(true);
303
188
  }
189
+ };
304
190
 
305
- function select(dx, dy) {
306
- var td;
191
+ function fillLeftDown(x, y, rows, cols) {
192
+ var tr, x2, r, c, cell;
307
193
 
308
- grid = getTableGrid(tableElm);
309
- dx = dx || 0;
310
- dy = dy || 0;
311
- dx = Math.max(cpos.cellindex + dx, 0);
312
- dy = Math.max(cpos.rowindex + dy, 0);
194
+ tr = grid[y][x].elm.parentNode;
195
+ for (r = 1; r <= rows; r++) {
196
+ tr = dom.getNext(tr, 'tr');
313
197
 
314
- // Recalculate grid and select
315
- inst.execCommand('mceRepaint');
316
- td = getCell(grid, dy, dx);
198
+ if (tr) {
199
+ // Loop left to find real cell
200
+ for (x2 = x; x2 >= 0; x2--) {
201
+ cell = grid[y + r][x2].elm;
317
202
 
318
- if (td) {
319
- inst.selection.select(td.firstChild || td);
320
- inst.selection.collapse(1);
321
- }
322
- };
203
+ if (cell.parentNode == tr) {
204
+ // Append clones after
205
+ for (c = 1; c <= cols; c++)
206
+ dom.insertAfter(cloneCell(cell), cell);
323
207
 
324
- function makeTD() {
325
- var newTD = doc.createElement("td");
208
+ break;
209
+ }
210
+ }
326
211
 
327
- if (!tinymce.isIE)
328
- newTD.innerHTML = '<br mce_bogus="1"/>';
212
+ if (x2 == -1) {
213
+ // Insert nodes before first cell
214
+ for (c = 1; c <= cols; c++)
215
+ tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]);
216
+ }
217
+ }
329
218
  }
219
+ };
330
220
 
331
- function getColRowSpan(td) {
332
- var colspan = inst.dom.getAttrib(td, "colspan");
333
- var rowspan = inst.dom.getAttrib(td, "rowspan");
221
+ function split() {
222
+ each(grid, function(row, y) {
223
+ each(row, function(cell, x) {
224
+ var colSpan, rowSpan, newCell, i;
334
225
 
335
- colspan = colspan == "" ? 1 : parseInt(colspan);
336
- rowspan = rowspan == "" ? 1 : parseInt(rowspan);
226
+ if (isCellSelected(cell)) {
227
+ cell = cell.elm;
228
+ colSpan = getSpanVal(cell, 'colspan');
229
+ rowSpan = getSpanVal(cell, 'rowspan');
337
230
 
338
- return {colspan : colspan, rowspan : rowspan};
231
+ if (colSpan > 1 || rowSpan > 1) {
232
+ cell.colSpan = cell.rowSpan = 1;
233
+
234
+ // Insert cells right
235
+ for (i = 0; i < colSpan - 1; i++)
236
+ dom.insertAfter(cloneCell(cell), cell);
237
+
238
+ fillLeftDown(x, y, rowSpan - 1, colSpan);
239
+ }
240
+ }
241
+ });
242
+ });
243
+ };
244
+
245
+ function merge(cell, cols, rows) {
246
+ var startX, startY, endX, endY, x, y, startCell, endCell, cell, children;
247
+
248
+ // Use specified cell and cols/rows
249
+ if (cell) {
250
+ pos = getPos(cell);
251
+ startX = pos.x;
252
+ startY = pos.y;
253
+ endX = startX + (cols - 1);
254
+ endY = startY + (rows - 1);
255
+ } else {
256
+ // Use selection
257
+ startX = startPos.x;
258
+ startY = startPos.y;
259
+ endX = endPos.x;
260
+ endY = endPos.y;
339
261
  }
340
262
 
341
- function getCellPos(grid, td) {
342
- var x, y;
263
+ // Find start/end cells
264
+ startCell = getCell(startX, startY);
265
+ endCell = getCell(endX, endY);
266
+
267
+ // Check if the cells exists and if they are of the same part for example tbody = tbody
268
+ if (startCell && endCell && startCell.part == endCell.part) {
269
+ // Split and rebuild grid
270
+ split();
271
+ buildGrid();
272
+
273
+ // Set row/col span to start cell
274
+ startCell = getCell(startX, startY).elm;
275
+ startCell.colSpan = (endX - startX) + 1;
276
+ startCell.rowSpan = (endY - startY) + 1;
277
+
278
+ // Remove other cells and add it's contents to the start cell
279
+ for (y = startY; y <= endY; y++) {
280
+ for (x = startX; x <= endX; x++) {
281
+ cell = grid[y][x].elm;
282
+
283
+ if (cell != startCell) {
284
+ // Move children to startCell
285
+ children = tinymce.grep(cell.childNodes);
286
+ each(children, function(node, i) {
287
+ // Jump over last BR element
288
+ if (node.nodeName != 'BR' || i != children.length - 1)
289
+ startCell.appendChild(node);
290
+ });
343
291
 
344
- for (y=0; y<grid.length; y++) {
345
- for (x=0; x<grid[y].length; x++) {
346
- if (grid[y][x] == td)
347
- return {cellindex : x, rowindex : y};
292
+ // Remove cell
293
+ dom.remove(cell);
294
+ }
348
295
  }
349
296
  }
350
297
 
351
- return null;
298
+ // Remove empty rows etc and restore caret location
299
+ cleanup();
352
300
  }
301
+ };
302
+
303
+ function insertRow(before) {
304
+ var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell;
305
+
306
+ // Find first/last row
307
+ each(grid, function(row, y) {
308
+ each(row, function(cell, x) {
309
+ if (isCellSelected(cell)) {
310
+ cell = cell.elm;
311
+ rowElm = cell.parentNode;
312
+ newRow = rowElm.cloneNode(false);
313
+ posY = y;
314
+
315
+ if (before)
316
+ return false;
317
+ }
318
+ });
353
319
 
354
- function getCell(grid, row, col) {
355
- if (grid[row] && grid[row][col])
356
- return grid[row][col];
320
+ if (before)
321
+ return !posY;
322
+ });
357
323
 
358
- return null;
359
- }
324
+ for (x = 0; x < grid[0].length; x++) {
325
+ cell = grid[posY][x].elm;
360
326
 
361
- function getNextCell(table, cell) {
362
- var cells = [], x = 0, i, j, cell, nextCell;
327
+ if (cell != lastCell) {
328
+ if (!before) {
329
+ rowSpan = getSpanVal(cell, 'rowspan');
330
+ if (rowSpan > 1) {
331
+ cell.rowSpan = rowSpan + 1;
332
+ continue;
333
+ }
334
+ } else {
335
+ // Check if cell above can be expanded
336
+ if (posY > 0 && grid[posY - 1][x]) {
337
+ otherCell = grid[posY - 1][x].elm;
338
+ rowSpan = getSpanVal(otherCell, 'rowspan');
339
+ if (rowSpan > 1) {
340
+ otherCell.rowSpan = rowSpan + 1;
341
+ continue;
342
+ }
343
+ }
344
+ }
363
345
 
364
- for (i = 0; i < table.rows.length; i++)
365
- for (j = 0; j < table.rows[i].cells.length; j++, x++)
366
- cells[x] = table.rows[i].cells[j];
346
+ // Insert new cell into new row
347
+ newCell = cloneCell(cell)
348
+ newCell.colSpan = cell.colSpan;
349
+ newRow.appendChild(newCell);
367
350
 
368
- for (i = 0; i < cells.length; i++)
369
- if (cells[i] == cell)
370
- if (nextCell = cells[i+1])
371
- return nextCell;
351
+ lastCell = cell;
352
+ }
372
353
  }
373
354
 
374
- function getTableGrid(table) {
375
- var grid = [], rows = table.rows, x, y, td, sd, xstart, x2, y2;
376
-
377
- for (y=0; y<rows.length; y++) {
378
- for (x=0; x<rows[y].cells.length; x++) {
379
- td = rows[y].cells[x];
380
- sd = getColRowSpan(td);
355
+ if (newRow.hasChildNodes()) {
356
+ if (!before)
357
+ dom.insertAfter(newRow, rowElm);
358
+ else
359
+ rowElm.parentNode.insertBefore(newRow, rowElm);
360
+ }
361
+ };
381
362
 
382
- // All ready filled
383
- for (xstart = x; grid[y] && grid[y][xstart]; xstart++) ;
363
+ function insertCol(before) {
364
+ var posX, lastCell;
384
365
 
385
- // Fill box
386
- for (y2=y; y2<y+sd['rowspan']; y2++) {
387
- if (!grid[y2])
388
- grid[y2] = [];
366
+ // Find first/last column
367
+ each(grid, function(row, y) {
368
+ each(row, function(cell, x) {
369
+ if (isCellSelected(cell)) {
370
+ posX = x;
389
371
 
390
- for (x2=xstart; x2<xstart+sd['colspan']; x2++)
391
- grid[y2][x2] = td;
392
- }
372
+ if (before)
373
+ return false;
393
374
  }
394
- }
375
+ });
395
376
 
396
- return grid;
397
- }
377
+ if (before)
378
+ return !posX;
379
+ });
398
380
 
399
- function trimRow(table, tr, td, new_tr) {
400
- var grid = getTableGrid(table), cpos = getCellPos(grid, td);
401
- var cells, lastElm;
402
-
403
- // Time to crop away some
404
- if (new_tr.cells.length != tr.childNodes.length) {
405
- cells = tr.childNodes;
406
- lastElm = null;
407
-
408
- for (var x=0; td = getCell(grid, cpos.rowindex, x); x++) {
409
- var remove = true;
410
- var sd = getColRowSpan(td);
411
-
412
- // Remove due to rowspan
413
- if (inArray(cells, td)) {
414
- new_tr.childNodes[x]._delete = true;
415
- } else if ((lastElm == null || td != lastElm) && sd.colspan > 1) { // Remove due to colspan
416
- for (var i=x; i<x+td.colSpan; i++)
417
- new_tr.childNodes[i]._delete = true;
418
- }
381
+ each(grid, function(row, y) {
382
+ var cell = row[posX].elm, rowSpan, colSpan;
419
383
 
420
- if ((lastElm == null || td != lastElm) && sd.rowspan > 1)
421
- td.rowSpan = sd.rowspan + 1;
384
+ if (cell != lastCell) {
385
+ colSpan = getSpanVal(cell, 'colspan');
386
+ rowSpan = getSpanVal(cell, 'rowspan');
422
387
 
423
- lastElm = td;
424
- }
388
+ if (colSpan == 1) {
389
+ if (!before) {
390
+ dom.insertAfter(cloneCell(cell), cell);
391
+ fillLeftDown(posX, y, rowSpan - 1, colSpan);
392
+ } else {
393
+ cell.parentNode.insertBefore(cloneCell(cell), cell);
394
+ fillLeftDown(posX, y, rowSpan - 1, colSpan);
395
+ }
396
+ } else
397
+ cell.colSpan++;
425
398
 
426
- deleteMarked(tableElm);
399
+ lastCell = cell;
427
400
  }
428
- }
401
+ });
402
+ };
429
403
 
430
- function prevElm(node, name) {
431
- while ((node = node.previousSibling) != null) {
432
- if (node.nodeName == name)
433
- return node;
434
- }
404
+ function deleteCols() {
405
+ var cols = [];
435
406
 
436
- return null;
437
- }
407
+ // Get selected column indexes
408
+ each(grid, function(row, y) {
409
+ each(row, function(cell, x) {
410
+ if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) {
411
+ each(grid, function(row) {
412
+ var cell = row[x].elm, colSpan;
438
413
 
439
- function nextElm(node, names) {
440
- var namesAr = names.split(',');
414
+ colSpan = getSpanVal(cell, 'colspan');
441
415
 
442
- while ((node = node.nextSibling) != null) {
443
- for (var i=0; i<namesAr.length; i++) {
444
- if (node.nodeName.toLowerCase() == namesAr[i].toLowerCase() )
445
- return node;
416
+ if (colSpan > 1)
417
+ cell.colSpan = colSpan - 1;
418
+ else
419
+ dom.remove(cell);
420
+ });
421
+
422
+ cols.push(x);
446
423
  }
447
- }
424
+ });
425
+ });
448
426
 
449
- return null;
450
- }
427
+ cleanup();
428
+ };
451
429
 
452
- function deleteMarked(tbl) {
453
- if (tbl.rows == 0)
454
- return;
430
+ function deleteRows() {
431
+ var rows;
455
432
 
456
- var tr = tbl.rows[0];
457
- do {
458
- var next = nextElm(tr, "TR");
433
+ function deleteRow(tr) {
434
+ var nextTr, pos, lastCell;
459
435
 
460
- // Delete row
461
- if (tr._delete) {
462
- tr.parentNode.removeChild(tr);
463
- continue;
464
- }
436
+ nextTr = dom.getNext(tr, 'tr');
465
437
 
466
- // Delete cells
467
- var td = tr.cells[0];
468
- if (td.cells > 1) {
469
- do {
470
- var nexttd = nextElm(td, "TD,TH");
438
+ // Move down row spanned cells
439
+ each(tr.cells, function(cell) {
440
+ var rowSpan = getSpanVal(cell, 'rowspan');
471
441
 
472
- if (td._delete)
473
- td.parentNode.removeChild(td);
474
- } while ((td = nexttd) != null);
442
+ if (rowSpan > 1) {
443
+ cell.rowSpan = rowSpan - 1;
444
+ pos = getPos(cell);
445
+ fillLeftDown(pos.x, pos.y, 1, 1);
475
446
  }
476
- } while ((tr = next) != null);
477
- }
447
+ });
478
448
 
479
- function addRows(td_elm, tr_elm, rowspan) {
480
- // Add rows
481
- td_elm.rowSpan = 1;
482
- var trNext = nextElm(tr_elm, "TR");
483
- for (var i=1; i<rowspan && trNext; i++) {
484
- var newTD = doc.createElement("td");
449
+ // Delete cells
450
+ pos = getPos(tr.cells[0]);
451
+ each(grid[pos.y], function(cell) {
452
+ var rowSpan;
485
453
 
486
- if (!tinymce.isIE)
487
- newTD.innerHTML = '<br mce_bogus="1"/>';
454
+ cell = cell.elm;
488
455
 
489
- if (tinymce.isIE)
490
- trNext.insertBefore(newTD, trNext.cells(td_elm.cellIndex));
491
- else
492
- trNext.insertBefore(newTD, trNext.cells[td_elm.cellIndex]);
456
+ if (cell != lastCell) {
457
+ rowSpan = getSpanVal(cell, 'rowspan');
493
458
 
494
- trNext = nextElm(trNext, "TR");
495
- }
496
- }
459
+ if (rowSpan <= 1)
460
+ dom.remove(cell);
461
+ else
462
+ cell.rowSpan = rowSpan - 1;
497
463
 
498
- function copyRow(doc, table, tr) {
499
- var grid = getTableGrid(table);
500
- var newTR = tr.cloneNode(false);
501
- var cpos = getCellPos(grid, tr.cells[0]);
502
- var lastCell = null;
503
- var tableBorder = inst.dom.getAttrib(table, "border");
504
- var tdElm = null;
505
-
506
- for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
507
- var newTD = null;
508
-
509
- if (lastCell != tdElm) {
510
- for (var i=0; i<tr.cells.length; i++) {
511
- if (tdElm == tr.cells[i]) {
512
- newTD = tdElm.cloneNode(true);
513
- break;
514
- }
515
- }
464
+ lastCell = cell;
516
465
  }
466
+ });
467
+ };
517
468
 
518
- if (newTD == null) {
519
- newTD = doc.createElement("td");
469
+ // Get selected rows and move selection out of scope
470
+ rows = getSelectedRows();
520
471
 
521
- if (!tinymce.isIE)
522
- newTD.innerHTML = '<br mce_bogus="1"/>';
523
- }
472
+ // Delete all selected rows
473
+ each(rows.reverse(), function(tr) {
474
+ deleteRow(tr);
475
+ });
524
476
 
525
- // Reset col/row span
526
- newTD.colSpan = 1;
527
- newTD.rowSpan = 1;
477
+ cleanup();
478
+ };
528
479
 
529
- newTR.appendChild(newTD);
480
+ function cutRows() {
481
+ var rows = getSelectedRows();
530
482
 
531
- lastCell = tdElm;
532
- }
483
+ dom.remove(rows);
484
+ cleanup();
533
485
 
534
- return newTR;
535
- }
486
+ return rows;
487
+ };
536
488
 
537
- // ---- Commands -----
489
+ function copyRows() {
490
+ var rows = getSelectedRows();
538
491
 
539
- // Handle commands
540
- switch (command) {
541
- case "mceTableMoveToNextRow":
542
- var nextCell = getNextCell(tableElm, tdElm);
492
+ each(rows, function(row, i) {
493
+ rows[i] = row.cloneNode(true);
494
+ });
543
495
 
544
- if (!nextCell) {
545
- inst.execCommand("mceTableInsertRowAfter", tdElm);
546
- nextCell = getNextCell(tableElm, tdElm);
547
- }
496
+ return rows;
497
+ };
548
498
 
549
- inst.selection.select(nextCell);
550
- inst.selection.collapse(true);
499
+ function pasteRows(rows, before) {
500
+ var selectedRows = getSelectedRows(),
501
+ targetRow = selectedRows[before ? 0 : selectedRows.length - 1],
502
+ targetCellCount = targetRow.cells.length;
551
503
 
552
- return true;
504
+ // Calc target cell count
505
+ each(grid, function(row) {
506
+ var match;
553
507
 
554
- case "mceTableRowProps":
555
- if (trElm == null)
556
- return true;
508
+ targetCellCount = 0;
509
+ each(row, function(cell, x) {
510
+ if (cell.real)
511
+ targetCellCount += cell.colspan;
557
512
 
558
- if (user_interface) {
559
- inst.windowManager.open({
560
- url : url + '/row.htm',
561
- width : 400 + parseInt(inst.getLang('table.rowprops_delta_width', 0)),
562
- height : 295 + parseInt(inst.getLang('table.rowprops_delta_height', 0)),
563
- inline : 1
564
- }, {
565
- plugin_url : url
566
- });
567
- }
513
+ if (cell.elm.parentNode == targetRow)
514
+ match = 1;
515
+ });
568
516
 
569
- return true;
517
+ if (match)
518
+ return false;
519
+ });
570
520
 
571
- case "mceTableCellProps":
572
- if (tdElm == null)
573
- return true;
521
+ if (!before)
522
+ rows.reverse();
574
523
 
575
- if (user_interface) {
576
- inst.windowManager.open({
577
- url : url + '/cell.htm',
578
- width : 400 + parseInt(inst.getLang('table.cellprops_delta_width', 0)),
579
- height : 295 + parseInt(inst.getLang('table.cellprops_delta_height', 0)),
580
- inline : 1
581
- }, {
582
- plugin_url : url
583
- });
584
- }
524
+ each(rows, function(row) {
525
+ var cellCount = row.cells.length, cell;
585
526
 
586
- return true;
527
+ // Remove col/rowspans
528
+ for (i = 0; i < cellCount; i++) {
529
+ cell = row.cells[i];
530
+ cell.colSpan = cell.rowSpan = 1;
531
+ }
587
532
 
588
- case "mceInsertTable":
589
- if (user_interface) {
590
- inst.windowManager.open({
591
- url : url + '/table.htm',
592
- width : 400 + parseInt(inst.getLang('table.table_delta_width', 0)),
593
- height : 320 + parseInt(inst.getLang('table.table_delta_height', 0)),
594
- inline : 1
595
- }, {
596
- plugin_url : url,
597
- action : value ? value.action : 0
598
- });
599
- }
533
+ // Needs more cells
534
+ for (i = cellCount; i < targetCellCount; i++)
535
+ row.appendChild(cloneCell(row.cells[cellCount - 1]));
600
536
 
601
- return true;
537
+ // Needs less cells
538
+ for (i = targetCellCount; i < cellCount; i++)
539
+ dom.remove(row.cells[i]);
602
540
 
603
- case "mceTableDelete":
604
- var table = inst.dom.getParent(inst.selection.getNode(), "table");
605
- if (table) {
606
- table.parentNode.removeChild(table);
607
- inst.execCommand('mceRepaint');
608
- }
609
- return true;
610
-
611
- case "mceTableSplitCells":
612
- case "mceTableMergeCells":
613
- case "mceTableInsertRowBefore":
614
- case "mceTableInsertRowAfter":
615
- case "mceTableDeleteRow":
616
- case "mceTableInsertColBefore":
617
- case "mceTableInsertColAfter":
618
- case "mceTableDeleteCol":
619
- case "mceTableCutRow":
620
- case "mceTableCopyRow":
621
- case "mceTablePasteRowBefore":
622
- case "mceTablePasteRowAfter":
623
- // No table just return (invalid command)
624
- if (!tableElm)
625
- return true;
626
-
627
- // Table has a tbody use that reference
628
- // Changed logic by ApTest 2005.07.12 (www.aptest.com)
629
- // Now lookk at the focused element and take its parentNode. That will be a tbody or a table.
630
- if (trElm && tableElm != trElm.parentNode)
631
- tableElm = trElm.parentNode;
632
-
633
- if (tableElm && trElm) {
634
- switch (command) {
635
- case "mceTableCutRow":
636
- if (!trElm || !tdElm)
637
- return true;
638
-
639
- inst.tableRowClipboard = copyRow(doc, tableElm, trElm);
640
- inst.execCommand("mceTableDeleteRow");
641
- break;
642
-
643
- case "mceTableCopyRow":
644
- if (!trElm || !tdElm)
645
- return true;
646
-
647
- inst.tableRowClipboard = copyRow(doc, tableElm, trElm);
648
- break;
649
-
650
- case "mceTablePasteRowBefore":
651
- if (!trElm || !tdElm)
652
- return true;
653
-
654
- var newTR = inst.tableRowClipboard.cloneNode(true);
655
-
656
- var prevTR = prevElm(trElm, "TR");
657
- if (prevTR != null)
658
- trimRow(tableElm, prevTR, prevTR.cells[0], newTR);
659
-
660
- trElm.parentNode.insertBefore(newTR, trElm);
661
- break;
662
-
663
- case "mceTablePasteRowAfter":
664
- if (!trElm || !tdElm)
665
- return true;
666
-
667
- var nextTR = nextElm(trElm, "TR");
668
- var newTR = inst.tableRowClipboard.cloneNode(true);
669
-
670
- trimRow(tableElm, trElm, tdElm, newTR);
671
-
672
- if (nextTR == null)
673
- trElm.parentNode.appendChild(newTR);
674
- else
675
- nextTR.parentNode.insertBefore(newTR, nextTR);
676
-
677
- break;
678
-
679
- case "mceTableInsertRowBefore":
680
- if (!trElm || !tdElm)
681
- return true;
682
-
683
- var grid = getTableGrid(tableElm);
684
- var cpos = getCellPos(grid, tdElm);
685
- var newTR = doc.createElement("tr");
686
- var lastTDElm = null;
687
-
688
- cpos.rowindex--;
689
- if (cpos.rowindex < 0)
690
- cpos.rowindex = 0;
691
-
692
- // Create cells
693
- for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
694
- if (tdElm != lastTDElm) {
695
- var sd = getColRowSpan(tdElm);
696
-
697
- if (sd['rowspan'] == 1) {
698
- var newTD = doc.createElement("td");
699
-
700
- if (!tinymce.isIE)
701
- newTD.innerHTML = '<br mce_bogus="1"/>';
702
-
703
- newTD.colSpan = tdElm.colSpan;
704
-
705
- newTR.appendChild(newTD);
706
- } else
707
- tdElm.rowSpan = sd['rowspan'] + 1;
708
-
709
- lastTDElm = tdElm;
710
- }
711
- }
541
+ // Add before/after
542
+ if (before)
543
+ targetRow.parentNode.insertBefore(row, targetRow);
544
+ else
545
+ dom.insertAfter(row, targetRow);
546
+ });
547
+ };
712
548
 
713
- trElm.parentNode.insertBefore(newTR, trElm);
714
- select(0, 1);
715
- break;
549
+ function getPos(target) {
550
+ var pos;
716
551
 
717
- case "mceTableInsertRowAfter":
718
- if (!trElm || !tdElm)
719
- return true;
552
+ each(grid, function(row, y) {
553
+ each(row, function(cell, x) {
554
+ if (cell.elm == target) {
555
+ pos = {x : x, y : y};
556
+ return false;
557
+ }
558
+ });
720
559
 
721
- var grid = getTableGrid(tableElm);
722
- var cpos = getCellPos(grid, tdElm);
723
- var newTR = doc.createElement("tr");
724
- var lastTDElm = null;
560
+ return !pos;
561
+ });
725
562
 
726
- // Create cells
727
- for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
728
- if (tdElm != lastTDElm) {
729
- var sd = getColRowSpan(tdElm);
563
+ return pos;
564
+ };
730
565
 
731
- if (sd['rowspan'] == 1) {
732
- var newTD = doc.createElement("td");
566
+ function setStartCell(cell) {
567
+ startPos = getPos(cell);
568
+ };
733
569
 
734
- if (!tinymce.isIE)
735
- newTD.innerHTML = '<br mce_bogus="1"/>';
570
+ function findEndPos() {
571
+ var pos, maxX, maxY;
736
572
 
737
- newTD.colSpan = tdElm.colSpan;
573
+ maxX = maxY = 0;
738
574
 
739
- newTR.appendChild(newTD);
740
- } else
741
- tdElm.rowSpan = sd['rowspan'] + 1;
575
+ each(grid, function(row, y) {
576
+ each(row, function(cell, x) {
577
+ var colSpan, rowSpan;
742
578
 
743
- lastTDElm = tdElm;
744
- }
745
- }
579
+ if (isCellSelected(cell)) {
580
+ cell = grid[y][x];
746
581
 
747
- if (newTR.hasChildNodes()) {
748
- var nextTR = nextElm(trElm, "TR");
749
- if (nextTR)
750
- nextTR.parentNode.insertBefore(newTR, nextTR);
751
- else
752
- tableElm.appendChild(newTR);
753
- }
582
+ if (x > maxX)
583
+ maxX = x;
754
584
 
755
- select(0, 1);
756
- break;
585
+ if (y > maxY)
586
+ maxY = y;
757
587
 
758
- case "mceTableDeleteRow":
759
- if (!trElm || !tdElm)
760
- return true;
588
+ if (cell.real) {
589
+ colSpan = cell.colspan - 1;
590
+ rowSpan = cell.rowspan - 1;
761
591
 
762
- var grid = getTableGrid(tableElm);
763
- var cpos = getCellPos(grid, tdElm);
592
+ if (colSpan) {
593
+ if (x + colSpan > maxX)
594
+ maxX = x + colSpan;
595
+ }
764
596
 
765
- // Only one row, remove whole table
766
- if (grid.length == 1 && tableElm.nodeName == 'TBODY') {
767
- inst.dom.remove(inst.dom.getParent(tableElm, "table"));
768
- return true;
769
- }
597
+ if (rowSpan) {
598
+ if (y + rowSpan > maxY)
599
+ maxY = y + rowSpan;
600
+ }
601
+ }
602
+ }
603
+ });
604
+ });
770
605
 
771
- // Move down row spanned cells
772
- var cells = trElm.cells;
773
- var nextTR = nextElm(trElm, "TR");
774
- for (var x=0; x<cells.length; x++) {
775
- if (cells[x].rowSpan > 1) {
776
- var newTD = cells[x].cloneNode(true);
777
- var sd = getColRowSpan(cells[x]);
606
+ return {x : maxX, y : maxY};
607
+ };
778
608
 
779
- newTD.rowSpan = sd.rowspan - 1;
609
+ function setEndCell(cell) {
610
+ var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan;
780
611
 
781
- var nextTD = nextTR.cells[x];
612
+ endPos = getPos(cell);
782
613
 
783
- if (nextTD == null)
784
- nextTR.appendChild(newTD);
785
- else
786
- nextTR.insertBefore(newTD, nextTD);
787
- }
788
- }
614
+ if (startPos && endPos) {
615
+ // Get start/end positions
616
+ startX = Math.min(startPos.x, endPos.x);
617
+ startY = Math.min(startPos.y, endPos.y);
618
+ endX = Math.max(startPos.x, endPos.x);
619
+ endY = Math.max(startPos.y, endPos.y);
789
620
 
790
- // Delete cells
791
- var lastTDElm = null;
792
- for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
793
- if (tdElm != lastTDElm) {
794
- var sd = getColRowSpan(tdElm);
621
+ // Expand end positon to include spans
622
+ maxX = endX;
623
+ maxY = endY;
795
624
 
796
- if (sd.rowspan > 1) {
797
- tdElm.rowSpan = sd.rowspan - 1;
798
- } else {
799
- trElm = tdElm.parentNode;
625
+ // Expand startX
626
+ for (y = startY; y <= maxY; y++) {
627
+ cell = grid[y][startX];
800
628
 
801
- if (trElm.parentNode)
802
- trElm._delete = true;
803
- }
629
+ if (!cell.real) {
630
+ if (startX - (cell.colspan - 1) < startX)
631
+ startX -= cell.colspan - 1;
632
+ }
633
+ }
804
634
 
805
- lastTDElm = tdElm;
806
- }
807
- }
635
+ // Expand startY
636
+ for (x = startX; x <= maxX; x++) {
637
+ cell = grid[startY][x];
808
638
 
809
- deleteMarked(tableElm);
639
+ if (!cell.real) {
640
+ if (startY - (cell.rowspan - 1) < startY)
641
+ startY -= cell.rowspan - 1;
642
+ }
643
+ }
810
644
 
811
- select(0, -1);
812
- break;
645
+ // Find max X, Y
646
+ for (y = startY; y <= endY; y++) {
647
+ for (x = startX; x <= endX; x++) {
648
+ cell = grid[y][x];
813
649
 
814
- case "mceTableInsertColBefore":
815
- if (!trElm || !tdElm)
816
- return true;
650
+ if (cell.real) {
651
+ colSpan = cell.colspan - 1;
652
+ rowSpan = cell.rowspan - 1;
817
653
 
818
- var grid = getTableGrid(inst.dom.getParent(tableElm, "table"));
819
- var cpos = getCellPos(grid, tdElm);
820
- var lastTDElm = null;
654
+ if (colSpan) {
655
+ if (x + colSpan > maxX)
656
+ maxX = x + colSpan;
657
+ }
821
658
 
822
- for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
823
- if (tdElm != lastTDElm) {
824
- var sd = getColRowSpan(tdElm);
659
+ if (rowSpan) {
660
+ if (y + rowSpan > maxY)
661
+ maxY = y + rowSpan;
662
+ }
663
+ }
664
+ }
665
+ }
825
666
 
826
- if (sd['colspan'] == 1) {
827
- var newTD = doc.createElement(tdElm.nodeName);
667
+ // Remove current selection
668
+ dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
828
669
 
829
- if (!tinymce.isIE)
830
- newTD.innerHTML = '<br mce_bogus="1"/>';
670
+ // Add new selection
671
+ for (y = startY; y <= maxY; y++) {
672
+ for (x = startX; x <= maxX; x++)
673
+ dom.addClass(grid[y][x].elm, 'mceSelected');
674
+ }
675
+ }
676
+ };
677
+
678
+ // Expose to public
679
+ tinymce.extend(this, {
680
+ deleteTable : deleteTable,
681
+ split : split,
682
+ merge : merge,
683
+ insertRow : insertRow,
684
+ insertCol : insertCol,
685
+ deleteCols : deleteCols,
686
+ deleteRows : deleteRows,
687
+ cutRows : cutRows,
688
+ copyRows : copyRows,
689
+ pasteRows : pasteRows,
690
+ getPos : getPos,
691
+ setStartCell : setStartCell,
692
+ setEndCell : setEndCell
693
+ });
694
+ };
831
695
 
832
- newTD.rowSpan = tdElm.rowSpan;
696
+ tinymce.create('tinymce.plugins.TablePlugin', {
697
+ init : function(ed, url) {
698
+ var winMan, clipboardRows;
833
699
 
834
- tdElm.parentNode.insertBefore(newTD, tdElm);
835
- } else
836
- tdElm.colSpan++;
700
+ function createTableGrid(node) {
701
+ var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table');
837
702
 
838
- lastTDElm = tdElm;
839
- }
840
- }
703
+ if (tblElm)
704
+ return new TableGrid(tblElm, ed.dom, selection);
705
+ };
841
706
 
842
- select();
843
- break;
707
+ function cleanup() {
708
+ // Restore selection possibilities
709
+ ed.getBody().style.webkitUserSelect = '';
710
+ ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
711
+ };
844
712
 
845
- case "mceTableInsertColAfter":
846
- if (!trElm || !tdElm)
847
- return true;
713
+ // Register buttons
714
+ each([
715
+ ['table', 'table.desc', 'mceInsertTable', true],
716
+ ['delete_table', 'table.del', 'mceTableDelete'],
717
+ ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'],
718
+ ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'],
719
+ ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'],
720
+ ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'],
721
+ ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'],
722
+ ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'],
723
+ ['row_props', 'table.row_desc', 'mceTableRowProps', true],
724
+ ['cell_props', 'table.cell_desc', 'mceTableCellProps', true],
725
+ ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true],
726
+ ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true]
727
+ ], function(c) {
728
+ ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});
729
+ });
848
730
 
849
- var grid = getTableGrid(inst.dom.getParent(tableElm, "table"));
850
- var cpos = getCellPos(grid, tdElm);
851
- var lastTDElm = null;
731
+ // Select whole table is a table border is clicked
732
+ if (!tinymce.isIE) {
733
+ ed.onClick.add(function(ed, e) {
734
+ e = e.target;
852
735
 
853
- for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
854
- if (tdElm != lastTDElm) {
855
- var sd = getColRowSpan(tdElm);
736
+ if (e.nodeName === 'TABLE')
737
+ ed.selection.select(e);
738
+ });
739
+ }
856
740
 
857
- if (sd['colspan'] == 1) {
858
- var newTD = doc.createElement(tdElm.nodeName);
741
+ // Handle node change updates
742
+ ed.onNodeChange.add(function(ed, cm, n) {
743
+ var p;
859
744
 
860
- if (!tinymce.isIE)
861
- newTD.innerHTML = '<br mce_bogus="1"/>';
745
+ n = ed.selection.getStart();
746
+ p = ed.dom.getParent(n, 'td,th,caption');
747
+ cm.setActive('table', n.nodeName === 'TABLE' || !!p);
862
748
 
863
- newTD.rowSpan = tdElm.rowSpan;
749
+ // Disable table tools if we are in caption
750
+ if (p && p.nodeName === 'CAPTION')
751
+ p = 0;
864
752
 
865
- var nextTD = nextElm(tdElm, "TD,TH");
866
- if (nextTD == null)
867
- tdElm.parentNode.appendChild(newTD);
868
- else
869
- nextTD.parentNode.insertBefore(newTD, nextTD);
870
- } else
871
- tdElm.colSpan++;
753
+ cm.setDisabled('delete_table', !p);
754
+ cm.setDisabled('delete_col', !p);
755
+ cm.setDisabled('delete_table', !p);
756
+ cm.setDisabled('delete_row', !p);
757
+ cm.setDisabled('col_after', !p);
758
+ cm.setDisabled('col_before', !p);
759
+ cm.setDisabled('row_after', !p);
760
+ cm.setDisabled('row_before', !p);
761
+ cm.setDisabled('row_props', !p);
762
+ cm.setDisabled('cell_props', !p);
763
+ cm.setDisabled('split_cells', !p);
764
+ cm.setDisabled('merge_cells', !p);
765
+ });
872
766
 
873
- lastTDElm = tdElm;
874
- }
875
- }
767
+ ed.onInit.add(function(ed) {
768
+ var startTable, startCell, dom = ed.dom, tableGrid;
876
769
 
877
- select(1);
878
- break;
770
+ winMan = ed.windowManager;
879
771
 
880
- case "mceTableDeleteCol":
881
- if (!trElm || !tdElm)
882
- return true;
772
+ // Add cell selection logic
773
+ ed.onMouseDown.add(function(ed, e) {
774
+ if (e.button != 2) {
775
+ cleanup();
883
776
 
884
- var grid = getTableGrid(tableElm);
885
- var cpos = getCellPos(grid, tdElm);
886
- var lastTDElm = null;
777
+ startCell = dom.getParent(e.target, 'td,th');
778
+ startTable = dom.getParent(startCell, 'table');
779
+ }
780
+ });
887
781
 
888
- // Only one col, remove whole table
889
- if ((grid.length > 1 && grid[0].length <= 1) && tableElm.nodeName == 'TBODY') {
890
- inst.dom.remove(inst.dom.getParent(tableElm, "table"));
891
- return true;
892
- }
782
+ dom.bind(ed.getDoc(), 'mouseover', function(e) {
783
+ var sel, table, target = e.target;
893
784
 
894
- // Delete cells
895
- for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
896
- if (tdElm != lastTDElm) {
897
- var sd = getColRowSpan(tdElm);
785
+ if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) {
786
+ table = dom.getParent(target, 'table');
787
+ if (table == startTable) {
788
+ if (!tableGrid) {
789
+ tableGrid = createTableGrid(table);
790
+ tableGrid.setStartCell(startCell);
898
791
 
899
- if (sd['colspan'] > 1)
900
- tdElm.colSpan = sd['colspan'] - 1;
901
- else {
902
- if (tdElm.parentNode)
903
- tdElm.parentNode.removeChild(tdElm);
904
- }
792
+ ed.getBody().style.webkitUserSelect = 'none';
793
+ }
905
794
 
906
- lastTDElm = tdElm;
907
- }
908
- }
795
+ tableGrid.setEndCell(target);
796
+ }
909
797
 
910
- select(-1);
911
- break;
798
+ // Remove current selection
799
+ sel = ed.selection.getSel();
912
800
 
913
- case "mceTableSplitCells":
914
- if (!trElm || !tdElm)
915
- return true;
801
+ if (sel.removeAllRanges)
802
+ sel.removeAllRanges();
803
+ else
804
+ sel.empty();
916
805
 
917
- var spandata = getColRowSpan(tdElm);
806
+ e.preventDefault();
807
+ }
808
+ });
918
809
 
919
- var colspan = spandata["colspan"];
920
- var rowspan = spandata["rowspan"];
810
+ ed.onMouseUp.add(function(ed, e) {
811
+ var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode;
921
812
 
922
- // Needs splitting
923
- if (colspan > 1 || rowspan > 1) {
924
- // Generate cols
925
- tdElm.colSpan = 1;
926
- for (var i=1; i<colspan; i++) {
927
- var newTD = doc.createElement("td");
813
+ // Move selection to startCell
814
+ if (startCell) {
815
+ if (tableGrid)
816
+ ed.getBody().style.webkitUserSelect = '';
928
817
 
929
- if (!tinymce.isIE)
930
- newTD.innerHTML = '<br mce_bogus="1"/>';
818
+ function setPoint(node, start) {
819
+ var walker = new tinymce.dom.TreeWalker(node, node);
931
820
 
932
- trElm.insertBefore(newTD, nextElm(tdElm, "TD,TH"));
821
+ do {
822
+ // Text node
823
+ if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) {
824
+ if (start)
825
+ rng.setStart(node, 0);
826
+ else
827
+ rng.setEnd(node, node.nodeValue.length);
933
828
 
934
- if (rowspan > 1)
935
- addRows(newTD, trElm, rowspan);
829
+ return;
936
830
  }
937
831
 
938
- addRows(tdElm, trElm, rowspan);
939
- }
940
-
941
- // Apply visual aids
942
- tableElm = inst.dom.getParent(inst.selection.getNode(), "table");
943
- break;
944
-
945
- case "mceTableMergeCells":
946
- var rows = [];
947
- var sel = inst.selection.getSel();
948
- var grid = getTableGrid(tableElm);
949
-
950
- if (tinymce.isIE || sel.rangeCount == 1) {
951
- if (user_interface) {
952
- // Setup template
953
- var sp = getColRowSpan(tdElm);
954
-
955
- inst.windowManager.open({
956
- url : url + '/merge_cells.htm',
957
- width : 240 + parseInt(inst.getLang('table.merge_cells_delta_width', 0)),
958
- height : 110 + parseInt(inst.getLang('table.merge_cells_delta_height', 0)),
959
- inline : 1
960
- }, {
961
- action : "update",
962
- numcols : sp.colspan,
963
- numrows : sp.rowspan,
964
- plugin_url : url
965
- });
966
-
967
- return true;
968
- } else {
969
- var numRows = parseInt(value['numrows']);
970
- var numCols = parseInt(value['numcols']);
971
- var cpos = getCellPos(grid, tdElm);
972
-
973
- if (("" + numRows) == "NaN")
974
- numRows = 1;
975
-
976
- if (("" + numCols) == "NaN")
977
- numCols = 1;
978
-
979
- // Get rows and cells
980
- var tRows = tableElm.rows;
981
- for (var y=cpos.rowindex; y<grid.length; y++) {
982
- var rowCells = [];
983
-
984
- for (var x=cpos.cellindex; x<grid[y].length; x++) {
985
- var td = getCell(grid, y, x);
986
-
987
- if (td && !inArray(rows, td) && !inArray(rowCells, td)) {
988
- var cp = getCellPos(grid, td);
989
-
990
- // Within range
991
- if (cp.cellindex < cpos.cellindex+numCols && cp.rowindex < cpos.rowindex+numRows)
992
- rowCells[rowCells.length] = td;
993
- }
994
- }
995
-
996
- if (rowCells.length > 0)
997
- rows[rows.length] = rowCells;
998
-
999
- var td = getCell(grid, cpos.rowindex, cpos.cellindex);
1000
- each(ed.dom.select('br', td), function(e, i) {
1001
- if (i > 0 && ed.dom.getAttrib('mce_bogus'))
1002
- ed.dom.remove(e);
1003
- });
1004
- }
832
+ // BR element
833
+ if (node.nodeName == 'BR') {
834
+ if (start)
835
+ rng.setStartBefore(node);
836
+ else
837
+ rng.setEndBefore(node);
1005
838
 
1006
- //return true;
839
+ return;
1007
840
  }
1008
- } else {
1009
- var cells = [];
1010
- var sel = inst.selection.getSel();
1011
- var lastTR = null;
1012
- var curRow = null;
1013
- var x1 = -1, y1 = -1, x2, y2;
1014
-
1015
- // Only one cell selected, whats the point?
1016
- if (sel.rangeCount < 2)
1017
- return true;
1018
-
1019
- // Get all selected cells
1020
- for (var i=0; i<sel.rangeCount; i++) {
1021
- var rng = sel.getRangeAt(i);
1022
- var tdElm = rng.startContainer.childNodes[rng.startOffset];
1023
-
1024
- if (!tdElm)
841
+ } while (node = (start ? walker.next() : walker.prev()));
842
+ };
843
+
844
+ // Try to expand text selection as much as we can only Gecko supports cell selection
845
+ selectedCells = dom.select('td.mceSelected,th.mceSelected');
846
+ if (selectedCells.length > 0) {
847
+ rng = dom.createRng();
848
+ node = selectedCells[0];
849
+ endNode = selectedCells[selectedCells.length - 1];
850
+
851
+ setPoint(node, 1);
852
+ walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table'));
853
+
854
+ do {
855
+ if (node.nodeName == 'TD' || node.nodeName == 'TH') {
856
+ if (!dom.hasClass(node, 'mceSelected'))
1025
857
  break;
1026
858
 
1027
- if (tdElm.nodeName == "TD" || tdElm.nodeName == "TH")
1028
- cells[cells.length] = tdElm;
859
+ lastNode = node;
1029
860
  }
861
+ } while (node = walker.next());
1030
862
 
1031
- // Get rows and cells
1032
- var tRows = tableElm.rows;
1033
- for (var y=0; y<tRows.length; y++) {
1034
- var rowCells = [];
863
+ setPoint(lastNode);
1035
864
 
1036
- for (var x=0; x<tRows[y].cells.length; x++) {
1037
- var td = tRows[y].cells[x];
865
+ sel.setRng(rng);
866
+ }
1038
867
 
1039
- for (var i=0; i<cells.length; i++) {
1040
- if (td == cells[i]) {
1041
- rowCells[rowCells.length] = td;
1042
- }
1043
- }
1044
- }
868
+ ed.nodeChanged();
869
+ startCell = tableGrid = startTable = null;
870
+ }
871
+ });
1045
872
 
1046
- if (rowCells.length > 0)
1047
- rows[rows.length] = rowCells;
1048
- }
873
+ ed.onKeyUp.add(function(ed, e) {
874
+ cleanup();
875
+ });
1049
876
 
1050
- // Find selected cells in grid and box
1051
- var curRow = [];
1052
- var lastTR = null;
1053
- for (var y=0; y<grid.length; y++) {
1054
- for (var x=0; x<grid[y].length; x++) {
1055
- grid[y][x]._selected = false;
1056
-
1057
- for (var i=0; i<cells.length; i++) {
1058
- if (grid[y][x] == cells[i]) {
1059
- // Get start pos
1060
- if (x1 == -1) {
1061
- x1 = x;
1062
- y1 = y;
1063
- }
1064
-
1065
- // Get end pos
1066
- x2 = x;
1067
- y2 = y;
1068
-
1069
- grid[y][x]._selected = true;
1070
- }
1071
- }
1072
- }
1073
- }
877
+ // Add context menu
878
+ if (ed && ed.plugins.contextmenu) {
879
+ ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {
880
+ var sm, se = ed.selection, el = se.getNode() || ed.getBody();
1074
881
 
1075
- // Is there gaps, if so deny
1076
- for (var y=y1; y<=y2; y++) {
1077
- for (var x=x1; x<=x2; x++) {
1078
- if (!grid[y][x]._selected) {
1079
- alert("Invalid selection for merge.");
1080
- return true;
1081
- }
1082
- }
1083
- }
882
+ if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th')) {
883
+ m.removeAll();
884
+
885
+ if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) {
886
+ m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});
887
+ m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});
888
+ m.addSeparator();
1084
889
  }
1085
890
 
1086
- // Validate selection and get total rowspan and colspan
1087
- var rowSpan = 1, colSpan = 1;
891
+ if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) {
892
+ m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});
893
+ m.addSeparator();
894
+ }
1088
895
 
1089
- // Validate horizontal and get total colspan
1090
- var lastRowSpan = -1;
1091
- for (var y=0; y<rows.length; y++) {
1092
- var rowColSpan = 0;
896
+ m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}});
897
+ m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'});
898
+ m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'});
899
+ m.addSeparator();
1093
900
 
1094
- for (var x=0; x<rows[y].length; x++) {
1095
- var sd = getColRowSpan(rows[y][x]);
901
+ // Cell menu
902
+ sm = m.addMenu({title : 'table.cell'});
903
+ sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'});
904
+ sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'});
905
+ sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'});
1096
906
 
1097
- rowColSpan += sd['colspan'];
907
+ // Row menu
908
+ sm = m.addMenu({title : 'table.row'});
909
+ sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'});
910
+ sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'});
911
+ sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'});
912
+ sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'});
913
+ sm.addSeparator();
914
+ sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'});
915
+ sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'});
916
+ sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows);
917
+ sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows);
1098
918
 
1099
- if (lastRowSpan != -1 && sd['rowspan'] != lastRowSpan) {
1100
- alert("Invalid selection for merge.");
1101
- return true;
1102
- }
919
+ // Column menu
920
+ sm = m.addMenu({title : 'table.col'});
921
+ sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'});
922
+ sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'});
923
+ sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'});
924
+ } else
925
+ m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'});
926
+ });
927
+ }
1103
928
 
1104
- lastRowSpan = sd['rowspan'];
1105
- }
929
+ // Fixes an issue on Gecko where it's impossible to place the caret behind a table
930
+ // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled
931
+ if (!tinymce.isIE) {
932
+ function fixTableCaretPos() {
933
+ var last;
1106
934
 
1107
- if (rowColSpan > colSpan)
1108
- colSpan = rowColSpan;
935
+ // Skip empty text nodes form the end
936
+ for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ;
1109
937
 
1110
- lastRowSpan = -1;
1111
- }
938
+ if (last && last.nodeName == 'TABLE')
939
+ ed.dom.add(ed.getBody(), 'p', null, '<br mce_bogus="1" />');
940
+ };
941
+
942
+ // Fixes an bug where it's impossible to place the caret before a table in Gecko
943
+ // this fix solves it by detecting when the caret is at the beginning of such a table
944
+ // and then manually moves the caret infront of the table
945
+ if (tinymce.isGecko) {
946
+ ed.onKeyDown.add(function(ed, e) {
947
+ var rng, table, dom = ed.dom;
948
+
949
+ // On gecko it's not possible to place the caret before a table
950
+ if (e.keyCode == 37 || e.keyCode == 38) {
951
+ rng = ed.selection.getRng();
952
+ table = dom.getParent(rng.startContainer, 'table');
1112
953
 
1113
- // Validate vertical and get total rowspan
1114
- var lastColSpan = -1;
1115
- for (var x=0; x<rows[0].length; x++) {
1116
- var colRowSpan = 0;
954
+ if (table && ed.getBody().firstChild == table) {
955
+ if (isAtStart(rng, table)) {
956
+ rng = dom.createRng();
1117
957
 
1118
- for (var y=0; y<rows.length; y++) {
1119
- var sd = getColRowSpan(rows[y][x]);
958
+ rng.setStartBefore(table);
959
+ rng.setEndBefore(table);
1120
960
 
1121
- colRowSpan += sd['rowspan'];
961
+ ed.selection.setRng(rng);
1122
962
 
1123
- if (lastColSpan != -1 && sd['colspan'] != lastColSpan) {
1124
- alert("Invalid selection for merge.");
1125
- return true;
963
+ e.preventDefault();
1126
964
  }
1127
-
1128
- lastColSpan = sd['colspan'];
1129
965
  }
966
+ }
967
+ });
968
+ }
1130
969
 
1131
- if (colRowSpan > rowSpan)
1132
- rowSpan = colRowSpan;
970
+ ed.onKeyUp.add(fixTableCaretPos);
971
+ ed.onSetContent.add(fixTableCaretPos);
972
+ ed.onVisualAid.add(fixTableCaretPos);
1133
973
 
1134
- lastColSpan = -1;
1135
- }
974
+ ed.onPreProcess.add(function(ed, o) {
975
+ var last = o.node.lastChild;
1136
976
 
1137
- // Setup td
1138
- tdElm = rows[0][0];
1139
- tdElm.rowSpan = rowSpan;
1140
- tdElm.colSpan = colSpan;
977
+ if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR')
978
+ ed.dom.remove(last);
979
+ });
1141
980
 
1142
- // Merge cells
1143
- for (var y=0; y<rows.length; y++) {
1144
- for (var x=0; x<rows[y].length; x++) {
1145
- var html = rows[y][x].innerHTML;
1146
- var chk = html.replace(/[ \t\r\n]/g, "");
981
+ fixTableCaretPos();
982
+ }
983
+ });
1147
984
 
1148
- if (chk != "<br/>" && chk != "<br>" && chk != '<br mce_bogus="1"/>' && (x+y > 0))
1149
- tdElm.innerHTML += html;
985
+ // Register action commands
986
+ each({
987
+ mceTableSplitCells : function(grid) {
988
+ grid.split();
989
+ },
1150
990
 
1151
- // Not current cell
1152
- if (rows[y][x] != tdElm && !rows[y][x]._deleted) {
1153
- var cpos = getCellPos(grid, rows[y][x]);
1154
- var tr = rows[y][x].parentNode;
991
+ mceTableMergeCells : function(grid) {
992
+ var rowSpan, colSpan, cell;
1155
993
 
1156
- tr.removeChild(rows[y][x]);
1157
- rows[y][x]._deleted = true;
994
+ cell = ed.dom.getParent(ed.selection.getNode(), 'th,td');
995
+ if (cell) {
996
+ rowSpan = cell.rowSpan;
997
+ colSpan = cell.colSpan;
998
+ }
1158
999
 
1159
- // Empty TR, remove it
1160
- if (!tr.hasChildNodes()) {
1161
- tr.parentNode.removeChild(tr);
1000
+ if (!ed.dom.select('td.mceSelected,th.mceSelected').length) {
1001
+ winMan.open({
1002
+ url : url + '/merge_cells.htm',
1003
+ width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)),
1004
+ height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)),
1005
+ inline : 1
1006
+ }, {
1007
+ rows : rowSpan,
1008
+ cols : colSpan,
1009
+ onaction : function(data) {
1010
+ grid.merge(cell, data.cols, data.rows);
1011
+ },
1012
+ plugin_url : url
1013
+ });
1014
+ } else
1015
+ grid.merge();
1016
+ },
1162
1017
 
1163
- var lastCell = null;
1164
- for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) {
1165
- if (cellElm != lastCell && cellElm.rowSpan > 1)
1166
- cellElm.rowSpan--;
1018
+ mceTableInsertRowBefore : function(grid) {
1019
+ grid.insertRow(true);
1020
+ },
1167
1021
 
1168
- lastCell = cellElm;
1169
- }
1022
+ mceTableInsertRowAfter : function(grid) {
1023
+ grid.insertRow();
1024
+ },
1170
1025
 
1171
- if (tdElm.rowSpan > 1)
1172
- tdElm.rowSpan--;
1173
- }
1174
- }
1175
- }
1176
- }
1026
+ mceTableInsertColBefore : function(grid) {
1027
+ grid.insertCol(true);
1028
+ },
1177
1029
 
1178
- // Remove all but one bogus br
1179
- each(ed.dom.select('br', tdElm), function(e, i) {
1180
- if (i > 0 && ed.dom.getAttrib(e, 'mce_bogus'))
1181
- ed.dom.remove(e);
1182
- });
1030
+ mceTableInsertColAfter : function(grid) {
1031
+ grid.insertCol();
1032
+ },
1183
1033
 
1184
- break;
1185
- }
1034
+ mceTableDeleteCol : function(grid) {
1035
+ grid.deleteCols();
1036
+ },
1186
1037
 
1187
- tableElm = inst.dom.getParent(inst.selection.getNode(), "table");
1188
- inst.addVisual(tableElm);
1189
- inst.nodeChanged();
1190
- }
1038
+ mceTableDeleteRow : function(grid) {
1039
+ grid.deleteRows();
1040
+ },
1191
1041
 
1192
- return true;
1193
- }
1042
+ mceTableCutRow : function(grid) {
1043
+ clipboardRows = grid.cutRows();
1044
+ },
1045
+
1046
+ mceTableCopyRow : function(grid) {
1047
+ clipboardRows = grid.copyRows();
1048
+ },
1194
1049
 
1195
- // Pass to next handler in chain
1196
- return false;
1050
+ mceTablePasteRowBefore : function(grid) {
1051
+ grid.pasteRows(clipboardRows, true);
1052
+ },
1053
+
1054
+ mceTablePasteRowAfter : function(grid) {
1055
+ grid.pasteRows(clipboardRows);
1056
+ },
1057
+
1058
+ mceTableDelete : function(grid) {
1059
+ grid.deleteTable();
1060
+ }
1061
+ }, function(func, name) {
1062
+ ed.addCommand(name, function() {
1063
+ var grid = createTableGrid();
1064
+
1065
+ if (grid) {
1066
+ func(grid);
1067
+ ed.execCommand('mceRepaint');
1068
+ cleanup();
1069
+ }
1070
+ });
1071
+ });
1072
+
1073
+ // Register dialog commands
1074
+ each({
1075
+ mceInsertTable : function(val) {
1076
+ winMan.open({
1077
+ url : url + '/table.htm',
1078
+ width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)),
1079
+ height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)),
1080
+ inline : 1
1081
+ }, {
1082
+ plugin_url : url,
1083
+ action : val ? val.action : 0
1084
+ });
1085
+ },
1086
+
1087
+ mceTableRowProps : function() {
1088
+ winMan.open({
1089
+ url : url + '/row.htm',
1090
+ width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)),
1091
+ height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)),
1092
+ inline : 1
1093
+ }, {
1094
+ plugin_url : url
1095
+ });
1096
+ },
1097
+
1098
+ mceTableCellProps : function() {
1099
+ winMan.open({
1100
+ url : url + '/cell.htm',
1101
+ width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)),
1102
+ height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)),
1103
+ inline : 1
1104
+ }, {
1105
+ plugin_url : url
1106
+ });
1107
+ }
1108
+ }, function(func, name) {
1109
+ ed.addCommand(name, function(ui, val) {
1110
+ func(val);
1111
+ });
1112
+ });
1197
1113
  }
1198
1114
  });
1199
1115
 
1200
1116
  // Register plugin
1201
1117
  tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);
1202
- })();
1118
+ })(tinymce);