muck-contents 0.2.21 → 0.2.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (410) hide show
  1. data/README.rdoc +4 -0
  2. data/VERSION +1 -1
  3. data/muck-contents.gemspec +88 -9
  4. data/public/javascripts/tiny_mce/langs/ar.js +95 -95
  5. data/public/javascripts/tiny_mce/langs/ca.js +65 -65
  6. data/public/javascripts/tiny_mce/langs/cs.js +14 -14
  7. data/public/javascripts/tiny_mce/langs/es.js +1 -1
  8. data/public/javascripts/tiny_mce/langs/fa.js +1 -1
  9. data/public/javascripts/tiny_mce/langs/fr.js +41 -41
  10. data/public/javascripts/tiny_mce/langs/he.js +8 -8
  11. data/public/javascripts/tiny_mce/langs/hr.js +2 -1
  12. data/public/javascripts/tiny_mce/langs/hu.js +10 -10
  13. data/public/javascripts/tiny_mce/langs/hy.js +157 -0
  14. data/public/javascripts/tiny_mce/langs/id.js +71 -71
  15. data/public/javascripts/tiny_mce/langs/ii.js +78 -70
  16. data/public/javascripts/tiny_mce/langs/ja.js +11 -11
  17. data/public/javascripts/tiny_mce/langs/lb.js +155 -0
  18. data/public/javascripts/tiny_mce/langs/pl.js +3 -3
  19. data/public/javascripts/tiny_mce/langs/ps.js +154 -0
  20. data/public/javascripts/tiny_mce/langs/pt.js +2 -2
  21. data/public/javascripts/tiny_mce/langs/ru.js +61 -59
  22. data/public/javascripts/tiny_mce/langs/sk.js +30 -30
  23. data/public/javascripts/tiny_mce/langs/th.js +1 -1
  24. data/public/javascripts/tiny_mce/langs/tr.js +51 -51
  25. data/public/javascripts/tiny_mce/langs/tw.js +2 -0
  26. data/public/javascripts/tiny_mce/langs/uk.js +7 -7
  27. data/public/javascripts/tiny_mce/langs/ur.js +154 -0
  28. data/public/javascripts/tiny_mce/langs/vi.js +75 -75
  29. data/public/javascripts/tiny_mce/langs/zu.js +162 -0
  30. data/public/javascripts/tiny_mce/plugins/advhr/editor_plugin_src.js +6 -3
  31. data/public/javascripts/tiny_mce/plugins/advhr/langs/ar_dlg.js +3 -3
  32. data/public/javascripts/tiny_mce/plugins/advhr/langs/ca_dlg.js +1 -1
  33. data/public/javascripts/tiny_mce/plugins/advhr/langs/hy_dlg.js +5 -0
  34. data/public/javascripts/tiny_mce/plugins/advhr/langs/id_dlg.js +3 -3
  35. data/public/javascripts/tiny_mce/plugins/advhr/langs/ii_dlg.js +1 -1
  36. data/public/javascripts/tiny_mce/plugins/advhr/langs/lb_dlg.js +5 -0
  37. data/public/javascripts/tiny_mce/plugins/advhr/langs/ps_dlg.js +5 -0
  38. data/public/javascripts/tiny_mce/plugins/advhr/langs/ur_dlg.js +5 -0
  39. data/public/javascripts/tiny_mce/plugins/advhr/langs/vi_dlg.js +3 -3
  40. data/public/javascripts/tiny_mce/plugins/advhr/langs/zu_dlg.js +5 -0
  41. data/public/javascripts/tiny_mce/plugins/advhr/rule.htm +2 -7
  42. data/public/javascripts/tiny_mce/plugins/advimage/editor_plugin_src.js +6 -3
  43. data/public/javascripts/tiny_mce/plugins/advimage/image.htm +2 -7
  44. data/public/javascripts/tiny_mce/plugins/advimage/js/image.js +1 -1
  45. data/public/javascripts/tiny_mce/plugins/advimage/langs/ar_dlg.js +41 -41
  46. data/public/javascripts/tiny_mce/plugins/advimage/langs/ca_dlg.js +23 -23
  47. data/public/javascripts/tiny_mce/plugins/advimage/langs/de_dlg.js +1 -1
  48. data/public/javascripts/tiny_mce/plugins/advimage/langs/fa_dlg.js +2 -2
  49. data/public/javascripts/tiny_mce/plugins/advimage/langs/fr_dlg.js +14 -14
  50. data/public/javascripts/tiny_mce/plugins/advimage/langs/hy_dlg.js +43 -0
  51. data/public/javascripts/tiny_mce/plugins/advimage/langs/id_dlg.js +22 -22
  52. data/public/javascripts/tiny_mce/plugins/advimage/langs/ii_dlg.js +24 -24
  53. data/public/javascripts/tiny_mce/plugins/advimage/langs/ja_dlg.js +10 -10
  54. data/public/javascripts/tiny_mce/plugins/advimage/langs/lb_dlg.js +43 -0
  55. data/public/javascripts/tiny_mce/plugins/advimage/langs/ps_dlg.js +43 -0
  56. data/public/javascripts/tiny_mce/plugins/advimage/langs/pt_dlg.js +1 -1
  57. data/public/javascripts/tiny_mce/plugins/advimage/langs/ru_dlg.js +31 -31
  58. data/public/javascripts/tiny_mce/plugins/advimage/langs/sk_dlg.js +2 -2
  59. data/public/javascripts/tiny_mce/plugins/advimage/langs/th_dlg.js +1 -1
  60. data/public/javascripts/tiny_mce/plugins/advimage/langs/tr_dlg.js +13 -13
  61. data/public/javascripts/tiny_mce/plugins/advimage/langs/uk_dlg.js +1 -1
  62. data/public/javascripts/tiny_mce/plugins/advimage/langs/ur_dlg.js +43 -0
  63. data/public/javascripts/tiny_mce/plugins/advimage/langs/vi_dlg.js +12 -12
  64. data/public/javascripts/tiny_mce/plugins/advimage/langs/zu_dlg.js +43 -0
  65. data/public/javascripts/tiny_mce/plugins/advlink/editor_plugin_src.js +6 -3
  66. data/public/javascripts/tiny_mce/plugins/advlink/js/advlink.js +1 -1
  67. data/public/javascripts/tiny_mce/plugins/advlink/langs/ar_dlg.js +49 -49
  68. data/public/javascripts/tiny_mce/plugins/advlink/langs/ca_dlg.js +27 -27
  69. data/public/javascripts/tiny_mce/plugins/advlink/langs/fr_dlg.js +12 -12
  70. data/public/javascripts/tiny_mce/plugins/advlink/langs/he_dlg.js +1 -1
  71. data/public/javascripts/tiny_mce/plugins/advlink/langs/hy_dlg.js +52 -0
  72. data/public/javascripts/tiny_mce/plugins/advlink/langs/id_dlg.js +32 -32
  73. data/public/javascripts/tiny_mce/plugins/advlink/langs/ii_dlg.js +31 -31
  74. data/public/javascripts/tiny_mce/plugins/advlink/langs/ja_dlg.js +3 -3
  75. data/public/javascripts/tiny_mce/plugins/advlink/langs/lb_dlg.js +52 -0
  76. data/public/javascripts/tiny_mce/plugins/advlink/langs/ps_dlg.js +52 -0
  77. data/public/javascripts/tiny_mce/plugins/advlink/langs/pt_dlg.js +1 -1
  78. data/public/javascripts/tiny_mce/plugins/advlink/langs/ru_dlg.js +38 -38
  79. data/public/javascripts/tiny_mce/plugins/advlink/langs/sk_dlg.js +8 -8
  80. data/public/javascripts/tiny_mce/plugins/advlink/langs/th_dlg.js +5 -5
  81. data/public/javascripts/tiny_mce/plugins/advlink/langs/tr_dlg.js +23 -23
  82. data/public/javascripts/tiny_mce/plugins/advlink/langs/uk_dlg.js +11 -11
  83. data/public/javascripts/tiny_mce/plugins/advlink/langs/ur_dlg.js +52 -0
  84. data/public/javascripts/tiny_mce/plugins/advlink/langs/vi_dlg.js +16 -16
  85. data/public/javascripts/tiny_mce/plugins/advlink/langs/zu_dlg.js +52 -0
  86. data/public/javascripts/tiny_mce/plugins/advlink/link.htm +2 -7
  87. data/public/javascripts/tiny_mce/plugins/advlist/editor_plugin.js +1 -0
  88. data/public/javascripts/tiny_mce/plugins/advlist/editor_plugin_src.js +154 -0
  89. data/public/javascripts/tiny_mce/plugins/autoresize/editor_plugin_src.js +26 -23
  90. data/public/javascripts/tiny_mce/plugins/autosave/editor_plugin.js +1 -1
  91. data/public/javascripts/tiny_mce/plugins/autosave/editor_plugin_src.js +388 -17
  92. data/public/javascripts/tiny_mce/plugins/autosave/langs/en.js +4 -0
  93. data/public/javascripts/tiny_mce/plugins/bbcode/editor_plugin_src.js +6 -3
  94. data/public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js +35 -3
  95. data/public/javascripts/tiny_mce/plugins/directionality/editor_plugin_src.js +6 -3
  96. data/public/javascripts/tiny_mce/plugins/emotions/editor_plugin.js +1 -1
  97. data/public/javascripts/tiny_mce/plugins/emotions/editor_plugin_src.js +8 -5
  98. data/public/javascripts/tiny_mce/plugins/emotions/langs/ar_dlg.js +18 -18
  99. data/public/javascripts/tiny_mce/plugins/emotions/langs/ca_dlg.js +14 -14
  100. data/public/javascripts/tiny_mce/plugins/emotions/langs/fr_dlg.js +3 -3
  101. data/public/javascripts/tiny_mce/plugins/emotions/langs/hy_dlg.js +20 -0
  102. data/public/javascripts/tiny_mce/plugins/emotions/langs/id_dlg.js +1 -1
  103. data/public/javascripts/tiny_mce/plugins/emotions/langs/ii_dlg.js +3 -3
  104. data/public/javascripts/tiny_mce/plugins/emotions/langs/ja_dlg.js +2 -2
  105. data/public/javascripts/tiny_mce/plugins/emotions/langs/lb_dlg.js +20 -0
  106. data/public/javascripts/tiny_mce/plugins/emotions/langs/ps_dlg.js +20 -0
  107. data/public/javascripts/tiny_mce/plugins/emotions/langs/ru_dlg.js +18 -18
  108. data/public/javascripts/tiny_mce/plugins/emotions/langs/sk_dlg.js +18 -18
  109. data/public/javascripts/tiny_mce/plugins/emotions/langs/th_dlg.js +1 -1
  110. data/public/javascripts/tiny_mce/plugins/emotions/langs/tr_dlg.js +12 -12
  111. data/public/javascripts/tiny_mce/plugins/emotions/langs/ur_dlg.js +20 -0
  112. data/public/javascripts/tiny_mce/plugins/emotions/langs/vi_dlg.js +18 -18
  113. data/public/javascripts/tiny_mce/plugins/emotions/langs/zu_dlg.js +20 -0
  114. data/public/javascripts/tiny_mce/plugins/example/dialog.htm +2 -7
  115. data/public/javascripts/tiny_mce/plugins/example/editor_plugin_src.js +6 -3
  116. data/public/javascripts/tiny_mce/plugins/fullpage/editor_plugin_src.js +6 -3
  117. data/public/javascripts/tiny_mce/plugins/fullpage/fullpage.htm +2 -7
  118. data/public/javascripts/tiny_mce/plugins/fullpage/js/fullpage.js +17 -7
  119. data/public/javascripts/tiny_mce/plugins/fullpage/langs/ar_dlg.js +78 -78
  120. data/public/javascripts/tiny_mce/plugins/fullpage/langs/ca_dlg.js +38 -38
  121. data/public/javascripts/tiny_mce/plugins/fullpage/langs/fr_dlg.js +4 -4
  122. data/public/javascripts/tiny_mce/plugins/fullpage/langs/he_dlg.js +20 -20
  123. data/public/javascripts/tiny_mce/plugins/fullpage/langs/hy_dlg.js +85 -0
  124. data/public/javascripts/tiny_mce/plugins/fullpage/langs/ii_dlg.js +51 -51
  125. data/public/javascripts/tiny_mce/plugins/fullpage/langs/ja_dlg.js +4 -4
  126. data/public/javascripts/tiny_mce/plugins/fullpage/langs/lb_dlg.js +85 -0
  127. data/public/javascripts/tiny_mce/plugins/fullpage/langs/ps_dlg.js +85 -0
  128. data/public/javascripts/tiny_mce/plugins/fullpage/langs/pt_dlg.js +1 -1
  129. data/public/javascripts/tiny_mce/plugins/fullpage/langs/ru_dlg.js +54 -54
  130. data/public/javascripts/tiny_mce/plugins/fullpage/langs/sk_dlg.js +6 -6
  131. data/public/javascripts/tiny_mce/plugins/fullpage/langs/tr_dlg.js +42 -42
  132. data/public/javascripts/tiny_mce/plugins/fullpage/langs/tw_dlg.js +3 -3
  133. data/public/javascripts/tiny_mce/plugins/fullpage/langs/ur_dlg.js +85 -0
  134. data/public/javascripts/tiny_mce/plugins/fullpage/langs/zu_dlg.js +85 -0
  135. data/public/javascripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js +6 -3
  136. data/public/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +0 -1
  137. data/public/javascripts/tiny_mce/plugins/iespell/editor_plugin_src.js +6 -3
  138. data/public/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +6 -3
  139. data/public/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js +6 -3
  140. data/public/javascripts/tiny_mce/plugins/layer/editor_plugin_src.js +6 -3
  141. data/public/javascripts/tiny_mce/plugins/legacyoutput/editor_plugin.js +1 -0
  142. data/public/javascripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js +136 -0
  143. data/public/javascripts/tiny_mce/plugins/media/editor_plugin.js +1 -1
  144. data/public/javascripts/tiny_mce/plugins/media/editor_plugin_src.js +18 -9
  145. data/public/javascripts/tiny_mce/plugins/media/langs/ar_dlg.js +86 -86
  146. data/public/javascripts/tiny_mce/plugins/media/langs/ca_dlg.js +67 -67
  147. data/public/javascripts/tiny_mce/plugins/media/langs/cs_dlg.js +12 -12
  148. data/public/javascripts/tiny_mce/plugins/media/langs/fr_dlg.js +15 -15
  149. data/public/javascripts/tiny_mce/plugins/media/langs/hy_dlg.js +103 -0
  150. data/public/javascripts/tiny_mce/plugins/media/langs/id_dlg.js +16 -16
  151. data/public/javascripts/tiny_mce/plugins/media/langs/ii_dlg.js +70 -70
  152. data/public/javascripts/tiny_mce/plugins/media/langs/ja_dlg.js +2 -2
  153. data/public/javascripts/tiny_mce/plugins/media/langs/lb_dlg.js +103 -0
  154. data/public/javascripts/tiny_mce/plugins/media/langs/ps_dlg.js +103 -0
  155. data/public/javascripts/tiny_mce/plugins/media/langs/ru_dlg.js +88 -88
  156. data/public/javascripts/tiny_mce/plugins/media/langs/sk_dlg.js +18 -18
  157. data/public/javascripts/tiny_mce/plugins/media/langs/tr_dlg.js +44 -44
  158. data/public/javascripts/tiny_mce/plugins/media/langs/uk_dlg.js +24 -24
  159. data/public/javascripts/tiny_mce/plugins/media/langs/ur_dlg.js +103 -0
  160. data/public/javascripts/tiny_mce/plugins/media/langs/vi_dlg.js +11 -11
  161. data/public/javascripts/tiny_mce/plugins/media/langs/zu_dlg.js +103 -0
  162. data/public/javascripts/tiny_mce/plugins/media/media.htm +2 -7
  163. data/public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js +6 -3
  164. data/public/javascripts/tiny_mce/plugins/noneditable/editor_plugin_src.js +6 -3
  165. data/public/javascripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js +6 -3
  166. data/public/javascripts/tiny_mce/plugins/paste/editor_plugin.js +1 -1
  167. data/public/javascripts/tiny_mce/plugins/paste/editor_plugin_src.js +524 -107
  168. data/public/javascripts/tiny_mce/plugins/paste/langs/ar_dlg.js +3 -3
  169. data/public/javascripts/tiny_mce/plugins/paste/langs/ca_dlg.js +3 -3
  170. data/public/javascripts/tiny_mce/plugins/paste/langs/fr_dlg.js +1 -1
  171. data/public/javascripts/tiny_mce/plugins/paste/langs/hy_dlg.js +5 -0
  172. data/public/javascripts/tiny_mce/plugins/paste/langs/id_dlg.js +2 -2
  173. data/public/javascripts/tiny_mce/plugins/paste/langs/ii_dlg.js +3 -3
  174. data/public/javascripts/tiny_mce/plugins/paste/langs/ja_dlg.js +1 -1
  175. data/public/javascripts/tiny_mce/plugins/paste/langs/lb_dlg.js +5 -0
  176. data/public/javascripts/tiny_mce/plugins/paste/langs/ps_dlg.js +5 -0
  177. data/public/javascripts/tiny_mce/plugins/paste/langs/ru_dlg.js +3 -3
  178. data/public/javascripts/tiny_mce/plugins/paste/langs/sk_dlg.js +2 -2
  179. data/public/javascripts/tiny_mce/plugins/paste/langs/tr_dlg.js +3 -3
  180. data/public/javascripts/tiny_mce/plugins/paste/langs/ur_dlg.js +5 -0
  181. data/public/javascripts/tiny_mce/plugins/paste/langs/vi_dlg.js +3 -3
  182. data/public/javascripts/tiny_mce/plugins/paste/langs/zu_dlg.js +5 -0
  183. data/public/javascripts/tiny_mce/plugins/paste/pastetext.htm +2 -8
  184. data/public/javascripts/tiny_mce/plugins/paste/pasteword.htm +2 -8
  185. data/public/javascripts/tiny_mce/plugins/preview/editor_plugin_src.js +6 -3
  186. data/public/javascripts/tiny_mce/plugins/print/editor_plugin_src.js +6 -3
  187. data/public/javascripts/tiny_mce/plugins/save/editor_plugin_src.js +6 -3
  188. data/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin.js +1 -1
  189. data/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js +7 -4
  190. data/public/javascripts/tiny_mce/plugins/searchreplace/js/searchreplace.js +4 -0
  191. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/ar_dlg.js +14 -14
  192. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/ca_dlg.js +10 -10
  193. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/fa_dlg.js +2 -2
  194. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/fr_dlg.js +10 -10
  195. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/hy_dlg.js +16 -0
  196. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/id_dlg.js +13 -13
  197. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/ii_dlg.js +11 -11
  198. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/lb_dlg.js +16 -0
  199. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/pl_dlg.js +2 -2
  200. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/ps_dlg.js +16 -0
  201. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/ru_dlg.js +8 -8
  202. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/sk_dlg.js +11 -11
  203. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/tr_dlg.js +5 -5
  204. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/ur_dlg.js +16 -0
  205. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/vi_dlg.js +14 -14
  206. data/public/javascripts/tiny_mce/plugins/searchreplace/langs/zu_dlg.js +16 -0
  207. data/public/javascripts/tiny_mce/plugins/searchreplace/searchreplace.htm +4 -9
  208. data/public/javascripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js +6 -3
  209. data/public/javascripts/tiny_mce/plugins/style/editor_plugin_src.js +6 -3
  210. data/public/javascripts/tiny_mce/plugins/style/langs/ar_dlg.js +61 -61
  211. data/public/javascripts/tiny_mce/plugins/style/langs/ca_dlg.js +23 -23
  212. data/public/javascripts/tiny_mce/plugins/style/langs/cs_dlg.js +1 -1
  213. data/public/javascripts/tiny_mce/plugins/style/langs/fr_dlg.js +4 -4
  214. data/public/javascripts/tiny_mce/plugins/style/langs/he_dlg.js +13 -13
  215. data/public/javascripts/tiny_mce/plugins/style/langs/hy_dlg.js +63 -0
  216. data/public/javascripts/tiny_mce/plugins/style/langs/ii_dlg.js +33 -33
  217. data/public/javascripts/tiny_mce/plugins/style/langs/ja_dlg.js +1 -1
  218. data/public/javascripts/tiny_mce/plugins/style/langs/lb_dlg.js +63 -0
  219. data/public/javascripts/tiny_mce/plugins/style/langs/pl_dlg.js +1 -1
  220. data/public/javascripts/tiny_mce/plugins/style/langs/ps_dlg.js +63 -0
  221. data/public/javascripts/tiny_mce/plugins/style/langs/ru_dlg.js +21 -21
  222. data/public/javascripts/tiny_mce/plugins/style/langs/sk_dlg.js +10 -10
  223. data/public/javascripts/tiny_mce/plugins/style/langs/th_dlg.js +3 -3
  224. data/public/javascripts/tiny_mce/plugins/style/langs/tr_dlg.js +18 -18
  225. data/public/javascripts/tiny_mce/plugins/style/langs/tw_dlg.js +2 -2
  226. data/public/javascripts/tiny_mce/plugins/style/langs/uk_dlg.js +19 -19
  227. data/public/javascripts/tiny_mce/plugins/style/langs/ur_dlg.js +63 -0
  228. data/public/javascripts/tiny_mce/plugins/style/langs/zu_dlg.js +63 -0
  229. data/public/javascripts/tiny_mce/plugins/style/props.htm +4 -8
  230. data/public/javascripts/tiny_mce/plugins/tabfocus/editor_plugin.js +1 -1
  231. data/public/javascripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js +7 -4
  232. data/public/javascripts/tiny_mce/plugins/table/cell.htm +2 -7
  233. data/public/javascripts/tiny_mce/plugins/table/editor_plugin.js +1 -1
  234. data/public/javascripts/tiny_mce/plugins/table/editor_plugin_src.js +895 -937
  235. data/public/javascripts/tiny_mce/plugins/table/js/cell.js +40 -23
  236. data/public/javascripts/tiny_mce/plugins/table/js/merge_cells.js +18 -20
  237. data/public/javascripts/tiny_mce/plugins/table/js/row.js +47 -22
  238. data/public/javascripts/tiny_mce/plugins/table/js/table.js +17 -8
  239. data/public/javascripts/tiny_mce/plugins/table/langs/ar_dlg.js +70 -70
  240. data/public/javascripts/tiny_mce/plugins/table/langs/ca_dlg.js +36 -36
  241. data/public/javascripts/tiny_mce/plugins/table/langs/fr_dlg.js +14 -14
  242. data/public/javascripts/tiny_mce/plugins/table/langs/he_dlg.js +2 -2
  243. data/public/javascripts/tiny_mce/plugins/table/langs/hy_dlg.js +74 -0
  244. data/public/javascripts/tiny_mce/plugins/table/langs/id_dlg.js +25 -25
  245. data/public/javascripts/tiny_mce/plugins/table/langs/ii_dlg.js +54 -54
  246. data/public/javascripts/tiny_mce/plugins/table/langs/ja_dlg.js +6 -6
  247. data/public/javascripts/tiny_mce/plugins/table/langs/lb_dlg.js +74 -0
  248. data/public/javascripts/tiny_mce/plugins/table/langs/ps_dlg.js +74 -0
  249. data/public/javascripts/tiny_mce/plugins/table/langs/pt_dlg.js +1 -1
  250. data/public/javascripts/tiny_mce/plugins/table/langs/ru_dlg.js +47 -47
  251. data/public/javascripts/tiny_mce/plugins/table/langs/sk_dlg.js +6 -6
  252. data/public/javascripts/tiny_mce/plugins/table/langs/tr_dlg.js +25 -25
  253. data/public/javascripts/tiny_mce/plugins/table/langs/uk_dlg.js +22 -22
  254. data/public/javascripts/tiny_mce/plugins/table/langs/ur_dlg.js +74 -0
  255. data/public/javascripts/tiny_mce/plugins/table/langs/vi_dlg.js +36 -36
  256. data/public/javascripts/tiny_mce/plugins/table/langs/zu_dlg.js +74 -0
  257. data/public/javascripts/tiny_mce/plugins/table/merge_cells.htm +3 -8
  258. data/public/javascripts/tiny_mce/plugins/table/row.htm +2 -7
  259. data/public/javascripts/tiny_mce/plugins/table/table.htm +2 -7
  260. data/public/javascripts/tiny_mce/plugins/template/editor_plugin.js +1 -1
  261. data/public/javascripts/tiny_mce/plugins/template/editor_plugin_src.js +10 -7
  262. data/public/javascripts/tiny_mce/plugins/template/langs/ar_dlg.js +11 -11
  263. data/public/javascripts/tiny_mce/plugins/template/langs/ca_dlg.js +8 -8
  264. data/public/javascripts/tiny_mce/plugins/template/langs/cs_dlg.js +4 -4
  265. data/public/javascripts/tiny_mce/plugins/template/langs/es_dlg.js +1 -1
  266. data/public/javascripts/tiny_mce/plugins/template/langs/fr_dlg.js +2 -2
  267. data/public/javascripts/tiny_mce/plugins/template/langs/he_dlg.js +3 -3
  268. data/public/javascripts/tiny_mce/plugins/template/langs/hy_dlg.js +15 -0
  269. data/public/javascripts/tiny_mce/plugins/template/langs/id_dlg.js +6 -6
  270. data/public/javascripts/tiny_mce/plugins/template/langs/ii_dlg.js +10 -10
  271. data/public/javascripts/tiny_mce/plugins/template/langs/ja_dlg.js +4 -4
  272. data/public/javascripts/tiny_mce/plugins/template/langs/lb_dlg.js +15 -0
  273. data/public/javascripts/tiny_mce/plugins/template/langs/ps_dlg.js +15 -0
  274. data/public/javascripts/tiny_mce/plugins/template/langs/ru_dlg.js +9 -9
  275. data/public/javascripts/tiny_mce/plugins/template/langs/sk_dlg.js +1 -1
  276. data/public/javascripts/tiny_mce/plugins/template/langs/tr_dlg.js +5 -5
  277. data/public/javascripts/tiny_mce/plugins/template/langs/ur_dlg.js +15 -0
  278. data/public/javascripts/tiny_mce/plugins/template/langs/zu_dlg.js +15 -0
  279. data/public/javascripts/tiny_mce/plugins/template/template.htm +2 -8
  280. data/public/javascripts/tiny_mce/plugins/visualchars/editor_plugin_src.js +6 -3
  281. data/public/javascripts/tiny_mce/plugins/wordcount/editor_plugin_src.js +6 -3
  282. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/abbr.htm +3 -10
  283. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/acronym.htm +3 -10
  284. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/attributes.htm +2 -7
  285. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/cite.htm +3 -10
  286. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/del.htm +3 -11
  287. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js +1 -1
  288. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js +11 -3
  289. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/ins.htm +3 -11
  290. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js +8 -5
  291. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js +7 -4
  292. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js +7 -4
  293. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/cite.js +7 -4
  294. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/del.js +7 -4
  295. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js +8 -8
  296. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/js/ins.js +7 -4
  297. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/ar_dlg.js +30 -30
  298. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/ca_dlg.js +15 -15
  299. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/cs_dlg.js +2 -2
  300. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js +6 -6
  301. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/he_dlg.js +2 -2
  302. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/hy_dlg.js +32 -0
  303. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/id_dlg.js +22 -22
  304. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/ii_dlg.js +14 -14
  305. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/lb_dlg.js +32 -0
  306. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/pl_dlg.js +3 -3
  307. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/ps_dlg.js +32 -0
  308. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/ru_dlg.js +15 -15
  309. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/sk_dlg.js +2 -2
  310. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/th_dlg.js +5 -5
  311. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/tr_dlg.js +18 -18
  312. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/uk_dlg.js +9 -9
  313. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/ur_dlg.js +32 -0
  314. data/public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/zu_dlg.js +32 -0
  315. data/public/javascripts/tiny_mce/templates/bio.htm +31 -0
  316. data/public/javascripts/tiny_mce/templates/country.htm +59 -0
  317. data/public/javascripts/tiny_mce/themes/advanced/about.htm +1 -3
  318. data/public/javascripts/tiny_mce/themes/advanced/anchor.htm +2 -7
  319. data/public/javascripts/tiny_mce/themes/advanced/color_picker.htm +1 -3
  320. data/public/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -1
  321. data/public/javascripts/tiny_mce/themes/advanced/editor_template_src.js +166 -169
  322. data/public/javascripts/tiny_mce/themes/advanced/image.htm +2 -7
  323. data/public/javascripts/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  324. data/public/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
  325. data/public/javascripts/tiny_mce/themes/advanced/js/anchor.js +7 -7
  326. data/public/javascripts/tiny_mce/themes/advanced/js/charmap.js +10 -0
  327. data/public/javascripts/tiny_mce/themes/advanced/js/image.js +2 -2
  328. data/public/javascripts/tiny_mce/themes/advanced/langs/ar.js +59 -61
  329. data/public/javascripts/tiny_mce/themes/advanced/langs/ar_dlg.js +49 -49
  330. data/public/javascripts/tiny_mce/themes/advanced/langs/ca.js +32 -32
  331. data/public/javascripts/tiny_mce/themes/advanced/langs/ca_dlg.js +30 -30
  332. data/public/javascripts/tiny_mce/themes/advanced/langs/cs.js +1 -1
  333. data/public/javascripts/tiny_mce/themes/advanced/langs/cs_dlg.js +1 -1
  334. data/public/javascripts/tiny_mce/themes/advanced/langs/el.js +3 -1
  335. data/public/javascripts/tiny_mce/themes/advanced/langs/es.js +4 -4
  336. data/public/javascripts/tiny_mce/themes/advanced/langs/es_dlg.js +2 -2
  337. data/public/javascripts/tiny_mce/themes/advanced/langs/fa_dlg.js +1 -1
  338. data/public/javascripts/tiny_mce/themes/advanced/langs/fr.js +14 -17
  339. data/public/javascripts/tiny_mce/themes/advanced/langs/fr_dlg.js +17 -17
  340. data/public/javascripts/tiny_mce/themes/advanced/langs/hu.js +2 -2
  341. data/public/javascripts/tiny_mce/themes/advanced/langs/hu_dlg.js +4 -4
  342. data/public/javascripts/tiny_mce/themes/advanced/langs/hy.js +62 -0
  343. data/public/javascripts/tiny_mce/themes/advanced/langs/hy_dlg.js +51 -0
  344. data/public/javascripts/tiny_mce/themes/advanced/langs/id.js +5 -5
  345. data/public/javascripts/tiny_mce/themes/advanced/langs/id_dlg.js +13 -13
  346. data/public/javascripts/tiny_mce/themes/advanced/langs/ii.js +42 -40
  347. data/public/javascripts/tiny_mce/themes/advanced/langs/ii_dlg.js +28 -28
  348. data/public/javascripts/tiny_mce/themes/advanced/langs/it_dlg.js +5 -5
  349. data/public/javascripts/tiny_mce/themes/advanced/langs/ja.js +1 -1
  350. data/public/javascripts/tiny_mce/themes/advanced/langs/ja_dlg.js +8 -8
  351. data/public/javascripts/tiny_mce/themes/advanced/langs/lb.js +63 -0
  352. data/public/javascripts/tiny_mce/themes/advanced/langs/lb_dlg.js +51 -0
  353. data/public/javascripts/tiny_mce/themes/advanced/langs/ps.js +62 -0
  354. data/public/javascripts/tiny_mce/themes/advanced/langs/ps_dlg.js +51 -0
  355. data/public/javascripts/tiny_mce/themes/advanced/langs/pt.js +5 -5
  356. data/public/javascripts/tiny_mce/themes/advanced/langs/ru.js +28 -28
  357. data/public/javascripts/tiny_mce/themes/advanced/langs/ru_dlg.js +37 -37
  358. data/public/javascripts/tiny_mce/themes/advanced/langs/sk.js +15 -15
  359. data/public/javascripts/tiny_mce/themes/advanced/langs/sk_dlg.js +21 -21
  360. data/public/javascripts/tiny_mce/themes/advanced/langs/th.js +4 -4
  361. data/public/javascripts/tiny_mce/themes/advanced/langs/th_dlg.js +4 -4
  362. data/public/javascripts/tiny_mce/themes/advanced/langs/tr.js +27 -27
  363. data/public/javascripts/tiny_mce/themes/advanced/langs/tr_dlg.js +17 -17
  364. data/public/javascripts/tiny_mce/themes/advanced/langs/tw.js +3 -3
  365. data/public/javascripts/tiny_mce/themes/advanced/langs/uk_dlg.js +6 -6
  366. data/public/javascripts/tiny_mce/themes/advanced/langs/ur.js +62 -0
  367. data/public/javascripts/tiny_mce/themes/advanced/langs/ur_dlg.js +51 -0
  368. data/public/javascripts/tiny_mce/themes/advanced/langs/vi.js +52 -52
  369. data/public/javascripts/tiny_mce/themes/advanced/langs/vi_dlg.js +49 -49
  370. data/public/javascripts/tiny_mce/themes/advanced/langs/zu.js +64 -0
  371. data/public/javascripts/tiny_mce/themes/advanced/langs/zu_dlg.js +51 -0
  372. data/public/javascripts/tiny_mce/themes/advanced/link.htm +2 -7
  373. data/public/javascripts/tiny_mce/themes/advanced/skins/default/content.css +6 -3
  374. data/public/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +4 -3
  375. data/public/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +4 -5
  376. data/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +6 -3
  377. data/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +3 -2
  378. data/public/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +3 -3
  379. data/public/javascripts/tiny_mce/themes/advanced/source_editor.htm +2 -7
  380. data/public/javascripts/tiny_mce/themes/simple/editor_template_src.js +5 -5
  381. data/public/javascripts/tiny_mce/themes/simple/langs/ar.js +9 -9
  382. data/public/javascripts/tiny_mce/themes/simple/langs/ca.js +4 -4
  383. data/public/javascripts/tiny_mce/themes/simple/langs/hu.js +1 -1
  384. data/public/javascripts/tiny_mce/themes/simple/langs/hy.js +11 -0
  385. data/public/javascripts/tiny_mce/themes/simple/langs/ii.js +8 -8
  386. data/public/javascripts/tiny_mce/themes/simple/langs/lb.js +11 -0
  387. data/public/javascripts/tiny_mce/themes/simple/langs/ps.js +11 -0
  388. data/public/javascripts/tiny_mce/themes/simple/langs/ru.js +4 -4
  389. data/public/javascripts/tiny_mce/themes/simple/langs/sk.js +4 -4
  390. data/public/javascripts/tiny_mce/themes/simple/langs/tr.js +4 -4
  391. data/public/javascripts/tiny_mce/themes/simple/langs/tw.js +1 -1
  392. data/public/javascripts/tiny_mce/themes/simple/langs/ur.js +11 -0
  393. data/public/javascripts/tiny_mce/themes/simple/langs/vi.js +7 -7
  394. data/public/javascripts/tiny_mce/themes/simple/langs/zu.js +11 -0
  395. data/public/javascripts/tiny_mce/tiny_mce.js +1 -1
  396. data/public/javascripts/tiny_mce/tiny_mce_popup.js +1 -1
  397. data/public/javascripts/tiny_mce/tiny_mce_src.js +4751 -4078
  398. data/public/javascripts/tiny_mce/utils/editable_selects.js +5 -4
  399. data/public/javascripts/tiny_mce/utils/form_utils.js +5 -4
  400. data/public/javascripts/tiny_mce/utils/mctabs.js +5 -4
  401. data/public/javascripts/tiny_mce/utils/validate.js +5 -4
  402. metadata +89 -10
  403. data/public/javascripts/tiny_mce/plugins/compat2x/editor_plugin.js +0 -1
  404. data/public/javascripts/tiny_mce/plugins/compat2x/editor_plugin_src.js +0 -616
  405. data/public/javascripts/tiny_mce/plugins/paste/blank.htm +0 -22
  406. data/public/javascripts/tiny_mce/plugins/paste/css/blank.css +0 -14
  407. data/public/javascripts/tiny_mce/plugins/paste/css/pasteword.css +0 -3
  408. data/public/javascripts/tiny_mce/plugins/safari/blank.htm +0 -1
  409. data/public/javascripts/tiny_mce/plugins/safari/editor_plugin.js +0 -1
  410. data/public/javascripts/tiny_mce/plugins/safari/editor_plugin_src.js +0 -438
