ckeditor-rails 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (708) hide show
  1. data/README.md +17 -14
  2. data/lib/ckeditor-rails/version.rb +1 -1
  3. data/vendor/assets/ckeditor/ckeditor/.htaccess +1 -1
  4. data/vendor/assets/ckeditor/ckeditor/CHANGES.html +139 -3
  5. data/vendor/assets/ckeditor/ckeditor/INSTALL.html +92 -92
  6. data/vendor/assets/ckeditor/ckeditor/LICENSE.html +2 -2
  7. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/application.xml +32 -32
  8. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/run.bat +9 -9
  9. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/run.sh +1 -1
  10. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/sample.html +45 -45
  11. data/vendor/assets/ckeditor/ckeditor/_samples/ajax.html +98 -98
  12. data/vendor/assets/ckeditor/ckeditor/_samples/api.html +192 -192
  13. data/vendor/assets/ckeditor/ckeditor/_samples/api_dialog.html +198 -198
  14. data/vendor/assets/ckeditor/ckeditor/_samples/api_dialog/my_dialog.js +28 -28
  15. data/vendor/assets/ckeditor/ckeditor/_samples/asp/advanced.asp +105 -105
  16. data/vendor/assets/ckeditor/ckeditor/_samples/asp/events.asp +136 -136
  17. data/vendor/assets/ckeditor/ckeditor/_samples/asp/index.html +103 -103
  18. data/vendor/assets/ckeditor/ckeditor/_samples/asp/replace.asp +72 -72
  19. data/vendor/assets/ckeditor/ckeditor/_samples/asp/replaceall.asp +77 -77
  20. data/vendor/assets/ckeditor/ckeditor/_samples/asp/sample_posteddata.asp +46 -46
  21. data/vendor/assets/ckeditor/ckeditor/_samples/asp/standalone.asp +72 -72
  22. data/vendor/assets/ckeditor/ckeditor/_samples/assets/_posteddata.php +59 -59
  23. data/vendor/assets/ckeditor/ckeditor/_samples/assets/output_xhtml.css +204 -204
  24. data/vendor/assets/ckeditor/ckeditor/_samples/assets/parsesample.css +70 -70
  25. data/vendor/assets/ckeditor/ckeditor/_samples/assets/swfobject.js +18 -18
  26. data/vendor/assets/ckeditor/ckeditor/_samples/autogrow.html +108 -107
  27. data/vendor/assets/ckeditor/ckeditor/_samples/bbcode.html +125 -125
  28. data/vendor/assets/ckeditor/ckeditor/_samples/devtools.html +94 -94
  29. data/vendor/assets/ckeditor/ckeditor/_samples/divreplace.html +154 -154
  30. data/vendor/assets/ckeditor/ckeditor/_samples/enterkey.html +115 -115
  31. data/vendor/assets/ckeditor/ckeditor/_samples/fullpage.html +82 -82
  32. data/vendor/assets/ckeditor/ckeditor/_samples/index.html +116 -116
  33. data/vendor/assets/ckeditor/ckeditor/_samples/jqueryadapter.html +99 -99
  34. data/vendor/assets/ckeditor/ckeditor/_samples/output_for_flash.html +275 -275
  35. data/vendor/assets/ckeditor/ckeditor/_samples/output_html.html +285 -285
  36. data/vendor/assets/ckeditor/ckeditor/_samples/output_xhtml.html +181 -177
  37. data/vendor/assets/ckeditor/ckeditor/_samples/php/advanced.php +120 -120
  38. data/vendor/assets/ckeditor/ckeditor/_samples/php/events.php +153 -153
  39. data/vendor/assets/ckeditor/ckeditor/_samples/php/index.html +47 -47
  40. data/vendor/assets/ckeditor/ckeditor/_samples/php/replace.php +87 -87
  41. data/vendor/assets/ckeditor/ckeditor/_samples/php/replaceall.php +88 -88
  42. data/vendor/assets/ckeditor/ckeditor/_samples/php/standalone.php +83 -83
  43. data/vendor/assets/ckeditor/ckeditor/_samples/placeholder.html +81 -81
  44. data/vendor/assets/ckeditor/ckeditor/_samples/readonly.html +91 -91
  45. data/vendor/assets/ckeditor/ckeditor/_samples/replacebyclass.html +64 -64
  46. data/vendor/assets/ckeditor/ckeditor/_samples/replacebycode.html +97 -97
  47. data/vendor/assets/ckeditor/ckeditor/_samples/sample.css +163 -163
  48. data/vendor/assets/ckeditor/ckeditor/_samples/sample.js +65 -65
  49. data/vendor/assets/ckeditor/ckeditor/_samples/sample_posteddata.php +21 -21
  50. data/vendor/assets/ckeditor/ckeditor/_samples/sharedspaces.html +153 -153
  51. data/vendor/assets/ckeditor/ckeditor/_samples/skins.html +110 -110
  52. data/vendor/assets/ckeditor/ckeditor/_samples/stylesheetparser.html +93 -93
  53. data/vendor/assets/ckeditor/ckeditor/_samples/tableresize.html +115 -115
  54. data/vendor/assets/ckeditor/ckeditor/_samples/ui_color.html +129 -129
  55. data/vendor/assets/ckeditor/ckeditor/_samples/ui_languages.html +134 -134
  56. data/vendor/assets/ckeditor/ckeditor/_source/adapters/jquery.js +306 -306
  57. data/vendor/assets/ckeditor/ckeditor/_source/core/_bootstrap.js +87 -87
  58. data/vendor/assets/ckeditor/ckeditor/_source/core/ckeditor.js +141 -141
  59. data/vendor/assets/ckeditor/ckeditor/_source/core/ckeditor_base.js +235 -227
  60. data/vendor/assets/ckeditor/ckeditor/_source/core/ckeditor_basic.js +238 -238
  61. data/vendor/assets/ckeditor/ckeditor/_source/core/command.js +225 -209
  62. data/vendor/assets/ckeditor/ckeditor/_source/core/commanddefinition.js +129 -129
  63. data/vendor/assets/ckeditor/ckeditor/_source/core/config.js +447 -431
  64. data/vendor/assets/ckeditor/ckeditor/_source/core/dataprocessor.js +65 -65
  65. data/vendor/assets/ckeditor/ckeditor/_source/core/dom.js +20 -20
  66. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/comment.js +44 -32
  67. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/document.js +251 -251
  68. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/documentfragment.js +49 -49
  69. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/domobject.js +258 -258
  70. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/element.js +1796 -1681
  71. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/elementpath.js +117 -119
  72. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/event.js +145 -145
  73. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/node.js +691 -695
  74. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/nodelist.js +26 -26
  75. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/range.js +2068 -2032
  76. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/rangelist.js +213 -213
  77. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/text.js +128 -128
  78. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/walker.js +496 -462
  79. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/window.js +96 -96
  80. data/vendor/assets/ckeditor/ckeditor/_source/core/dtd.js +266 -266
  81. data/vendor/assets/ckeditor/ckeditor/_source/core/editor.js +1059 -1059
  82. data/vendor/assets/ckeditor/ckeditor/_source/core/editor_basic.js +186 -186
  83. data/vendor/assets/ckeditor/ckeditor/_source/core/env.js +305 -291
  84. data/vendor/assets/ckeditor/ckeditor/_source/core/event.js +342 -342
  85. data/vendor/assets/ckeditor/ckeditor/_source/core/eventInfo.js +120 -120
  86. data/vendor/assets/ckeditor/ckeditor/_source/core/focusmanager.js +152 -152
  87. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser.js +224 -224
  88. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/basicwriter.js +145 -145
  89. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/cdata.js +43 -43
  90. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/comment.js +60 -60
  91. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/element.js +308 -308
  92. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/filter.js +288 -288
  93. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/fragment.js +537 -497
  94. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/text.js +53 -55
  95. data/vendor/assets/ckeditor/ckeditor/_source/core/lang.js +157 -157
  96. data/vendor/assets/ckeditor/ckeditor/_source/core/loader.js +240 -240
  97. data/vendor/assets/ckeditor/ckeditor/_source/core/plugindefinition.js +83 -83
  98. data/vendor/assets/ckeditor/ckeditor/_source/core/plugins.js +103 -103
  99. data/vendor/assets/ckeditor/ckeditor/_source/core/resourcemanager.js +238 -238
  100. data/vendor/assets/ckeditor/ckeditor/_source/core/scriptloader.js +180 -180
  101. data/vendor/assets/ckeditor/ckeditor/_source/core/skins.js +184 -184
  102. data/vendor/assets/ckeditor/ckeditor/_source/core/themes.js +19 -19
  103. data/vendor/assets/ckeditor/ckeditor/_source/core/tools.js +763 -763
  104. data/vendor/assets/ckeditor/ckeditor/_source/core/ui.js +128 -128
  105. data/vendor/assets/ckeditor/ckeditor/_source/lang/_languages.js +84 -84
  106. data/vendor/assets/ckeditor/ckeditor/_source/lang/_translationstatus.txt +63 -61
  107. data/vendor/assets/ckeditor/ckeditor/_source/lang/af.js +815 -812
  108. data/vendor/assets/ckeditor/ckeditor/_source/lang/ar.js +815 -812
  109. data/vendor/assets/ckeditor/ckeditor/_source/lang/bg.js +815 -812
  110. data/vendor/assets/ckeditor/ckeditor/_source/lang/bn.js +815 -812
  111. data/vendor/assets/ckeditor/ckeditor/_source/lang/bs.js +815 -812
  112. data/vendor/assets/ckeditor/ckeditor/_source/lang/ca.js +815 -812
  113. data/vendor/assets/ckeditor/ckeditor/_source/lang/cs.js +815 -812
  114. data/vendor/assets/ckeditor/ckeditor/_source/lang/cy.js +815 -812
  115. data/vendor/assets/ckeditor/ckeditor/_source/lang/da.js +815 -812
  116. data/vendor/assets/ckeditor/ckeditor/_source/lang/de.js +815 -812
  117. data/vendor/assets/ckeditor/ckeditor/_source/lang/el.js +815 -812
  118. data/vendor/assets/ckeditor/ckeditor/_source/lang/en-au.js +815 -812
  119. data/vendor/assets/ckeditor/ckeditor/_source/lang/en-ca.js +815 -812
  120. data/vendor/assets/ckeditor/ckeditor/_source/lang/en-gb.js +815 -812
  121. data/vendor/assets/ckeditor/ckeditor/_source/lang/en.js +815 -812
  122. data/vendor/assets/ckeditor/ckeditor/_source/lang/eo.js +815 -812
  123. data/vendor/assets/ckeditor/ckeditor/_source/lang/es.js +815 -812
  124. data/vendor/assets/ckeditor/ckeditor/_source/lang/et.js +815 -812
  125. data/vendor/assets/ckeditor/ckeditor/_source/lang/eu.js +815 -812
  126. data/vendor/assets/ckeditor/ckeditor/_source/lang/fa.js +815 -812
  127. data/vendor/assets/ckeditor/ckeditor/_source/lang/fi.js +815 -812
  128. data/vendor/assets/ckeditor/ckeditor/_source/lang/fo.js +815 -812
  129. data/vendor/assets/ckeditor/ckeditor/_source/lang/fr-ca.js +815 -812
  130. data/vendor/assets/ckeditor/ckeditor/_source/lang/fr.js +815 -812
  131. data/vendor/assets/ckeditor/ckeditor/_source/lang/gl.js +815 -812
  132. data/vendor/assets/ckeditor/ckeditor/_source/lang/gu.js +815 -812
  133. data/vendor/assets/ckeditor/ckeditor/_source/lang/he.js +815 -812
  134. data/vendor/assets/ckeditor/ckeditor/_source/lang/hi.js +815 -812
  135. data/vendor/assets/ckeditor/ckeditor/_source/lang/hr.js +815 -812
  136. data/vendor/assets/ckeditor/ckeditor/_source/lang/hu.js +815 -812
  137. data/vendor/assets/ckeditor/ckeditor/_source/lang/is.js +815 -812
  138. data/vendor/assets/ckeditor/ckeditor/_source/lang/it.js +815 -812
  139. data/vendor/assets/ckeditor/ckeditor/_source/lang/ja.js +815 -812
  140. data/vendor/assets/ckeditor/ckeditor/_source/lang/ka.js +815 -812
  141. data/vendor/assets/ckeditor/ckeditor/_source/lang/km.js +815 -812
  142. data/vendor/assets/ckeditor/ckeditor/_source/lang/ko.js +815 -812
  143. data/vendor/assets/ckeditor/ckeditor/_source/lang/lt.js +815 -812
  144. data/vendor/assets/ckeditor/ckeditor/_source/lang/lv.js +815 -812
  145. data/vendor/assets/ckeditor/ckeditor/_source/lang/mk.js +814 -0
  146. data/vendor/assets/ckeditor/ckeditor/_source/lang/mn.js +815 -812
  147. data/vendor/assets/ckeditor/ckeditor/_source/lang/ms.js +815 -812
  148. data/vendor/assets/ckeditor/ckeditor/_source/lang/nb.js +815 -812
  149. data/vendor/assets/ckeditor/ckeditor/_source/lang/nl.js +815 -812
  150. data/vendor/assets/ckeditor/ckeditor/_source/lang/no.js +815 -812
  151. data/vendor/assets/ckeditor/ckeditor/_source/lang/pl.js +815 -812
  152. data/vendor/assets/ckeditor/ckeditor/_source/lang/pt-br.js +814 -811
  153. data/vendor/assets/ckeditor/ckeditor/_source/lang/pt.js +815 -812
  154. data/vendor/assets/ckeditor/ckeditor/_source/lang/ro.js +815 -812
  155. data/vendor/assets/ckeditor/ckeditor/_source/lang/ru.js +815 -812
  156. data/vendor/assets/ckeditor/ckeditor/_source/lang/sk.js +815 -812
  157. data/vendor/assets/ckeditor/ckeditor/_source/lang/sl.js +815 -812
  158. data/vendor/assets/ckeditor/ckeditor/_source/lang/sr-latn.js +815 -812
  159. data/vendor/assets/ckeditor/ckeditor/_source/lang/sr.js +815 -812
  160. data/vendor/assets/ckeditor/ckeditor/_source/lang/sv.js +814 -811
  161. data/vendor/assets/ckeditor/ckeditor/_source/lang/th.js +815 -812
  162. data/vendor/assets/ckeditor/ckeditor/_source/lang/tr.js +814 -811
  163. data/vendor/assets/ckeditor/ckeditor/_source/lang/ug.js +814 -0
  164. data/vendor/assets/ckeditor/ckeditor/_source/lang/uk.js +815 -812
  165. data/vendor/assets/ckeditor/ckeditor/_source/lang/vi.js +815 -812
  166. data/vendor/assets/ckeditor/ckeditor/_source/lang/zh-cn.js +815 -812
  167. data/vendor/assets/ckeditor/ckeditor/_source/lang/zh.js +815 -812
  168. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/dialogs/a11yhelp.js +222 -222
  169. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/_translationstatus.txt +23 -0
  170. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/cs.js +89 -0
  171. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/cy.js +89 -0
  172. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/da.js +89 -0
  173. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/de.js +89 -0
  174. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/el.js +89 -0
  175. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/en.js +108 -108
  176. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/eo.js +89 -0
  177. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/fa.js +89 -0
  178. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/fi.js +89 -0
  179. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/fr.js +89 -0
  180. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/gu.js +89 -0
  181. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/he.js +89 -216
  182. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/it.js +89 -0
  183. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/mk.js +89 -0
  184. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/nb.js +89 -0
  185. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/nl.js +89 -0
  186. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/no.js +89 -0
  187. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/tr.js +89 -0
  188. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/ug.js +89 -0
  189. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/vi.js +89 -0
  190. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/zh-cn.js +89 -0
  191. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/plugin.js +47 -47
  192. data/vendor/assets/ckeditor/ckeditor/_source/plugins/about/dialogs/about.js +76 -76
  193. data/vendor/assets/ckeditor/ckeditor/_source/plugins/about/plugin.js +24 -24
  194. data/vendor/assets/ckeditor/ckeditor/_source/plugins/adobeair/plugin.js +228 -228
  195. data/vendor/assets/ckeditor/ckeditor/_source/plugins/ajax/plugin.js +152 -152
  196. data/vendor/assets/ckeditor/ckeditor/_source/plugins/autogrow/plugin.js +141 -88
  197. data/vendor/assets/ckeditor/ckeditor/_source/plugins/basicstyles/plugin.js +129 -101
  198. data/vendor/assets/ckeditor/ckeditor/_source/plugins/bbcode/plugin.js +931 -931
  199. data/vendor/assets/ckeditor/ckeditor/_source/plugins/bidi/plugin.js +334 -334
  200. data/vendor/assets/ckeditor/ckeditor/_source/plugins/blockquote/plugin.js +305 -305
  201. data/vendor/assets/ckeditor/ckeditor/_source/plugins/button/plugin.js +290 -290
  202. data/vendor/assets/ckeditor/ckeditor/_source/plugins/clipboard/dialogs/paste.js +223 -223
  203. data/vendor/assets/ckeditor/ckeditor/_source/plugins/clipboard/plugin.js +479 -453
  204. data/vendor/assets/ckeditor/ckeditor/_source/plugins/colorbutton/plugin.js +300 -294
  205. data/vendor/assets/ckeditor/ckeditor/_source/plugins/colordialog/dialogs/colordialog.js +387 -340
  206. data/vendor/assets/ckeditor/ckeditor/_source/plugins/colordialog/plugin.js +15 -15
  207. data/vendor/assets/ckeditor/ckeditor/_source/plugins/contextmenu/plugin.js +179 -177
  208. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/_translationstatus.txt +27 -0
  209. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/bg.js +16 -0
  210. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/cs.js +16 -0
  211. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/cy.js +16 -0
  212. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/da.js +16 -0
  213. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/de.js +16 -0
  214. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/el.js +16 -0
  215. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/en.js +16 -16
  216. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/eo.js +16 -0
  217. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/et.js +16 -0
  218. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/fa.js +16 -0
  219. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/fi.js +16 -0
  220. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/fr.js +16 -0
  221. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/gu.js +16 -0
  222. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/he.js +16 -0
  223. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/hr.js +16 -0
  224. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/it.js +16 -0
  225. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/nb.js +16 -0
  226. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/nl.js +16 -0
  227. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/no.js +16 -0
  228. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/pl.js +16 -0
  229. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/tr.js +16 -0
  230. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/ug.js +16 -0
  231. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/uk.js +16 -0
  232. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/vi.js +16 -0
  233. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/zh-cn.js +16 -0
  234. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/plugin.js +173 -173
  235. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialog/dialogDefinition.js +1166 -1166
  236. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialog/plugin.js +3319 -3289
  237. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialogadvtab/plugin.js +208 -207
  238. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialogui/plugin.js +1549 -1541
  239. data/vendor/assets/ckeditor/ckeditor/_source/plugins/div/dialogs/div.js +535 -535
  240. data/vendor/assets/ckeditor/ckeditor/_source/plugins/div/plugin.js +121 -121
  241. data/vendor/assets/ckeditor/ckeditor/_source/plugins/docprops/dialogs/docprops.js +674 -686
  242. data/vendor/assets/ckeditor/ckeditor/_source/plugins/docprops/plugin.js +22 -22
  243. data/vendor/assets/ckeditor/ckeditor/_source/plugins/domiterator/plugin.js +366 -361
  244. data/vendor/assets/ckeditor/ckeditor/_source/plugins/editingblock/plugin.js +278 -275
  245. data/vendor/assets/ckeditor/ckeditor/_source/plugins/elementspath/plugin.js +218 -218
  246. data/vendor/assets/ckeditor/ckeditor/_source/plugins/enterkey/plugin.js +433 -413
  247. data/vendor/assets/ckeditor/ckeditor/_source/plugins/entities/plugin.js +254 -250
  248. data/vendor/assets/ckeditor/ckeditor/_source/plugins/fakeobjects/plugin.js +175 -175
  249. data/vendor/assets/ckeditor/ckeditor/_source/plugins/filebrowser/plugin.js +533 -524
  250. data/vendor/assets/ckeditor/ckeditor/_source/plugins/find/dialogs/find.js +915 -903
  251. data/vendor/assets/ckeditor/ckeditor/_source/plugins/find/plugin.js +47 -47
  252. data/vendor/assets/ckeditor/ckeditor/_source/plugins/flash/dialogs/flash.js +674 -673
  253. data/vendor/assets/ckeditor/ckeditor/_source/plugins/flash/plugin.js +154 -154
  254. data/vendor/assets/ckeditor/ckeditor/_source/plugins/floatpanel/plugin.js +476 -428
  255. data/vendor/assets/ckeditor/ckeditor/_source/plugins/font/plugin.js +234 -234
  256. data/vendor/assets/ckeditor/ckeditor/_source/plugins/format/plugin.js +197 -197
  257. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/button.js +118 -118
  258. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/checkbox.js +153 -153
  259. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/form.js +177 -177
  260. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/hiddenfield.js +100 -100
  261. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/radio.js +135 -135
  262. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/select.js +558 -558
  263. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/textarea.js +135 -114
  264. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/textfield.js +199 -199
  265. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/plugin.js +288 -288
  266. data/vendor/assets/ckeditor/ckeditor/_source/plugins/horizontalrule/plugin.js +48 -48
  267. data/vendor/assets/ckeditor/ckeditor/_source/plugins/htmldataprocessor/plugin.js +600 -595
  268. data/vendor/assets/ckeditor/ckeditor/_source/plugins/htmlwriter/plugin.js +319 -319
  269. data/vendor/assets/ckeditor/ckeditor/_source/plugins/iframe/dialogs/iframe.js +229 -229
  270. data/vendor/assets/ckeditor/ckeditor/_source/plugins/iframe/plugin.js +87 -87
  271. data/vendor/assets/ckeditor/ckeditor/_source/plugins/iframedialog/plugin.js +188 -188
  272. data/vendor/assets/ckeditor/ckeditor/_source/plugins/image/dialogs/image.js +1406 -1406
  273. data/vendor/assets/ckeditor/ckeditor/_source/plugins/image/plugin.js +164 -81
  274. data/vendor/assets/ckeditor/ckeditor/_source/plugins/indent/plugin.js +480 -461
  275. data/vendor/assets/ckeditor/ckeditor/_source/plugins/justify/plugin.js +251 -253
  276. data/vendor/assets/ckeditor/ckeditor/_source/plugins/keystrokes/plugin.js +225 -225
  277. data/vendor/assets/ckeditor/ckeditor/_source/plugins/link/dialogs/anchor.js +144 -144
  278. data/vendor/assets/ckeditor/ckeditor/_source/plugins/link/dialogs/link.js +1427 -1424
  279. data/vendor/assets/ckeditor/ckeditor/_source/plugins/link/plugin.js +374 -374
  280. data/vendor/assets/ckeditor/ckeditor/_source/plugins/list/plugin.js +967 -734
  281. data/vendor/assets/ckeditor/ckeditor/_source/plugins/listblock/plugin.js +260 -268
  282. data/vendor/assets/ckeditor/ckeditor/_source/plugins/liststyle/dialogs/liststyle.js +225 -225
  283. data/vendor/assets/ckeditor/ckeditor/_source/plugins/liststyle/plugin.js +66 -66
  284. data/vendor/assets/ckeditor/ckeditor/_source/plugins/maximize/plugin.js +353 -352
  285. data/vendor/assets/ckeditor/ckeditor/_source/plugins/menu/plugin.js +542 -541
  286. data/vendor/assets/ckeditor/ckeditor/_source/plugins/menubutton/plugin.js +98 -98
  287. data/vendor/assets/ckeditor/ckeditor/_source/plugins/newpage/plugin.js +55 -54
  288. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pagebreak/plugin.js +164 -164
  289. data/vendor/assets/ckeditor/ckeditor/_source/plugins/panel/plugin.js +396 -403
  290. data/vendor/assets/ckeditor/ckeditor/_source/plugins/panelbutton/plugin.js +144 -144
  291. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastefromword/filter/default.js +1367 -1367
  292. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastefromword/plugin.js +141 -141
  293. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastetext/dialogs/pastetext.js +67 -67
  294. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastetext/plugin.js +98 -98
  295. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/dialogs/placeholder.js +71 -71
  296. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/_translationstatus.txt +26 -0
  297. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/bg.js +16 -0
  298. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/cs.js +16 -0
  299. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/cy.js +16 -0
  300. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/da.js +16 -0
  301. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/de.js +16 -0
  302. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/el.js +16 -0
  303. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/en.js +16 -16
  304. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/eo.js +16 -0
  305. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/et.js +16 -0
  306. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/fa.js +16 -0
  307. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/fi.js +16 -0
  308. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/fr.js +16 -0
  309. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/he.js +16 -16
  310. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/hr.js +16 -0
  311. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/it.js +16 -0
  312. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/nb.js +16 -0
  313. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/nl.js +16 -0
  314. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/no.js +16 -0
  315. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/pl.js +16 -0
  316. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/tr.js +16 -0
  317. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/ug.js +16 -0
  318. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/uk.js +16 -0
  319. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/vi.js +16 -0
  320. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/zh-cn.js +16 -0
  321. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/plugin.js +171 -171
  322. data/vendor/assets/ckeditor/ckeditor/_source/plugins/popup/plugin.js +69 -64
  323. data/vendor/assets/ckeditor/ckeditor/_source/plugins/preview/plugin.js +113 -109
  324. data/vendor/assets/ckeditor/ckeditor/_source/plugins/print/plugin.js +42 -42
  325. data/vendor/assets/ckeditor/ckeditor/_source/plugins/removeformat/plugin.js +185 -185
  326. data/vendor/assets/ckeditor/ckeditor/_source/plugins/resize/plugin.js +169 -168
  327. data/vendor/assets/ckeditor/ckeditor/_source/plugins/richcombo/plugin.js +381 -381
  328. data/vendor/assets/ckeditor/ckeditor/_source/plugins/save/plugin.js +56 -56
  329. data/vendor/assets/ckeditor/ckeditor/_source/plugins/scayt/dialogs/options.js +537 -537
  330. data/vendor/assets/ckeditor/ckeditor/_source/plugins/scayt/dialogs/toolbar.css +71 -71
  331. data/vendor/assets/ckeditor/ckeditor/_source/plugins/scayt/plugin.js +973 -964
  332. data/vendor/assets/ckeditor/ckeditor/_source/plugins/selection/plugin.js +1855 -1601
  333. data/vendor/assets/ckeditor/ckeditor/_source/plugins/showblocks/plugin.js +160 -160
  334. data/vendor/assets/ckeditor/ckeditor/_source/plugins/showborders/plugin.js +207 -207
  335. data/vendor/assets/ckeditor/ckeditor/_source/plugins/smiley/dialogs/smiley.js +224 -224
  336. data/vendor/assets/ckeditor/ckeditor/_source/plugins/smiley/plugin.js +94 -94
  337. data/vendor/assets/ckeditor/ckeditor/_source/plugins/sourcearea/plugin.js +209 -209
  338. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/dialogs/specialchar.js +350 -350
  339. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/_translationstatus.txt +19 -0
  340. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/cs.js +126 -0
  341. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/cy.js +126 -0
  342. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/de.js +126 -0
  343. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/en.js +126 -89
  344. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/eo.js +126 -0
  345. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/et.js +126 -0
  346. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/fa.js +126 -0
  347. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/fi.js +126 -0
  348. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/fr.js +126 -0
  349. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/hr.js +126 -0
  350. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/it.js +126 -0
  351. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/nb.js +126 -0
  352. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/nl.js +126 -0
  353. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/no.js +126 -0
  354. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/tr.js +126 -0
  355. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/ug.js +126 -0
  356. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/zh-cn.js +126 -0
  357. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/plugin.js +70 -70
  358. data/vendor/assets/ckeditor/ckeditor/_source/plugins/styles/plugin.js +1706 -1696
  359. data/vendor/assets/ckeditor/ckeditor/_source/plugins/styles/styles/default.js +88 -88
  360. data/vendor/assets/ckeditor/ckeditor/_source/plugins/stylescombo/plugin.js +218 -218
  361. data/vendor/assets/ckeditor/ckeditor/_source/plugins/stylesheetparser/plugin.js +148 -148
  362. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tab/plugin.js +367 -367
  363. data/vendor/assets/ckeditor/ckeditor/_source/plugins/table/dialogs/table.js +618 -602
  364. data/vendor/assets/ckeditor/ckeditor/_source/plugins/table/plugin.js +78 -78
  365. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tableresize/plugin.js +443 -443
  366. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tabletools/dialogs/tableCell.js +520 -525
  367. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tabletools/plugin.js +1185 -1194
  368. data/vendor/assets/ckeditor/ckeditor/_source/plugins/templates/dialogs/templates.js +234 -234
  369. data/vendor/assets/ckeditor/ckeditor/_source/plugins/templates/plugin.js +100 -99
  370. data/vendor/assets/ckeditor/ckeditor/_source/plugins/templates/templates/default.js +94 -94
  371. data/vendor/assets/ckeditor/ckeditor/_source/plugins/toolbar/plugin.js +545 -545
  372. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/dialogs/uicolor.js +205 -205
  373. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/_translationstatus.txt +27 -0
  374. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/bg.js +15 -0
  375. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/cs.js +15 -0
  376. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/cy.js +15 -0
  377. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/da.js +15 -0
  378. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/de.js +15 -0
  379. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/el.js +15 -0
  380. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/en.js +15 -15
  381. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/eo.js +15 -0
  382. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/et.js +15 -0
  383. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/fa.js +15 -0
  384. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/fi.js +15 -0
  385. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/fr.js +15 -0
  386. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/he.js +15 -15
  387. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/hr.js +15 -0
  388. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/it.js +15 -0
  389. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/mk.js +15 -0
  390. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/nb.js +15 -0
  391. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/nl.js +15 -0
  392. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/no.js +15 -0
  393. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/pl.js +15 -0
  394. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/tr.js +15 -0
  395. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/ug.js +15 -0
  396. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/uk.js +15 -0
  397. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/vi.js +15 -0
  398. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/zh-cn.js +15 -0
  399. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/plugin.js +37 -37
  400. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/yui/assets/yui.css +15 -15
  401. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/yui/yui.js +71 -71
  402. data/vendor/assets/ckeditor/ckeditor/_source/plugins/undo/plugin.js +593 -580
  403. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/ciframe.html +49 -49
  404. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/tmpFrameset.html +52 -52
  405. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/wsc.css +82 -82
  406. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/wsc.js +192 -192
  407. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/plugin.js +33 -33
  408. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wysiwygarea/plugin.js +1346 -1351
  409. data/vendor/assets/ckeditor/ckeditor/_source/plugins/xml/plugin.js +170 -170
  410. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/dialog.css +989 -943
  411. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/editor.css +25 -25
  412. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/elementspath.css +73 -73
  413. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/icons.css +366 -366
  414. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/mainui.css +206 -203
  415. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/menu.css +232 -232
  416. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/panel.css +217 -217
  417. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/presets.css +49 -49
  418. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/reset.css +85 -84
  419. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/richcombo.css +287 -287
  420. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/skin.js +236 -236
  421. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/templates.css +88 -88
  422. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/toolbar.css +408 -407
  423. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/dialog.css +891 -844
  424. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/editor.css +25 -25
  425. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/elementspath.css +74 -74
  426. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/icons.css +363 -363
  427. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/mainui.css +153 -153
  428. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/menu.css +229 -229
  429. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/panel.css +212 -212
  430. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/presets.css +49 -49
  431. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/reset.css +85 -84
  432. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/richcombo.css +309 -309
  433. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/skin.js +74 -74
  434. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/templates.css +87 -87
  435. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/toolbar.css +522 -522
  436. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/dialog.css +907 -861
  437. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/editor.css +25 -25
  438. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/elementspath.css +74 -74
  439. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/icons.css +363 -363
  440. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/mainui.css +162 -162
  441. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/menu.css +232 -232
  442. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/panel.css +212 -212
  443. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/presets.css +50 -50
  444. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/reset.css +85 -84
  445. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/richcombo.css +302 -302
  446. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/skin.js +70 -70
  447. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/templates.css +87 -87
  448. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/toolbar.css +465 -465
  449. data/vendor/assets/ckeditor/ckeditor/_source/themes/default/theme.js +407 -395
  450. data/vendor/assets/ckeditor/ckeditor/adapters/jquery.js +6 -6
  451. data/vendor/assets/ckeditor/ckeditor/ckeditor.asp +955 -955
  452. data/vendor/assets/ckeditor/ckeditor/ckeditor.js +134 -130
  453. data/vendor/assets/ckeditor/ckeditor/ckeditor.pack +211 -211
  454. data/vendor/assets/ckeditor/ckeditor/ckeditor.php +29 -29
  455. data/vendor/assets/ckeditor/ckeditor/ckeditor_basic.js +8 -8
  456. data/vendor/assets/ckeditor/ckeditor/ckeditor_basic_source.js +20 -20
  457. data/vendor/assets/ckeditor/ckeditor/ckeditor_php4.php +566 -566
  458. data/vendor/assets/ckeditor/ckeditor/ckeditor_php5.php +556 -556
  459. data/vendor/assets/ckeditor/ckeditor/ckeditor_source.js +14 -4
  460. data/vendor/assets/ckeditor/ckeditor/config.js +11 -11
  461. data/vendor/assets/ckeditor/ckeditor/contents.css +25 -25
  462. data/vendor/assets/ckeditor/ckeditor/lang/_languages.js +1 -1
  463. data/vendor/assets/ckeditor/ckeditor/lang/_translationstatus.txt +61 -59
  464. data/vendor/assets/ckeditor/ckeditor/lang/af.js +2 -2
  465. data/vendor/assets/ckeditor/ckeditor/lang/ar.js +2 -2
  466. data/vendor/assets/ckeditor/ckeditor/lang/bg.js +2 -2
  467. data/vendor/assets/ckeditor/ckeditor/lang/bn.js +2 -2
  468. data/vendor/assets/ckeditor/ckeditor/lang/bs.js +2 -2
  469. data/vendor/assets/ckeditor/ckeditor/lang/ca.js +2 -2
  470. data/vendor/assets/ckeditor/ckeditor/lang/cs.js +2 -2
  471. data/vendor/assets/ckeditor/ckeditor/lang/cy.js +2 -2
  472. data/vendor/assets/ckeditor/ckeditor/lang/da.js +2 -2
  473. data/vendor/assets/ckeditor/ckeditor/lang/de.js +2 -2
  474. data/vendor/assets/ckeditor/ckeditor/lang/el.js +2 -2
  475. data/vendor/assets/ckeditor/ckeditor/lang/en-au.js +2 -2
  476. data/vendor/assets/ckeditor/ckeditor/lang/en-ca.js +2 -2
  477. data/vendor/assets/ckeditor/ckeditor/lang/en-gb.js +2 -2
  478. data/vendor/assets/ckeditor/ckeditor/lang/en.js +2 -2
  479. data/vendor/assets/ckeditor/ckeditor/lang/eo.js +2 -2
  480. data/vendor/assets/ckeditor/ckeditor/lang/es.js +2 -2
  481. data/vendor/assets/ckeditor/ckeditor/lang/et.js +2 -2
  482. data/vendor/assets/ckeditor/ckeditor/lang/eu.js +2 -2
  483. data/vendor/assets/ckeditor/ckeditor/lang/fa.js +2 -2
  484. data/vendor/assets/ckeditor/ckeditor/lang/fi.js +2 -2
  485. data/vendor/assets/ckeditor/ckeditor/lang/fo.js +2 -2
  486. data/vendor/assets/ckeditor/ckeditor/lang/fr-ca.js +2 -2
  487. data/vendor/assets/ckeditor/ckeditor/lang/fr.js +2 -2
  488. data/vendor/assets/ckeditor/ckeditor/lang/gl.js +2 -2
  489. data/vendor/assets/ckeditor/ckeditor/lang/gu.js +2 -2
  490. data/vendor/assets/ckeditor/ckeditor/lang/he.js +2 -2
  491. data/vendor/assets/ckeditor/ckeditor/lang/hi.js +2 -2
  492. data/vendor/assets/ckeditor/ckeditor/lang/hr.js +2 -2
  493. data/vendor/assets/ckeditor/ckeditor/lang/hu.js +2 -2
  494. data/vendor/assets/ckeditor/ckeditor/lang/is.js +2 -2
  495. data/vendor/assets/ckeditor/ckeditor/lang/it.js +2 -2
  496. data/vendor/assets/ckeditor/ckeditor/lang/ja.js +2 -2
  497. data/vendor/assets/ckeditor/ckeditor/lang/ka.js +2 -2
  498. data/vendor/assets/ckeditor/ckeditor/lang/km.js +2 -2
  499. data/vendor/assets/ckeditor/ckeditor/lang/ko.js +2 -2
  500. data/vendor/assets/ckeditor/ckeditor/lang/lt.js +2 -2
  501. data/vendor/assets/ckeditor/ckeditor/lang/lv.js +2 -2
  502. data/vendor/assets/ckeditor/ckeditor/lang/mk.js +6 -0
  503. data/vendor/assets/ckeditor/ckeditor/lang/mn.js +2 -2
  504. data/vendor/assets/ckeditor/ckeditor/lang/ms.js +2 -2
  505. data/vendor/assets/ckeditor/ckeditor/lang/nb.js +2 -2
  506. data/vendor/assets/ckeditor/ckeditor/lang/nl.js +2 -2
  507. data/vendor/assets/ckeditor/ckeditor/lang/no.js +2 -2
  508. data/vendor/assets/ckeditor/ckeditor/lang/pl.js +2 -2
  509. data/vendor/assets/ckeditor/ckeditor/lang/pt-br.js +2 -2
  510. data/vendor/assets/ckeditor/ckeditor/lang/pt.js +2 -2
  511. data/vendor/assets/ckeditor/ckeditor/lang/ro.js +2 -2
  512. data/vendor/assets/ckeditor/ckeditor/lang/ru.js +2 -2
  513. data/vendor/assets/ckeditor/ckeditor/lang/sk.js +2 -2
  514. data/vendor/assets/ckeditor/ckeditor/lang/sl.js +2 -2
  515. data/vendor/assets/ckeditor/ckeditor/lang/sr-latn.js +2 -2
  516. data/vendor/assets/ckeditor/ckeditor/lang/sr.js +2 -2
  517. data/vendor/assets/ckeditor/ckeditor/lang/sv.js +2 -2
  518. data/vendor/assets/ckeditor/ckeditor/lang/th.js +2 -2
  519. data/vendor/assets/ckeditor/ckeditor/lang/tr.js +2 -2
  520. data/vendor/assets/ckeditor/ckeditor/lang/ug.js +6 -0
  521. data/vendor/assets/ckeditor/ckeditor/lang/uk.js +2 -2
  522. data/vendor/assets/ckeditor/ckeditor/lang/vi.js +2 -2
  523. data/vendor/assets/ckeditor/ckeditor/lang/zh-cn.js +2 -2
  524. data/vendor/assets/ckeditor/ckeditor/lang/zh.js +2 -2
  525. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +1 -1
  526. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/_translationstatus.txt +23 -0
  527. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/cs.js +6 -0
  528. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/cy.js +6 -0
  529. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/da.js +6 -0
  530. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/de.js +6 -0
  531. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/el.js +6 -0
  532. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/en.js +2 -2
  533. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/eo.js +6 -0
  534. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/fa.js +6 -0
  535. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/fi.js +6 -0
  536. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/fr.js +6 -0
  537. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/gu.js +6 -0
  538. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/he.js +2 -2
  539. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/it.js +6 -0
  540. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/mk.js +6 -0
  541. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/nb.js +6 -0
  542. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/nl.js +6 -0
  543. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/no.js +6 -0
  544. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/tr.js +6 -0
  545. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/ug.js +6 -0
  546. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/vi.js +6 -0
  547. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/zh-cn.js +6 -0
  548. data/vendor/assets/ckeditor/ckeditor/plugins/about/dialogs/about.js +1 -1
  549. data/vendor/assets/ckeditor/ckeditor/plugins/adobeair/plugin.js +1 -1
  550. data/vendor/assets/ckeditor/ckeditor/plugins/ajax/plugin.js +1 -1
  551. data/vendor/assets/ckeditor/ckeditor/plugins/autogrow/plugin.js +2 -2
  552. data/vendor/assets/ckeditor/ckeditor/plugins/bbcode/plugin.js +1 -1
  553. data/vendor/assets/ckeditor/ckeditor/plugins/clipboard/dialogs/paste.js +2 -2
  554. data/vendor/assets/ckeditor/ckeditor/plugins/colordialog/dialogs/colordialog.js +3 -3
  555. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/_translationstatus.txt +27 -0
  556. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/bg.js +6 -0
  557. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/cs.js +6 -0
  558. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/cy.js +6 -0
  559. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/da.js +6 -0
  560. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/de.js +6 -0
  561. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/el.js +6 -0
  562. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/en.js +1 -1
  563. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/eo.js +6 -0
  564. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/et.js +6 -0
  565. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/fa.js +6 -0
  566. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/fi.js +6 -0
  567. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/fr.js +6 -0
  568. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/gu.js +6 -0
  569. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/he.js +6 -0
  570. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/hr.js +6 -0
  571. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/it.js +6 -0
  572. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/nb.js +6 -0
  573. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/nl.js +6 -0
  574. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/no.js +6 -0
  575. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/pl.js +6 -0
  576. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/tr.js +6 -0
  577. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/ug.js +6 -0
  578. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/uk.js +6 -0
  579. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/vi.js +6 -0
  580. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/zh-cn.js +6 -0
  581. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/plugin.js +2 -2
  582. data/vendor/assets/ckeditor/ckeditor/plugins/dialog/dialogDefinition.js +1 -1
  583. data/vendor/assets/ckeditor/ckeditor/plugins/div/dialogs/div.js +1 -1
  584. data/vendor/assets/ckeditor/ckeditor/plugins/docprops/dialogs/docprops.js +3 -3
  585. data/vendor/assets/ckeditor/ckeditor/plugins/docprops/plugin.js +1 -1
  586. data/vendor/assets/ckeditor/ckeditor/plugins/find/dialogs/find.js +6 -6
  587. data/vendor/assets/ckeditor/ckeditor/plugins/flash/dialogs/flash.js +2 -2
  588. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/button.js +1 -1
  589. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/checkbox.js +1 -1
  590. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/form.js +1 -1
  591. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/hiddenfield.js +1 -1
  592. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/radio.js +1 -1
  593. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/select.js +1 -1
  594. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/textarea.js +2 -2
  595. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/textfield.js +1 -1
  596. data/vendor/assets/ckeditor/ckeditor/plugins/iframe/dialogs/iframe.js +1 -1
  597. data/vendor/assets/ckeditor/ckeditor/plugins/iframedialog/plugin.js +1 -1
  598. data/vendor/assets/ckeditor/ckeditor/plugins/image/dialogs/image.js +9 -9
  599. data/vendor/assets/ckeditor/ckeditor/plugins/link/dialogs/anchor.js +1 -1
  600. data/vendor/assets/ckeditor/ckeditor/plugins/link/dialogs/link.js +6 -6
  601. data/vendor/assets/ckeditor/ckeditor/plugins/liststyle/dialogs/liststyle.js +1 -1
  602. data/vendor/assets/ckeditor/ckeditor/plugins/pastefromword/filter/default.js +1 -1
  603. data/vendor/assets/ckeditor/ckeditor/plugins/pastetext/dialogs/pastetext.js +1 -1
  604. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/dialogs/placeholder.js +1 -1
  605. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/_translationstatus.txt +26 -0
  606. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/bg.js +6 -0
  607. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/cs.js +6 -0
  608. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/cy.js +6 -0
  609. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/da.js +6 -0
  610. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/de.js +6 -0
  611. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/el.js +6 -0
  612. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/en.js +1 -1
  613. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/eo.js +6 -0
  614. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/et.js +6 -0
  615. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/fa.js +6 -0
  616. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/fi.js +6 -0
  617. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/fr.js +6 -0
  618. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/he.js +1 -1
  619. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/hr.js +6 -0
  620. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/it.js +6 -0
  621. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/nb.js +6 -0
  622. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/nl.js +6 -0
  623. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/no.js +6 -0
  624. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/pl.js +6 -0
  625. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/tr.js +6 -0
  626. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/ug.js +6 -0
  627. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/uk.js +6 -0
  628. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/vi.js +6 -0
  629. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/zh-cn.js +6 -0
  630. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/plugin.js +2 -2
  631. data/vendor/assets/ckeditor/ckeditor/plugins/scayt/dialogs/options.js +1 -1
  632. data/vendor/assets/ckeditor/ckeditor/plugins/scayt/dialogs/toolbar.css +1 -1
  633. data/vendor/assets/ckeditor/ckeditor/plugins/smiley/dialogs/smiley.js +1 -1
  634. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/dialogs/specialchar.js +2 -2
  635. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/_translationstatus.txt +19 -0
  636. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/cs.js +6 -0
  637. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/cy.js +6 -0
  638. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/de.js +6 -0
  639. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/en.js +2 -2
  640. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/eo.js +6 -0
  641. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/et.js +6 -0
  642. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/fa.js +6 -0
  643. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/fi.js +6 -0
  644. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/fr.js +6 -0
  645. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/hr.js +6 -0
  646. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/it.js +6 -0
  647. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/nb.js +6 -0
  648. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/nl.js +6 -0
  649. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/no.js +6 -0
  650. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/tr.js +6 -0
  651. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/ug.js +6 -0
  652. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/zh-cn.js +6 -0
  653. data/vendor/assets/ckeditor/ckeditor/plugins/styles/styles/default.js +1 -1
  654. data/vendor/assets/ckeditor/ckeditor/plugins/stylesheetparser/plugin.js +1 -1
  655. data/vendor/assets/ckeditor/ckeditor/plugins/table/dialogs/table.js +5 -5
  656. data/vendor/assets/ckeditor/ckeditor/plugins/tableresize/plugin.js +1 -1
  657. data/vendor/assets/ckeditor/ckeditor/plugins/tabletools/dialogs/tableCell.js +3 -3
  658. data/vendor/assets/ckeditor/ckeditor/plugins/templates/dialogs/templates.js +1 -1
  659. data/vendor/assets/ckeditor/ckeditor/plugins/templates/templates/default.js +1 -1
  660. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/dialogs/uicolor.js +1 -1
  661. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/_translationstatus.txt +27 -0
  662. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/bg.js +6 -0
  663. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/cs.js +6 -0
  664. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/cy.js +6 -0
  665. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/da.js +6 -0
  666. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/de.js +6 -0
  667. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/el.js +6 -0
  668. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/en.js +1 -1
  669. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/eo.js +6 -0
  670. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/et.js +6 -0
  671. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/fa.js +6 -0
  672. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/fi.js +6 -0
  673. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/fr.js +6 -0
  674. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/he.js +1 -1
  675. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/hr.js +6 -0
  676. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/it.js +6 -0
  677. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/mk.js +6 -0
  678. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/nb.js +6 -0
  679. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/nl.js +6 -0
  680. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/no.js +6 -0
  681. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/pl.js +6 -0
  682. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/tr.js +6 -0
  683. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/ug.js +6 -0
  684. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/uk.js +6 -0
  685. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/vi.js +6 -0
  686. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/zh-cn.js +6 -0
  687. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/plugin.js +2 -2
  688. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/yui/assets/yui.css +1 -1
  689. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/yui/yui.js +1 -1
  690. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/ciframe.html +1 -1
  691. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +1 -1
  692. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/wsc.css +1 -1
  693. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/wsc.js +2 -2
  694. data/vendor/assets/ckeditor/ckeditor/plugins/xml/plugin.js +1 -1
  695. data/vendor/assets/ckeditor/ckeditor/skins/kama/dialog.css +2 -2
  696. data/vendor/assets/ckeditor/ckeditor/skins/kama/editor.css +4 -4
  697. data/vendor/assets/ckeditor/ckeditor/skins/kama/skin.js +1 -1
  698. data/vendor/assets/ckeditor/ckeditor/skins/kama/templates.css +1 -1
  699. data/vendor/assets/ckeditor/ckeditor/skins/office2003/dialog.css +2 -2
  700. data/vendor/assets/ckeditor/ckeditor/skins/office2003/editor.css +2 -2
  701. data/vendor/assets/ckeditor/ckeditor/skins/office2003/skin.js +1 -1
  702. data/vendor/assets/ckeditor/ckeditor/skins/office2003/templates.css +1 -1
  703. data/vendor/assets/ckeditor/ckeditor/skins/v2/dialog.css +2 -2
  704. data/vendor/assets/ckeditor/ckeditor/skins/v2/editor.css +2 -2
  705. data/vendor/assets/ckeditor/ckeditor/skins/v2/skin.js +1 -1
  706. data/vendor/assets/ckeditor/ckeditor/skins/v2/templates.css +1 -1
  707. data/vendor/assets/ckeditor/ckeditor/themes/default/theme.js +8 -8
  708. metadata +225 -3