@@ -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,19 +14,19 @@ 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:"Decoration",
20
+ text_decoration:"Dekor\u00E1cia",
21
21
  text_overline:"overline",
22
22
  text_underline:"underline",
23
23
  text_striketrough:"strikethrough",
24
24
  text_blink:"blink",
25
- text_none:"none",
26
- background_color:"Background color",
27
- background_image:"Background image",
25
+ text_none:"\u017Eiadne",
26
+ background_color:"Farba pozadia",
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('ur.style_dlg',{
2
+ title:"Edit CSS Style",
3
+ apply:"Apply",
4
+ text_tab:"Text",
5
+ background_tab:"Background",
6
+ block_tab:"Block",
7
+ box_tab:"Box",
8
+ border_tab:"Border",
9
+ list_tab:"List",
10
+ positioning_tab:"Positioning",
11
+ text_props:"Text",
12
+ text_font:"Font",
13
+ text_size:"Size",
14
+ text_weight:"Weight",
15
+ text_style:"Style",
16
+ text_variant:"Variant",
17
+ text_lineheight:"Line height",
18
+ text_case:"Case",
19
+ text_color:"Color",
20
+ text_decoration:"Decoration",
21
+ text_overline:"overline",
22
+ text_underline:"underline",
23
+ text_striketrough:"strikethrough",
24
+ text_blink:"blink",
25
+ text_none:"none",
26
+ background_color:"Background color",
27
+ background_image:"Background image",
28
+ background_repeat:"Repeat",
29
+ background_attachment:"Attachment",
30
+ background_hpos:"Horizontal position",
31
+ background_vpos:"Vertical position",
32
+ block_wordspacing:"Word spacing",
33
+ block_letterspacing:"Letter spacing",
34
+ block_vertical_alignment:"Vertical alignment",
35
+ block_text_align:"Text align",
36
+ block_text_indent:"Text indent",
37
+ block_whitespace:"Whitespace",
38
+ block_display:"Display",
39
+ box_width:"Width",
40
+ box_height:"Height",
41
+ box_float:"Float",
42
+ box_clear:"Clear",
43
+ padding:"Padding",
44
+ same:"Same for all",
45
+ top:"Top",
46
+ right:"Right",
47
+ bottom:"Bottom",
48
+ left:"Left",
49
+ margin:"Margin",
50
+ style:"Style",
51
+ width:"Width",
52
+ height:"Height",
53
+ color:"Color",
54
+ list_type:"Type",
55
+ bullet_image:"Bullet image",
56
+ position:"Position",
57
+ positioning_type:"Type",
58
+ visibility:"Visibility",
59
+ zindex:"Z-index",
60
+ overflow:"Overflow",
61
+ placement:"Placement",
62
+ clip:"Clip"
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 a=tinymce.each;tinymce.create("tinymce.plugins.TablePlugin",{init:function(b,c){var d=this;d.editor=b;d.url=c;a([["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(e){b.addButton(e[0],{title:e[1],cmd:e[2],ui:e[3]})});if(b.getParam("inline_styles")){b.onPreProcess.add(function(e,g){var f=e.dom;a(f.select("table",g.node),function(i){var h;if(h=f.getAttrib(i,"width")){f.setStyle(i,"width",h);f.setAttrib(i,"width")}if(h=f.getAttrib(i,"height")){f.setStyle(i,"height",h);f.setAttrib(i,"height")}})})}b.onInit.add(function(){if(!tinymce.isIE&&b.getParam("forced_root_block")){function e(){var f=b.getBody().lastChild;if(f&&f.nodeName=="TABLE"){b.dom.add(b.getBody(),"p",null,'<br mce_bogus="1" />')}}b.onKeyUp.add(e);b.onSetContent.add(e);b.onVisualAid.add(e);b.onPreProcess.add(function(f,h){var g=h.node.lastChild;if(g&&g.childNodes.length==1&&g.firstChild.nodeName=="BR"){f.dom.remove(g)}});e()}if(b&&b.plugins.contextmenu){b.plugins.contextmenu.onContextMenu.add(function(h,f,j){var k,i=b.selection,g=i.getNode()||b.getBody();if(b.dom.getParent(j,"td")||b.dom.getParent(j,"th")){f.removeAll();if(g.nodeName=="A"&&!b.dom.getAttrib(g,"name")){f.add({title:"advanced.link_desc",icon:"link",cmd:b.plugins.advlink?"mceAdvLink":"mceLink",ui:true});f.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});f.addSeparator()}if(g.nodeName=="IMG"&&g.className.indexOf("mceItem")==-1){f.add({title:"advanced.image_desc",icon:"image",cmd:b.plugins.advimage?"mceAdvImage":"mceImage",ui:true});f.addSeparator()}f.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",ui:true,value:{action:"insert"}});f.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable",ui:true});f.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete",ui:true});f.addSeparator();k=f.addMenu({title:"table.cell"});k.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps",ui:true});k.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells",ui:true});k.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells",ui:true});k=f.addMenu({title:"table.row"});k.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps",ui:true});k.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});k.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});k.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});k.addSeparator();k.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});k.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});k.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"});k.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"});k=f.addMenu({title:"table.col"});k.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});k.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});k.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{f.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",ui:true})}})}});b.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(b.getParam("table_selection",true)){b.onClick.add(function(f,g){g=g.target;if(g.nodeName==="TABLE"){f.selection.select(g)}})}}b.onNodeChange.add(function(f,e,h){var g=f.dom.getParent(h,"td,th,caption");e.setActive("table",h.nodeName==="TABLE"||!!g);if(g&&g.nodeName==="CAPTION"){g=null}e.setDisabled("delete_table",!g);e.setDisabled("delete_col",!g);e.setDisabled("delete_table",!g);e.setDisabled("delete_row",!g);e.setDisabled("col_after",!g);e.setDisabled("col_before",!g);e.setDisabled("row_after",!g);e.setDisabled("row_before",!g);e.setDisabled("row_props",!g);e.setDisabled("cell_props",!g);e.setDisabled("split_cells",!g||(parseInt(f.dom.getAttrib(g,"colspan","1"))<2&&parseInt(f.dom.getAttrib(g,"rowspan","1"))<2));e.setDisabled("merge_cells",!g)});if(!tinymce.isIE){b.onBeforeSetContent.add(function(e,f){if(f.initial){f.content=f.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(r,Z,ae){var V=this.editor,au=V,g=this.url;var n=V.selection.getNode();var W=V.dom.getParent(n,"tr");var aq=V.dom.getParent(n,"td,th");var F=V.dom.getParent(n,"table");var k=V.contentWindow.document;var av=F?F.getAttribute("border"):"";if(W&&aq==null){aq=W.cells[0]}function ap(y,x){for(var ax=0;ax<y.length;ax++){if(y[ax].length>0&&ap(y[ax],x)){return true}if(y[ax]==x){return true}}return false}function aj(x,i){var y;ad=e(F);x=x||0;i=i||0;x=Math.max(o.cellindex+x,0);i=Math.max(o.rowindex+i,0);V.execCommand("mceRepaint");y=d(ad,i,x);if(y){V.selection.select(y.firstChild||y);V.selection.collapse(1)}}function ah(){var i=k.createElement("td");if(!tinymce.isIE){i.innerHTML='<br mce_bogus="1"/>'}}function j(y){var x=V.dom.getAttrib(y,"colspan");var i=V.dom.getAttrib(y,"rowspan");x=x==""?1:parseInt(x);i=i==""?1:parseInt(i);return{colspan:x,rowspan:i}}function al(ax,az){var i,ay;for(ay=0;ay<ax.length;ay++){for(i=0;i<ax[ay].length;i++){if(ax[ay][i]==az){return{cellindex:i,rowindex:ay}}}}return null}function d(x,y,i){if(x[y]&&x[y][i]){return x[y][i]}return null}function A(aC,ax){var az=[],y=0,aA,ay,ax,aB;for(aA=0;aA<aC.rows.length;aA++){for(ay=0;ay<aC.rows[aA].cells.length;ay++,y++){az[y]=aC.rows[aA].cells[ay]}}for(aA=0;aA<az.length;aA++){if(az[aA]==ax){if(aB=az[aA+1]){return aB}}}}function e(aE){var i=[],aF=aE.rows,aC,aB,ay,az,aD,ax,aA;for(aB=0;aB<aF.length;aB++){for(aC=0;aC<aF[aB].cells.length;aC++){ay=aF[aB].cells[aC];az=j(ay);for(aD=aC;i[aB]&&i[aB][aD];aD++){}for(aA=aB;aA<aB+az.rowspan;aA++){if(!i[aA]){i[aA]=[]}for(ax=aD;ax<aD+az.colspan;ax++){i[aA][ax]=ay}}}}return i}function m(aG,aD,ay,ax){var y=e(aG),aF=al(y,ay);var aH,aC;if(ax.cells.length!=aD.childNodes.length){aH=aD.childNodes;aC=null;for(var aE=0;ay=d(y,aF.rowindex,aE);aE++){var aA=true;var aB=j(ay);if(ap(aH,ay)){ax.childNodes[aE]._delete=true}else{if((aC==null||ay!=aC)&&aB.colspan>1){for(var az=aE;az<aE+ay.colSpan;az++){ax.childNodes[az]._delete=true}}}if((aC==null||ay!=aC)&&aB.rowspan>1){ay.rowSpan=aB.rowspan+1}aC=ay}B(F)}}function O(x,i){while((x=x.previousSibling)!=null){if(x.nodeName==i){return x}}return null}function af(ax,ay){var x=ay.split(",");while((ax=ax.nextSibling)!=null){for(var y=0;y<x.length;y++){if(ax.nodeName.toLowerCase()==x[y].toLowerCase()){return ax}}}return null}function B(ax){if(ax.rows==0){return}var y=ax.rows[0];do{var x=af(y,"TR");if(y._delete){y.parentNode.removeChild(y);continue}var ay=y.cells[0];if(ay.cells>1){do{var i=af(ay,"TD,TH");if(ay._delete){ay.parentNode.removeChild(ay)}}while((ay=i)!=null)}}while((y=x)!=null)}function p(ax,aA,az){ax.rowSpan=1;var x=af(aA,"TR");for(var ay=1;ay<az&&x;ay++){var y=k.createElement("td");if(!tinymce.isIE){y.innerHTML='<br mce_bogus="1"/>'}if(tinymce.isIE){x.insertBefore(y,x.cells(ax.cellIndex))}else{x.insertBefore(y,x.cells[ax.cellIndex])}x=af(x,"TR")}}function S(aF,aH,aB){var y=e(aH);var ax=aB.cloneNode(false);var aG=al(y,aB.cells[0]);var aC=null;var aA=V.dom.getAttrib(aH,"border");var az=null;for(var aE=0;az=d(y,aG.rowindex,aE);aE++){var aD=null;if(aC!=az){for(var ay=0;ay<aB.cells.length;ay++){if(az==aB.cells[ay]){aD=az.cloneNode(true);break}}}if(aD==null){aD=aF.createElement("td");if(!tinymce.isIE){aD.innerHTML='<br mce_bogus="1"/>'}}aD.colSpan=1;aD.rowSpan=1;ax.appendChild(aD);aC=az}return ax}switch(r){case"mceTableMoveToNextRow":var L=A(F,aq);if(!L){V.execCommand("mceTableInsertRowAfter",aq);L=A(F,aq)}V.selection.select(L);V.selection.collapse(true);return true;case"mceTableRowProps":if(W==null){return true}if(Z){V.windowManager.open({url:g+"/row.htm",width:400+parseInt(V.getLang("table.rowprops_delta_width",0)),height:295+parseInt(V.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:g})}return true;case"mceTableCellProps":if(aq==null){return true}if(Z){V.windowManager.open({url:g+"/cell.htm",width:400+parseInt(V.getLang("table.cellprops_delta_width",0)),height:295+parseInt(V.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:g})}return true;case"mceInsertTable":if(Z){V.windowManager.open({url:g+"/table.htm",width:400+parseInt(V.getLang("table.table_delta_width",0)),height:320+parseInt(V.getLang("table.table_delta_height",0)),inline:1},{plugin_url:g,action:ae?ae.action:0})}return true;case"mceTableDelete":var G=V.dom.getParent(V.selection.getNode(),"table");if(G){G.parentNode.removeChild(G);V.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(!F){return true}if(W&&F!=W.parentNode){F=W.parentNode}if(F&&W){switch(r){case"mceTableCutRow":if(!W||!aq){return true}V.tableRowClipboard=S(k,F,W);V.execCommand("mceTableDeleteRow");break;case"mceTableCopyRow":if(!W||!aq){return true}V.tableRowClipboard=S(k,F,W);break;case"mceTablePasteRowBefore":if(!W||!aq){return true}var v=V.tableRowClipboard.cloneNode(true);var h=O(W,"TR");if(h!=null){m(F,h,h.cells[0],v)}W.parentNode.insertBefore(v,W);break;case"mceTablePasteRowAfter":if(!W||!aq){return true}var X=af(W,"TR");var v=V.tableRowClipboard.cloneNode(true);m(F,W,aq,v);if(X==null){W.parentNode.appendChild(v)}else{X.parentNode.insertBefore(v,X)}break;case"mceTableInsertRowBefore":if(!W||!aq){return true}var ad=e(F);var o=al(ad,aq);var v=k.createElement("tr");var u=null;o.rowindex--;if(o.rowindex<0){o.rowindex=0}for(var ac=0;aq=d(ad,o.rowindex,ac);ac++){if(aq!=u){var E=j(aq);if(E.rowspan==1){var J=k.createElement("td");if(!tinymce.isIE){J.innerHTML='<br mce_bogus="1"/>'}J.colSpan=aq.colSpan;v.appendChild(J)}else{aq.rowSpan=E.rowspan+1}u=aq}}W.parentNode.insertBefore(v,W);aj(0,1);break;case"mceTableInsertRowAfter":if(!W||!aq){return true}var ad=e(F);var o=al(ad,aq);var v=k.createElement("tr");var u=null;for(var ac=0;aq=d(ad,o.rowindex,ac);ac++){if(aq!=u){var E=j(aq);if(E.rowspan==1){var J=k.createElement("td");if(!tinymce.isIE){J.innerHTML='<br mce_bogus="1"/>'}J.colSpan=aq.colSpan;v.appendChild(J)}else{aq.rowSpan=E.rowspan+1}u=aq}}if(v.hasChildNodes()){var X=af(W,"TR");if(X){X.parentNode.insertBefore(v,X)}else{F.appendChild(v)}}aj(0,1);break;case"mceTableDeleteRow":if(!W||!aq){return true}var ad=e(F);var o=al(ad,aq);if(ad.length==1&&F.nodeName=="TBODY"){V.dom.remove(V.dom.getParent(F,"table"));return true}var D=W.cells;var X=af(W,"TR");for(var ac=0;ac<D.length;ac++){if(D[ac].rowSpan>1){var J=D[ac].cloneNode(true);var E=j(D[ac]);J.rowSpan=E.rowspan-1;var ak=X.cells[ac];if(ak==null){X.appendChild(J)}else{X.insertBefore(J,ak)}}}var u=null;for(var ac=0;aq=d(ad,o.rowindex,ac);ac++){if(aq!=u){var E=j(aq);if(E.rowspan>1){aq.rowSpan=E.rowspan-1}else{W=aq.parentNode;if(W.parentNode){W._delete=true}}u=aq}}B(F);aj(0,-1);break;case"mceTableInsertColBefore":if(!W||!aq){return true}var ad=e(V.dom.getParent(F,"table"));var o=al(ad,aq);var u=null;for(var aa=0;aq=d(ad,aa,o.cellindex);aa++){if(aq!=u){var E=j(aq);if(E.colspan==1){var J=k.createElement(aq.nodeName);if(!tinymce.isIE){J.innerHTML='<br mce_bogus="1"/>'}J.rowSpan=aq.rowSpan;aq.parentNode.insertBefore(J,aq)}else{aq.colSpan++}u=aq}}aj();break;case"mceTableInsertColAfter":if(!W||!aq){return true}var ad=e(V.dom.getParent(F,"table"));var o=al(ad,aq);var u=null;for(var aa=0;aq=d(ad,aa,o.cellindex);aa++){if(aq!=u){var E=j(aq);if(E.colspan==1){var J=k.createElement(aq.nodeName);if(!tinymce.isIE){J.innerHTML='<br mce_bogus="1"/>'}J.rowSpan=aq.rowSpan;var ak=af(aq,"TD,TH");if(ak==null){aq.parentNode.appendChild(J)}else{ak.parentNode.insertBefore(J,ak)}}else{aq.colSpan++}u=aq}}aj(1);break;case"mceTableDeleteCol":if(!W||!aq){return true}var ad=e(F);var o=al(ad,aq);var u=null;if((ad.length>1&&ad[0].length<=1)&&F.nodeName=="TBODY"){V.dom.remove(V.dom.getParent(F,"table"));return true}for(var aa=0;aq=d(ad,aa,o.cellindex);aa++){if(aq!=u){var E=j(aq);if(E.colspan>1){aq.colSpan=E.colspan-1}else{if(aq.parentNode){aq.parentNode.removeChild(aq)}}u=aq}}aj(-1);break;case"mceTableSplitCells":if(!W||!aq){return true}var l=j(aq);var C=l.colspan;var H=l.rowspan;if(C>1||H>1){aq.colSpan=1;for(var am=1;am<C;am++){var J=k.createElement("td");if(!tinymce.isIE){J.innerHTML='<br mce_bogus="1"/>'}W.insertBefore(J,af(aq,"TD,TH"));if(H>1){p(J,W,H)}}p(aq,W,H)}F=V.dom.getParent(V.selection.getNode(),"table");break;case"mceTableMergeCells":var ao=[];var R=V.selection.getSel();var ad=e(F);if(tinymce.isIE||R.rangeCount==1){if(Z){var t=j(aq);V.windowManager.open({url:g+"/merge_cells.htm",width:240+parseInt(V.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(V.getLang("table.merge_cells_delta_height",0)),inline:1},{action:"update",numcols:t.colspan,numrows:t.rowspan,plugin_url:g});return true}else{var U=parseInt(ae.numrows);var c=parseInt(ae.numcols);var o=al(ad,aq);if((""+U)=="NaN"){U=1}if((""+c)=="NaN"){c=1}var b=F.rows;for(var aa=o.rowindex;aa<ad.length;aa++){var ag=[];for(var ac=o.cellindex;ac<ad[aa].length;ac++){var f=d(ad,aa,ac);if(f&&!ap(ao,f)&&!ap(ag,f)){var N=al(ad,f);if(N.cellindex<o.cellindex+c&&N.rowindex<o.rowindex+U){ag[ag.length]=f}}}if(ag.length>0){ao[ao.length]=ag}var f=d(ad,o.rowindex,o.cellindex);a(au.dom.select("br",f),function(y,x){if(x>0&&au.dom.getAttrib("mce_bogus")){au.dom.remove(y)}})}}}else{var D=[];var R=V.selection.getSel();var Y=null;var an=null;var z=-1,aw=-1,w,at;if(R.rangeCount<2){return true}for(var am=0;am<R.rangeCount;am++){var ai=R.getRangeAt(am);var aq=ai.startContainer.childNodes[ai.startOffset];if(!aq){break}if(aq.nodeName=="TD"||aq.nodeName=="TH"){D[D.length]=aq}}var b=F.rows;for(var aa=0;aa<b.length;aa++){var ag=[];for(var ac=0;ac<b[aa].cells.length;ac++){var f=b[aa].cells[ac];for(var am=0;am<D.length;am++){if(f==D[am]){ag[ag.length]=f}}}if(ag.length>0){ao[ao.length]=ag}}var an=[];var Y=null;for(var aa=0;aa<ad.length;aa++){for(var ac=0;ac<ad[aa].length;ac++){ad[aa][ac]._selected=false;for(var am=0;am<D.length;am++){if(ad[aa][ac]==D[am]){if(z==-1){z=ac;aw=aa}w=ac;at=aa;ad[aa][ac]._selected=true}}}}for(var aa=aw;aa<=at;aa++){for(var ac=z;ac<=w;ac++){if(!ad[aa][ac]._selected){alert("Invalid selection for merge.");return true}}}}var s=1,q=1;var T=-1;for(var aa=0;aa<ao.length;aa++){var I=0;for(var ac=0;ac<ao[aa].length;ac++){var E=j(ao[aa][ac]);I+=E.colspan;if(T!=-1&&E.rowspan!=T){alert("Invalid selection for merge.");return true}T=E.rowspan}if(I>q){q=I}T=-1}var Q=-1;for(var ac=0;ac<ao[0].length;ac++){var M=0;for(var aa=0;aa<ao.length;aa++){var E=j(ao[aa][ac]);M+=E.rowspan;if(Q!=-1&&E.colspan!=Q){alert("Invalid selection for merge.");return true}Q=E.colspan}if(M>s){s=M}Q=-1}aq=ao[0][0];aq.rowSpan=s;aq.colSpan=q;for(var aa=0;aa<ao.length;aa++){for(var ac=0;ac<ao[aa].length;ac++){var P=ao[aa][ac].innerHTML;var K=P.replace(/[ \t\r\n]/g,"");if(K!="<br/>"&&K!="<br>"&&K!='<br mce_bogus="1"/>'&&(ac+aa>0)){aq.innerHTML+=P}if(ao[aa][ac]!=aq&&!ao[aa][ac]._deleted){var o=al(ad,ao[aa][ac]);var ar=ao[aa][ac].parentNode;ar.removeChild(ao[aa][ac]);ao[aa][ac]._deleted=true;if(!ar.hasChildNodes()){ar.parentNode.removeChild(ar);var ab=null;for(var ac=0;cellElm=d(ad,o.rowindex,ac);ac++){if(cellElm!=ab&&cellElm.rowSpan>1){cellElm.rowSpan--}ab=cellElm}if(aq.rowSpan>1){aq.rowSpan--}}}}}a(au.dom.select("br",aq),function(y,x){if(x>0&&au.dom.getAttrib(y,"mce_bogus")){au.dom.remove(y)}});break}F=V.dom.getParent(V.selection.getNode(),"table");V.addVisual(F);V.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,1160 +1,1118 @@
1
1
  /**
2
- * $Id: editor_plugin_src.js 1206 2009-08-19 12:30:52Z 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
- tinymce.create('tinymce.plugins.TablePlugin', {
12
- init : function(ed, url) {
13
- var t = this;
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
- t.editor = ed;
16
- t.url = url;
28
+ function buildGrid() {
29
+ var startY = 0;
17
30
 
18
- // Register buttons
19
- each([
20
- ['table', 'table.desc', 'mceInsertTable', true],
21
- ['delete_table', 'table.del', 'mceTableDelete'],
22
- ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'],
23
- ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'],
24
- ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'],
25
- ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'],
26
- ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'],
27
- ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'],
28
- ['row_props', 'table.row_desc', 'mceTableRowProps', true],
29
- ['cell_props', 'table.cell_desc', 'mceTableCellProps', true],
30
- ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true],
31
- ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true]
32
- ], function(c) {
33
- ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});
34
- });
31
+ grid = [];
32
+
33
+ each(['thead', 'tbody', 'tfoot'], function(part) {
34
+ var rows = dom.select(part + ' tr', table);
35
35
 
36
- if (ed.getParam('inline_styles')) {
37
- // Force move of attribs to styles in strict mode
38
- ed.onPreProcess.add(function(ed, o) {
39
- var dom = ed.dom;
36
+ each(rows, function(tr, y) {
37
+ y += startY;
40
38
 
41
- each(dom.select('table', o.node), function(n) {
42
- var v;
39
+ each(dom.select('td,th', tr), function(td, x) {
40
+ var x2, y2, rowspan, colspan;
43
41
 
44
- if (v = dom.getAttrib(n, 'width')) {
45
- dom.setStyle(n, 'width', v);
46
- dom.setAttrib(n, 'width');
42
+ // Skip over existing cells produced by rowspan
43
+ if (grid[y]) {
44
+ while (grid[y][x])
45
+ x++;
47
46
  }
48
47
 
49
- if (v = dom.getAttrib(n, 'height')) {
50
- dom.setStyle(n, 'height', v);
51
- dom.setAttrib(n, 'height');
48
+ // Get col/rowspan from cell
49
+ rowspan = getSpanVal(td, 'rowspan');
50
+ colspan = getSpanVal(td, 'colspan');
51
+
52
+ // Fill out rowspan/colspan right and down
53
+ for (y2 = y; y2 < y + rowspan; y2++) {
54
+ if (!grid[y2])
55
+ grid[y2] = [];
56
+
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
+ }
52
66
  }
53
67
  });
54
68
  });
55
- }
56
69
 
57
- ed.onInit.add(function() {
58
- // Fixes an issue on Gecko where it's impossible to place the caret behind a table
59
- // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled
60
- if (!tinymce.isIE && ed.getParam('forced_root_block')) {
61
- function fixTableCaretPos() {
62
- var last = ed.getBody().lastChild;
70
+ startY += rows.length;
71
+ });
72
+ };
63
73
 
64
- if (last && last.nodeName == 'TABLE')
65
- ed.dom.add(ed.getBody(), 'p', null, '<br mce_bogus="1" />');
66
- };
74
+ function getCell(x, y) {
75
+ var row;
67
76
 
68
- ed.onKeyUp.add(fixTableCaretPos);
69
- ed.onSetContent.add(fixTableCaretPos);
70
- ed.onVisualAid.add(fixTableCaretPos);
77
+ row = grid[y];
78
+ if (row)
79
+ return row[x];
80
+ };
71
81
 
72
- ed.onPreProcess.add(function(ed, o) {
73
- var last = o.node.lastChild;
82
+ function getSpanVal(td, name) {
83
+ return parseInt(td.getAttribute(name) || 1);
84
+ };
74
85
 
75
- if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR')
76
- ed.dom.remove(last);
77
- });
86
+ function isCellSelected(cell) {
87
+ return dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell;
88
+ };
78
89
 
79
- fixTableCaretPos();
80
- }
90
+ function getSelectedRows() {
91
+ var rows = [];
81
92
 
82
- if (ed && ed.plugins.contextmenu) {
83
- ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {
84
- var sm, se = ed.selection, el = se.getNode() || ed.getBody();
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;
98
+ }
99
+ });
100
+ });
85
101
 
86
- if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th')) {
87
- m.removeAll();
102
+ return rows;
103
+ };
88
104
 
89
- if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) {
90
- m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});
91
- m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});
92
- m.addSeparator();
93
- }
105
+ function deleteTable() {
106
+ var rng = dom.createRng();
94
107
 
95
- if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) {
96
- m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});
97
- m.addSeparator();
98
- }
108
+ rng.setStartAfter(table);
109
+ rng.setEndAfter(table);
99
110
 
100
- m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true, value : {action : 'insert'}});
101
- m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable', ui : true});
102
- m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete', ui : true});
103
- m.addSeparator();
111
+ selection.setRng(rng);
104
112
 
105
- // Cell menu
106
- sm = m.addMenu({title : 'table.cell'});
107
- sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps', ui : true});
108
- sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells', ui : true});
109
- sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells', ui : true});
113
+ dom.remove(table);
114
+ };
110
115
 
111
- // Row menu
112
- sm = m.addMenu({title : 'table.row'});
113
- sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps', ui : true});
114
- sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'});
115
- sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'});
116
- sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'});
117
- sm.addSeparator();
118
- sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'});
119
- sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'});
120
- sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'});
121
- sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'});
116
+ function cloneCell(cell) {
117
+ var formatNode;
122
118
 
123
- // Column menu
124
- sm = m.addMenu({title : 'table.col'});
125
- sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'});
126
- sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'});
127
- sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'});
128
- } else
129
- m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true});
119
+ // Clone formats
120
+ tinymce.walk(cell, function(node) {
121
+ var curNode;
122
+
123
+ if (node.nodeType == 3) {
124
+ each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) {
125
+ node = node.cloneNode(false);
126
+
127
+ if (!formatNode)
128
+ formatNode = curNode = node;
129
+ else if (curNode)
130
+ curNode.appendChild(node);
131
+
132
+ curNode = node;
130
133
  });
131
- }
132
- });
133
134
 
134
- // Add undo level when new rows are created using the tab key
135
- ed.onKeyDown.add(function(ed, e) {
136
- if (e.keyCode == 9 && ed.dom.getParent(ed.selection.getNode(), 'TABLE')) {
137
- if (!tinymce.isGecko && !tinymce.isOpera) {
138
- tinyMCE.execInstanceCommand(ed.editorId, "mceTableMoveToNextRow", true);
139
- return tinymce.dom.Event.cancel(e);
140
- }
135
+ // Add something to the inner node
136
+ if (curNode)
137
+ curNode.innerHTML = tinymce.isIE ? '&nbsp;' : '<br _mce_bogus="1" />';
141
138
 
142
- ed.undoManager.add();
139
+ return false;
143
140
  }
144
- });
141
+ }, 'childNodes');
145
142
 
146
- // Select whole table is a table border is clicked
147
- if (!tinymce.isIE) {
148
- if (ed.getParam('table_selection', true)) {
149
- ed.onClick.add(function(ed, e) {
150
- e = e.target;
143
+ cell = cell.cloneNode(false);
144
+ cell.rowSpan = cell.colSpan = 1;
151
145
 
152
- if (e.nodeName === 'TABLE')
153
- ed.selection.select(e);
154
- });
155
- }
146
+ if (formatNode) {
147
+ cell.appendChild(formatNode);
148
+ } else {
149
+ if (!tinymce.isIE)
150
+ cell.innerHTML = '<br _mce_bogus="1" />';
156
151
  }
157
152
 
158
- ed.onNodeChange.add(function(ed, cm, n) {
159
- var p = ed.dom.getParent(n, 'td,th,caption');
153
+ return cell;
154
+ };
160
155
 
161
- cm.setActive('table', n.nodeName === 'TABLE' || !!p);
162
- if (p && p.nodeName === 'CAPTION')
163
- p = null;
156
+ function cleanup() {
157
+ var rng = dom.createRng();
164
158
 
165
- cm.setDisabled('delete_table', !p);
166
- cm.setDisabled('delete_col', !p);
167
- cm.setDisabled('delete_table', !p);
168
- cm.setDisabled('delete_row', !p);
169
- cm.setDisabled('col_after', !p);
170
- cm.setDisabled('col_before', !p);
171
- cm.setDisabled('row_after', !p);
172
- cm.setDisabled('row_before', !p);
173
- cm.setDisabled('row_props', !p);
174
- cm.setDisabled('cell_props', !p);
175
- cm.setDisabled('split_cells', !p || (parseInt(ed.dom.getAttrib(p, 'colspan', '1')) < 2 && parseInt(ed.dom.getAttrib(p, 'rowspan', '1')) < 2));
176
- 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);
177
163
  });
178
164
 
179
- // Padd empty table cells
180
- if (!tinymce.isIE) {
181
- ed.onBeforeSetContent.add(function(ed, o) {
182
- if (o.initial)
183
- o.content = o.content.replace(/<(td|th)([^>]+|)>\s*<\/(td|th)>/g, tinymce.isOpera ? '<$1$2>&nbsp;</$1>' : '<$1$2><br mce_bogus="1" /></$1>');
184
- });
185
- }
186
- },
187
-
188
- execCommand : function(cmd, ui, val) {
189
- var ed = this.editor, b;
190
-
191
- // Is table command
192
- switch (cmd) {
193
- case "mceTableMoveToNextRow":
194
- case "mceInsertTable":
195
- case "mceTableRowProps":
196
- case "mceTableCellProps":
197
- case "mceTableSplitCells":
198
- case "mceTableMergeCells":
199
- case "mceTableInsertRowBefore":
200
- case "mceTableInsertRowAfter":
201
- case "mceTableDeleteRow":
202
- case "mceTableInsertColBefore":
203
- case "mceTableInsertColAfter":
204
- case "mceTableDeleteCol":
205
- case "mceTableCutRow":
206
- case "mceTableCopyRow":
207
- case "mceTablePasteRowBefore":
208
- case "mceTablePasteRowAfter":
209
- case "mceTableDelete":
210
- ed.execCommand('mceBeginUndoLevel');
211
- this._doExecCommand(cmd, ui, val);
212
- ed.execCommand('mceEndUndoLevel');
213
-
214
- 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;
215
172
  }
216
173
 
217
- // Pass to next handler in chain
218
- return false;
219
- },
220
-
221
- getInfo : function() {
222
- return {
223
- longname : 'Tables',
224
- author : 'Moxiecode Systems AB',
225
- authorurl : 'http://tinymce.moxiecode.com',
226
- infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table',
227
- version : tinymce.majorVersion + "." + tinymce.minorVersion
228
- };
229
- },
230
-
231
- // Private plugin internal methods
232
-
233
- /**
234
- * Executes the table commands.
235
- */
236
- _doExecCommand : function(command, user_interface, value) {
237
- var inst = this.editor, ed = inst, url = this.url;
238
- var focusElm = inst.selection.getNode();
239
- var trElm = inst.dom.getParent(focusElm, "tr");
240
- var tdElm = inst.dom.getParent(focusElm, "td,th");
241
- var tableElm = inst.dom.getParent(focusElm, "table");
242
- var doc = inst.contentWindow.document;
243
- var tableBorder = tableElm ? tableElm.getAttribute("border") : "";
244
-
245
- // Get first TD if no TD found
246
- if (trElm && tdElm == null)
247
- tdElm = trElm.cells[0];
248
-
249
- function inArray(ar, v) {
250
- for (var i=0; i<ar.length; i++) {
251
- // Is array
252
- if (ar[i].length > 0 && inArray(ar[i], v))
253
- return true;
254
-
255
- // Found value
256
- if (ar[i] == v)
257
- return true;
258
- }
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();
259
182
 
260
- 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);
261
188
  }
189
+ };
262
190
 
263
- function select(dx, dy) {
264
- var td;
191
+ function fillLeftDown(x, y, rows, cols) {
192
+ var tr, x2, r, c, cell;
265
193
 
266
- grid = getTableGrid(tableElm);
267
- dx = dx || 0;
268
- dy = dy || 0;
269
- dx = Math.max(cpos.cellindex + dx, 0);
270
- 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');
271
197
 
272
- // Recalculate grid and select
273
- inst.execCommand('mceRepaint');
274
- 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;
275
202
 
276
- if (td) {
277
- inst.selection.select(td.firstChild || td);
278
- inst.selection.collapse(1);
279
- }
280
- };
203
+ if (cell.parentNode == tr) {
204
+ // Append clones after
205
+ for (c = 1; c <= cols; c++)
206
+ dom.insertAfter(cloneCell(cell), cell);
281
207
 
282
- function makeTD() {
283
- var newTD = doc.createElement("td");
208
+ break;
209
+ }
210
+ }
284
211
 
285
- if (!tinymce.isIE)
286
- 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
+ }
287
218
  }
219
+ };
220
+
221
+ function split() {
222
+ each(grid, function(row, y) {
223
+ each(row, function(cell, x) {
224
+ var colSpan, rowSpan, newCell, i;
225
+
226
+ if (isCellSelected(cell)) {
227
+ cell = cell.elm;
228
+ colSpan = getSpanVal(cell, 'colspan');
229
+ rowSpan = getSpanVal(cell, 'rowspan');
288
230
 
289
- function getColRowSpan(td) {
290
- var colspan = inst.dom.getAttrib(td, "colspan");
291
- var rowspan = inst.dom.getAttrib(td, "rowspan");
231
+ if (colSpan > 1 || rowSpan > 1) {
232
+ cell.colSpan = cell.rowSpan = 1;
292
233
 
293
- colspan = colspan == "" ? 1 : parseInt(colspan);
294
- rowspan = rowspan == "" ? 1 : parseInt(rowspan);
234
+ // Insert cells right
235
+ for (i = 0; i < colSpan - 1; i++)
236
+ dom.insertAfter(cloneCell(cell), cell);
295
237
 
296
- return {colspan : colspan, rowspan : rowspan};
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;
297
261
  }
298
262
 
299
- function getCellPos(grid, td) {
300
- 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
+ });
301
291
 
302
- for (y=0; y<grid.length; y++) {
303
- for (x=0; x<grid[y].length; x++) {
304
- if (grid[y][x] == td)
305
- return {cellindex : x, rowindex : y};
292
+ // Remove cell
293
+ dom.remove(cell);
294
+ }
306
295
  }
307
296
  }
308
297
 
309
- return null;
298
+ // Remove empty rows etc and restore caret location
299
+ cleanup();
310
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
+ });
311
319
 
312
- function getCell(grid, row, col) {
313
- if (grid[row] && grid[row][col])
314
- return grid[row][col];
320
+ if (before)
321
+ return !posY;
322
+ });
315
323
 
316
- return null;
317
- }
324
+ for (x = 0; x < grid[0].length; x++) {
325
+ cell = grid[posY][x].elm;
318
326
 
319
- function getNextCell(table, cell) {
320
- 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
+ }
321
345
 
322
- for (i = 0; i < table.rows.length; i++)
323
- for (j = 0; j < table.rows[i].cells.length; j++, x++)
324
- 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);
325
350
 
326
- for (i = 0; i < cells.length; i++)
327
- if (cells[i] == cell)
328
- if (nextCell = cells[i+1])
329
- return nextCell;
351
+ lastCell = cell;
352
+ }
330
353
  }