@@ -1,1194 +1,1185 @@
1
- /*
2
- Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
3
- For licensing, see LICENSE.html or http://ckeditor.com/license
4
- */
5
-
6
- (function()
7
- {
8
- var cellNodeRegex = /^(?:td|th)$/;
9
-
10
- function getSelectedCells( selection )
11
- {
12
- // Walker will try to split text nodes, which will make the current selection
13
- // invalid. So save bookmarks before doing anything.
14
- var bookmarks = selection.createBookmarks();
15
-
16
- var ranges = selection.getRanges();
17
- var retval = [];
18
- var database = {};
19
-
20
- function moveOutOfCellGuard( node )
21
- {
22
- // Apply to the first cell only.
23
- if ( retval.length > 0 )
24
- return;
25
-
26
- // If we are exiting from the first </td>, then the td should definitely be
27
- // included.
28
- if ( node.type == CKEDITOR.NODE_ELEMENT && cellNodeRegex.test( node.getName() )
29
- && !node.getCustomData( 'selected_cell' ) )
30
- {
31
- CKEDITOR.dom.element.setMarker( database, node, 'selected_cell', true );
32
- retval.push( node );
33
- }
34
- }
35
-
36
- for ( var i = 0 ; i < ranges.length ; i++ )
37
- {
38
- var range = ranges[ i ];
39
-
40
- if ( range.collapsed )
41
- {
42
- // Walker does not handle collapsed ranges yet - fall back to old API.
43
- var startNode = range.getCommonAncestor();
44
- var nearestCell = startNode.getAscendant( 'td', true ) || startNode.getAscendant( 'th', true );
45
- if ( nearestCell )
46
- retval.push( nearestCell );
47
- }
48
- else
49
- {
50
- var walker = new CKEDITOR.dom.walker( range );
51
- var node;
52
- walker.guard = moveOutOfCellGuard;
53
-
54
- while ( ( node = walker.next() ) )
55
- {
56
- // If may be possible for us to have a range like this:
57
- // <td>^1</td><td>^2</td>
58
- // The 2nd td shouldn't be included.
59
- //
60
- // So we have to take care to include a td we've entered only when we've
61
- // walked into its children.
62
-
63
- var parent = node.getAscendant( 'td' ) || node.getAscendant( 'th' );
64
- if ( parent && !parent.getCustomData( 'selected_cell' ) )
65
- {
66
- CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
67
- retval.push( parent );
68
- }
69
- }
70
- }
71
- }
72
-
73
- CKEDITOR.dom.element.clearAllMarkers( database );
74
-
75
- // Restore selection position.
76
- selection.selectBookmarks( bookmarks );
77
-
78
- return retval;
79
- }
80
-
81
- function getFocusElementAfterDelCells( cellsToDelete ) {
82
- var i = 0,
83
- last = cellsToDelete.length - 1,
84
- database = {},
85
- cell,focusedCell,
86
- tr;
87
-
88
- while ( ( cell = cellsToDelete[ i++ ] ) )
89
- CKEDITOR.dom.element.setMarker( database, cell, 'delete_cell', true );
90
-
91
- // 1.first we check left or right side focusable cell row by row;
92
- i = 0;
93
- while ( ( cell = cellsToDelete[ i++ ] ) )
94
- {
95
- if ( ( focusedCell = cell.getPrevious() ) && !focusedCell.getCustomData( 'delete_cell' )
96
- || ( focusedCell = cell.getNext() ) && !focusedCell.getCustomData( 'delete_cell' ) )
97
- {
98
- CKEDITOR.dom.element.clearAllMarkers( database );
99
- return focusedCell;
100
- }
101
- }
102
-
103
- CKEDITOR.dom.element.clearAllMarkers( database );
104
-
105
- // 2. then we check the toppest row (outside the selection area square) focusable cell
106
- tr = cellsToDelete[ 0 ].getParent();
107
- if ( ( tr = tr.getPrevious() ) )
108
- return tr.getLast();
109
-
110
- // 3. last we check the lowerest row focusable cell
111
- tr = cellsToDelete[ last ].getParent();
112
- if ( ( tr = tr.getNext() ) )
113
- return tr.getChild( 0 );
114
-
115
- return null;
116
- }
117
-
118
- function insertRow( selection, insertBefore )
119
- {
120
- var cells = getSelectedCells( selection ),
121
- firstCell = cells[ 0 ],
122
- table = firstCell.getAscendant( 'table' ),
123
- doc = firstCell.getDocument(),
124
- startRow = cells[ 0 ].getParent(),
125
- startRowIndex = startRow.$.rowIndex,
126
- lastCell = cells[ cells.length - 1 ],
127
- endRowIndex = lastCell.getParent().$.rowIndex + lastCell.$.rowSpan - 1,
128
- endRow = new CKEDITOR.dom.element( table.$.rows[ endRowIndex ] ),
129
- rowIndex = insertBefore ? startRowIndex : endRowIndex,
130
- row = insertBefore ? startRow : endRow;
131
-
132
- var map = CKEDITOR.tools.buildTableMap( table ),
133
- cloneRow = map[ rowIndex ],
134
- nextRow = insertBefore ? map[ rowIndex - 1 ] : map[ rowIndex + 1 ],
135
- width = map[0].length;
136
-
137
- var newRow = doc.createElement( 'tr' );
138
- for ( var i = 0; i < width; i++ )
139
- {
140
- var cell;
141
- // Check whether there's a spanning row here, do not break it.
142
- if ( cloneRow[ i ].rowSpan > 1 && nextRow && cloneRow[ i ] == nextRow[ i ] )
143
- {
144
- cell = cloneRow[ i ];
145
- cell.rowSpan += 1;
146
- }
147
- else
148
- {
149
- cell = new CKEDITOR.dom.element( cloneRow[ i ] ).clone();
150
- cell.removeAttribute( 'rowSpan' );
151
- !CKEDITOR.env.ie && cell.appendBogus();
152
- newRow.append( cell );
153
- cell = cell.$;
154
- }
155
-
156
- i += cell.colSpan - 1;
157
- }
158
-
159
- insertBefore ?
160
- newRow.insertBefore( row ) :
161
- newRow.insertAfter( row );
162
- }
163
-
164
- function deleteRows( selectionOrRow )
165
- {
166
- if ( selectionOrRow instanceof CKEDITOR.dom.selection )
167
- {
168
- var cells = getSelectedCells( selectionOrRow ),
169
- firstCell = cells[ 0 ],
170
- table = firstCell.getAscendant( 'table' ),
171
- map = CKEDITOR.tools.buildTableMap( table ),
172
- startRow = cells[ 0 ].getParent(),
173
- startRowIndex = startRow.$.rowIndex,
174
- lastCell = cells[ cells.length - 1 ],
175
- endRowIndex = lastCell.getParent().$.rowIndex + lastCell.$.rowSpan - 1,
176
- rowsToDelete = [];
177
-
178
- // Delete cell or reduce cell spans by checking through the table map.
179
- for ( var i = startRowIndex; i <= endRowIndex; i++ )
180
- {
181
- var mapRow = map[ i ],
182
- row = new CKEDITOR.dom.element( table.$.rows[ i ] );
183
-
184
- for ( var j = 0; j < mapRow.length; j++ )
185
- {
186
- var cell = new CKEDITOR.dom.element( mapRow[ j ] ),
187
- cellRowIndex = cell.getParent().$.rowIndex;
188
-
189
- if ( cell.$.rowSpan == 1 )
190
- cell.remove();
191
- // Row spanned cell.
192
- else
193
- {
194
- // Span row of the cell, reduce spanning.
195
- cell.$.rowSpan -= 1;
196
- // Root row of the cell, root cell to next row.
197
- if ( cellRowIndex == i )
198
- {
199
- var nextMapRow = map[ i + 1 ];
200
- nextMapRow[ j - 1 ] ?
201
- cell.insertAfter( new CKEDITOR.dom.element( nextMapRow[ j - 1 ] ) )
202
- : new CKEDITOR.dom.element( table.$.rows[ i + 1 ] ).append( cell, 1 );
203
- }
204
- }
205
-
206
- j += cell.$.colSpan - 1;
207
- }
208
-
209
- rowsToDelete.push( row );
210
- }
211
-
212
- var rows = table.$.rows;
213
-
214
- // Where to put the cursor after rows been deleted?
215
- // 1. Into next sibling row if any;
216
- // 2. Into previous sibling row if any;
217
- // 3. Into table's parent element if it's the very last row.
218
- var cursorPosition = new CKEDITOR.dom.element( rows[ endRowIndex + 1 ] || ( startRowIndex > 0 ? rows[ startRowIndex - 1 ] : null ) || table.$.parentNode );
219
-
220
- for ( i = rowsToDelete.length ; i >= 0 ; i-- )
221
- deleteRows( rowsToDelete[ i ] );
222
-
223
- return cursorPosition;
224
- }
225
- else if ( selectionOrRow instanceof CKEDITOR.dom.element )
226
- {
227
- table = selectionOrRow.getAscendant( 'table' );
228
-
229
- if ( table.$.rows.length == 1 )
230
- table.remove();
231
- else
232
- selectionOrRow.remove();
233
- }
234
-
235
- return null;
236
- }
237
-
238
- function getCellColIndex( cell, isStart )
239
- {
240
- var row = cell.getParent(),
241
- rowCells = row.$.cells;
242
-
243
- var colIndex = 0;
244
- for ( var i = 0; i < rowCells.length; i++ )
245
- {
246
- var mapCell = rowCells[ i ];
247
- colIndex += isStart ? 1 : mapCell.colSpan;
248
- if ( mapCell == cell.$ )
249
- break;
250
- }
251
-
252
- return colIndex -1;
253
- }
254
-
255
- function getColumnsIndices( cells, isStart )
256
- {
257
- var retval = isStart ? Infinity : 0;
258
- for ( var i = 0; i < cells.length; i++ )
259
- {
260
- var colIndex = getCellColIndex( cells[ i ], isStart );
261
- if ( isStart ? colIndex < retval : colIndex > retval )
262
- retval = colIndex;
263
- }
264
- return retval;
265
- }
266
-
267
- function insertColumn( selection, insertBefore )
268
- {
269
- var cells = getSelectedCells( selection ),
270
- firstCell = cells[ 0 ],
271
- table = firstCell.getAscendant( 'table' ),
272
- startCol = getColumnsIndices( cells, 1 ),
273
- lastCol = getColumnsIndices( cells ),
274
- colIndex = insertBefore? startCol : lastCol;
275
-
276
- var map = CKEDITOR.tools.buildTableMap( table ),
277
- cloneCol = [],
278
- nextCol = [],
279
- height = map.length;
280
-
281
- for ( var i = 0; i < height; i++ )
282
- {
283
- cloneCol.push( map[ i ][ colIndex ] );
284
- var nextCell = insertBefore ? map[ i ][ colIndex - 1 ] : map[ i ][ colIndex + 1 ];
285
- nextCell && nextCol.push( nextCell );
286
- }
287
-
288
- for ( i = 0; i < height; i++ )
289
- {
290
- var cell;
291
- // Check whether there's a spanning column here, do not break it.
292
- if ( cloneCol[ i ].colSpan > 1
293
- && nextCol.length
294
- && nextCol[ i ] == cloneCol[ i ] )
295
- {
296
- cell = cloneCol[ i ];
297
- cell.colSpan += 1;
298
- }
299
- else
300
- {
301
- cell = new CKEDITOR.dom.element( cloneCol[ i ] ).clone();
302
- cell.removeAttribute( 'colSpan' );
303
- !CKEDITOR.env.ie && cell.appendBogus();
304
- cell[ insertBefore? 'insertBefore' : 'insertAfter' ].call( cell, new CKEDITOR.dom.element ( cloneCol[ i ] ) );
305
- cell = cell.$;
306
- }
307
-
308
- i += cell.rowSpan - 1;
309
- }
310
- }
311
-
312
- function deleteColumns( selectionOrCell )
313
- {
314
- var cells = getSelectedCells( selectionOrCell ),
315
- firstCell = cells[ 0 ],
316
- lastCell = cells[ cells.length - 1 ],
317
- table = firstCell.getAscendant( 'table' ),
318
- map = CKEDITOR.tools.buildTableMap( table ),
319
- startColIndex,
320
- endColIndex,
321
- rowsToDelete = [];
322
-
323
- // Figure out selected cells' column indices.
324
- for ( var i = 0, rows = map.length; i < rows; i++ )
325
- {
326
- for ( var j = 0, cols = map[ i ].length; j < cols; j++ )
327
- {
328
- if ( map[ i ][ j ] == firstCell.$ )
329
- startColIndex = j;
330
- if ( map[ i ][ j ] == lastCell.$ )
331
- endColIndex = j;
332
- }
333
- }
334
-
335
- // Delete cell or reduce cell spans by checking through the table map.
336
- for ( i = startColIndex; i <= endColIndex; i++ )
337
- {
338
- for ( j = 0; j < map.length; j++ )
339
- {
340
- var mapRow = map[ j ],
341
- row = new CKEDITOR.dom.element( table.$.rows[ j ] ),
342
- cell = new CKEDITOR.dom.element( mapRow[ i ] );
343
-
344
- if ( cell.$ )
345
- {
346
- if ( cell.$.colSpan == 1 )
347
- cell.remove();
348
- // Reduce the col spans.
349
- else
350
- cell.$.colSpan -= 1;
351
-
352
- j += cell.$.rowSpan - 1;
353
-
354
- if ( !row.$.cells.length )
355
- rowsToDelete.push( row );
356
- }
357
- }
358
- }
359
-
360
- var firstRowCells = table.$.rows[ 0 ] && table.$.rows[ 0 ].cells;
361
-
362
- // Where to put the cursor after columns been deleted?
363
- // 1. Into next cell of the first row if any;
364
- // 2. Into previous cell of the first row if any;
365
- // 3. Into table's parent element;
366
- var cursorPosition = new CKEDITOR.dom.element( firstRowCells[ startColIndex ] || ( startColIndex ? firstRowCells[ startColIndex - 1 ] : table.$.parentNode ) );
367
-
368
- // Delete table rows only if all columns are gone (do not remove empty row).
369
- if ( rowsToDelete.length == rows )
370
- table.remove();
371
-
372
- return cursorPosition;
373
- }
374
-
375
- function getFocusElementAfterDelCols( cells )
376
- {
377
- var cellIndexList = [],
378
- table = cells[ 0 ] && cells[ 0 ].getAscendant( 'table' ),
379
- i, length,
380
- targetIndex, targetCell;
381
-
382
- // get the cellIndex list of delete cells
383
- for ( i = 0, length = cells.length; i < length; i++ )
384
- cellIndexList.push( cells[i].$.cellIndex );
385
-
386
- // get the focusable column index
387
- cellIndexList.sort();
388
- for ( i = 1, length = cellIndexList.length; i < length; i++ )
389
- {
390
- if ( cellIndexList[ i ] - cellIndexList[ i - 1 ] > 1 )
391
- {
392
- targetIndex = cellIndexList[ i - 1 ] + 1;
393
- break;
394
- }
395
- }
396
-
397
- if ( !targetIndex )
398
- targetIndex = cellIndexList[ 0 ] > 0 ? ( cellIndexList[ 0 ] - 1 )
399
- : ( cellIndexList[ cellIndexList.length - 1 ] + 1 );
400
-
401
- // scan row by row to get the target cell
402
- var rows = table.$.rows;
403
- for ( i = 0, length = rows.length; i < length ; i++ )
404
- {
405
- targetCell = rows[ i ].cells[ targetIndex ];
406
- if ( targetCell )
407
- break;
408
- }
409
-
410
- return targetCell ? new CKEDITOR.dom.element( targetCell ) : table.getPrevious();
411
- }
412
-
413
- function insertCell( selection, insertBefore )
414
- {
415
- var startElement = selection.getStartElement();
416
- var cell = startElement.getAscendant( 'td', 1 ) || startElement.getAscendant( 'th', 1 );
417
-
418
- if ( !cell )
419
- return;
420
-
421
- // Create the new cell element to be added.
422
- var newCell = cell.clone();
423
- if ( !CKEDITOR.env.ie )
424
- newCell.appendBogus();
425
-
426
- if ( insertBefore )
427
- newCell.insertBefore( cell );
428
- else
429
- newCell.insertAfter( cell );
430
- }
431
-
432
- function deleteCells( selectionOrCell )
433
- {
434
- if ( selectionOrCell instanceof CKEDITOR.dom.selection )
435
- {
436
- var cellsToDelete = getSelectedCells( selectionOrCell );
437
- var table = cellsToDelete[ 0 ] && cellsToDelete[ 0 ].getAscendant( 'table' );
438
- var cellToFocus = getFocusElementAfterDelCells( cellsToDelete );
439
-
440
- for ( var i = cellsToDelete.length - 1 ; i >= 0 ; i-- )
441
- deleteCells( cellsToDelete[ i ] );
442
-
443
- if ( cellToFocus )
444
- placeCursorInCell( cellToFocus, true );
445
- else if ( table )
446
- table.remove();
447
- }
448
- else if ( selectionOrCell instanceof CKEDITOR.dom.element )
449
- {
450
- var tr = selectionOrCell.getParent();
451
- if ( tr.getChildCount() == 1 )
452
- tr.remove();
453
- else
454
- selectionOrCell.remove();
455
- }
456
- }
457
-
458
- // Remove filler at end and empty spaces around the cell content.
459
- function trimCell( cell )
460
- {
461
- var bogus = cell.getBogus();
462
- bogus && bogus.remove();
463
- cell.trim();
464
- }
465
-
466
- function placeCursorInCell( cell, placeAtEnd )
467
- {
468
- var range = new CKEDITOR.dom.range( cell.getDocument() );
469
- if ( !range[ 'moveToElementEdit' + ( placeAtEnd ? 'End' : 'Start' ) ]( cell ) )
470
- {
471
- range.selectNodeContents( cell );
472
- range.collapse( placeAtEnd ? false : true );
473
- }
474
- range.select( true );
475
- }
476
-
477
- function cellInRow( tableMap, rowIndex, cell )
478
- {
479
- var oRow = tableMap[ rowIndex ];
480
- if ( typeof cell == 'undefined' )
481
- return oRow;
482
-
483
- for ( var c = 0 ; oRow && c < oRow.length ; c++ )
484
- {
485
- if ( cell.is && oRow[c] == cell.$ )
486
- return c;
487
- else if ( c == cell )
488
- return new CKEDITOR.dom.element( oRow[ c ] );
489
- }
490
- return cell.is ? -1 : null;
491
- }
492
-
493
- function cellInCol( tableMap, colIndex, cell )
494
- {
495
- var oCol = [];
496
- for ( var r = 0; r < tableMap.length; r++ )
497
- {
498
- var row = tableMap[ r ];
499
- if ( typeof cell == 'undefined' )
500
- oCol.push( row[ colIndex ] );
501
- else if ( cell.is && row[ colIndex ] == cell.$ )
502
- return r;
503
- else if ( r == cell )
504
- return new CKEDITOR.dom.element( row[ colIndex ] );
505
- }
506
-
507
- return ( typeof cell == 'undefined' )? oCol : cell.is ? -1 : null;
508
- }
509
-
510
- function mergeCells( selection, mergeDirection, isDetect )
511
- {
512
- var cells = getSelectedCells( selection );
513
-
514
- // Invalid merge request if:
515
- // 1. In batch mode despite that less than two selected.
516
- // 2. In solo mode while not exactly only one selected.
517
- // 3. Cells distributed in different table groups (e.g. from both thead and tbody).
518
- var commonAncestor;
519
- if ( ( mergeDirection ? cells.length != 1 : cells.length < 2 )
520
- || ( commonAncestor = selection.getCommonAncestor() )
521
- && commonAncestor.type == CKEDITOR.NODE_ELEMENT
522
- && commonAncestor.is( 'table' ) )
523
- {
524
- return false;
525
- }
526
-
527
- var cell,
528
- firstCell = cells[ 0 ],
529
- table = firstCell.getAscendant( 'table' ),
530
- map = CKEDITOR.tools.buildTableMap( table ),
531
- mapHeight = map.length,
532
- mapWidth = map[ 0 ].length,
533
- startRow = firstCell.getParent().$.rowIndex,
534
- startColumn = cellInRow( map, startRow, firstCell );
535
-
536
- if ( mergeDirection )
537
- {
538
- var targetCell;
539
- try
540
- {
541
- var rowspan = parseInt( firstCell.getAttribute( 'rowspan' ), 10 ) || 1;
542
- var colspan = parseInt( firstCell.getAttribute( 'colspan' ), 10 ) || 1;
543
-
544
- targetCell =
545
- map[ mergeDirection == 'up' ?
546
- ( startRow - rowspan ):
547
- mergeDirection == 'down' ? ( startRow + rowspan ) : startRow ] [
548
- mergeDirection == 'left' ?
549
- ( startColumn - colspan ):
550
- mergeDirection == 'right' ? ( startColumn + colspan ) : startColumn ];
551
-
552
- }
553
- catch( er )
554
- {
555
- return false;
556
- }
557
-
558
- // 1. No cell could be merged.
559
- // 2. Same cell actually.
560
- if ( !targetCell || firstCell.$ == targetCell )
561
- return false;
562
-
563
- // Sort in map order regardless of the DOM sequence.
564
- cells[ ( mergeDirection == 'up' || mergeDirection == 'left' ) ?
565
- 'unshift' : 'push' ]( new CKEDITOR.dom.element( targetCell ) );
566
- }
567
-
568
- // Start from here are merging way ignorance (merge up/right, batch merge).
569
- var doc = firstCell.getDocument(),
570
- lastRowIndex = startRow,
571
- totalRowSpan = 0,
572
- totalColSpan = 0,
573
- // Use a documentFragment as buffer when appending cell contents.
574
- frag = !isDetect && new CKEDITOR.dom.documentFragment( doc ),
575
- dimension = 0;
576
-
577
- for ( var i = 0; i < cells.length; i++ )
578
- {
579
- cell = cells[ i ];
580
-
581
- var tr = cell.getParent(),
582
- cellFirstChild = cell.getFirst(),
583
- colSpan = cell.$.colSpan,
584
- rowSpan = cell.$.rowSpan,
585
- rowIndex = tr.$.rowIndex,
586
- colIndex = cellInRow( map, rowIndex, cell );
587
-
588
- // Accumulated the actual places taken by all selected cells.
589
- dimension += colSpan * rowSpan;
590
- // Accumulated the maximum virtual spans from column and row.
591
- totalColSpan = Math.max( totalColSpan, colIndex - startColumn + colSpan ) ;
592
- totalRowSpan = Math.max( totalRowSpan, rowIndex - startRow + rowSpan );
593
-
594
- if ( !isDetect )
595
- {
596
- // Trim all cell fillers and check to remove empty cells.
597
- if ( trimCell( cell ), cell.getChildren().count() )
598
- {
599
- // Merge vertically cells as two separated paragraphs.
600
- if ( rowIndex != lastRowIndex
601
- && cellFirstChild
602
- && !( cellFirstChild.isBlockBoundary
603
- && cellFirstChild.isBlockBoundary( { br : 1 } ) ) )
604
- {
605
- var last = frag.getLast( CKEDITOR.dom.walker.whitespaces( true ) );
606
- if ( last && !( last.is && last.is( 'br' ) ) )
607
- frag.append( 'br' );
608
- }
609
-
610
- cell.moveChildren( frag );
611
- }
612
- i ? cell.remove() : cell.setHtml( '' );
613
- }
614
- lastRowIndex = rowIndex;
615
- }
616
-
617
- if ( !isDetect )
618
- {
619
- frag.moveChildren( firstCell );
620
-
621
- if ( !CKEDITOR.env.ie )
622
- firstCell.appendBogus();
623
-
624
- if ( totalColSpan >= mapWidth )
625
- firstCell.removeAttribute( 'rowSpan' );
626
- else
627
- firstCell.$.rowSpan = totalRowSpan;
628
-
629
- if ( totalRowSpan >= mapHeight )
630
- firstCell.removeAttribute( 'colSpan' );
631
- else
632
- firstCell.$.colSpan = totalColSpan;
633
-
634
- // Swip empty <tr> left at the end of table due to the merging.
635
- var trs = new CKEDITOR.dom.nodeList( table.$.rows ),
636
- count = trs.count();
637
-
638
- for ( i = count - 1; i >= 0; i-- )
639
- {
640
- var tailTr = trs.getItem( i );
641
- if ( !tailTr.$.cells.length )
642
- {
643
- tailTr.remove();
644
- count++;
645
- continue;
646
- }
647
- }
648
-
649
- return firstCell;
650
- }
651
- // Be able to merge cells only if actual dimension of selected
652
- // cells equals to the caculated rectangle.
653
- else
654
- return ( totalRowSpan * totalColSpan ) == dimension;
655
- }
656
-
657
- function verticalSplitCell ( selection, isDetect )
658
- {
659
- var cells = getSelectedCells( selection );
660
- if ( cells.length > 1 )
661
- return false;
662
- else if ( isDetect )
663
- return true;
664
-
665
- var cell = cells[ 0 ],
666
- tr = cell.getParent(),
667
- table = tr.getAscendant( 'table' ),
668
- map = CKEDITOR.tools.buildTableMap( table ),
669
- rowIndex = tr.$.rowIndex,
670
- colIndex = cellInRow( map, rowIndex, cell ),
671
- rowSpan = cell.$.rowSpan,
672
- newCell,
673
- newRowSpan,
674
- newCellRowSpan,
675
- newRowIndex;
676
-
677
- if ( rowSpan > 1 )
678
- {
679
- newRowSpan = Math.ceil( rowSpan / 2 );
680
- newCellRowSpan = Math.floor( rowSpan / 2 );
681
- newRowIndex = rowIndex + newRowSpan;
682
- var newCellTr = new CKEDITOR.dom.element( table.$.rows[ newRowIndex ] ),
683
- newCellRow = cellInRow( map, newRowIndex ),
684
- candidateCell;
685
-
686
- newCell = cell.clone();
687
-
688
- // Figure out where to insert the new cell by checking the vitual row.
689
- for ( var c = 0; c < newCellRow.length; c++ )
690
- {
691
- candidateCell = newCellRow[ c ];
692
- // Catch first cell actually following the column.
693
- if ( candidateCell.parentNode == newCellTr.$
694
- && c > colIndex )
695
- {
696
- newCell.insertBefore( new CKEDITOR.dom.element( candidateCell ) );
697
- break;
698
- }
699
- else
700
- candidateCell = null;
701
- }
702
-
703
- // The destination row is empty, append at will.
704
- if ( !candidateCell )
705
- newCellTr.append( newCell, true );
706
- }
707
- else
708
- {
709
- newCellRowSpan = newRowSpan = 1;
710
-
711
- newCellTr = tr.clone();
712
- newCellTr.insertAfter( tr );
713
- newCellTr.append( newCell = cell.clone() );
714
-
715
- var cellsInSameRow = cellInRow( map, rowIndex );
716
- for ( var i = 0; i < cellsInSameRow.length; i++ )
717
- cellsInSameRow[ i ].rowSpan++;
718
- }
719
-
720
- if ( !CKEDITOR.env.ie )
721
- newCell.appendBogus();
722
-
723
- cell.$.rowSpan = newRowSpan;
724
- newCell.$.rowSpan = newCellRowSpan;
725
- if ( newRowSpan == 1 )
726
- cell.removeAttribute( 'rowSpan' );
727
- if ( newCellRowSpan == 1 )
728
- newCell.removeAttribute( 'rowSpan' );
729
-
730
- return newCell;
731
- }
732
-
733
- function horizontalSplitCell( selection, isDetect )
734
- {
735
- var cells = getSelectedCells( selection );
736
- if ( cells.length > 1 )
737
- return false;
738
- else if ( isDetect )
739
- return true;
740
-
741
- var cell = cells[ 0 ],
742
- tr = cell.getParent(),
743
- table = tr.getAscendant( 'table' ),
744
- map = CKEDITOR.tools.buildTableMap( table ),
745
- rowIndex = tr.$.rowIndex,
746
- colIndex = cellInRow( map, rowIndex, cell ),
747
- colSpan = cell.$.colSpan,
748
- newCell,
749
- newColSpan,
750
- newCellColSpan;
751
-
752
- if ( colSpan > 1 )
753
- {
754
- newColSpan = Math.ceil( colSpan / 2 );
755
- newCellColSpan = Math.floor( colSpan / 2 );
756
- }
757
- else
758
- {
759
- newCellColSpan = newColSpan = 1;
760
- var cellsInSameCol = cellInCol( map, colIndex );
761
- for ( var i = 0; i < cellsInSameCol.length; i++ )
762
- cellsInSameCol[ i ].colSpan++;
763
- }
764
- newCell = cell.clone();
765
- newCell.insertAfter( cell );
766
- if ( !CKEDITOR.env.ie )
767
- newCell.appendBogus();
768
-
769
- cell.$.colSpan = newColSpan;
770
- newCell.$.colSpan = newCellColSpan;
771
- if ( newColSpan == 1 )
772
- cell.removeAttribute( 'colSpan' );
773
- if ( newCellColSpan == 1 )
774
- newCell.removeAttribute( 'colSpan' );
775
-
776
- return newCell;
777
- }
778
- // Context menu on table caption incorrect (#3834)
779
- var contextMenuTags = { thead : 1, tbody : 1, tfoot : 1, td : 1, tr : 1, th : 1 };
780
-
781
- CKEDITOR.plugins.tabletools =
782
- {
783
- init : function( editor )
784
- {
785
- var lang = editor.lang.table;
786
-
787
- editor.addCommand( 'cellProperties', new CKEDITOR.dialogCommand( 'cellProperties' ) );
788
- CKEDITOR.dialog.add( 'cellProperties', this.path + 'dialogs/tableCell.js' );
789
-
790
- editor.addCommand( 'tableDelete',
791
- {
792
- exec : function( editor )
793
- {
794
- var selection = editor.getSelection(),
795
- startElement = selection && selection.getStartElement(),
796
- table = startElement && startElement.getAscendant( 'table', 1 );
797
-
798
- if ( !table )
799
- return;
800
-
801
- // If the table's parent has only one child remove it as well (unless it's the body or a table cell) (#5416, #6289)
802
- var parent = table.getParent();
803
- if ( parent.getChildCount() == 1 && !parent.is( 'body', 'td', 'th' ) )
804
- table = parent;
805
-
806
- var range = new CKEDITOR.dom.range( editor.document );
807
- range.moveToPosition( table, CKEDITOR.POSITION_BEFORE_START );
808
- table.remove();
809
- range.select();
810
- }
811
- } );
812
-
813
- editor.addCommand( 'rowDelete',
814
- {
815
- exec : function( editor )
816
- {
817
- var selection = editor.getSelection();
818
- placeCursorInCell( deleteRows( selection ) );
819
- }
820
- } );
821
-
822
- editor.addCommand( 'rowInsertBefore',
823
- {
824
- exec : function( editor )
825
- {
826
- var selection = editor.getSelection();
827
- insertRow( selection, true );
828
- }
829
- } );
830
-
831
- editor.addCommand( 'rowInsertAfter',
832
- {
833
- exec : function( editor )
834
- {
835
- var selection = editor.getSelection();
836
- insertRow( selection );
837
- }
838
- } );
839
-
840
- editor.addCommand( 'columnDelete',
841
- {
842
- exec : function( editor )
843
- {
844
- var selection = editor.getSelection();
845
- var element = deleteColumns( selection );
846
- element && placeCursorInCell( element, true );
847
- }
848
- } );
849
-
850
- editor.addCommand( 'columnInsertBefore',
851
- {
852
- exec : function( editor )
853
- {
854
- var selection = editor.getSelection();
855
- insertColumn( selection, true );
856
- }
857
- } );
858
-
859
- editor.addCommand( 'columnInsertAfter',
860
- {
861
- exec : function( editor )
862
- {
863
- var selection = editor.getSelection();
864
- insertColumn( selection );
865
- }
866
- } );
867
-
868
- editor.addCommand( 'cellDelete',
869
- {
870
- exec : function( editor )
871
- {
872
- var selection = editor.getSelection();
873
- deleteCells( selection );
874
- }
875
- } );
876
-
877
- editor.addCommand( 'cellMerge',
878
- {
879
- exec : function( editor )
880
- {
881
- placeCursorInCell( mergeCells( editor.getSelection() ), true );
882
- }
883
- } );
884
-
885
- editor.addCommand( 'cellMergeRight',
886
- {
887
- exec : function( editor )
888
- {
889
- placeCursorInCell( mergeCells( editor.getSelection(), 'right' ), true );
890
- }
891
- } );
892
-
893
- editor.addCommand( 'cellMergeDown',
894
- {
895
- exec : function( editor )
896
- {
897
- placeCursorInCell( mergeCells( editor.getSelection(), 'down' ), true );
898
- }
899
- } );
900
-
901
- editor.addCommand( 'cellVerticalSplit',
902
- {
903
- exec : function( editor )
904
- {
905
- placeCursorInCell( verticalSplitCell( editor.getSelection() ) );
906
- }
907
- } );
908
-
909
- editor.addCommand( 'cellHorizontalSplit',
910
- {
911
- exec : function( editor )
912
- {
913
- placeCursorInCell( horizontalSplitCell( editor.getSelection() ) );
914
- }
915
- } );
916
-
917
- editor.addCommand( 'cellInsertBefore',
918
- {
919
- exec : function( editor )
920
- {
921
- var selection = editor.getSelection();
922
- insertCell( selection, true );
923
- }
924
- } );
925
-
926
- editor.addCommand( 'cellInsertAfter',
927
- {
928
- exec : function( editor )
929
- {
930
- var selection = editor.getSelection();
931
- insertCell( selection );
932
- }
933
- } );
934
-
935
- // If the "menu" plugin is loaded, register the menu items.
936
- if ( editor.addMenuItems )
937
- {
938
- editor.addMenuItems(
939
- {
940
- tablecell :
941
- {
942
- label : lang.cell.menu,
943
- group : 'tablecell',
944
- order : 1,
945
- getItems : function()
946
- {
947
- var selection = editor.getSelection(),
948
- cells = getSelectedCells( selection );
949
- return {
950
- tablecell_insertBefore : CKEDITOR.TRISTATE_OFF,
951
- tablecell_insertAfter : CKEDITOR.TRISTATE_OFF,
952
- tablecell_delete : CKEDITOR.TRISTATE_OFF,
953
- tablecell_merge : mergeCells( selection, null, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
954
- tablecell_merge_right : mergeCells( selection, 'right', true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
955
- tablecell_merge_down : mergeCells( selection, 'down', true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
956
- tablecell_split_vertical : verticalSplitCell( selection, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
957
- tablecell_split_horizontal : horizontalSplitCell( selection, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
958
- tablecell_properties : cells.length > 0 ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
959
- };
960
- }
961
- },
962
-
963
- tablecell_insertBefore :
964
- {
965
- label : lang.cell.insertBefore,
966
- group : 'tablecell',
967
- command : 'cellInsertBefore',
968
- order : 5
969
- },
970
-
971
- tablecell_insertAfter :
972
- {
973
- label : lang.cell.insertAfter,
974
- group : 'tablecell',
975
- command : 'cellInsertAfter',
976
- order : 10
977
- },
978
-
979
- tablecell_delete :
980
- {
981
- label : lang.cell.deleteCell,
982
- group : 'tablecell',
983
- command : 'cellDelete',
984
- order : 15
985
- },
986
-
987
- tablecell_merge :
988
- {
989
- label : lang.cell.merge,
990
- group : 'tablecell',
991
- command : 'cellMerge',
992
- order : 16
993
- },
994
-
995
- tablecell_merge_right :
996
- {
997
- label : lang.cell.mergeRight,
998
- group : 'tablecell',
999
- command : 'cellMergeRight',
1000
- order : 17
1001
- },
1002
-
1003
- tablecell_merge_down :
1004
- {
1005
- label : lang.cell.mergeDown,
1006
- group : 'tablecell',
1007
- command : 'cellMergeDown',
1008
- order : 18
1009
- },
1010
-
1011
- tablecell_split_horizontal :
1012
- {
1013
- label : lang.cell.splitHorizontal,
1014
- group : 'tablecell',
1015
- command : 'cellHorizontalSplit',
1016
- order : 19
1017
- },
1018
-
1019
- tablecell_split_vertical :
1020
- {
1021
- label : lang.cell.splitVertical,
1022
- group : 'tablecell',
1023
- command : 'cellVerticalSplit',
1024
- order : 20
1025
- },
1026
-
1027
- tablecell_properties :
1028
- {
1029
- label : lang.cell.title,
1030
- group : 'tablecellproperties',
1031
- command : 'cellProperties',
1032
- order : 21
1033
- },
1034
-
1035
- tablerow :
1036
- {
1037
- label : lang.row.menu,
1038
- group : 'tablerow',
1039
- order : 1,
1040
- getItems : function()
1041
- {
1042
- return {
1043
- tablerow_insertBefore : CKEDITOR.TRISTATE_OFF,
1044
- tablerow_insertAfter : CKEDITOR.TRISTATE_OFF,
1045
- tablerow_delete : CKEDITOR.TRISTATE_OFF
1046
- };
1047
- }
1048
- },
1049
-
1050
- tablerow_insertBefore :
1051
- {
1052
- label : lang.row.insertBefore,
1053
- group : 'tablerow',
1054
- command : 'rowInsertBefore',
1055
- order : 5
1056
- },
1057
-
1058
- tablerow_insertAfter :
1059
- {
1060
- label : lang.row.insertAfter,
1061
- group : 'tablerow',
1062
- command : 'rowInsertAfter',
1063
- order : 10
1064
- },
1065
-
1066
- tablerow_delete :
1067
- {
1068
- label : lang.row.deleteRow,
1069
- group : 'tablerow',
1070
- command : 'rowDelete',
1071
- order : 15
1072
- },
1073
-
1074
- tablecolumn :
1075
- {
1076
- label : lang.column.menu,
1077
- group : 'tablecolumn',
1078
- order : 1,
1079
- getItems : function()
1080
- {
1081
- return {
1082
- tablecolumn_insertBefore : CKEDITOR.TRISTATE_OFF,
1083
- tablecolumn_insertAfter : CKEDITOR.TRISTATE_OFF,
1084
- tablecolumn_delete : CKEDITOR.TRISTATE_OFF
1085
- };
1086
- }
1087
- },
1088
-
1089
- tablecolumn_insertBefore :
1090
- {
1091
- label : lang.column.insertBefore,
1092
- group : 'tablecolumn',
1093
- command : 'columnInsertBefore',
1094
- order : 5
1095
- },
1096
-
1097
- tablecolumn_insertAfter :
1098
- {
1099
- label : lang.column.insertAfter,
1100
- group : 'tablecolumn',
1101
- command : 'columnInsertAfter',
1102
- order : 10
1103
- },
1104
-
1105
- tablecolumn_delete :
1106
- {
1107
- label : lang.column.deleteColumn,
1108
- group : 'tablecolumn',
1109
- command : 'columnDelete',
1110
- order : 15
1111
- }
1112
- });
1113
- }
1114
-
1115
- // If the "contextmenu" plugin is laoded, register the listeners.
1116
- if ( editor.contextMenu )
1117
- {
1118
- editor.contextMenu.addListener( function( element, selection )
1119
- {
1120
- if ( !element || element.isReadOnly() )
1121
- return null;
1122
-
1123
- while ( element )
1124
- {
1125
- if ( element.getName() in contextMenuTags )
1126
- {
1127
- return {
1128
- tablecell : CKEDITOR.TRISTATE_OFF,
1129
- tablerow : CKEDITOR.TRISTATE_OFF,
1130
- tablecolumn : CKEDITOR.TRISTATE_OFF
1131
- };
1132
- }
1133
- element = element.getParent();
1134
- }
1135
-
1136
- return null;
1137
- } );
1138
- }
1139
- },
1140
-
1141
- getSelectedCells : getSelectedCells
1142
-
1143
- };
1144
- CKEDITOR.plugins.add( 'tabletools', CKEDITOR.plugins.tabletools );
1145
- })();
1146
-
1147
- /**
1148
- * Create a two-dimension array that reflects the actual layout of table cells,
1149
- * with cell spans, with mappings to the original td elements.
1150
- * @param table {CKEDITOR.dom.element}
1151
- */
1152
- CKEDITOR.tools.buildTableMap = function ( table )
1153
- {
1154
- var aRows = table.$.rows ;
1155
-
1156
- // Row and Column counters.
1157
- var r = -1 ;
1158
-
1159
- var aMap = [];
1160
-
1161
- for ( var i = 0 ; i < aRows.length ; i++ )
1162
- {
1163
- r++ ;
1164
- !aMap[r] && ( aMap[r] = [] );
1165
-
1166
- var c = -1 ;
1167
-
1168
- for ( var j = 0 ; j < aRows[i].cells.length ; j++ )
1169
- {
1170
- var oCell = aRows[i].cells[j] ;
1171
-
1172
- c++ ;
1173
- while ( aMap[r][c] )
1174
- c++ ;
1175
-
1176
- var iColSpan = isNaN( oCell.colSpan ) ? 1 : oCell.colSpan ;
1177
- var iRowSpan = isNaN( oCell.rowSpan ) ? 1 : oCell.rowSpan ;
1178
-
1179
- for ( var rs = 0 ; rs < iRowSpan ; rs++ )
1180
- {
1181
- if ( !aMap[r + rs] )
1182
- aMap[r + rs] = [];
1183
-
1184
- for ( var cs = 0 ; cs < iColSpan ; cs++ )
1185
- {
1186
- aMap[r + rs][c + cs] = aRows[i].cells[j] ;
1187
- }
1188
- }
1189
-
1190
- c += iColSpan - 1 ;
1191
- }
1192
- }
1193
- return aMap ;
1194
- };
1
+ /*
2
+ Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
3
+ For licensing, see LICENSE.html or http://ckeditor.com/license
4
+ */
5
+
6
+ (function()
7
+ {
8
+ var cellNodeRegex = /^(?:td|th)$/;
9
+
10
+ function getSelectedCells( selection )
11
+ {
12
+ var ranges = selection.getRanges();
13
+ var retval = [];
14
+ var database = {};
15
+
16
+ function moveOutOfCellGuard( node )
17
+ {
18
+ // Apply to the first cell only.
19
+ if ( retval.length > 0 )
20
+ return;
21
+
22
+ // If we are exiting from the first </td>, then the td should definitely be
23
+ // included.
24
+ if ( node.type == CKEDITOR.NODE_ELEMENT && cellNodeRegex.test( node.getName() )
25
+ && !node.getCustomData( 'selected_cell' ) )
26
+ {
27
+ CKEDITOR.dom.element.setMarker( database, node, 'selected_cell', true );
28
+ retval.push( node );
29
+ }
30
+ }
31
+
32
+ for ( var i = 0 ; i < ranges.length ; i++ )
33
+ {
34
+ var range = ranges[ i ];
35
+
36
+ if ( range.collapsed )
37
+ {
38
+ // Walker does not handle collapsed ranges yet - fall back to old API.
39
+ var startNode = range.getCommonAncestor();
40
+ var nearestCell = startNode.getAscendant( 'td', true ) || startNode.getAscendant( 'th', true );
41
+ if ( nearestCell )
42
+ retval.push( nearestCell );
43
+ }
44
+ else
45
+ {
46
+ var walker = new CKEDITOR.dom.walker( range );
47
+ var node;
48
+ walker.guard = moveOutOfCellGuard;
49
+
50
+ while ( ( node = walker.next() ) )
51
+ {
52
+ // If may be possible for us to have a range like this:
53
+ // <td>^1</td><td>^2</td>
54
+ // The 2nd td shouldn't be included.
55
+ //
56
+ // So we have to take care to include a td we've entered only when we've
57
+ // walked into its children.
58
+
59
+ var parent = node.getAscendant( 'td' ) || node.getAscendant( 'th' );
60
+ if ( parent && !parent.getCustomData( 'selected_cell' ) )
61
+ {
62
+ CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
63
+ retval.push( parent );
64
+ }
65
+ }
66
+ }
67
+ }
68
+
69
+ CKEDITOR.dom.element.clearAllMarkers( database );
70
+
71
+ return retval;
72
+ }
73
+
74
+ function getFocusElementAfterDelCells( cellsToDelete ) {
75
+ var i = 0,
76
+ last = cellsToDelete.length - 1,
77
+ database = {},
78
+ cell,focusedCell,
79
+ tr;
80
+
81
+ while ( ( cell = cellsToDelete[ i++ ] ) )
82
+ CKEDITOR.dom.element.setMarker( database, cell, 'delete_cell', true );
83
+
84
+ // 1.first we check left or right side focusable cell row by row;
85
+ i = 0;
86
+ while ( ( cell = cellsToDelete[ i++ ] ) )
87
+ {
88
+ if ( ( focusedCell = cell.getPrevious() ) && !focusedCell.getCustomData( 'delete_cell' )
89
+ || ( focusedCell = cell.getNext() ) && !focusedCell.getCustomData( 'delete_cell' ) )
90
+ {
91
+ CKEDITOR.dom.element.clearAllMarkers( database );
92
+ return focusedCell;
93
+ }
94
+ }
95
+
96
+ CKEDITOR.dom.element.clearAllMarkers( database );
97
+
98
+ // 2. then we check the toppest row (outside the selection area square) focusable cell
99
+ tr = cellsToDelete[ 0 ].getParent();
100
+ if ( ( tr = tr.getPrevious() ) )
101
+ return tr.getLast();
102
+
103
+ // 3. last we check the lowerest row focusable cell
104
+ tr = cellsToDelete[ last ].getParent();
105
+ if ( ( tr = tr.getNext() ) )
106
+ return tr.getChild( 0 );
107
+
108
+ return null;
109
+ }
110
+
111
+ function insertRow( selection, insertBefore )
112
+ {
113
+ var cells = getSelectedCells( selection ),
114
+ firstCell = cells[ 0 ],
115
+ table = firstCell.getAscendant( 'table' ),
116
+ doc = firstCell.getDocument(),
117
+ startRow = cells[ 0 ].getParent(),
118
+ startRowIndex = startRow.$.rowIndex,
119
+ lastCell = cells[ cells.length - 1 ],
120
+ endRowIndex = lastCell.getParent().$.rowIndex + lastCell.$.rowSpan - 1,
121
+ endRow = new CKEDITOR.dom.element( table.$.rows[ endRowIndex ] ),
122
+ rowIndex = insertBefore ? startRowIndex : endRowIndex,
123
+ row = insertBefore ? startRow : endRow;
124
+
125
+ var map = CKEDITOR.tools.buildTableMap( table ),
126
+ cloneRow = map[ rowIndex ],
127
+ nextRow = insertBefore ? map[ rowIndex - 1 ] : map[ rowIndex + 1 ],
128
+ width = map[0].length;
129
+
130
+ var newRow = doc.createElement( 'tr' );
131
+ for ( var i = 0; cloneRow[ i ] && i < width; i++ )
132
+ {
133
+ var cell;
134
+ // Check whether there's a spanning row here, do not break it.
135
+ if ( cloneRow[ i ].rowSpan > 1 && nextRow && cloneRow[ i ] == nextRow[ i ] )
136
+ {
137
+ cell = cloneRow[ i ];
138
+ cell.rowSpan += 1;
139
+ }
140
+ else
141
+ {
142
+ cell = new CKEDITOR.dom.element( cloneRow[ i ] ).clone();
143
+ cell.removeAttribute( 'rowSpan' );
144
+ !CKEDITOR.env.ie && cell.appendBogus();
145
+ newRow.append( cell );
146
+ cell = cell.$;
147
+ }
148
+
149
+ i += cell.colSpan - 1;
150
+ }
151
+
152
+ insertBefore ?
153
+ newRow.insertBefore( row ) :
154
+ newRow.insertAfter( row );
155
+ }
156
+
157
+ function deleteRows( selectionOrRow )
158
+ {
159
+ if ( selectionOrRow instanceof CKEDITOR.dom.selection )
160
+ {
161
+ var cells = getSelectedCells( selectionOrRow ),
162
+ firstCell = cells[ 0 ],
163
+ table = firstCell.getAscendant( 'table' ),
164
+ map = CKEDITOR.tools.buildTableMap( table ),
165
+ startRow = cells[ 0 ].getParent(),
166
+ startRowIndex = startRow.$.rowIndex,
167
+ lastCell = cells[ cells.length - 1 ],
168
+ endRowIndex = lastCell.getParent().$.rowIndex + lastCell.$.rowSpan - 1,
169
+ rowsToDelete = [];
170
+
171
+ // Delete cell or reduce cell spans by checking through the table map.
172
+ for ( var i = startRowIndex; i <= endRowIndex; i++ )
173
+ {
174
+ var mapRow = map[ i ],
175
+ row = new CKEDITOR.dom.element( table.$.rows[ i ] );
176
+
177
+ for ( var j = 0; j < mapRow.length; j++ )
178
+ {
179
+ var cell = new CKEDITOR.dom.element( mapRow[ j ] ),
180
+ cellRowIndex = cell.getParent().$.rowIndex;
181
+
182
+ if ( cell.$.rowSpan == 1 )
183
+ cell.remove();
184
+ // Row spanned cell.
185
+ else
186
+ {
187
+ // Span row of the cell, reduce spanning.
188
+ cell.$.rowSpan -= 1;
189
+ // Root row of the cell, root cell to next row.
190
+ if ( cellRowIndex == i )
191
+ {
192
+ var nextMapRow = map[ i + 1 ];
193
+ nextMapRow[ j - 1 ] ?
194
+ cell.insertAfter( new CKEDITOR.dom.element( nextMapRow[ j - 1 ] ) )
195
+ : new CKEDITOR.dom.element( table.$.rows[ i + 1 ] ).append( cell, 1 );
196
+ }
197
+ }
198
+
199
+ j += cell.$.colSpan - 1;
200
+ }
201
+
202
+ rowsToDelete.push( row );
203
+ }
204
+
205
+ var rows = table.$.rows;
206
+
207
+ // Where to put the cursor after rows been deleted?
208
+ // 1. Into next sibling row if any;
209
+ // 2. Into previous sibling row if any;
210
+ // 3. Into table's parent element if it's the very last row.
211
+ var cursorPosition = new CKEDITOR.dom.element( rows[ endRowIndex + 1 ] || ( startRowIndex > 0 ? rows[ startRowIndex - 1 ] : null ) || table.$.parentNode );
212
+
213
+ for ( i = rowsToDelete.length ; i >= 0 ; i-- )
214
+ deleteRows( rowsToDelete[ i ] );
215
+
216
+ return cursorPosition;
217
+ }
218
+ else if ( selectionOrRow instanceof CKEDITOR.dom.element )
219
+ {
220
+ table = selectionOrRow.getAscendant( 'table' );
221
+
222
+ if ( table.$.rows.length == 1 )
223
+ table.remove();
224
+ else
225
+ selectionOrRow.remove();
226
+ }
227
+
228
+ return null;
229
+ }
230
+
231
+ function getCellColIndex( cell, isStart )
232
+ {
233
+ var row = cell.getParent(),
234
+ rowCells = row.$.cells;
235
+
236
+ var colIndex = 0;
237
+ for ( var i = 0; i < rowCells.length; i++ )
238
+ {
239
+ var mapCell = rowCells[ i ];
240
+ colIndex += isStart ? 1 : mapCell.colSpan;
241
+ if ( mapCell == cell.$ )
242
+ break;
243
+ }
244
+
245
+ return colIndex -1;
246
+ }
247
+
248
+ function getColumnsIndices( cells, isStart )
249
+ {
250
+ var retval = isStart ? Infinity : 0;
251
+ for ( var i = 0; i < cells.length; i++ )
252
+ {
253
+ var colIndex = getCellColIndex( cells[ i ], isStart );
254
+ if ( isStart ? colIndex < retval : colIndex > retval )
255
+ retval = colIndex;
256
+ }
257
+ return retval;
258
+ }
259
+
260
+ function insertColumn( selection, insertBefore )
261
+ {
262
+ var cells = getSelectedCells( selection ),
263
+ firstCell = cells[ 0 ],
264
+ table = firstCell.getAscendant( 'table' ),
265
+ startCol = getColumnsIndices( cells, 1 ),
266
+ lastCol = getColumnsIndices( cells ),
267
+ colIndex = insertBefore? startCol : lastCol;
268
+
269
+ var map = CKEDITOR.tools.buildTableMap( table ),
270
+ cloneCol = [],
271
+ nextCol = [],
272
+ height = map.length;
273
+
274
+ for ( var i = 0; i < height; i++ )
275
+ {
276
+ cloneCol.push( map[ i ][ colIndex ] );
277
+ var nextCell = insertBefore ? map[ i ][ colIndex - 1 ] : map[ i ][ colIndex + 1 ];
278
+ nextCell && nextCol.push( nextCell );
279
+ }
280
+
281
+ for ( i = 0; i < height; i++ )
282
+ {
283
+ var cell;
284
+ // Check whether there's a spanning column here, do not break it.
285
+ if ( cloneCol[ i ].colSpan > 1
286
+ && nextCol.length
287
+ && nextCol[ i ] == cloneCol[ i ] )
288
+ {
289
+ cell = cloneCol[ i ];
290
+ cell.colSpan += 1;
291
+ }
292
+ else
293
+ {
294
+ cell = new CKEDITOR.dom.element( cloneCol[ i ] ).clone();
295
+ cell.removeAttribute( 'colSpan' );
296
+ !CKEDITOR.env.ie && cell.appendBogus();
297
+ cell[ insertBefore? 'insertBefore' : 'insertAfter' ].call( cell, new CKEDITOR.dom.element ( cloneCol[ i ] ) );
298
+ cell = cell.$;
299
+ }
300
+
301
+ i += cell.rowSpan - 1;
302
+ }
303
+ }
304
+
305
+ function deleteColumns( selectionOrCell )
306
+ {
307
+ var cells = getSelectedCells( selectionOrCell ),
308
+ firstCell = cells[ 0 ],
309
+ lastCell = cells[ cells.length - 1 ],
310
+ table = firstCell.getAscendant( 'table' ),
311
+ map = CKEDITOR.tools.buildTableMap( table ),
312
+ startColIndex,
313
+ endColIndex,
314
+ rowsToDelete = [];
315
+
316
+ // Figure out selected cells' column indices.
317
+ for ( var i = 0, rows = map.length; i < rows; i++ )
318
+ {
319
+ for ( var j = 0, cols = map[ i ].length; j < cols; j++ )
320
+ {
321
+ if ( map[ i ][ j ] == firstCell.$ )
322
+ startColIndex = j;
323
+ if ( map[ i ][ j ] == lastCell.$ )
324
+ endColIndex = j;
325
+ }
326
+ }
327
+
328
+ // Delete cell or reduce cell spans by checking through the table map.
329
+ for ( i = startColIndex; i <= endColIndex; i++ )
330
+ {
331
+ for ( j = 0; j < map.length; j++ )
332
+ {
333
+ var mapRow = map[ j ],
334
+ row = new CKEDITOR.dom.element( table.$.rows[ j ] ),
335
+ cell = new CKEDITOR.dom.element( mapRow[ i ] );
336
+
337
+ if ( cell.$ )
338
+ {
339
+ if ( cell.$.colSpan == 1 )
340
+ cell.remove();
341
+ // Reduce the col spans.
342
+ else
343
+ cell.$.colSpan -= 1;
344
+
345
+ j += cell.$.rowSpan - 1;
346
+
347
+ if ( !row.$.cells.length )
348
+ rowsToDelete.push( row );
349
+ }
350
+ }
351
+ }
352
+
353
+ var firstRowCells = table.$.rows[ 0 ] && table.$.rows[ 0 ].cells;
354
+
355
+ // Where to put the cursor after columns been deleted?
356
+ // 1. Into next cell of the first row if any;
357
+ // 2. Into previous cell of the first row if any;
358
+ // 3. Into table's parent element;
359
+ var cursorPosition = new CKEDITOR.dom.element( firstRowCells[ startColIndex ] || ( startColIndex ? firstRowCells[ startColIndex - 1 ] : table.$.parentNode ) );
360
+
361
+ // Delete table rows only if all columns are gone (do not remove empty row).
362
+ if ( rowsToDelete.length == rows )
363
+ table.remove();
364
+
365
+ return cursorPosition;
366
+ }
367
+
368
+ function getFocusElementAfterDelCols( cells )
369
+ {
370
+ var cellIndexList = [],
371
+ table = cells[ 0 ] && cells[ 0 ].getAscendant( 'table' ),
372
+ i, length,
373
+ targetIndex, targetCell;
374
+
375
+ // get the cellIndex list of delete cells
376
+ for ( i = 0, length = cells.length; i < length; i++ )
377
+ cellIndexList.push( cells[i].$.cellIndex );
378
+
379
+ // get the focusable column index
380
+ cellIndexList.sort();
381
+ for ( i = 1, length = cellIndexList.length; i < length; i++ )
382
+ {
383
+ if ( cellIndexList[ i ] - cellIndexList[ i - 1 ] > 1 )
384
+ {
385
+ targetIndex = cellIndexList[ i - 1 ] + 1;
386
+ break;
387
+ }
388
+ }
389
+
390
+ if ( !targetIndex )
391
+ targetIndex = cellIndexList[ 0 ] > 0 ? ( cellIndexList[ 0 ] - 1 )
392
+ : ( cellIndexList[ cellIndexList.length - 1 ] + 1 );
393
+
394
+ // scan row by row to get the target cell
395
+ var rows = table.$.rows;
396
+ for ( i = 0, length = rows.length; i < length ; i++ )
397
+ {
398
+ targetCell = rows[ i ].cells[ targetIndex ];
399
+ if ( targetCell )
400
+ break;
401
+ }
402
+
403
+ return targetCell ? new CKEDITOR.dom.element( targetCell ) : table.getPrevious();
404
+ }
405
+
406
+ function insertCell( selection, insertBefore )
407
+ {
408
+ var startElement = selection.getStartElement();
409
+ var cell = startElement.getAscendant( 'td', 1 ) || startElement.getAscendant( 'th', 1 );
410
+
411
+ if ( !cell )
412
+ return;
413
+
414
+ // Create the new cell element to be added.
415
+ var newCell = cell.clone();
416
+ if ( !CKEDITOR.env.ie )
417
+ newCell.appendBogus();
418
+
419
+ if ( insertBefore )
420
+ newCell.insertBefore( cell );
421
+ else
422
+ newCell.insertAfter( cell );
423
+ }
424
+
425
+ function deleteCells( selectionOrCell )
426
+ {
427
+ if ( selectionOrCell instanceof CKEDITOR.dom.selection )
428
+ {
429
+ var cellsToDelete = getSelectedCells( selectionOrCell );
430
+ var table = cellsToDelete[ 0 ] && cellsToDelete[ 0 ].getAscendant( 'table' );
431
+ var cellToFocus = getFocusElementAfterDelCells( cellsToDelete );
432
+
433
+ for ( var i = cellsToDelete.length - 1 ; i >= 0 ; i-- )
434
+ deleteCells( cellsToDelete[ i ] );
435
+
436
+ if ( cellToFocus )
437
+ placeCursorInCell( cellToFocus, true );
438
+ else if ( table )
439
+ table.remove();
440
+ }
441
+ else if ( selectionOrCell instanceof CKEDITOR.dom.element )
442
+ {
443
+ var tr = selectionOrCell.getParent();
444
+ if ( tr.getChildCount() == 1 )
445
+ tr.remove();
446
+ else
447
+ selectionOrCell.remove();
448
+ }
449
+ }
450
+
451
+ // Remove filler at end and empty spaces around the cell content.
452
+ function trimCell( cell )
453
+ {
454
+ var bogus = cell.getBogus();
455
+ bogus && bogus.remove();
456
+ cell.trim();
457
+ }
458
+
459
+ function placeCursorInCell( cell, placeAtEnd )
460
+ {
461
+ var range = new CKEDITOR.dom.range( cell.getDocument() );
462
+ if ( !range[ 'moveToElementEdit' + ( placeAtEnd ? 'End' : 'Start' ) ]( cell ) )
463
+ {
464
+ range.selectNodeContents( cell );
465
+ range.collapse( placeAtEnd ? false : true );
466
+ }
467
+ range.select( true );
468
+ }
469
+
470
+ function cellInRow( tableMap, rowIndex, cell )
471
+ {
472
+ var oRow = tableMap[ rowIndex ];
473
+ if ( typeof cell == 'undefined' )
474
+ return oRow;
475
+
476
+ for ( var c = 0 ; oRow && c < oRow.length ; c++ )
477
+ {
478
+ if ( cell.is && oRow[c] == cell.$ )
479
+ return c;
480
+ else if ( c == cell )
481
+ return new CKEDITOR.dom.element( oRow[ c ] );
482
+ }
483
+ return cell.is ? -1 : null;
484
+ }
485
+
486
+ function cellInCol( tableMap, colIndex )
487
+ {
488
+ var oCol = [];
489
+ for ( var r = 0; r < tableMap.length; r++ )
490
+ {
491
+ var row = tableMap[ r ];
492
+ oCol.push( row[ colIndex ] );
493
+
494
+ // Avoid adding duplicate cells.
495
+ if ( row[ colIndex ].rowSpan > 1 )
496
+ r += row[ colIndex ].rowSpan - 1;
497
+ }
498
+ return oCol;
499
+ }
500
+
501
+ function mergeCells( selection, mergeDirection, isDetect )
502
+ {
503
+ var cells = getSelectedCells( selection );
504
+
505
+ // Invalid merge request if:
506
+ // 1. In batch mode despite that less than two selected.
507
+ // 2. In solo mode while not exactly only one selected.
508
+ // 3. Cells distributed in different table groups (e.g. from both thead and tbody).
509
+ var commonAncestor;
510
+ if ( ( mergeDirection ? cells.length != 1 : cells.length < 2 )
511
+ || ( commonAncestor = selection.getCommonAncestor() )
512
+ && commonAncestor.type == CKEDITOR.NODE_ELEMENT
513
+ && commonAncestor.is( 'table' ) )
514
+ {
515
+ return false;
516
+ }
517
+
518
+ var cell,
519
+ firstCell = cells[ 0 ],
520
+ table = firstCell.getAscendant( 'table' ),
521
+ map = CKEDITOR.tools.buildTableMap( table ),
522
+ mapHeight = map.length,
523
+ mapWidth = map[ 0 ].length,
524
+ startRow = firstCell.getParent().$.rowIndex,
525
+ startColumn = cellInRow( map, startRow, firstCell );
526
+
527
+ if ( mergeDirection )
528
+ {
529
+ var targetCell;
530
+ try
531
+ {
532
+ var rowspan = parseInt( firstCell.getAttribute( 'rowspan' ), 10 ) || 1;
533
+ var colspan = parseInt( firstCell.getAttribute( 'colspan' ), 10 ) || 1;
534
+
535
+ targetCell =
536
+ map[ mergeDirection == 'up' ?
537
+ ( startRow - rowspan ):
538
+ mergeDirection == 'down' ? ( startRow + rowspan ) : startRow ] [
539
+ mergeDirection == 'left' ?
540
+ ( startColumn - colspan ):
541
+ mergeDirection == 'right' ? ( startColumn + colspan ) : startColumn ];
542
+
543
+ }
544
+ catch( er )
545
+ {
546
+ return false;
547
+ }
548
+
549
+ // 1. No cell could be merged.
550
+ // 2. Same cell actually.
551
+ if ( !targetCell || firstCell.$ == targetCell )
552
+ return false;
553
+
554
+ // Sort in map order regardless of the DOM sequence.
555
+ cells[ ( mergeDirection == 'up' || mergeDirection == 'left' ) ?
556
+ 'unshift' : 'push' ]( new CKEDITOR.dom.element( targetCell ) );
557
+ }
558
+
559
+ // Start from here are merging way ignorance (merge up/right, batch merge).
560
+ var doc = firstCell.getDocument(),
561
+ lastRowIndex = startRow,
562
+ totalRowSpan = 0,
563
+ totalColSpan = 0,
564
+ // Use a documentFragment as buffer when appending cell contents.
565
+ frag = !isDetect && new CKEDITOR.dom.documentFragment( doc ),
566
+ dimension = 0;
567
+
568
+ for ( var i = 0; i < cells.length; i++ )
569
+ {
570
+ cell = cells[ i ];
571
+
572
+ var tr = cell.getParent(),
573
+ cellFirstChild = cell.getFirst(),
574
+ colSpan = cell.$.colSpan,
575
+ rowSpan = cell.$.rowSpan,
576
+ rowIndex = tr.$.rowIndex,
577
+ colIndex = cellInRow( map, rowIndex, cell );
578
+
579
+ // Accumulated the actual places taken by all selected cells.
580
+ dimension += colSpan * rowSpan;
581
+ // Accumulated the maximum virtual spans from column and row.
582
+ totalColSpan = Math.max( totalColSpan, colIndex - startColumn + colSpan ) ;
583
+ totalRowSpan = Math.max( totalRowSpan, rowIndex - startRow + rowSpan );
584
+
585
+ if ( !isDetect )
586
+ {
587
+ // Trim all cell fillers and check to remove empty cells.
588
+ if ( trimCell( cell ), cell.getChildren().count() )
589
+ {
590
+ // Merge vertically cells as two separated paragraphs.
591
+ if ( rowIndex != lastRowIndex
592
+ && cellFirstChild
593
+ && !( cellFirstChild.isBlockBoundary
594
+ && cellFirstChild.isBlockBoundary( { br : 1 } ) ) )
595
+ {
596
+ var last = frag.getLast( CKEDITOR.dom.walker.whitespaces( true ) );
597
+ if ( last && !( last.is && last.is( 'br' ) ) )
598
+ frag.append( 'br' );
599
+ }
600
+
601
+ cell.moveChildren( frag );
602
+ }
603
+ i ? cell.remove() : cell.setHtml( '' );
604
+ }
605
+ lastRowIndex = rowIndex;
606
+ }
607
+
608
+ if ( !isDetect )
609
+ {
610
+ frag.moveChildren( firstCell );
611
+
612
+ if ( !CKEDITOR.env.ie )
613
+ firstCell.appendBogus();
614
+
615
+ if ( totalColSpan >= mapWidth )
616
+ firstCell.removeAttribute( 'rowSpan' );
617
+ else
618
+ firstCell.$.rowSpan = totalRowSpan;
619
+
620
+ if ( totalRowSpan >= mapHeight )
621
+ firstCell.removeAttribute( 'colSpan' );
622
+ else
623
+ firstCell.$.colSpan = totalColSpan;
624
+
625
+ // Swip empty <tr> left at the end of table due to the merging.
626
+ var trs = new CKEDITOR.dom.nodeList( table.$.rows ),
627
+ count = trs.count();
628
+
629
+ for ( i = count - 1; i >= 0; i-- )
630
+ {
631
+ var tailTr = trs.getItem( i );
632
+ if ( !tailTr.$.cells.length )
633
+ {
634
+ tailTr.remove();
635
+ count++;
636
+ continue;
637
+ }
638
+ }
639
+
640
+ return firstCell;
641
+ }
642
+ // Be able to merge cells only if actual dimension of selected
643
+ // cells equals to the caculated rectangle.
644
+ else
645
+ return ( totalRowSpan * totalColSpan ) == dimension;
646
+ }
647
+
648
+ function verticalSplitCell ( selection, isDetect )
649
+ {
650
+ var cells = getSelectedCells( selection );
651
+ if ( cells.length > 1 )
652
+ return false;
653
+ else if ( isDetect )
654
+ return true;
655
+
656
+ var cell = cells[ 0 ],
657
+ tr = cell.getParent(),
658
+ table = tr.getAscendant( 'table' ),
659
+ map = CKEDITOR.tools.buildTableMap( table ),
660
+ rowIndex = tr.$.rowIndex,
661
+ colIndex = cellInRow( map, rowIndex, cell ),
662
+ rowSpan = cell.$.rowSpan,
663
+ newCell,
664
+ newRowSpan,
665
+ newCellRowSpan,
666
+ newRowIndex;
667
+
668
+ if ( rowSpan > 1 )
669
+ {
670
+ newRowSpan = Math.ceil( rowSpan / 2 );
671
+ newCellRowSpan = Math.floor( rowSpan / 2 );
672
+ newRowIndex = rowIndex + newRowSpan;
673
+ var newCellTr = new CKEDITOR.dom.element( table.$.rows[ newRowIndex ] ),
674
+ newCellRow = cellInRow( map, newRowIndex ),
675
+ candidateCell;
676
+
677
+ newCell = cell.clone();
678
+
679
+ // Figure out where to insert the new cell by checking the vitual row.
680
+ for ( var c = 0; c < newCellRow.length; c++ )
681
+ {
682
+ candidateCell = newCellRow[ c ];
683
+ // Catch first cell actually following the column.
684
+ if ( candidateCell.parentNode == newCellTr.$
685
+ && c > colIndex )
686
+ {
687
+ newCell.insertBefore( new CKEDITOR.dom.element( candidateCell ) );
688
+ break;
689
+ }
690
+ else
691
+ candidateCell = null;
692
+ }
693
+
694
+ // The destination row is empty, append at will.
695
+ if ( !candidateCell )
696
+ newCellTr.append( newCell, true );
697
+ }
698
+ else
699
+ {
700
+ newCellRowSpan = newRowSpan = 1;
701
+
702
+ newCellTr = tr.clone();
703
+ newCellTr.insertAfter( tr );
704
+ newCellTr.append( newCell = cell.clone() );
705
+
706
+ var cellsInSameRow = cellInRow( map, rowIndex );
707
+ for ( var i = 0; i < cellsInSameRow.length; i++ )
708
+ cellsInSameRow[ i ].rowSpan++;
709
+ }
710
+
711
+ if ( !CKEDITOR.env.ie )
712
+ newCell.appendBogus();
713
+
714
+ cell.$.rowSpan = newRowSpan;
715
+ newCell.$.rowSpan = newCellRowSpan;
716
+ if ( newRowSpan == 1 )
717
+ cell.removeAttribute( 'rowSpan' );
718
+ if ( newCellRowSpan == 1 )
719
+ newCell.removeAttribute( 'rowSpan' );
720
+
721
+ return newCell;
722
+ }
723
+
724
+ function horizontalSplitCell( selection, isDetect )
725
+ {
726
+ var cells = getSelectedCells( selection );
727
+ if ( cells.length > 1 )
728
+ return false;
729
+ else if ( isDetect )
730
+ return true;
731
+
732
+ var cell = cells[ 0 ],
733
+ tr = cell.getParent(),
734
+ table = tr.getAscendant( 'table' ),
735
+ map = CKEDITOR.tools.buildTableMap( table ),
736
+ rowIndex = tr.$.rowIndex,
737
+ colIndex = cellInRow( map, rowIndex, cell ),
738
+ colSpan = cell.$.colSpan,
739
+ newCell,
740
+ newColSpan,
741
+ newCellColSpan;
742
+
743
+ if ( colSpan > 1 )
744
+ {
745
+ newColSpan = Math.ceil( colSpan / 2 );
746
+ newCellColSpan = Math.floor( colSpan / 2 );
747
+ }
748
+ else
749
+ {
750
+ newCellColSpan = newColSpan = 1;
751
+ var cellsInSameCol = cellInCol( map, colIndex );
752
+ for ( var i = 0; i < cellsInSameCol.length; i++ )
753
+ cellsInSameCol[ i ].colSpan++;
754
+ }
755
+ newCell = cell.clone();
756
+ newCell.insertAfter( cell );
757
+ if ( !CKEDITOR.env.ie )
758
+ newCell.appendBogus();
759
+
760
+ cell.$.colSpan = newColSpan;
761
+ newCell.$.colSpan = newCellColSpan;
762
+ if ( newColSpan == 1 )
763
+ cell.removeAttribute( 'colSpan' );
764
+ if ( newCellColSpan == 1 )
765
+ newCell.removeAttribute( 'colSpan' );
766
+
767
+ return newCell;
768
+ }
769
+ // Context menu on table caption incorrect (#3834)
770
+ var contextMenuTags = { thead : 1, tbody : 1, tfoot : 1, td : 1, tr : 1, th : 1 };
771
+
772
+ CKEDITOR.plugins.tabletools =
773
+ {
774
+ init : function( editor )
775
+ {
776
+ var lang = editor.lang.table;
777
+
778
+ editor.addCommand( 'cellProperties', new CKEDITOR.dialogCommand( 'cellProperties' ) );
779
+ CKEDITOR.dialog.add( 'cellProperties', this.path + 'dialogs/tableCell.js' );
780
+
781
+ editor.addCommand( 'tableDelete',
782
+ {
783
+ exec : function( editor )
784
+ {
785
+ var selection = editor.getSelection(),
786
+ startElement = selection && selection.getStartElement(),
787
+ table = startElement && startElement.getAscendant( 'table', 1 );
788
+
789
+ if ( !table )
790
+ return;
791
+
792
+ // If the table's parent has only one child remove it as well (unless it's the body or a table cell) (#5416, #6289)
793
+ var parent = table.getParent();
794
+ if ( parent.getChildCount() == 1 && !parent.is( 'body', 'td', 'th' ) )
795
+ table = parent;
796
+
797
+ var range = new CKEDITOR.dom.range( editor.document );
798
+ range.moveToPosition( table, CKEDITOR.POSITION_BEFORE_START );
799
+ table.remove();
800
+ range.select();
801
+ }
802
+ } );
803
+
804
+ editor.addCommand( 'rowDelete',
805
+ {
806
+ exec : function( editor )
807
+ {
808
+ var selection = editor.getSelection();
809
+ placeCursorInCell( deleteRows( selection ) );
810
+ }
811
+ } );
812
+
813
+ editor.addCommand( 'rowInsertBefore',
814
+ {
815
+ exec : function( editor )
816
+ {
817
+ var selection = editor.getSelection();
818
+ insertRow( selection, true );
819
+ }
820
+ } );
821
+
822
+ editor.addCommand( 'rowInsertAfter',
823
+ {
824
+ exec : function( editor )
825
+ {
826
+ var selection = editor.getSelection();
827
+ insertRow( selection );
828
+ }
829
+ } );
830
+
831
+ editor.addCommand( 'columnDelete',
832
+ {
833
+ exec : function( editor )
834
+ {
835
+ var selection = editor.getSelection();
836
+ var element = deleteColumns( selection );
837
+ element && placeCursorInCell( element, true );
838
+ }
839
+ } );
840
+
841
+ editor.addCommand( 'columnInsertBefore',
842
+ {
843
+ exec : function( editor )
844
+ {
845
+ var selection = editor.getSelection();
846
+ insertColumn( selection, true );
847
+ }
848
+ } );
849
+
850
+ editor.addCommand( 'columnInsertAfter',
851
+ {
852
+ exec : function( editor )
853
+ {
854
+ var selection = editor.getSelection();
855
+ insertColumn( selection );
856
+ }
857
+ } );
858
+
859
+ editor.addCommand( 'cellDelete',
860
+ {
861
+ exec : function( editor )
862
+ {
863
+ var selection = editor.getSelection();
864
+ deleteCells( selection );
865
+ }
866
+ } );
867
+
868
+ editor.addCommand( 'cellMerge',
869
+ {
870
+ exec : function( editor )
871
+ {
872
+ placeCursorInCell( mergeCells( editor.getSelection() ), true );
873
+ }
874
+ } );
875
+
876
+ editor.addCommand( 'cellMergeRight',
877
+ {
878
+ exec : function( editor )
879
+ {
880
+ placeCursorInCell( mergeCells( editor.getSelection(), 'right' ), true );
881
+ }
882
+ } );
883
+
884
+ editor.addCommand( 'cellMergeDown',
885
+ {
886
+ exec : function( editor )
887
+ {
888
+ placeCursorInCell( mergeCells( editor.getSelection(), 'down' ), true );
889
+ }
890
+ } );
891
+
892
+ editor.addCommand( 'cellVerticalSplit',
893
+ {
894
+ exec : function( editor )
895
+ {
896
+ placeCursorInCell( verticalSplitCell( editor.getSelection() ) );
897
+ }
898
+ } );
899
+
900
+ editor.addCommand( 'cellHorizontalSplit',
901
+ {
902
+ exec : function( editor )
903
+ {
904
+ placeCursorInCell( horizontalSplitCell( editor.getSelection() ) );
905
+ }
906
+ } );
907
+
908
+ editor.addCommand( 'cellInsertBefore',
909
+ {
910
+ exec : function( editor )
911
+ {
912
+ var selection = editor.getSelection();
913
+ insertCell( selection, true );
914
+ }
915
+ } );
916
+
917
+ editor.addCommand( 'cellInsertAfter',
918
+ {
919
+ exec : function( editor )
920
+ {
921
+ var selection = editor.getSelection();
922
+ insertCell( selection );
923
+ }
924
+ } );
925
+
926
+ // If the "menu" plugin is loaded, register the menu items.
927
+ if ( editor.addMenuItems )
928
+ {
929
+ editor.addMenuItems(
930
+ {
931
+ tablecell :
932
+ {
933
+ label : lang.cell.menu,
934
+ group : 'tablecell',
935
+ order : 1,
936
+ getItems : function()
937
+ {
938
+ var selection = editor.getSelection(),
939
+ cells = getSelectedCells( selection );
940
+ return {
941
+ tablecell_insertBefore : CKEDITOR.TRISTATE_OFF,
942
+ tablecell_insertAfter : CKEDITOR.TRISTATE_OFF,
943
+ tablecell_delete : CKEDITOR.TRISTATE_OFF,
944
+ tablecell_merge : mergeCells( selection, null, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
945
+ tablecell_merge_right : mergeCells( selection, 'right', true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
946
+ tablecell_merge_down : mergeCells( selection, 'down', true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
947
+ tablecell_split_vertical : verticalSplitCell( selection, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
948
+ tablecell_split_horizontal : horizontalSplitCell( selection, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
949
+ tablecell_properties : cells.length > 0 ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
950
+ };
951
+ }
952
+ },
953
+
954
+ tablecell_insertBefore :
955
+ {
956
+ label : lang.cell.insertBefore,
957
+ group : 'tablecell',
958
+ command : 'cellInsertBefore',
959
+ order : 5
960
+ },
961
+
962
+ tablecell_insertAfter :
963
+ {
964
+ label : lang.cell.insertAfter,
965
+ group : 'tablecell',
966
+ command : 'cellInsertAfter',
967
+ order : 10
968
+ },
969
+
970
+ tablecell_delete :
971
+ {
972
+ label : lang.cell.deleteCell,
973
+ group : 'tablecell',
974
+ command : 'cellDelete',
975
+ order : 15
976
+ },
977
+
978
+ tablecell_merge :
979
+ {
980
+ label : lang.cell.merge,
981
+ group : 'tablecell',
982
+ command : 'cellMerge',
983
+ order : 16
984
+ },
985
+
986
+ tablecell_merge_right :
987
+ {
988
+ label : lang.cell.mergeRight,
989
+ group : 'tablecell',
990
+ command : 'cellMergeRight',
991
+ order : 17
992
+ },
993
+
994
+ tablecell_merge_down :
995
+ {
996
+ label : lang.cell.mergeDown,
997
+ group : 'tablecell',
998
+ command : 'cellMergeDown',
999
+ order : 18
1000
+ },
1001
+
1002
+ tablecell_split_horizontal :
1003
+ {
1004
+ label : lang.cell.splitHorizontal,
1005
+ group : 'tablecell',
1006
+ command : 'cellHorizontalSplit',
1007
+ order : 19
1008
+ },
1009
+
1010
+ tablecell_split_vertical :
1011
+ {
1012
+ label : lang.cell.splitVertical,
1013
+ group : 'tablecell',
1014
+ command : 'cellVerticalSplit',
1015
+ order : 20
1016
+ },
1017
+
1018
+ tablecell_properties :
1019
+ {
1020
+ label : lang.cell.title,
1021
+ group : 'tablecellproperties',
1022
+ command : 'cellProperties',
1023
+ order : 21
1024
+ },
1025
+
1026
+ tablerow :
1027
+ {
1028
+ label : lang.row.menu,
1029
+ group : 'tablerow',
1030
+ order : 1,
1031
+ getItems : function()
1032
+ {
1033
+ return {
1034
+ tablerow_insertBefore : CKEDITOR.TRISTATE_OFF,
1035
+ tablerow_insertAfter : CKEDITOR.TRISTATE_OFF,
1036
+ tablerow_delete : CKEDITOR.TRISTATE_OFF
1037
+ };
1038
+ }
1039
+ },
1040
+
1041
+ tablerow_insertBefore :
1042
+ {
1043
+ label : lang.row.insertBefore,
1044
+ group : 'tablerow',
1045
+ command : 'rowInsertBefore',
1046
+ order : 5
1047
+ },
1048
+
1049
+ tablerow_insertAfter :
1050
+ {
1051
+ label : lang.row.insertAfter,
1052
+ group : 'tablerow',
1053
+ command : 'rowInsertAfter',
1054
+ order : 10
1055
+ },
1056
+
1057
+ tablerow_delete :
1058
+ {
1059
+ label : lang.row.deleteRow,
1060
+ group : 'tablerow',
1061
+ command : 'rowDelete',
1062
+ order : 15
1063
+ },
1064
+
1065
+ tablecolumn :
1066
+ {
1067
+ label : lang.column.menu,
1068
+ group : 'tablecolumn',
1069
+ order : 1,
1070
+ getItems : function()
1071
+ {
1072
+ return {
1073
+ tablecolumn_insertBefore : CKEDITOR.TRISTATE_OFF,
1074
+ tablecolumn_insertAfter : CKEDITOR.TRISTATE_OFF,
1075
+ tablecolumn_delete : CKEDITOR.TRISTATE_OFF
1076
+ };
1077
+ }
1078
+ },
1079
+
1080
+ tablecolumn_insertBefore :
1081
+ {
1082
+ label : lang.column.insertBefore,
1083
+ group : 'tablecolumn',
1084
+ command : 'columnInsertBefore',
1085
+ order : 5
1086
+ },
1087
+
1088
+ tablecolumn_insertAfter :
1089
+ {
1090
+ label : lang.column.insertAfter,
1091
+ group : 'tablecolumn',
1092
+ command : 'columnInsertAfter',
1093
+ order : 10
1094
+ },
1095
+
1096
+ tablecolumn_delete :
1097
+ {
1098
+ label : lang.column.deleteColumn,
1099
+ group : 'tablecolumn',
1100
+ command : 'columnDelete',
1101
+ order : 15
1102
+ }
1103
+ });
1104
+ }
1105
+
1106
+ // If the "contextmenu" plugin is laoded, register the listeners.
1107
+ if ( editor.contextMenu )
1108
+ {
1109
+ editor.contextMenu.addListener( function( element, selection )
1110
+ {
1111
+ if ( !element || element.isReadOnly() )
1112
+ return null;
1113
+
1114
+ while ( element )
1115
+ {
1116
+ if ( element.getName() in contextMenuTags )
1117
+ {
1118
+ return {
1119
+ tablecell : CKEDITOR.TRISTATE_OFF,
1120
+ tablerow : CKEDITOR.TRISTATE_OFF,
1121
+ tablecolumn : CKEDITOR.TRISTATE_OFF
1122
+ };
1123
+ }
1124
+ element = element.getParent();
1125
+ }
1126
+
1127
+ return null;
1128
+ } );
1129
+ }
1130
+ },
1131
+
1132
+ getSelectedCells : getSelectedCells
1133
+
1134
+ };
1135
+ CKEDITOR.plugins.add( 'tabletools', CKEDITOR.plugins.tabletools );
1136
+ })();
1137
+
1138
+ /**
1139
+ * Create a two-dimension array that reflects the actual layout of table cells,
1140
+ * with cell spans, with mappings to the original td elements.
1141
+ * @param table {CKEDITOR.dom.element}
1142
+ */
1143
+ CKEDITOR.tools.buildTableMap = function ( table )
1144
+ {
1145
+ var aRows = table.$.rows ;
1146
+
1147
+ // Row and Column counters.
1148
+ var r = -1 ;
1149
+
1150
+ var aMap = [];
1151
+
1152
+ for ( var i = 0 ; i < aRows.length ; i++ )
1153
+ {
1154
+ r++ ;
1155
+ !aMap[r] && ( aMap[r] = [] );
1156
+
1157
+ var c = -1 ;
1158
+
1159
+ for ( var j = 0 ; j < aRows[i].cells.length ; j++ )
1160
+ {
1161
+ var oCell = aRows[i].cells[j] ;
1162
+
1163
+ c++ ;
1164
+ while ( aMap[r][c] )
1165
+ c++ ;
1166
+
1167
+ var iColSpan = isNaN( oCell.colSpan ) ? 1 : oCell.colSpan ;
1168
+ var iRowSpan = isNaN( oCell.rowSpan ) ? 1 : oCell.rowSpan ;
1169
+
1170
+ for ( var rs = 0 ; rs < iRowSpan ; rs++ )
1171
+ {
1172
+ if ( !aMap[r + rs] )
1173
+ aMap[r + rs] = [];
1174
+
1175
+ for ( var cs = 0 ; cs < iColSpan ; cs++ )
1176
+ {
1177
+ aMap[r + rs][c + cs] = aRows[i].cells[j] ;
1178
+ }
1179
+ }
1180
+
1181
+ c += iColSpan - 1 ;
1182
+ }
1183
+ }
1184
+ return aMap ;
1185
+ };