331
354
 
332
- function getTableGrid(table) {
333
- var grid = [], rows = table.rows, x, y, td, sd, xstart, x2, y2;
334
-
335
- for (y=0; y<rows.length; y++) {
336
- for (x=0; x<rows[y].cells.length; x++) {
337
- td = rows[y].cells[x];
338
- 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
+ };
339
362
 
340
- // All ready filled
341
- for (xstart = x; grid[y] && grid[y][xstart]; xstart++) ;
363
+ function insertCol(before) {
364
+ var posX, lastCell;
342
365
 
343
- // Fill box
344
- for (y2=y; y2<y+sd['rowspan']; y2++) {
345
- if (!grid[y2])
346
- 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;
347
371
 
348
- for (x2=xstart; x2<xstart+sd['colspan']; x2++)
349
- grid[y2][x2] = td;
350
- }
372
+ if (before)
373
+ return false;
351
374
  }
352
- }
375
+ });
353
376
 
354
- return grid;
355
- }
377
+ if (before)
378
+ return !posX;
379
+ });
356
380
 
357
- function trimRow(table, tr, td, new_tr) {
358
- var grid = getTableGrid(table), cpos = getCellPos(grid, td);
359
- var cells, lastElm;
360
-
361
- // Time to crop away some
362
- if (new_tr.cells.length != tr.childNodes.length) {
363
- cells = tr.childNodes;
364
- lastElm = null;
365
-
366
- for (var x=0; td = getCell(grid, cpos.rowindex, x); x++) {
367
- var remove = true;
368
- var sd = getColRowSpan(td);
369
-
370
- // Remove due to rowspan
371
- if (inArray(cells, td)) {
372
- new_tr.childNodes[x]._delete = true;
373
- } else if ((lastElm == null || td != lastElm) && sd.colspan > 1) { // Remove due to colspan
374
- for (var i=x; i<x+td.colSpan; i++)
375
- new_tr.childNodes[i]._delete = true;
376
- }
381
+ each(grid, function(row, y) {
382
+ var cell = row[posX].elm, rowSpan, colSpan;
377
383
 
378
- if ((lastElm == null || td != lastElm) && sd.rowspan > 1)
379
- td.rowSpan = sd.rowspan + 1;
384
+ if (cell != lastCell) {
385
+ colSpan = getSpanVal(cell, 'colspan');
386
+ rowSpan = getSpanVal(cell, 'rowspan');
380
387
 
381
- lastElm = td;
382
- }
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++;
383
398
 
384
- deleteMarked(tableElm);
399
+ lastCell = cell;
385
400
  }
386
- }
401
+ });
402
+ };
387
403
 
388
- function prevElm(node, name) {
389
- while ((node = node.previousSibling) != null) {
390
- if (node.nodeName == name)
391
- return node;
392
- }
404
+ function deleteCols() {
405
+ var cols = [];
393
406
 
394
- return null;
395
- }
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;
413
+
414
+ colSpan = getSpanVal(cell, 'colspan');
396
415
 
397
- function nextElm(node, names) {
398
- var namesAr = names.split(',');
416
+ if (colSpan > 1)
417
+ cell.colSpan = colSpan - 1;
418
+ else
419
+ dom.remove(cell);
420
+ });
399
421
 
400
- while ((node = node.nextSibling) != null) {
401
- for (var i=0; i<namesAr.length; i++) {
402
- if (node.nodeName.toLowerCase() == namesAr[i].toLowerCase() )
403
- return node;
422
+ cols.push(x);
404
423
  }
405
- }
424
+ });
425
+ });
406
426
 
407
- return null;
408
- }
427
+ cleanup();
428
+ };
409
429
 
410
- function deleteMarked(tbl) {
411
- if (tbl.rows == 0)
412
- return;
430
+ function deleteRows() {
431
+ var rows;
413
432
 
414
- var tr = tbl.rows[0];
415
- do {
416
- var next = nextElm(tr, "TR");
433
+ function deleteRow(tr) {
434
+ var nextTr, pos, lastCell;
417
435
 
418
- // Delete row
419
- if (tr._delete) {
420
- tr.parentNode.removeChild(tr);
421
- continue;
422
- }
436
+ nextTr = dom.getNext(tr, 'tr');
423
437
 
424
- // Delete cells
425
- var td = tr.cells[0];
426
- if (td.cells > 1) {
427
- do {
428
- var nexttd = nextElm(td, "TD,TH");
438
+ // Move down row spanned cells
439
+ each(tr.cells, function(cell) {
440
+ var rowSpan = getSpanVal(cell, 'rowspan');
429
441
 
430
- if (td._delete)
431
- td.parentNode.removeChild(td);
432
- } 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);
433
446
  }
434
- } while ((tr = next) != null);
435
- }
447
+ });
436
448
 
437
- function addRows(td_elm, tr_elm, rowspan) {
438
- // Add rows
439
- td_elm.rowSpan = 1;
440
- var trNext = nextElm(tr_elm, "TR");
441
- for (var i=1; i<rowspan && trNext; i++) {
442
- var newTD = doc.createElement("td");
449
+ // Delete cells
450
+ pos = getPos(tr.cells[0]);
451
+ each(grid[pos.y], function(cell) {
452
+ var rowSpan;
443
453
 
444
- if (!tinymce.isIE)
445
- newTD.innerHTML = '<br mce_bogus="1"/>';
454
+ cell = cell.elm;
446
455
 
447
- if (tinymce.isIE)
448
- trNext.insertBefore(newTD, trNext.cells(td_elm.cellIndex));
449
- else
450
- trNext.insertBefore(newTD, trNext.cells[td_elm.cellIndex]);
456
+ if (cell != lastCell) {
457
+ rowSpan = getSpanVal(cell, 'rowspan');
451
458
 
452
- trNext = nextElm(trNext, "TR");
453
- }
454
- }
459
+ if (rowSpan <= 1)
460
+ dom.remove(cell);
461
+ else
462
+ cell.rowSpan = rowSpan - 1;
455
463
 
456
- function copyRow(doc, table, tr) {
457
- var grid = getTableGrid(table);
458
- var newTR = tr.cloneNode(false);
459
- var cpos = getCellPos(grid, tr.cells[0]);
460
- var lastCell = null;
461
- var tableBorder = inst.dom.getAttrib(table, "border");
462
- var tdElm = null;
463
-
464
- for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
465
- var newTD = null;
466
-
467
- if (lastCell != tdElm) {
468
- for (var i=0; i<tr.cells.length; i++) {
469
- if (tdElm == tr.cells[i]) {
470
- newTD = tdElm.cloneNode(true);
471
- break;
472
- }
473
- }
464
+ lastCell = cell;
474
465
  }
466
+ });
467
+ };
475
468
 
476
- if (newTD == null) {
477
- newTD = doc.createElement("td");
469
+ // Get selected rows and move selection out of scope
470
+ rows = getSelectedRows();
478
471
 
479
- if (!tinymce.isIE)
480
- newTD.innerHTML = '<br mce_bogus="1"/>';
481
- }
472
+ // Delete all selected rows
473
+ each(rows.reverse(), function(tr) {
474
+ deleteRow(tr);
475
+ });
482
476
 
483
- // Reset col/row span
484
- newTD.colSpan = 1;
485
- newTD.rowSpan = 1;
477
+ cleanup();
478
+ };
486
479
 
487
- newTR.appendChild(newTD);
480
+ function cutRows() {
481
+ var rows = getSelectedRows();
488
482
 
489
- lastCell = tdElm;
490
- }
483
+ dom.remove(rows);
484
+ cleanup();
491
485
 
492
- return newTR;
493
- }
486
+ return rows;
487
+ };
494
488
 
495
- // ---- Commands -----
489
+ function copyRows() {
490
+ var rows = getSelectedRows();
496
491
 
497
- // Handle commands
498
- switch (command) {
499
- case "mceTableMoveToNextRow":
500
- var nextCell = getNextCell(tableElm, tdElm);
492
+ each(rows, function(row, i) {
493
+ rows[i] = row.cloneNode(true);
494
+ });
501
495
 
502
- if (!nextCell) {
503
- inst.execCommand("mceTableInsertRowAfter", tdElm);
504
- nextCell = getNextCell(tableElm, tdElm);
505
- }
496
+ return rows;
497
+ };
506
498
 
507
- inst.selection.select(nextCell);
508
- 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;
509
503
 
510
- return true;
504
+ // Calc target cell count
505
+ each(grid, function(row) {
506
+ var match;
511
507
 
512
- case "mceTableRowProps":
513
- if (trElm == null)
514
- return true;
508
+ targetCellCount = 0;
509
+ each(row, function(cell, x) {
510
+ if (cell.real)
511
+ targetCellCount += cell.colspan;
515
512
 
516
- if (user_interface) {
517
- inst.windowManager.open({
518
- url : url + '/row.htm',
519
- width : 400 + parseInt(inst.getLang('table.rowprops_delta_width', 0)),
520
- height : 295 + parseInt(inst.getLang('table.rowprops_delta_height', 0)),
521
- inline : 1
522
- }, {
523
- plugin_url : url
524
- });
525
- }
513
+ if (cell.elm.parentNode == targetRow)
514
+ match = 1;
515
+ });
526
516
 
527
- return true;
517
+ if (match)
518
+ return false;
519
+ });
528
520
 
529
- case "mceTableCellProps":
530
- if (tdElm == null)
531
- return true;
521
+ if (!before)
522
+ rows.reverse();
532
523
 
533
- if (user_interface) {
534
- inst.windowManager.open({
535
- url : url + '/cell.htm',
536
- width : 400 + parseInt(inst.getLang('table.cellprops_delta_width', 0)),
537
- height : 295 + parseInt(inst.getLang('table.cellprops_delta_height', 0)),
538
- inline : 1
539
- }, {
540
- plugin_url : url
541
- });
542
- }
524
+ each(rows, function(row) {
525
+ var cellCount = row.cells.length, cell;
543
526
 
544
- 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
+ }
545
532
 
546
- case "mceInsertTable":
547
- if (user_interface) {
548
- inst.windowManager.open({
549
- url : url + '/table.htm',
550
- width : 400 + parseInt(inst.getLang('table.table_delta_width', 0)),
551
- height : 320 + parseInt(inst.getLang('table.table_delta_height', 0)),
552
- inline : 1
553
- }, {
554
- plugin_url : url,
555
- action : value ? value.action : 0
556
- });
557
- }
533
+ // Needs more cells
534
+ for (i = cellCount; i < targetCellCount; i++)
535
+ row.appendChild(cloneCell(row.cells[cellCount - 1]));
558
536
 
559
- return true;
537
+ // Needs less cells
538
+ for (i = targetCellCount; i < cellCount; i++)
539
+ dom.remove(row.cells[i]);
560
540
 
561
- case "mceTableDelete":
562
- var table = inst.dom.getParent(inst.selection.getNode(), "table");
563
- if (table) {
564
- table.parentNode.removeChild(table);
565
- inst.execCommand('mceRepaint');
566
- }
567
- return true;
568
-
569
- case "mceTableSplitCells":
570
- case "mceTableMergeCells":
571
- case "mceTableInsertRowBefore":
572
- case "mceTableInsertRowAfter":
573
- case "mceTableDeleteRow":
574
- case "mceTableInsertColBefore":
575
- case "mceTableInsertColAfter":
576
- case "mceTableDeleteCol":
577
- case "mceTableCutRow":
578
- case "mceTableCopyRow":
579
- case "mceTablePasteRowBefore":
580
- case "mceTablePasteRowAfter":
581
- // No table just return (invalid command)
582
- if (!tableElm)
583
- return true;
584
-
585
- // Table has a tbody use that reference
586
- // Changed logic by ApTest 2005.07.12 (www.aptest.com)
587
- // Now lookk at the focused element and take its parentNode. That will be a tbody or a table.
588
- if (trElm && tableElm != trElm.parentNode)
589
- tableElm = trElm.parentNode;
590
-
591
- if (tableElm && trElm) {
592
- switch (command) {
593
- case "mceTableCutRow":
594
- if (!trElm || !tdElm)
595
- return true;
596
-
597
- inst.tableRowClipboard = copyRow(doc, tableElm, trElm);
598
- inst.execCommand("mceTableDeleteRow");
599
- break;
600
-
601
- case "mceTableCopyRow":
602
- if (!trElm || !tdElm)
603
- return true;
604
-
605
- inst.tableRowClipboard = copyRow(doc, tableElm, trElm);
606
- break;
607
-
608
- case "mceTablePasteRowBefore":
609
- if (!trElm || !tdElm)
610
- return true;
611
-
612
- var newTR = inst.tableRowClipboard.cloneNode(true);
613
-
614
- var prevTR = prevElm(trElm, "TR");
615
- if (prevTR != null)
616
- trimRow(tableElm, prevTR, prevTR.cells[0], newTR);
617
-
618
- trElm.parentNode.insertBefore(newTR, trElm);
619
- break;
620
-
621
- case "mceTablePasteRowAfter":
622
- if (!trElm || !tdElm)
623
- return true;
624
-
625
- var nextTR = nextElm(trElm, "TR");
626
- var newTR = inst.tableRowClipboard.cloneNode(true);
627
-
628
- trimRow(tableElm, trElm, tdElm, newTR);
629
-
630
- if (nextTR == null)
631
- trElm.parentNode.appendChild(newTR);
632
- else
633
- nextTR.parentNode.insertBefore(newTR, nextTR);
634
-
635
- break;
636
-
637
- case "mceTableInsertRowBefore":
638
- if (!trElm || !tdElm)
639
- return true;
640
-
641
- var grid = getTableGrid(tableElm);
642
- var cpos = getCellPos(grid, tdElm);
643
- var newTR = doc.createElement("tr");
644
- var lastTDElm = null;
645
-
646
- cpos.rowindex--;
647
- if (cpos.rowindex < 0)
648
- cpos.rowindex = 0;
649
-
650
- // Create cells
651
- for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
652
- if (tdElm != lastTDElm) {
653
- var sd = getColRowSpan(tdElm);
654
-
655
- if (sd['rowspan'] == 1) {
656
- var newTD = doc.createElement("td");
657
-
658
- if (!tinymce.isIE)
659
- newTD.innerHTML = '<br mce_bogus="1"/>';
660
-
661
- newTD.colSpan = tdElm.colSpan;
662
-
663
- newTR.appendChild(newTD);
664
- } else
665
- tdElm.rowSpan = sd['rowspan'] + 1;
666
-
667
- lastTDElm = tdElm;
668
- }
669
- }
541
+ // Add before/after
542
+ if (before)
543
+ targetRow.parentNode.insertBefore(row, targetRow);
544
+ else
545
+ dom.insertAfter(row, targetRow);
546
+ });
547
+ };
670
548
 
671
- trElm.parentNode.insertBefore(newTR, trElm);
672
- select(0, 1);
673
- break;
549
+ function getPos(target) {
550
+ var pos;
674
551
 
675
- case "mceTableInsertRowAfter":
676
- if (!trElm || !tdElm)
677
- 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
+ });
678
559
 
679
- var grid = getTableGrid(tableElm);
680
- var cpos = getCellPos(grid, tdElm);
681
- var newTR = doc.createElement("tr");
682
- var lastTDElm = null;
560
+ return !pos;
561
+ });
683
562
 
684
- // Create cells
685
- for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
686
- if (tdElm != lastTDElm) {
687
- var sd = getColRowSpan(tdElm);
563
+ return pos;
564
+ };
688
565
 
689
- if (sd['rowspan'] == 1) {
690
- var newTD = doc.createElement("td");
566
+ function setStartCell(cell) {
567
+ startPos = getPos(cell);
568
+ };
691
569
 
692
- if (!tinymce.isIE)
693
- newTD.innerHTML = '<br mce_bogus="1"/>';
570
+ function findEndPos() {
571
+ var pos, maxX, maxY;
694
572
 
695
- newTD.colSpan = tdElm.colSpan;
573
+ maxX = maxY = 0;
696
574
 
697
- newTR.appendChild(newTD);
698
- } else
699
- tdElm.rowSpan = sd['rowspan'] + 1;
575
+ each(grid, function(row, y) {
576
+ each(row, function(cell, x) {
577
+ var colSpan, rowSpan;
700
578
 
701
- lastTDElm = tdElm;
702
- }
703
- }
579
+ if (isCellSelected(cell)) {
580
+ cell = grid[y][x];
704
581
 
705
- if (newTR.hasChildNodes()) {
706
- var nextTR = nextElm(trElm, "TR");
707
- if (nextTR)
708
- nextTR.parentNode.insertBefore(newTR, nextTR);
709
- else
710
- tableElm.appendChild(newTR);
711
- }
582
+ if (x > maxX)
583
+ maxX = x;
712
584
 
713
- select(0, 1);
714
- break;
585
+ if (y > maxY)
586
+ maxY = y;
715
587
 
716
- case "mceTableDeleteRow":
717
- if (!trElm || !tdElm)
718
- return true;
588
+ if (cell.real) {
589
+ colSpan = cell.colspan - 1;
590
+ rowSpan = cell.rowspan - 1;
719
591
 
720
- var grid = getTableGrid(tableElm);
721
- var cpos = getCellPos(grid, tdElm);
592
+ if (colSpan) {
593
+ if (x + colSpan > maxX)
594
+ maxX = x + colSpan;
595
+ }
722
596
 
723
- // Only one row, remove whole table
724
- if (grid.length == 1 && tableElm.nodeName == 'TBODY') {
725
- inst.dom.remove(inst.dom.getParent(tableElm, "table"));
726
- return true;
727
- }
597
+ if (rowSpan) {
598
+ if (y + rowSpan > maxY)
599
+ maxY = y + rowSpan;
600
+ }
601
+ }
602
+ }
603
+ });
604
+ });
728
605
 
729
- // Move down row spanned cells
730
- var cells = trElm.cells;
731
- var nextTR = nextElm(trElm, "TR");
732
- for (var x=0; x<cells.length; x++) {
733
- if (cells[x].rowSpan > 1) {
734
- var newTD = cells[x].cloneNode(true);
735
- var sd = getColRowSpan(cells[x]);
606
+ return {x : maxX, y : maxY};
607
+ };
736
608
 
737
- newTD.rowSpan = sd.rowspan - 1;
609
+ function setEndCell(cell) {
610
+ var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan;
738
611
 
739
- var nextTD = nextTR.cells[x];
612
+ endPos = getPos(cell);
740
613
 
741
- if (nextTD == null)
742
- nextTR.appendChild(newTD);
743
- else
744
- nextTR.insertBefore(newTD, nextTD);
745
- }
746
- }
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);
747
620
 
748
- // Delete cells
749
- var lastTDElm = null;
750
- for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
751
- if (tdElm != lastTDElm) {
752
- var sd = getColRowSpan(tdElm);
621
+ // Expand end positon to include spans
622
+ maxX = endX;
623
+ maxY = endY;
753
624
 
754
- if (sd.rowspan > 1) {
755
- tdElm.rowSpan = sd.rowspan - 1;
756
- } else {
757
- trElm = tdElm.parentNode;
625
+ // Expand startX
626
+ for (y = startY; y <= maxY; y++) {
627
+ cell = grid[y][startX];
758
628
 
759
- if (trElm.parentNode)
760
- trElm._delete = true;
761
- }
629
+ if (!cell.real) {
630
+ if (startX - (cell.colspan - 1) < startX)
631
+ startX -= cell.colspan - 1;
632
+ }
633
+ }
762
634
 
763
- lastTDElm = tdElm;
764
- }
765
- }
635
+ // Expand startY
636
+ for (x = startX; x <= maxX; x++) {
637
+ cell = grid[startY][x];
766
638
 
767
- deleteMarked(tableElm);
639
+ if (!cell.real) {
640
+ if (startY - (cell.rowspan - 1) < startY)
641
+ startY -= cell.rowspan - 1;
642
+ }
643
+ }
768
644
 
769
- select(0, -1);
770
- 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];
771
649
 
772
- case "mceTableInsertColBefore":
773
- if (!trElm || !tdElm)
774
- return true;
650
+ if (cell.real) {
651
+ colSpan = cell.colspan - 1;
652
+ rowSpan = cell.rowspan - 1;
775
653
 
776
- var grid = getTableGrid(inst.dom.getParent(tableElm, "table"));
777
- var cpos = getCellPos(grid, tdElm);
778
- var lastTDElm = null;
654
+ if (colSpan) {
655
+ if (x + colSpan > maxX)
656
+ maxX = x + colSpan;
657
+ }
779
658
 
780
- for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
781
- if (tdElm != lastTDElm) {
782
- var sd = getColRowSpan(tdElm);
659
+ if (rowSpan) {
660
+ if (y + rowSpan > maxY)
661
+ maxY = y + rowSpan;
662
+ }
663
+ }
664
+ }
665
+ }
783
666
 
784
- if (sd['colspan'] == 1) {
785
- var newTD = doc.createElement(tdElm.nodeName);
667
+ // Remove current selection
668
+ dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
786
669
 
787
- if (!tinymce.isIE)
788
- 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
+ };
789
695
 
790
- newTD.rowSpan = tdElm.rowSpan;
696
+ tinymce.create('tinymce.plugins.TablePlugin', {
697
+ init : function(ed, url) {
698
+ var winMan, clipboardRows;
791
699
 
792
- tdElm.parentNode.insertBefore(newTD, tdElm);
793
- } else
794
- tdElm.colSpan++;
700
+ function createTableGrid(node) {
701
+ var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table');
795
702
 
796
- lastTDElm = tdElm;
797
- }
798
- }
703
+ if (tblElm)
704
+ return new TableGrid(tblElm, ed.dom, selection);
705
+ };
799
706
 
800
- select();
801
- 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
+ };
802
712
 
803
- case "mceTableInsertColAfter":
804
- if (!trElm || !tdElm)
805
- 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
+ });
806
730
 
807
- var grid = getTableGrid(inst.dom.getParent(tableElm, "table"));
808
- var cpos = getCellPos(grid, tdElm);
809
- 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;
810
735
 
811
- for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
812
- if (tdElm != lastTDElm) {
813
- var sd = getColRowSpan(tdElm);
736
+ if (e.nodeName === 'TABLE')
737
+ ed.selection.select(e);
738
+ });
739
+ }
814
740
 
815
- if (sd['colspan'] == 1) {
816
- var newTD = doc.createElement(tdElm.nodeName);
741
+ // Handle node change updates
742
+ ed.onNodeChange.add(function(ed, cm, n) {
743
+ var p;
817
744
 
818
- if (!tinymce.isIE)
819
- 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);
820
748
 
821
- newTD.rowSpan = tdElm.rowSpan;
749
+ // Disable table tools if we are in caption
750
+ if (p && p.nodeName === 'CAPTION')
751
+ p = 0;
822
752
 
823
- var nextTD = nextElm(tdElm, "TD,TH");
824
- if (nextTD == null)
825
- tdElm.parentNode.appendChild(newTD);
826
- else
827
- nextTD.parentNode.insertBefore(newTD, nextTD);
828
- } else
829
- 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
+ });
830
766
 
831
- lastTDElm = tdElm;
832
- }
833
- }
767
+ ed.onInit.add(function(ed) {
768
+ var startTable, startCell, dom = ed.dom, tableGrid;
834
769
 
835
- select(1);
836
- break;
770
+ winMan = ed.windowManager;
837
771
 
838
- case "mceTableDeleteCol":
839
- if (!trElm || !tdElm)
840
- return true;
772
+ // Add cell selection logic
773
+ ed.onMouseDown.add(function(ed, e) {
774
+ if (e.button != 2) {
775
+ cleanup();
841
776
 
842
- var grid = getTableGrid(tableElm);
843
- var cpos = getCellPos(grid, tdElm);
844
- var lastTDElm = null;
777
+ startCell = dom.getParent(e.target, 'td,th');
778
+ startTable = dom.getParent(startCell, 'table');
779
+ }
780
+ });
845
781
 
846
- // Only one col, remove whole table
847
- if ((grid.length > 1 && grid[0].length <= 1) && tableElm.nodeName == 'TBODY') {
848
- inst.dom.remove(inst.dom.getParent(tableElm, "table"));
849
- return true;
850
- }
782
+ dom.bind(ed.getDoc(), 'mouseover', function(e) {
783
+ var sel, table, target = e.target;
851
784
 
852
- // Delete cells
853
- for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
854
- if (tdElm != lastTDElm) {
855
- 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);
856
791
 
857
- if (sd['colspan'] > 1)
858
- tdElm.colSpan = sd['colspan'] - 1;
859
- else {
860
- if (tdElm.parentNode)
861
- tdElm.parentNode.removeChild(tdElm);
862
- }
792
+ ed.getBody().style.webkitUserSelect = 'none';
793
+ }
863
794
 
864
- lastTDElm = tdElm;
865
- }
866
- }
795
+ tableGrid.setEndCell(target);
796
+ }
867
797
 
868
- select(-1);
869
- break;
798
+ // Remove current selection
799
+ sel = ed.selection.getSel();
870
800
 
871
- case "mceTableSplitCells":
872
- if (!trElm || !tdElm)
873
- return true;
801
+ if (sel.removeAllRanges)
802
+ sel.removeAllRanges();
803
+ else
804
+ sel.empty();
874
805
 
875
- var spandata = getColRowSpan(tdElm);
806
+ e.preventDefault();
807
+ }
808
+ });
876
809
 
877
- var colspan = spandata["colspan"];
878
- 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;
879
812
 
880
- // Needs splitting
881
- if (colspan > 1 || rowspan > 1) {
882
- // Generate cols
883
- tdElm.colSpan = 1;
884
- for (var i=1; i<colspan; i++) {
885
- var newTD = doc.createElement("td");
813
+ // Move selection to startCell
814
+ if (startCell) {
815
+ if (tableGrid)
816
+ ed.getBody().style.webkitUserSelect = '';
886
817
 
887
- if (!tinymce.isIE)
888
- newTD.innerHTML = '<br mce_bogus="1"/>';
818
+ function setPoint(node, start) {
819
+ var walker = new tinymce.dom.TreeWalker(node, node);
889
820
 
890
- 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);
891
828
 
892
- if (rowspan > 1)
893
- addRows(newTD, trElm, rowspan);
829
+ return;
894
830
  }
895
831
 
896
- addRows(tdElm, trElm, rowspan);
897
- }
898
-
899
- // Apply visual aids
900
- tableElm = inst.dom.getParent(inst.selection.getNode(), "table");
901
- break;
902
-
903
- case "mceTableMergeCells":
904
- var rows = [];
905
- var sel = inst.selection.getSel();
906
- var grid = getTableGrid(tableElm);
907
-
908
- if (tinymce.isIE || sel.rangeCount == 1) {
909
- if (user_interface) {
910
- // Setup template
911
- var sp = getColRowSpan(tdElm);
912
-
913
- inst.windowManager.open({
914
- url : url + '/merge_cells.htm',
915
- width : 240 + parseInt(inst.getLang('table.merge_cells_delta_width', 0)),
916
- height : 110 + parseInt(inst.getLang('table.merge_cells_delta_height', 0)),
917
- inline : 1
918
- }, {
919
- action : "update",
920
- numcols : sp.colspan,
921
- numrows : sp.rowspan,
922
- plugin_url : url
923
- });
924
-
925
- return true;
926
- } else {
927
- var numRows = parseInt(value['numrows']);
928
- var numCols = parseInt(value['numcols']);
929
- var cpos = getCellPos(grid, tdElm);
930
-
931
- if (("" + numRows) == "NaN")
932
- numRows = 1;
933
-
934
- if (("" + numCols) == "NaN")
935
- numCols = 1;
936
-
937
- // Get rows and cells
938
- var tRows = tableElm.rows;
939
- for (var y=cpos.rowindex; y<grid.length; y++) {
940
- var rowCells = [];
941
-
942
- for (var x=cpos.cellindex; x<grid[y].length; x++) {
943
- var td = getCell(grid, y, x);
944
-
945
- if (td && !inArray(rows, td) && !inArray(rowCells, td)) {
946
- var cp = getCellPos(grid, td);
947
-
948
- // Within range
949
- if (cp.cellindex < cpos.cellindex+numCols && cp.rowindex < cpos.rowindex+numRows)
950
- rowCells[rowCells.length] = td;
951
- }
952
- }
953
-
954
- if (rowCells.length > 0)
955
- rows[rows.length] = rowCells;
956
-
957
- var td = getCell(grid, cpos.rowindex, cpos.cellindex);
958
- each(ed.dom.select('br', td), function(e, i) {
959
- if (i > 0 && ed.dom.getAttrib('mce_bogus'))
960
- ed.dom.remove(e);
961
- });
962
- }
832
+ // BR element
833
+ if (node.nodeName == 'BR') {
834
+ if (start)
835
+ rng.setStartBefore(node);
836
+ else
837
+ rng.setEndBefore(node);
963
838
 
964
- //return true;
839
+ return;
965
840
  }
966
- } else {
967
- var cells = [];
968
- var sel = inst.selection.getSel();
969
- var lastTR = null;
970
- var curRow = null;
971
- var x1 = -1, y1 = -1, x2, y2;
972
-
973
- // Only one cell selected, whats the point?
974
- if (sel.rangeCount < 2)
975
- return true;
976
-
977
- // Get all selected cells
978
- for (var i=0; i<sel.rangeCount; i++) {
979
- var rng = sel.getRangeAt(i);
980
- var tdElm = rng.startContainer.childNodes[rng.startOffset];
981
-
982
- 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'))
983
857
  break;
984
858
 
985
- if (tdElm.nodeName == "TD" || tdElm.nodeName == "TH")
986
- cells[cells.length] = tdElm;
859
+ lastNode = node;
987
860
  }
861
+ } while (node = walker.next());
988
862
 
989
- // Get rows and cells
990
- var tRows = tableElm.rows;
991
- for (var y=0; y<tRows.length; y++) {
992
- var rowCells = [];
863
+ setPoint(lastNode);
993
864
 
994
- for (var x=0; x<tRows[y].cells.length; x++) {
995
- var td = tRows[y].cells[x];
865
+ sel.setRng(rng);
866
+ }
996
867
 
997
- for (var i=0; i<cells.length; i++) {
998
- if (td == cells[i]) {
999
- rowCells[rowCells.length] = td;
1000
- }
1001
- }
1002
- }
868
+ ed.nodeChanged();
869
+ startCell = tableGrid = startTable = null;
870
+ }
871
+ });
1003
872
 
1004
- if (rowCells.length > 0)
1005
- rows[rows.length] = rowCells;
1006
- }
873
+ ed.onKeyUp.add(function(ed, e) {
874
+ cleanup();
875
+ });
1007
876
 
1008
- // Find selected cells in grid and box
1009
- var curRow = [];
1010
- var lastTR = null;
1011
- for (var y=0; y<grid.length; y++) {
1012
- for (var x=0; x<grid[y].length; x++) {
1013
- grid[y][x]._selected = false;
1014
-
1015
- for (var i=0; i<cells.length; i++) {
1016
- if (grid[y][x] == cells[i]) {
1017
- // Get start pos
1018
- if (x1 == -1) {
1019
- x1 = x;
1020
- y1 = y;
1021
- }
1022
-
1023
- // Get end pos
1024
- x2 = x;
1025
- y2 = y;
1026
-
1027
- grid[y][x]._selected = true;
1028
- }
1029
- }
1030
- }
1031
- }
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();
1032
881
 
1033
- // Is there gaps, if so deny
1034
- for (var y=y1; y<=y2; y++) {
1035
- for (var x=x1; x<=x2; x++) {
1036
- if (!grid[y][x]._selected) {
1037
- alert("Invalid selection for merge.");
1038
- return true;
1039
- }
1040
- }
1041
- }
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();
1042
889
  }
1043
890
 
1044
- // Validate selection and get total rowspan and colspan
1045
- 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
+ }
1046
895
 
1047
- // Validate horizontal and get total colspan
1048
- var lastRowSpan = -1;
1049
- for (var y=0; y<rows.length; y++) {
1050
- 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();
1051
900
 
1052
- for (var x=0; x<rows[y].length; x++) {
1053
- 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'});
1054
906
 
1055
- 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);
1056
918
 
1057
- if (lastRowSpan != -1 && sd['rowspan'] != lastRowSpan) {
1058
- alert("Invalid selection for merge.");
1059
- return true;
1060
- }
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
+ }
1061
928
 
1062
- lastRowSpan = sd['rowspan'];
1063
- }
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;
1064
934
 
1065
- if (rowColSpan > colSpan)
1066
- 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) ;
1067
937
 
1068
- lastRowSpan = -1;
1069
- }
938
+ if (last && last.nodeName == 'TABLE')
939
+ ed.dom.add(ed.getBody(), 'p', null, '<br mce_bogus="1" />');
940
+ };
1070
941
 
1071
- // Validate vertical and get total rowspan
1072
- var lastColSpan = -1;
1073
- for (var x=0; x<rows[0].length; x++) {
1074
- var colRowSpan = 0;
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;
1075
948
 
1076
- for (var y=0; y<rows.length; y++) {
1077
- var sd = getColRowSpan(rows[y][x]);
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');
1078
953
 
1079
- colRowSpan += sd['rowspan'];
954
+ if (table && ed.getBody().firstChild == table) {
955
+ if (isAtStart(rng, table)) {
956
+ rng = dom.createRng();
1080
957
 
1081
- if (lastColSpan != -1 && sd['colspan'] != lastColSpan) {
1082
- alert("Invalid selection for merge.");
1083
- return true;
1084
- }
958
+ rng.setStartBefore(table);
959
+ rng.setEndBefore(table);
960
+
961
+ ed.selection.setRng(rng);
1085
962
 
1086
- lastColSpan = sd['colspan'];
963
+ e.preventDefault();
964
+ }
1087
965
  }
966
+ }
967
+ });
968
+ }
969
+
970
+ ed.onKeyUp.add(fixTableCaretPos);
971
+ ed.onSetContent.add(fixTableCaretPos);
972
+ ed.onVisualAid.add(fixTableCaretPos);
1088
973
 
1089
- if (colRowSpan > rowSpan)
1090
- rowSpan = colRowSpan;
974
+ ed.onPreProcess.add(function(ed, o) {
975
+ var last = o.node.lastChild;
1091
976
 
1092
- lastColSpan = -1;
1093
- }
977
+ if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR')
978
+ ed.dom.remove(last);
979
+ });
980
+
981
+ fixTableCaretPos();
982
+ }
983
+ });
984
+
985
+ // Register action commands
986
+ each({
987
+ mceTableSplitCells : function(grid) {
988
+ grid.split();
989
+ },
1094
990
 
1095
- // Setup td
1096
- tdElm = rows[0][0];
1097
- tdElm.rowSpan = rowSpan;
1098
- tdElm.colSpan = colSpan;
991
+ mceTableMergeCells : function(grid) {
992
+ var rowSpan, colSpan, cell;
1099
993
 
1100
- // Merge cells
1101
- for (var y=0; y<rows.length; y++) {
1102
- for (var x=0; x<rows[y].length; x++) {
1103
- var html = rows[y][x].innerHTML;
1104
- var chk = html.replace(/[ \t\r\n]/g, "");
994
+ cell = ed.dom.getParent(ed.selection.getNode(), 'th,td');
995
+ if (cell) {
996
+ rowSpan = cell.rowSpan;
997
+ colSpan = cell.colSpan;
998
+ }
1105
999
 
1106
- if (chk != "<br/>" && chk != "<br>" && chk != '<br mce_bogus="1"/>' && (x+y > 0))
1107
- tdElm.innerHTML += html;
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
+ },
1108
1017
 
1109
- // Not current cell
1110
- if (rows[y][x] != tdElm && !rows[y][x]._deleted) {
1111
- var cpos = getCellPos(grid, rows[y][x]);
1112
- var tr = rows[y][x].parentNode;
1018
+ mceTableInsertRowBefore : function(grid) {
1019
+ grid.insertRow(true);
1020
+ },
1113
1021
 
1114
- tr.removeChild(rows[y][x]);
1115
- rows[y][x]._deleted = true;
1022
+ mceTableInsertRowAfter : function(grid) {
1023
+ grid.insertRow();
1024
+ },
1116
1025
 
1117
- // Empty TR, remove it
1118
- if (!tr.hasChildNodes()) {
1119
- tr.parentNode.removeChild(tr);
1026
+ mceTableInsertColBefore : function(grid) {
1027
+ grid.insertCol(true);
1028
+ },
1120
1029
 
1121
- var lastCell = null;
1122
- for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) {
1123
- if (cellElm != lastCell && cellElm.rowSpan > 1)
1124
- cellElm.rowSpan--;
1030
+ mceTableInsertColAfter : function(grid) {
1031
+ grid.insertCol();
1032
+ },
1125
1033
 
1126
- lastCell = cellElm;
1127
- }
1034
+ mceTableDeleteCol : function(grid) {
1035
+ grid.deleteCols();
1036
+ },
1128
1037
 
1129
- if (tdElm.rowSpan > 1)
1130
- tdElm.rowSpan--;
1131
- }
1132
- }
1133
- }
1134
- }
1038
+ mceTableDeleteRow : function(grid) {
1039
+ grid.deleteRows();
1040
+ },
1135
1041
 
1136
- // Remove all but one bogus br
1137
- each(ed.dom.select('br', tdElm), function(e, i) {
1138
- if (i > 0 && ed.dom.getAttrib(e, 'mce_bogus'))
1139
- ed.dom.remove(e);
1140
- });
1042
+ mceTableCutRow : function(grid) {
1043
+ clipboardRows = grid.cutRows();
1044
+ },
1141
1045
 
1142
- break;
1143
- }
1046
+ mceTableCopyRow : function(grid) {
1047
+ clipboardRows = grid.copyRows();
1048
+ },
1144
1049
 
1145
- tableElm = inst.dom.getParent(inst.selection.getNode(), "table");
1146
- inst.addVisual(tableElm);
1147
- inst.nodeChanged();
1148
- }
1050
+ mceTablePasteRowBefore : function(grid) {
1051
+ grid.pasteRows(clipboardRows, true);
1052
+ },
1149
1053
 
1150
- return true;
1151
- }
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
+ });
1152
1072
 
1153
- // Pass to next handler in chain
1154
- return false;
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
+ });
1155
1113
  }
1156
1114
  });
1157
1115
 
1158
1116
  // Register plugin
1159
1117
  tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);
1160
- })();
1118
+ })(tinymce);