ckeditor-rails 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,1681 +1,1796 @@
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
- /**
7
- * @fileOverview Defines the {@link CKEDITOR.dom.element} class, which
8
- * represents a DOM element.
9
- */
10
-
11
- /**
12
- * Represents a DOM element.
13
- * @constructor
14
- * @augments CKEDITOR.dom.node
15
- * @param {Object|String} element A native DOM element or the element name for
16
- * new elements.
17
- * @param {CKEDITOR.dom.document} [ownerDocument] The document that will contain
18
- * the element in case of element creation.
19
- * @example
20
- * // Create a new <span> element.
21
- * var element = new CKEDITOR.dom.element( 'span' );
22
- * @example
23
- * // Create an element based on a native DOM element.
24
- * var element = new CKEDITOR.dom.element( document.getElementById( 'myId' ) );
25
- */
26
- CKEDITOR.dom.element = function( element, ownerDocument )
27
- {
28
- if ( typeof element == 'string' )
29
- element = ( ownerDocument ? ownerDocument.$ : document ).createElement( element );
30
-
31
- // Call the base constructor (we must not call CKEDITOR.dom.node).
32
- CKEDITOR.dom.domObject.call( this, element );
33
- };
34
-
35
- // PACKAGER_RENAME( CKEDITOR.dom.element )
36
-
37
- /**
38
- * The the {@link CKEDITOR.dom.element} representing and element. If the
39
- * element is a native DOM element, it will be transformed into a valid
40
- * CKEDITOR.dom.element object.
41
- * @returns {CKEDITOR.dom.element} The transformed element.
42
- * @example
43
- * var element = new CKEDITOR.dom.element( 'span' );
44
- * alert( element == <b>CKEDITOR.dom.element.get( element )</b> ); "true"
45
- * @example
46
- * var element = document.getElementById( 'myElement' );
47
- * alert( <b>CKEDITOR.dom.element.get( element )</b>.getName() ); e.g. "p"
48
- */
49
- CKEDITOR.dom.element.get = function( element )
50
- {
51
- return element && ( element.$ ? element : new CKEDITOR.dom.element( element ) );
52
- };
53
-
54
- CKEDITOR.dom.element.prototype = new CKEDITOR.dom.node();
55
-
56
- /**
57
- * Creates an instance of the {@link CKEDITOR.dom.element} class based on the
58
- * HTML representation of an element.
59
- * @param {String} html The element HTML. It should define only one element in
60
- * the "root" level. The "root" element can have child nodes, but not
61
- * siblings.
62
- * @returns {CKEDITOR.dom.element} The element instance.
63
- * @example
64
- * var element = <b>CKEDITOR.dom.element.createFromHtml( '&lt;strong class="anyclass"&gt;My element&lt;/strong&gt;' )</b>;
65
- * alert( element.getName() ); // "strong"
66
- */
67
- CKEDITOR.dom.element.createFromHtml = function( html, ownerDocument )
68
- {
69
- var temp = new CKEDITOR.dom.element( 'div', ownerDocument );
70
- temp.setHtml( html );
71
-
72
- // When returning the node, remove it from its parent to detach it.
73
- return temp.getFirst().remove();
74
- };
75
-
76
- CKEDITOR.dom.element.setMarker = function( database, element, name, value )
77
- {
78
- var id = element.getCustomData( 'list_marker_id' ) ||
79
- ( element.setCustomData( 'list_marker_id', CKEDITOR.tools.getNextNumber() ).getCustomData( 'list_marker_id' ) ),
80
- markerNames = element.getCustomData( 'list_marker_names' ) ||
81
- ( element.setCustomData( 'list_marker_names', {} ).getCustomData( 'list_marker_names' ) );
82
- database[id] = element;
83
- markerNames[name] = 1;
84
-
85
- return element.setCustomData( name, value );
86
- };
87
-
88
- CKEDITOR.dom.element.clearAllMarkers = function( database )
89
- {
90
- for ( var i in database )
91
- CKEDITOR.dom.element.clearMarkers( database, database[i], 1 );
92
- };
93
-
94
- CKEDITOR.dom.element.clearMarkers = function( database, element, removeFromDatabase )
95
- {
96
- var names = element.getCustomData( 'list_marker_names' ),
97
- id = element.getCustomData( 'list_marker_id' );
98
- for ( var i in names )
99
- element.removeCustomData( i );
100
- element.removeCustomData( 'list_marker_names' );
101
- if ( removeFromDatabase )
102
- {
103
- element.removeCustomData( 'list_marker_id' );
104
- delete database[id];
105
- }
106
- };
107
-
108
- CKEDITOR.tools.extend( CKEDITOR.dom.element.prototype,
109
- /** @lends CKEDITOR.dom.element.prototype */
110
- {
111
- /**
112
- * The node type. This is a constant value set to
113
- * {@link CKEDITOR.NODE_ELEMENT}.
114
- * @type Number
115
- * @example
116
- */
117
- type : CKEDITOR.NODE_ELEMENT,
118
-
119
- /**
120
- * Adds a CSS class to the element. It appends the class to the
121
- * already existing names.
122
- * @param {String} className The name of the class to be added.
123
- * @example
124
- * var element = new CKEDITOR.dom.element( 'div' );
125
- * element.addClass( 'classA' ); // &lt;div class="classA"&gt;
126
- * element.addClass( 'classB' ); // &lt;div class="classA classB"&gt;
127
- * element.addClass( 'classA' ); // &lt;div class="classA classB"&gt;
128
- */
129
- addClass : function( className )
130
- {
131
- var c = this.$.className;
132
- if ( c )
133
- {
134
- var regex = new RegExp( '(?:^|\\s)' + className + '(?:\\s|$)', '' );
135
- if ( !regex.test( c ) )
136
- c += ' ' + className;
137
- }
138
- this.$.className = c || className;
139
- },
140
-
141
- /**
142
- * Removes a CSS class name from the elements classes. Other classes
143
- * remain untouched.
144
- * @param {String} className The name of the class to remove.
145
- * @example
146
- * var element = new CKEDITOR.dom.element( 'div' );
147
- * element.addClass( 'classA' ); // &lt;div class="classA"&gt;
148
- * element.addClass( 'classB' ); // &lt;div class="classA classB"&gt;
149
- * element.removeClass( 'classA' ); // &lt;div class="classB"&gt;
150
- * element.removeClass( 'classB' ); // &lt;div&gt;
151
- */
152
- removeClass : function( className )
153
- {
154
- var c = this.getAttribute( 'class' );
155
- if ( c )
156
- {
157
- var regex = new RegExp( '(?:^|\\s+)' + className + '(?=\\s|$)', 'i' );
158
- if ( regex.test( c ) )
159
- {
160
- c = c.replace( regex, '' ).replace( /^\s+/, '' );
161
-
162
- if ( c )
163
- this.setAttribute( 'class', c );
164
- else
165
- this.removeAttribute( 'class' );
166
- }
167
- }
168
- },
169
-
170
- hasClass : function( className )
171
- {
172
- var regex = new RegExp( '(?:^|\\s+)' + className + '(?=\\s|$)', '' );
173
- return regex.test( this.getAttribute('class') );
174
- },
175
-
176
- /**
177
- * Append a node as a child of this element.
178
- * @param {CKEDITOR.dom.node|String} node The node or element name to be
179
- * appended.
180
- * @param {Boolean} [toStart] Indicates that the element is to be
181
- * appended at the start.
182
- * @returns {CKEDITOR.dom.node} The appended node.
183
- * @example
184
- * var p = new CKEDITOR.dom.element( 'p' );
185
- *
186
- * var strong = new CKEDITOR.dom.element( 'strong' );
187
- * <b>p.append( strong );</b>
188
- *
189
- * var em = <b>p.append( 'em' );</b>
190
- *
191
- * // result: "&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;"
192
- */
193
- append : function( node, toStart )
194
- {
195
- if ( typeof node == 'string' )
196
- node = this.getDocument().createElement( node );
197
-
198
- if ( toStart )
199
- this.$.insertBefore( node.$, this.$.firstChild );
200
- else
201
- this.$.appendChild( node.$ );
202
-
203
- return node;
204
- },
205
-
206
- appendHtml : function( html )
207
- {
208
- if ( !this.$.childNodes.length )
209
- this.setHtml( html );
210
- else
211
- {
212
- var temp = new CKEDITOR.dom.element( 'div', this.getDocument() );
213
- temp.setHtml( html );
214
- temp.moveChildren( this );
215
- }
216
- },
217
-
218
- /**
219
- * Append text to this element.
220
- * @param {String} text The text to be appended.
221
- * @returns {CKEDITOR.dom.node} The appended node.
222
- * @example
223
- * var p = new CKEDITOR.dom.element( 'p' );
224
- * p.appendText( 'This is' );
225
- * p.appendText( ' some text' );
226
- *
227
- * // result: "&lt;p&gt;This is some text&lt;/p&gt;"
228
- */
229
- appendText : function( text )
230
- {
231
- if ( this.$.text != undefined )
232
- this.$.text += text;
233
- else
234
- this.append( new CKEDITOR.dom.text( text ) );
235
- },
236
-
237
- appendBogus : function()
238
- {
239
- var lastChild = this.getLast() ;
240
-
241
- // Ignore empty/spaces text.
242
- while ( lastChild && lastChild.type == CKEDITOR.NODE_TEXT && !CKEDITOR.tools.rtrim( lastChild.getText() ) )
243
- lastChild = lastChild.getPrevious();
244
- if ( !lastChild || !lastChild.is || !lastChild.is( 'br' ) )
245
- {
246
- var bogus = CKEDITOR.env.opera ?
247
- this.getDocument().createText('') :
248
- this.getDocument().createElement( 'br' );
249
-
250
- CKEDITOR.env.gecko && bogus.setAttribute( 'type', '_moz' );
251
-
252
- this.append( bogus );
253
- }
254
- },
255
-
256
- /**
257
- * Breaks one of the ancestor element in the element position, moving
258
- * this element between the broken parts.
259
- * @param {CKEDITOR.dom.element} parent The anscestor element to get broken.
260
- * @example
261
- * // Before breaking:
262
- * // &lt;b&gt;This &lt;i&gt;is some&lt;span /&gt; sample&lt;/i&gt; test text&lt;/b&gt;
263
- * // If "element" is &lt;span /&gt; and "parent" is &lt;i&gt;:
264
- * // &lt;b&gt;This &lt;i&gt;is some&lt;/i&gt;&lt;span /&gt;&lt;i&gt; sample&lt;/i&gt; test text&lt;/b&gt;
265
- * element.breakParent( parent );
266
- * @example
267
- * // Before breaking:
268
- * // &lt;b&gt;This &lt;i&gt;is some&lt;span /&gt; sample&lt;/i&gt; test text&lt;/b&gt;
269
- * // If "element" is &lt;span /&gt; and "parent" is &lt;b&gt;:
270
- * // &lt;b&gt;This &lt;i&gt;is some&lt;/i&gt;&lt;/b&gt;&lt;span /&gt;&lt;b&gt;&lt;i&gt; sample&lt;/i&gt; test text&lt;/b&gt;
271
- * element.breakParent( parent );
272
- */
273
- breakParent : function( parent )
274
- {
275
- var range = new CKEDITOR.dom.range( this.getDocument() );
276
-
277
- // We'll be extracting part of this element, so let's use our
278
- // range to get the correct piece.
279
- range.setStartAfter( this );
280
- range.setEndAfter( parent );
281
-
282
- // Extract it.
283
- var docFrag = range.extractContents();
284
-
285
- // Move the element outside the broken element.
286
- range.insertNode( this.remove() );
287
-
288
- // Re-insert the extracted piece after the element.
289
- docFrag.insertAfterNode( this );
290
- },
291
-
292
- contains :
293
- CKEDITOR.env.ie || CKEDITOR.env.webkit ?
294
- function( node )
295
- {
296
- var $ = this.$;
297
-
298
- return node.type != CKEDITOR.NODE_ELEMENT ?
299
- $.contains( node.getParent().$ ) :
300
- $ != node.$ && $.contains( node.$ );
301
- }
302
- :
303
- function( node )
304
- {
305
- return !!( this.$.compareDocumentPosition( node.$ ) & 16 );
306
- },
307
-
308
- /**
309
- * Moves the selection focus to this element.
310
- * @function
311
- * @param {Boolean} defer Whether to asynchronously defer the
312
- * execution by 100 ms.
313
- * @example
314
- * var element = CKEDITOR.document.getById( 'myTextarea' );
315
- * <b>element.focus()</b>;
316
- */
317
- focus : ( function()
318
- {
319
- function exec()
320
- {
321
- // IE throws error if the element is not visible.
322
- try
323
- {
324
- this.$.focus();
325
- }
326
- catch (e)
327
- {}
328
- }
329
-
330
- return function( defer )
331
- {
332
- if ( defer )
333
- CKEDITOR.tools.setTimeout( exec, 100, this );
334
- else
335
- exec.call( this );
336
- };
337
- })(),
338
-
339
- /**
340
- * Gets the inner HTML of this element.
341
- * @returns {String} The inner HTML of this element.
342
- * @example
343
- * var element = CKEDITOR.dom.element.createFromHtml( '&lt;div&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/div&gt;' );
344
- * alert( <b>p.getHtml()</b> ); // "&lt;b&gt;Example&lt;/b&gt;"
345
- */
346
- getHtml : function()
347
- {
348
- var retval = this.$.innerHTML;
349
- // Strip <?xml:namespace> tags in IE. (#3341).
350
- return CKEDITOR.env.ie ? retval.replace( /<\?[^>]*>/g, '' ) : retval;
351
- },
352
-
353
- getOuterHtml : function()
354
- {
355
- if ( this.$.outerHTML )
356
- {
357
- // IE includes the <?xml:namespace> tag in the outerHTML of
358
- // namespaced element. So, we must strip it here. (#3341)
359
- return this.$.outerHTML.replace( /<\?[^>]*>/, '' );
360
- }
361
-
362
- var tmpDiv = this.$.ownerDocument.createElement( 'div' );
363
- tmpDiv.appendChild( this.$.cloneNode( true ) );
364
- return tmpDiv.innerHTML;
365
- },
366
-
367
- /**
368
- * Sets the inner HTML of this element.
369
- * @param {String} html The HTML to be set for this element.
370
- * @returns {String} The inserted HTML.
371
- * @example
372
- * var p = new CKEDITOR.dom.element( 'p' );
373
- * <b>p.setHtml( '&lt;b&gt;Inner&lt;/b&gt; HTML' );</b>
374
- *
375
- * // result: "&lt;p&gt;&lt;b&gt;Inner&lt;/b&gt; HTML&lt;/p&gt;"
376
- */
377
- setHtml : function( html )
378
- {
379
- return ( this.$.innerHTML = html );
380
- },
381
-
382
- /**
383
- * Sets the element contents as plain text.
384
- * @param {String} text The text to be set.
385
- * @returns {String} The inserted text.
386
- * @example
387
- * var element = new CKEDITOR.dom.element( 'div' );
388
- * element.setText( 'A > B & C < D' );
389
- * alert( element.innerHTML ); // "A &amp;gt; B &amp;amp; C &amp;lt; D"
390
- */
391
- setText : function( text )
392
- {
393
- CKEDITOR.dom.element.prototype.setText = ( this.$.innerText != undefined ) ?
394
- function ( text )
395
- {
396
- return this.$.innerText = text;
397
- } :
398
- function ( text )
399
- {
400
- return this.$.textContent = text;
401
- };
402
-
403
- return this.setText( text );
404
- },
405
-
406
- /**
407
- * Gets the value of an element attribute.
408
- * @function
409
- * @param {String} name The attribute name.
410
- * @returns {String} The attribute value or null if not defined.
411
- * @example
412
- * var element = CKEDITOR.dom.element.createFromHtml( '&lt;input type="text" /&gt;' );
413
- * alert( <b>element.getAttribute( 'type' )</b> ); // "text"
414
- */
415
- getAttribute : (function()
416
- {
417
- var standard = function( name )
418
- {
419
- return this.$.getAttribute( name, 2 );
420
- };
421
-
422
- if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
423
- {
424
- return function( name )
425
- {
426
- switch ( name )
427
- {
428
- case 'class':
429
- name = 'className';
430
- break;
431
-
432
- case 'http-equiv':
433
- name = 'httpEquiv';
434
- break;
435
-
436
- case 'name':
437
- return this.$.name;
438
-
439
- case 'tabindex':
440
- var tabIndex = standard.call( this, name );
441
-
442
- // IE returns tabIndex=0 by default for all
443
- // elements. For those elements,
444
- // getAtrribute( 'tabindex', 2 ) returns 32768
445
- // instead. So, we must make this check to give a
446
- // uniform result among all browsers.
447
- if ( tabIndex !== 0 && this.$.tabIndex === 0 )
448
- tabIndex = null;
449
-
450
- return tabIndex;
451
- break;
452
-
453
- case 'checked':
454
- {
455
- var attr = this.$.attributes.getNamedItem( name ),
456
- attrValue = attr.specified ? attr.nodeValue // For value given by parser.
457
- : this.$.checked; // For value created via DOM interface.
458
-
459
- return attrValue ? 'checked' : null;
460
- }
461
-
462
- case 'hspace':
463
- case 'value':
464
- return this.$[ name ];
465
-
466
- case 'style':
467
- // IE does not return inline styles via getAttribute(). See #2947.
468
- return this.$.style.cssText;
469
- }
470
-
471
- return standard.call( this, name );
472
- };
473
- }
474
- else
475
- return standard;
476
- })(),
477
-
478
- getChildren : function()
479
- {
480
- return new CKEDITOR.dom.nodeList( this.$.childNodes );
481
- },
482
-
483
- /**
484
- * Gets the current computed value of one of the element CSS style
485
- * properties.
486
- * @function
487
- * @param {String} propertyName The style property name.
488
- * @returns {String} The property value.
489
- * @example
490
- * var element = new CKEDITOR.dom.element( 'span' );
491
- * alert( <b>element.getComputedStyle( 'display' )</b> ); // "inline"
492
- */
493
- getComputedStyle :
494
- CKEDITOR.env.ie ?
495
- function( propertyName )
496
- {
497
- return this.$.currentStyle[ CKEDITOR.tools.cssStyleToDomStyle( propertyName ) ];
498
- }
499
- :
500
- function( propertyName )
501
- {
502
- return this.getWindow().$.getComputedStyle( this.$, '' ).getPropertyValue( propertyName );
503
- },
504
-
505
- /**
506
- * Gets the DTD entries for this element.
507
- * @returns {Object} An object containing the list of elements accepted
508
- * by this element.
509
- */
510
- getDtd : function()
511
- {
512
- var dtd = CKEDITOR.dtd[ this.getName() ];
513
-
514
- this.getDtd = function()
515
- {
516
- return dtd;
517
- };
518
-
519
- return dtd;
520
- },
521
-
522
- getElementsByTag : CKEDITOR.dom.document.prototype.getElementsByTag,
523
-
524
- /**
525
- * Gets the computed tabindex for this element.
526
- * @function
527
- * @returns {Number} The tabindex value.
528
- * @example
529
- * var element = CKEDITOR.document.getById( 'myDiv' );
530
- * alert( <b>element.getTabIndex()</b> ); // e.g. "-1"
531
- */
532
- getTabIndex :
533
- CKEDITOR.env.ie ?
534
- function()
535
- {
536
- var tabIndex = this.$.tabIndex;
537
-
538
- // IE returns tabIndex=0 by default for all elements. In
539
- // those cases we must check that the element really has
540
- // the tabindex attribute set to zero, or it is one of
541
- // those element that should have zero by default.
542
- if ( tabIndex === 0 && !CKEDITOR.dtd.$tabIndex[ this.getName() ] && parseInt( this.getAttribute( 'tabindex' ), 10 ) !== 0 )
543
- tabIndex = -1;
544
-
545
- return tabIndex;
546
- }
547
- : CKEDITOR.env.webkit ?
548
- function()
549
- {
550
- var tabIndex = this.$.tabIndex;
551
-
552
- // Safari returns "undefined" for elements that should not
553
- // have tabindex (like a div). So, we must try to get it
554
- // from the attribute.
555
- // https://bugs.webkit.org/show_bug.cgi?id=20596
556
- if ( tabIndex == undefined )
557
- {
558
- tabIndex = parseInt( this.getAttribute( 'tabindex' ), 10 );
559
-
560
- // If the element don't have the tabindex attribute,
561
- // then we should return -1.
562
- if ( isNaN( tabIndex ) )
563
- tabIndex = -1;
564
- }
565
-
566
- return tabIndex;
567
- }
568
- :
569
- function()
570
- {
571
- return this.$.tabIndex;
572
- },
573
-
574
- /**
575
- * Gets the text value of this element.
576
- *
577
- * Only in IE (which uses innerText), &lt;br&gt; will cause linebreaks,
578
- * and sucessive whitespaces (including line breaks) will be reduced to
579
- * a single space. This behavior is ok for us, for now. It may change
580
- * in the future.
581
- * @returns {String} The text value.
582
- * @example
583
- * var element = CKEDITOR.dom.element.createFromHtml( '&lt;div&gt;Same &lt;i&gt;text&lt;/i&gt;.&lt;/div&gt;' );
584
- * alert( <b>element.getText()</b> ); // "Sample text."
585
- */
586
- getText : function()
587
- {
588
- return this.$.textContent || this.$.innerText || '';
589
- },
590
-
591
- /**
592
- * Gets the window object that contains this element.
593
- * @returns {CKEDITOR.dom.window} The window object.
594
- * @example
595
- */
596
- getWindow : function()
597
- {
598
- return this.getDocument().getWindow();
599
- },
600
-
601
- /**
602
- * Gets the value of the "id" attribute of this element.
603
- * @returns {String} The element id, or null if not available.
604
- * @example
605
- * var element = CKEDITOR.dom.element.createFromHtml( '&lt;p id="myId"&gt;&lt;/p&gt;' );
606
- * alert( <b>element.getId()</b> ); // "myId"
607
- */
608
- getId : function()
609
- {
610
- return this.$.id || null;
611
- },
612
-
613
- /**
614
- * Gets the value of the "name" attribute of this element.
615
- * @returns {String} The element name, or null if not available.
616
- * @example
617
- * var element = CKEDITOR.dom.element.createFromHtml( '&lt;input name="myName"&gt;&lt;/input&gt;' );
618
- * alert( <b>element.getNameAtt()</b> ); // "myName"
619
- */
620
- getNameAtt : function()
621
- {
622
- return this.$.name || null;
623
- },
624
-
625
- /**
626
- * Gets the element name (tag name). The returned name is guaranteed to
627
- * be always full lowercased.
628
- * @returns {String} The element name.
629
- * @example
630
- * var element = new CKEDITOR.dom.element( 'span' );
631
- * alert( <b>element.getName()</b> ); // "span"
632
- */
633
- getName : function()
634
- {
635
- // Cache the lowercased name inside a closure.
636
- var nodeName = this.$.nodeName.toLowerCase();
637
-
638
- if ( CKEDITOR.env.ie && ! ( document.documentMode > 8 ) )
639
- {
640
- var scopeName = this.$.scopeName;
641
- if ( scopeName != 'HTML' )
642
- nodeName = scopeName.toLowerCase() + ':' + nodeName;
643
- }
644
-
645
- return (
646
- this.getName = function()
647
- {
648
- return nodeName;
649
- })();
650
- },
651
-
652
- /**
653
- * Gets the value set to this element. This value is usually available
654
- * for form field elements.
655
- * @returns {String} The element value.
656
- */
657
- getValue : function()
658
- {
659
- return this.$.value;
660
- },
661
-
662
- /**
663
- * Gets the first child node of this element.
664
- * @param {Function} evaluator Filtering the result node.
665
- * @returns {CKEDITOR.dom.node} The first child node or null if not
666
- * available.
667
- * @example
668
- * var element = CKEDITOR.dom.element.createFromHtml( '&lt;div&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/div&gt;' );
669
- * var first = <b>element.getFirst()</b>;
670
- * alert( first.getName() ); // "b"
671
- */
672
- getFirst : function( evaluator )
673
- {
674
- var first = this.$.firstChild,
675
- retval = first && new CKEDITOR.dom.node( first );
676
- if ( retval && evaluator && !evaluator( retval ) )
677
- retval = retval.getNext( evaluator );
678
-
679
- return retval;
680
- },
681
-
682
- /**
683
- * @param {Function} evaluator Filtering the result node.
684
- */
685
- getLast : function( evaluator )
686
- {
687
- var last = this.$.lastChild,
688
- retval = last && new CKEDITOR.dom.node( last );
689
- if ( retval && evaluator && !evaluator( retval ) )
690
- retval = retval.getPrevious( evaluator );
691
-
692
- return retval;
693
- },
694
-
695
- getStyle : function( name )
696
- {
697
- return this.$.style[ CKEDITOR.tools.cssStyleToDomStyle( name ) ];
698
- },
699
-
700
- /**
701
- * Checks if the element name matches one or more names.
702
- * @param {String} name[,name[,...]] One or more names to be checked.
703
- * @returns {Boolean} true if the element name matches any of the names.
704
- * @example
705
- * var element = new CKEDITOR.element( 'span' );
706
- * alert( <b>element.is( 'span' )</b> ); "true"
707
- * alert( <b>element.is( 'p', 'span' )</b> ); "true"
708
- * alert( <b>element.is( 'p' )</b> ); "false"
709
- * alert( <b>element.is( 'p', 'div' )</b> ); "false"
710
- */
711
- is : function()
712
- {
713
- var name = this.getName();
714
- for ( var i = 0 ; i < arguments.length ; i++ )
715
- {
716
- if ( arguments[ i ] == name )
717
- return true;
718
- }
719
- return false;
720
- },
721
-
722
- isEditable : function()
723
- {
724
- if ( this.isReadOnly() )
725
- return false;
726
-
727
- // Get the element name.
728
- var name = this.getName();
729
-
730
- // Get the element DTD (defaults to span for unknown elements).
731
- var dtd = !CKEDITOR.dtd.$nonEditable[ name ]
732
- && ( CKEDITOR.dtd[ name ] || CKEDITOR.dtd.span );
733
-
734
- // In the DTD # == text node.
735
- return ( dtd && dtd['#'] );
736
- },
737
-
738
- isIdentical : function( otherElement )
739
- {
740
- if ( this.getName() != otherElement.getName() )
741
- return false;
742
-
743
- var thisAttribs = this.$.attributes,
744
- otherAttribs = otherElement.$.attributes;
745
-
746
- var thisLength = thisAttribs.length,
747
- otherLength = otherAttribs.length;
748
-
749
- for ( var i = 0 ; i < thisLength ; i++ )
750
- {
751
- var attribute = thisAttribs[ i ];
752
-
753
- if ( attribute.nodeName == '_moz_dirty' )
754
- continue;
755
-
756
- if ( ( !CKEDITOR.env.ie || ( attribute.specified && attribute.nodeName != 'data-cke-expando' ) ) && attribute.nodeValue != otherElement.getAttribute( attribute.nodeName ) )
757
- return false;
758
- }
759
-
760
- // For IE, we have to for both elements, because it's difficult to
761
- // know how the atttibutes collection is organized in its DOM.
762
- if ( CKEDITOR.env.ie )
763
- {
764
- for ( i = 0 ; i < otherLength ; i++ )
765
- {
766
- attribute = otherAttribs[ i ];
767
- if ( attribute.specified && attribute.nodeName != 'data-cke-expando'
768
- && attribute.nodeValue != this.getAttribute( attribute.nodeName ) )
769
- return false;
770
- }
771
- }
772
-
773
- return true;
774
- },
775
-
776
- /**
777
- * Checks if this element is visible. May not work if the element is
778
- * child of an element with visibility set to "hidden", but works well
779
- * on the great majority of cases.
780
- * @return {Boolean} True if the element is visible.
781
- */
782
- isVisible : function()
783
- {
784
- var isVisible = !!this.$.offsetHeight && this.getComputedStyle( 'visibility' ) != 'hidden',
785
- elementWindow,
786
- elementWindowFrame;
787
-
788
- // Webkit and Opera report non-zero offsetHeight despite that
789
- // element is inside an invisible iframe. (#4542)
790
- if ( isVisible && ( CKEDITOR.env.webkit || CKEDITOR.env.opera ) )
791
- {
792
- elementWindow = this.getWindow();
793
-
794
- if ( !elementWindow.equals( CKEDITOR.document.getWindow() )
795
- && ( elementWindowFrame = elementWindow.$.frameElement ) )
796
- {
797
- isVisible = new CKEDITOR.dom.element( elementWindowFrame ).isVisible();
798
- }
799
- }
800
-
801
- return isVisible;
802
- },
803
-
804
- /**
805
- * Whether it's an empty inline elements which has no visual impact when removed.
806
- */
807
- isEmptyInlineRemoveable : function()
808
- {
809
- if ( !CKEDITOR.dtd.$removeEmpty[ this.getName() ] )
810
- return false;
811
-
812
- var children = this.getChildren();
813
- for ( var i = 0, count = children.count(); i < count; i++ )
814
- {
815
- var child = children.getItem( i );
816
-
817
- if ( child.type == CKEDITOR.NODE_ELEMENT && child.data( 'cke-bookmark' ) )
818
- continue;
819
-
820
- if ( child.type == CKEDITOR.NODE_ELEMENT && !child.isEmptyInlineRemoveable()
821
- || child.type == CKEDITOR.NODE_TEXT && CKEDITOR.tools.trim( child.getText() ) )
822
- {
823
- return false;
824
- }
825
- }
826
- return true;
827
- },
828
-
829
- /**
830
- * Checks if the element has any defined attributes.
831
- * @function
832
- * @returns {Boolean} True if the element has attributes.
833
- * @example
834
- * var element = CKEDITOR.dom.element.createFromHtml( '&lt;div title="Test"&gt;Example&lt;/div&gt;' );
835
- * alert( <b>element.hasAttributes()</b> ); // "true"
836
- * @example
837
- * var element = CKEDITOR.dom.element.createFromHtml( '&lt;div&gt;Example&lt;/div&gt;' );
838
- * alert( <b>element.hasAttributes()</b> ); // "false"
839
- */
840
- hasAttributes :
841
- CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) ?
842
- function()
843
- {
844
- var attributes = this.$.attributes;
845
-
846
- for ( var i = 0 ; i < attributes.length ; i++ )
847
- {
848
- var attribute = attributes[i];
849
-
850
- switch ( attribute.nodeName )
851
- {
852
- case 'class' :
853
- // IE has a strange bug. If calling removeAttribute('className'),
854
- // the attributes collection will still contain the "class"
855
- // attribute, which will be marked as "specified", even if the
856
- // outerHTML of the element is not displaying the class attribute.
857
- // Note : I was not able to reproduce it outside the editor,
858
- // but I've faced it while working on the TC of #1391.
859
- if ( this.getAttribute( 'class' ) )
860
- return true;
861
-
862
- // Attributes to be ignored.
863
- case 'data-cke-expando' :
864
- continue;
865
-
866
- /*jsl:fallthru*/
867
-
868
- default :
869
- if ( attribute.specified )
870
- return true;
871
- }
872
- }
873
-
874
- return false;
875
- }
876
- :
877
- function()
878
- {
879
- var attrs = this.$.attributes,
880
- attrsNum = attrs.length;
881
-
882
- // The _moz_dirty attribute might get into the element after pasting (#5455)
883
- var execludeAttrs = { 'data-cke-expando' : 1, _moz_dirty : 1 };
884
-
885
- return attrsNum > 0 &&
886
- ( attrsNum > 2 ||
887
- !execludeAttrs[ attrs[0].nodeName ] ||
888
- ( attrsNum == 2 && !execludeAttrs[ attrs[1].nodeName ] ) );
889
- },
890
-
891
- /**
892
- * Checks if the specified attribute is defined for this element.
893
- * @returns {Boolean} True if the specified attribute is defined.
894
- * @param {String} name The attribute name.
895
- * @example
896
- */
897
- hasAttribute : (function()
898
- {
899
- function standard( name )
900
- {
901
- var $attr = this.$.attributes.getNamedItem( name );
902
- return !!( $attr && $attr.specified );
903
- }
904
-
905
- return ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 ) ?
906
- function( name )
907
- {
908
- // On IE < 8 the name attribute cannot be retrieved
909
- // right after the element creation and setting the
910
- // name with setAttribute.
911
- if ( name == 'name' )
912
- return !!this.$.name;
913
-
914
- return standard.call( this, name );
915
- }
916
- :
917
- standard;
918
- })(),
919
-
920
- /**
921
- * Hides this element (display:none).
922
- * @example
923
- * var element = CKEDITOR.dom.element.getById( 'myElement' );
924
- * <b>element.hide()</b>;
925
- */
926
- hide : function()
927
- {
928
- this.setStyle( 'display', 'none' );
929
- },
930
-
931
- moveChildren : function( target, toStart )
932
- {
933
- var $ = this.$;
934
- target = target.$;
935
-
936
- if ( $ == target )
937
- return;
938
-
939
- var child;
940
-
941
- if ( toStart )
942
- {
943
- while ( ( child = $.lastChild ) )
944
- target.insertBefore( $.removeChild( child ), target.firstChild );
945
- }
946
- else
947
- {
948
- while ( ( child = $.firstChild ) )
949
- target.appendChild( $.removeChild( child ) );
950
- }
951
- },
952
-
953
- /**
954
- * Merges sibling elements that are identical to this one.<br>
955
- * <br>
956
- * Identical child elements are also merged. For example:<br>
957
- * &lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt; =&gt; &lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;
958
- * @function
959
- * @param {Boolean} [inlineOnly] Allow only inline elements to be merged. Defaults to "true".
960
- */
961
- mergeSiblings : ( function()
962
- {
963
- function mergeElements( element, sibling, isNext )
964
- {
965
- if ( sibling && sibling.type == CKEDITOR.NODE_ELEMENT )
966
- {
967
- // Jumping over bookmark nodes and empty inline elements, e.g. <b><i></i></b>,
968
- // queuing them to be moved later. (#5567)
969
- var pendingNodes = [];
970
-
971
- while ( sibling.data( 'cke-bookmark' )
972
- || sibling.isEmptyInlineRemoveable() )
973
- {
974
- pendingNodes.push( sibling );
975
- sibling = isNext ? sibling.getNext() : sibling.getPrevious();
976
- if ( !sibling || sibling.type != CKEDITOR.NODE_ELEMENT )
977
- return;
978
- }
979
-
980
- if ( element.isIdentical( sibling ) )
981
- {
982
- // Save the last child to be checked too, to merge things like
983
- // <b><i></i></b><b><i></i></b> => <b><i></i></b>
984
- var innerSibling = isNext ? element.getLast() : element.getFirst();
985
-
986
- // Move pending nodes first into the target element.
987
- while( pendingNodes.length )
988
- pendingNodes.shift().move( element, !isNext );
989
-
990
- sibling.moveChildren( element, !isNext );
991
- sibling.remove();
992
-
993
- // Now check the last inner child (see two comments above).
994
- if ( innerSibling && innerSibling.type == CKEDITOR.NODE_ELEMENT )
995
- innerSibling.mergeSiblings();
996
- }
997
- }
998
- }
999
-
1000
- return function( inlineOnly )
1001
- {
1002
- if ( ! ( inlineOnly === false
1003
- || CKEDITOR.dtd.$removeEmpty[ this.getName() ]
1004
- || this.is( 'a' ) ) ) // Merge empty links and anchors also. (#5567)
1005
- {
1006
- return;
1007
- }
1008
-
1009
- mergeElements( this, this.getNext(), true );
1010
- mergeElements( this, this.getPrevious() );
1011
- };
1012
- } )(),
1013
-
1014
- /**
1015
- * Shows this element (display it).
1016
- * @example
1017
- * var element = CKEDITOR.dom.element.getById( 'myElement' );
1018
- * <b>element.show()</b>;
1019
- */
1020
- show : function()
1021
- {
1022
- this.setStyles(
1023
- {
1024
- display : '',
1025
- visibility : ''
1026
- });
1027
- },
1028
-
1029
- /**
1030
- * Sets the value of an element attribute.
1031
- * @param {String} name The name of the attribute.
1032
- * @param {String} value The value to be set to the attribute.
1033
- * @function
1034
- * @returns {CKEDITOR.dom.element} This element instance.
1035
- * @example
1036
- * var element = CKEDITOR.dom.element.getById( 'myElement' );
1037
- * <b>element.setAttribute( 'class', 'myClass' )</b>;
1038
- * <b>element.setAttribute( 'title', 'This is an example' )</b>;
1039
- */
1040
- setAttribute : (function()
1041
- {
1042
- var standard = function( name, value )
1043
- {
1044
- this.$.setAttribute( name, value );
1045
- return this;
1046
- };
1047
-
1048
- if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
1049
- {
1050
- return function( name, value )
1051
- {
1052
- if ( name == 'class' )
1053
- this.$.className = value;
1054
- else if ( name == 'style' )
1055
- this.$.style.cssText = value;
1056
- else if ( name == 'tabindex' ) // Case sensitive.
1057
- this.$.tabIndex = value;
1058
- else if ( name == 'checked' )
1059
- this.$.checked = value;
1060
- else
1061
- standard.apply( this, arguments );
1062
- return this;
1063
- };
1064
- }
1065
- else if ( CKEDITOR.env.ie8Compat && CKEDITOR.env.secure )
1066
- {
1067
- return function( name, value )
1068
- {
1069
- // IE8 throws error when setting src attribute to non-ssl value. (#7847)
1070
- if ( name == 'src' && value.match( /^http:\/\// ) )
1071
- try { standard.apply( this, arguments ); } catch( e ){}
1072
- else
1073
- standard.apply( this, arguments );
1074
- return this;
1075
- };
1076
- }
1077
- else
1078
- return standard;
1079
- })(),
1080
-
1081
- /**
1082
- * Sets the value of several element attributes.
1083
- * @param {Object} attributesPairs An object containing the names and
1084
- * values of the attributes.
1085
- * @returns {CKEDITOR.dom.element} This element instance.
1086
- * @example
1087
- * var element = CKEDITOR.dom.element.getById( 'myElement' );
1088
- * <b>element.setAttributes({
1089
- * 'class' : 'myClass',
1090
- * 'title' : 'This is an example' })</b>;
1091
- */
1092
- setAttributes : function( attributesPairs )
1093
- {
1094
- for ( var name in attributesPairs )
1095
- this.setAttribute( name, attributesPairs[ name ] );
1096
- return this;
1097
- },
1098
-
1099
- /**
1100
- * Sets the element value. This function is usually used with form
1101
- * field element.
1102
- * @param {String} value The element value.
1103
- * @returns {CKEDITOR.dom.element} This element instance.
1104
- */
1105
- setValue : function( value )
1106
- {
1107
- this.$.value = value;
1108
- return this;
1109
- },
1110
-
1111
- /**
1112
- * Removes an attribute from the element.
1113
- * @param {String} name The attribute name.
1114
- * @function
1115
- * @example
1116
- * var element = CKEDITOR.dom.element.createFromHtml( '<div class="classA"></div>' );
1117
- * element.removeAttribute( 'class' );
1118
- */
1119
- removeAttribute : (function()
1120
- {
1121
- var standard = function( name )
1122
- {
1123
- this.$.removeAttribute( name );
1124
- };
1125
-
1126
- if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
1127
- {
1128
- return function( name )
1129
- {
1130
- if ( name == 'class' )
1131
- name = 'className';
1132
- else if ( name == 'tabindex' )
1133
- name = 'tabIndex';
1134
- standard.call( this, name );
1135
- };
1136
- }
1137
- else
1138
- return standard;
1139
- })(),
1140
-
1141
- removeAttributes : function ( attributes )
1142
- {
1143
- if ( CKEDITOR.tools.isArray( attributes ) )
1144
- {
1145
- for ( var i = 0 ; i < attributes.length ; i++ )
1146
- this.removeAttribute( attributes[ i ] );
1147
- }
1148
- else
1149
- {
1150
- for ( var attr in attributes )
1151
- attributes.hasOwnProperty( attr ) && this.removeAttribute( attr );
1152
- }
1153
- },
1154
-
1155
- /**
1156
- * Removes a style from the element.
1157
- * @param {String} name The style name.
1158
- * @function
1159
- * @example
1160
- * var element = CKEDITOR.dom.element.createFromHtml( '<div style="display:none"></div>' );
1161
- * element.removeStyle( 'display' );
1162
- */
1163
- removeStyle : function( name )
1164
- {
1165
- this.setStyle( name, '' );
1166
- if ( this.$.style.removeAttribute )
1167
- this.$.style.removeAttribute( CKEDITOR.tools.cssStyleToDomStyle( name ) );
1168
-
1169
- if ( !this.$.style.cssText )
1170
- this.removeAttribute( 'style' );
1171
- },
1172
-
1173
- /**
1174
- * Sets the value of an element style.
1175
- * @param {String} name The name of the style. The CSS naming notation
1176
- * must be used (e.g. "background-color").
1177
- * @param {String} value The value to be set to the style.
1178
- * @returns {CKEDITOR.dom.element} This element instance.
1179
- * @example
1180
- * var element = CKEDITOR.dom.element.getById( 'myElement' );
1181
- * <b>element.setStyle( 'background-color', '#ff0000' )</b>;
1182
- * <b>element.setStyle( 'margin-top', '10px' )</b>;
1183
- * <b>element.setStyle( 'float', 'right' )</b>;
1184
- */
1185
- setStyle : function( name, value )
1186
- {
1187
- this.$.style[ CKEDITOR.tools.cssStyleToDomStyle( name ) ] = value;
1188
- return this;
1189
- },
1190
-
1191
- /**
1192
- * Sets the value of several element styles.
1193
- * @param {Object} stylesPairs An object containing the names and
1194
- * values of the styles.
1195
- * @returns {CKEDITOR.dom.element} This element instance.
1196
- * @example
1197
- * var element = CKEDITOR.dom.element.getById( 'myElement' );
1198
- * <b>element.setStyles({
1199
- * 'position' : 'absolute',
1200
- * 'float' : 'right' })</b>;
1201
- */
1202
- setStyles : function( stylesPairs )
1203
- {
1204
- for ( var name in stylesPairs )
1205
- this.setStyle( name, stylesPairs[ name ] );
1206
- return this;
1207
- },
1208
-
1209
- /**
1210
- * Sets the opacity of an element.
1211
- * @param {Number} opacity A number within the range [0.0, 1.0].
1212
- * @example
1213
- * var element = CKEDITOR.dom.element.getById( 'myElement' );
1214
- * <b>element.setOpacity( 0.75 )</b>;
1215
- */
1216
- setOpacity : function( opacity )
1217
- {
1218
- if ( CKEDITOR.env.ie )
1219
- {
1220
- opacity = Math.round( opacity * 100 );
1221
- this.setStyle( 'filter', opacity >= 100 ? '' : 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')' );
1222
- }
1223
- else
1224
- this.setStyle( 'opacity', opacity );
1225
- },
1226
-
1227
- /**
1228
- * Makes the element and its children unselectable.
1229
- * @function
1230
- * @example
1231
- * var element = CKEDITOR.dom.element.getById( 'myElement' );
1232
- * element.unselectable();
1233
- */
1234
- unselectable :
1235
- CKEDITOR.env.gecko ?
1236
- function()
1237
- {
1238
- this.$.style.MozUserSelect = 'none';
1239
- this.on( 'dragstart', function( evt ) { evt.data.preventDefault(); } );
1240
- }
1241
- : CKEDITOR.env.webkit ?
1242
- function()
1243
- {
1244
- this.$.style.KhtmlUserSelect = 'none';
1245
- this.on( 'dragstart', function( evt ) { evt.data.preventDefault(); } );
1246
- }
1247
- :
1248
- function()
1249
- {
1250
- if ( CKEDITOR.env.ie || CKEDITOR.env.opera )
1251
- {
1252
- var element = this.$,
1253
- e,
1254
- i = 0;
1255
-
1256
- element.unselectable = 'on';
1257
-
1258
- while ( ( e = element.all[ i++ ] ) )
1259
- {
1260
- switch ( e.tagName.toLowerCase() )
1261
- {
1262
- case 'iframe' :
1263
- case 'textarea' :
1264
- case 'input' :
1265
- case 'select' :
1266
- /* Ignore the above tags */
1267
- break;
1268
- default :
1269
- e.unselectable = 'on';
1270
- }
1271
- }
1272
- }
1273
- },
1274
-
1275
- getPositionedAncestor : function()
1276
- {
1277
- var current = this;
1278
- while ( current.getName() != 'html' )
1279
- {
1280
- if ( current.getComputedStyle( 'position' ) != 'static' )
1281
- return current;
1282
-
1283
- current = current.getParent();
1284
- }
1285
- return null;
1286
- },
1287
-
1288
- getDocumentPosition : function( refDocument )
1289
- {
1290
- var x = 0, y = 0,
1291
- body = this.getDocument().getBody(),
1292
- quirks = this.getDocument().$.compatMode == 'BackCompat';
1293
-
1294
- var doc = this.getDocument();
1295
-
1296
- if ( document.documentElement[ "getBoundingClientRect" ] )
1297
- {
1298
- var box = this.$.getBoundingClientRect(),
1299
- $doc = doc.$,
1300
- $docElem = $doc.documentElement;
1301
-
1302
- var clientTop = $docElem.clientTop || body.$.clientTop || 0,
1303
- clientLeft = $docElem.clientLeft || body.$.clientLeft || 0,
1304
- needAdjustScrollAndBorders = true;
1305
-
1306
- /*
1307
- * #3804: getBoundingClientRect() works differently on IE and non-IE
1308
- * browsers, regarding scroll positions.
1309
- *
1310
- * On IE, the top position of the <html> element is always 0, no matter
1311
- * how much you scrolled down.
1312
- *
1313
- * On other browsers, the top position of the <html> element is negative
1314
- * scrollTop.
1315
- */
1316
- if ( CKEDITOR.env.ie )
1317
- {
1318
- var inDocElem = doc.getDocumentElement().contains( this ),
1319
- inBody = doc.getBody().contains( this );
1320
-
1321
- needAdjustScrollAndBorders = ( quirks && inBody ) || ( !quirks && inDocElem );
1322
- }
1323
-
1324
- if ( needAdjustScrollAndBorders )
1325
- {
1326
- x = box.left + ( !quirks && $docElem.scrollLeft || body.$.scrollLeft );
1327
- x -= clientLeft;
1328
- y = box.top + ( !quirks && $docElem.scrollTop || body.$.scrollTop );
1329
- y -= clientTop;
1330
- }
1331
- }
1332
- else
1333
- {
1334
- var current = this, previous = null, offsetParent;
1335
- while ( current && !( current.getName() == 'body' || current.getName() == 'html' ) )
1336
- {
1337
- x += current.$.offsetLeft - current.$.scrollLeft;
1338
- y += current.$.offsetTop - current.$.scrollTop;
1339
-
1340
- // Opera includes clientTop|Left into offsetTop|Left.
1341
- if ( !current.equals( this ) )
1342
- {
1343
- x += ( current.$.clientLeft || 0 );
1344
- y += ( current.$.clientTop || 0 );
1345
- }
1346
-
1347
- var scrollElement = previous;
1348
- while ( scrollElement && !scrollElement.equals( current ) )
1349
- {
1350
- x -= scrollElement.$.scrollLeft;
1351
- y -= scrollElement.$.scrollTop;
1352
- scrollElement = scrollElement.getParent();
1353
- }
1354
-
1355
- previous = current;
1356
- current = ( offsetParent = current.$.offsetParent ) ?
1357
- new CKEDITOR.dom.element( offsetParent ) : null;
1358
- }
1359
- }
1360
-
1361
- if ( refDocument )
1362
- {
1363
- var currentWindow = this.getWindow(),
1364
- refWindow = refDocument.getWindow();
1365
-
1366
- if ( !currentWindow.equals( refWindow ) && currentWindow.$.frameElement )
1367
- {
1368
- var iframePosition = ( new CKEDITOR.dom.element( currentWindow.$.frameElement ) ).getDocumentPosition( refDocument );
1369
-
1370
- x += iframePosition.x;
1371
- y += iframePosition.y;
1372
- }
1373
- }
1374
-
1375
- if ( !document.documentElement[ "getBoundingClientRect" ] )
1376
- {
1377
- // In Firefox, we'll endup one pixel before the element positions,
1378
- // so we must add it here.
1379
- if ( CKEDITOR.env.gecko && !quirks )
1380
- {
1381
- x += this.$.clientLeft ? 1 : 0;
1382
- y += this.$.clientTop ? 1 : 0;
1383
- }
1384
- }
1385
-
1386
- return { x : x, y : y };
1387
- },
1388
-
1389
- scrollIntoView : function( alignTop )
1390
- {
1391
- // Get the element window.
1392
- var win = this.getWindow(),
1393
- winHeight = win.getViewPaneSize().height;
1394
-
1395
- // Starts from the offset that will be scrolled with the negative value of
1396
- // the visible window height.
1397
- var offset = winHeight * -1;
1398
-
1399
- // Append the view pane's height if align to top.
1400
- // Append element height if we are aligning to the bottom.
1401
- if ( alignTop )
1402
- offset += winHeight;
1403
- else
1404
- {
1405
- offset += this.$.offsetHeight || 0;
1406
-
1407
- // Consider the margin in the scroll, which is ok for our current needs, but
1408
- // needs investigation if we will be using this function in other places.
1409
- offset += parseInt( this.getComputedStyle( 'marginBottom' ) || 0, 10 ) || 0;
1410
- }
1411
-
1412
- // Append the offsets for the entire element hierarchy.
1413
- var elementPosition = this.getDocumentPosition();
1414
- offset += elementPosition.y;
1415
-
1416
- // offset value might be out of range(nagative), fix it(#3692).
1417
- offset = offset < 0 ? 0 : offset;
1418
-
1419
- // Scroll the window to the desired position, if not already visible(#3795).
1420
- var currentScroll = win.getScrollPosition().y;
1421
- if ( offset > currentScroll || offset < currentScroll - winHeight )
1422
- win.$.scrollTo( 0, offset );
1423
- },
1424
-
1425
- setState : function( state )
1426
- {
1427
- switch ( state )
1428
- {
1429
- case CKEDITOR.TRISTATE_ON :
1430
- this.addClass( 'cke_on' );
1431
- this.removeClass( 'cke_off' );
1432
- this.removeClass( 'cke_disabled' );
1433
- break;
1434
- case CKEDITOR.TRISTATE_DISABLED :
1435
- this.addClass( 'cke_disabled' );
1436
- this.removeClass( 'cke_off' );
1437
- this.removeClass( 'cke_on' );
1438
- break;
1439
- default :
1440
- this.addClass( 'cke_off' );
1441
- this.removeClass( 'cke_on' );
1442
- this.removeClass( 'cke_disabled' );
1443
- break;
1444
- }
1445
- },
1446
-
1447
- /**
1448
- * Returns the inner document of this IFRAME element.
1449
- * @returns {CKEDITOR.dom.document} The inner document.
1450
- */
1451
- getFrameDocument : function()
1452
- {
1453
- var $ = this.$;
1454
-
1455
- try
1456
- {
1457
- // In IE, with custom document.domain, it may happen that
1458
- // the iframe is not yet available, resulting in "Access
1459
- // Denied" for the following property access.
1460
- $.contentWindow.document;
1461
- }
1462
- catch ( e )
1463
- {
1464
- // Trick to solve this issue, forcing the iframe to get ready
1465
- // by simply setting its "src" property.
1466
- $.src = $.src;
1467
-
1468
- // In IE6 though, the above is not enough, so we must pause the
1469
- // execution for a while, giving it time to think.
1470
- if ( CKEDITOR.env.ie && CKEDITOR.env.version < 7 )
1471
- {
1472
- window.showModalDialog(
1473
- 'javascript:document.write("' +
1474
- '<script>' +
1475
- 'window.setTimeout(' +
1476
- 'function(){window.close();}' +
1477
- ',50);' +
1478
- '</script>")' );
1479
- }
1480
- }
1481
-
1482
- return $ && new CKEDITOR.dom.document( $.contentWindow.document );
1483
- },
1484
-
1485
- /**
1486
- * Copy all the attributes from one node to the other, kinda like a clone
1487
- * skipAttributes is an object with the attributes that must NOT be copied.
1488
- * @param {CKEDITOR.dom.element} dest The destination element.
1489
- * @param {Object} skipAttributes A dictionary of attributes to skip.
1490
- * @example
1491
- */
1492
- copyAttributes : function( dest, skipAttributes )
1493
- {
1494
- var attributes = this.$.attributes;
1495
- skipAttributes = skipAttributes || {};
1496
-
1497
- for ( var n = 0 ; n < attributes.length ; n++ )
1498
- {
1499
- var attribute = attributes[n];
1500
-
1501
- // Lowercase attribute name hard rule is broken for
1502
- // some attribute on IE, e.g. CHECKED.
1503
- var attrName = attribute.nodeName.toLowerCase(),
1504
- attrValue;
1505
-
1506
- // We can set the type only once, so do it with the proper value, not copying it.
1507
- if ( attrName in skipAttributes )
1508
- continue;
1509
-
1510
- if ( attrName == 'checked' && ( attrValue = this.getAttribute( attrName ) ) )
1511
- dest.setAttribute( attrName, attrValue );
1512
- // IE BUG: value attribute is never specified even if it exists.
1513
- else if ( attribute.specified ||
1514
- ( CKEDITOR.env.ie && attribute.nodeValue && attrName == 'value' ) )
1515
- {
1516
- attrValue = this.getAttribute( attrName );
1517
- if ( attrValue === null )
1518
- attrValue = attribute.nodeValue;
1519
-
1520
- dest.setAttribute( attrName, attrValue );
1521
- }
1522
- }
1523
-
1524
- // The style:
1525
- if ( this.$.style.cssText !== '' )
1526
- dest.$.style.cssText = this.$.style.cssText;
1527
- },
1528
-
1529
- /**
1530
- * Changes the tag name of the current element.
1531
- * @param {String} newTag The new tag for the element.
1532
- */
1533
- renameNode : function( newTag )
1534
- {
1535
- // If it's already correct exit here.
1536
- if ( this.getName() == newTag )
1537
- return;
1538
-
1539
- var doc = this.getDocument();
1540
-
1541
- // Create the new node.
1542
- var newNode = new CKEDITOR.dom.element( newTag, doc );
1543
-
1544
- // Copy all attributes.
1545
- this.copyAttributes( newNode );
1546
-
1547
- // Move children to the new node.
1548
- this.moveChildren( newNode );
1549
-
1550
- // Replace the node.
1551
- this.getParent() && this.$.parentNode.replaceChild( newNode.$, this.$ );
1552
- newNode.$[ 'data-cke-expando' ] = this.$[ 'data-cke-expando' ];
1553
- this.$ = newNode.$;
1554
- },
1555
-
1556
- /**
1557
- * Gets a DOM tree descendant under the current node.
1558
- * @param {Array|Number} indices The child index or array of child indices under the node.
1559
- * @returns {CKEDITOR.dom.node} The specified DOM child under the current node. Null if child does not exist.
1560
- * @example
1561
- * var strong = p.getChild(0);
1562
- */
1563
- getChild : function( indices )
1564
- {
1565
- var rawNode = this.$;
1566
-
1567
- if ( !indices.slice )
1568
- rawNode = rawNode.childNodes[ indices ];
1569
- else
1570
- {
1571
- while ( indices.length > 0 && rawNode )
1572
- rawNode = rawNode.childNodes[ indices.shift() ];
1573
- }
1574
-
1575
- return rawNode ? new CKEDITOR.dom.node( rawNode ) : null;
1576
- },
1577
-
1578
- getChildCount : function()
1579
- {
1580
- return this.$.childNodes.length;
1581
- },
1582
-
1583
- disableContextMenu : function()
1584
- {
1585
- this.on( 'contextmenu', function( event )
1586
- {
1587
- // Cancel the browser context menu.
1588
- if ( !event.data.getTarget().hasClass( 'cke_enable_context_menu' ) )
1589
- event.data.preventDefault();
1590
- } );
1591
- },
1592
-
1593
- /**
1594
- * Gets element's direction. Supports both CSS 'direction' prop and 'dir' attr.
1595
- */
1596
- getDirection : function( useComputed )
1597
- {
1598
- return useComputed ?
1599
- this.getComputedStyle( 'direction' )
1600
- // Webkit: offline element returns empty direction (#8053).
1601
- || this.getDirection()
1602
- || this.getDocument().$.dir
1603
- || this.getDocument().getBody().getDirection( 1 )
1604
- : this.getStyle( 'direction' ) || this.getAttribute( 'dir' );
1605
- },
1606
-
1607
- /**
1608
- * Gets, sets and removes custom data to be stored as HTML5 data-* attributes.
1609
- * @param {String} name The name of the attribute, excluding the 'data-' part.
1610
- * @param {String} [value] The value to set. If set to false, the attribute will be removed.
1611
- * @example
1612
- * element.data( 'extra-info', 'test' ); // appended the attribute data-extra-info="test" to the element
1613
- * alert( element.data( 'extra-info' ) ); // "test"
1614
- * element.data( 'extra-info', false ); // remove the data-extra-info attribute from the element
1615
- */
1616
- data : function ( name, value )
1617
- {
1618
- name = 'data-' + name;
1619
- if ( value === undefined )
1620
- return this.getAttribute( name );
1621
- else if ( value === false )
1622
- this.removeAttribute( name );
1623
- else
1624
- this.setAttribute( name, value );
1625
-
1626
- return null;
1627
- }
1628
- });
1629
-
1630
- ( function()
1631
- {
1632
- var sides = {
1633
- width : [ "border-left-width", "border-right-width","padding-left", "padding-right" ],
1634
- height : [ "border-top-width", "border-bottom-width", "padding-top", "padding-bottom" ]
1635
- };
1636
-
1637
- function marginAndPaddingSize( type )
1638
- {
1639
- var adjustment = 0;
1640
- for ( var i = 0, len = sides[ type ].length; i < len; i++ )
1641
- adjustment += parseInt( this.getComputedStyle( sides [ type ][ i ] ) || 0, 10 ) || 0;
1642
- return adjustment;
1643
- }
1644
-
1645
- /**
1646
- * Sets the element size considering the box model.
1647
- * @name CKEDITOR.dom.element.prototype.setSize
1648
- * @function
1649
- * @param {String} type The dimension to set. It accepts "width" and "height".
1650
- * @param {Number} size The length unit in px.
1651
- * @param {Boolean} isBorderBox Apply the size based on the border box model.
1652
- */
1653
- CKEDITOR.dom.element.prototype.setSize = function( type, size, isBorderBox )
1654
- {
1655
- if ( typeof size == 'number' )
1656
- {
1657
- if ( isBorderBox && !( CKEDITOR.env.ie && CKEDITOR.env.quirks ) )
1658
- size -= marginAndPaddingSize.call( this, type );
1659
-
1660
- this.setStyle( type, size + 'px' );
1661
- }
1662
- };
1663
-
1664
- /**
1665
- * Gets the element size, possibly considering the box model.
1666
- * @name CKEDITOR.dom.element.prototype.getSize
1667
- * @function
1668
- * @param {String} type The dimension to get. It accepts "width" and "height".
1669
- * @param {Boolean} isBorderBox Get the size based on the border box model.
1670
- */
1671
- CKEDITOR.dom.element.prototype.getSize = function( type, isBorderBox )
1672
- {
1673
- var size = Math.max( this.$[ 'offset' + CKEDITOR.tools.capitalize( type ) ],
1674
- this.$[ 'client' + CKEDITOR.tools.capitalize( type ) ] ) || 0;
1675
-
1676
- if ( isBorderBox )
1677
- size -= marginAndPaddingSize.call( this, type );
1678
-
1679
- return size;
1680
- };
1681
- })();
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
+ /**
7
+ * @fileOverview Defines the {@link CKEDITOR.dom.element} class, which
8
+ * represents a DOM element.
9
+ */
10
+
11
+ /**
12
+ * Represents a DOM element.
13
+ * @constructor
14
+ * @augments CKEDITOR.dom.node
15
+ * @param {Object|String} element A native DOM element or the element name for
16
+ * new elements.
17
+ * @param {CKEDITOR.dom.document} [ownerDocument] The document that will contain
18
+ * the element in case of element creation.
19
+ * @example
20
+ * // Create a new &lt;span&gt; element.
21
+ * var element = new CKEDITOR.dom.element( 'span' );
22
+ * @example
23
+ * // Create an element based on a native DOM element.
24
+ * var element = new CKEDITOR.dom.element( document.getElementById( 'myId' ) );
25
+ */
26
+ CKEDITOR.dom.element = function( element, ownerDocument )
27
+ {
28
+ if ( typeof element == 'string' )
29
+ element = ( ownerDocument ? ownerDocument.$ : document ).createElement( element );
30
+
31
+ // Call the base constructor (we must not call CKEDITOR.dom.node).
32
+ CKEDITOR.dom.domObject.call( this, element );
33
+ };
34
+
35
+ // PACKAGER_RENAME( CKEDITOR.dom.element )
36
+
37
+ /**
38
+ * The the {@link CKEDITOR.dom.element} representing and element. If the
39
+ * element is a native DOM element, it will be transformed into a valid
40
+ * CKEDITOR.dom.element object.
41
+ * @returns {CKEDITOR.dom.element} The transformed element.
42
+ * @example
43
+ * var element = new CKEDITOR.dom.element( 'span' );
44
+ * alert( element == <b>CKEDITOR.dom.element.get( element )</b> ); "true"
45
+ * @example
46
+ * var element = document.getElementById( 'myElement' );
47
+ * alert( <b>CKEDITOR.dom.element.get( element )</b>.getName() ); e.g. "p"
48
+ */
49
+ CKEDITOR.dom.element.get = function( element )
50
+ {
51
+ return element && ( element.$ ? element : new CKEDITOR.dom.element( element ) );
52
+ };
53
+
54
+ CKEDITOR.dom.element.prototype = new CKEDITOR.dom.node();
55
+
56
+ /**
57
+ * Creates an instance of the {@link CKEDITOR.dom.element} class based on the
58
+ * HTML representation of an element.
59
+ * @param {String} html The element HTML. It should define only one element in
60
+ * the "root" level. The "root" element can have child nodes, but not
61
+ * siblings.
62
+ * @returns {CKEDITOR.dom.element} The element instance.
63
+ * @example
64
+ * var element = <b>CKEDITOR.dom.element.createFromHtml( '&lt;strong class="anyclass"&gt;My element&lt;/strong&gt;' )</b>;
65
+ * alert( element.getName() ); // "strong"
66
+ */
67
+ CKEDITOR.dom.element.createFromHtml = function( html, ownerDocument )
68
+ {
69
+ var temp = new CKEDITOR.dom.element( 'div', ownerDocument );
70
+ temp.setHtml( html );
71
+
72
+ // When returning the node, remove it from its parent to detach it.
73
+ return temp.getFirst().remove();
74
+ };
75
+
76
+ CKEDITOR.dom.element.setMarker = function( database, element, name, value )
77
+ {
78
+ var id = element.getCustomData( 'list_marker_id' ) ||
79
+ ( element.setCustomData( 'list_marker_id', CKEDITOR.tools.getNextNumber() ).getCustomData( 'list_marker_id' ) ),
80
+ markerNames = element.getCustomData( 'list_marker_names' ) ||
81
+ ( element.setCustomData( 'list_marker_names', {} ).getCustomData( 'list_marker_names' ) );
82
+ database[id] = element;
83
+ markerNames[name] = 1;
84
+
85
+ return element.setCustomData( name, value );
86
+ };
87
+
88
+ CKEDITOR.dom.element.clearAllMarkers = function( database )
89
+ {
90
+ for ( var i in database )
91
+ CKEDITOR.dom.element.clearMarkers( database, database[i], 1 );
92
+ };
93
+
94
+ CKEDITOR.dom.element.clearMarkers = function( database, element, removeFromDatabase )
95
+ {
96
+ var names = element.getCustomData( 'list_marker_names' ),
97
+ id = element.getCustomData( 'list_marker_id' );
98
+ for ( var i in names )
99
+ element.removeCustomData( i );
100
+ element.removeCustomData( 'list_marker_names' );
101
+ if ( removeFromDatabase )
102
+ {
103
+ element.removeCustomData( 'list_marker_id' );
104
+ delete database[id];
105
+ }
106
+ };
107
+
108
+ CKEDITOR.tools.extend( CKEDITOR.dom.element.prototype,
109
+ /** @lends CKEDITOR.dom.element.prototype */
110
+ {
111
+ /**
112
+ * The node type. This is a constant value set to
113
+ * {@link CKEDITOR.NODE_ELEMENT}.
114
+ * @type Number
115
+ * @example
116
+ */
117
+ type : CKEDITOR.NODE_ELEMENT,
118
+
119
+ /**
120
+ * Adds a CSS class to the element. It appends the class to the
121
+ * already existing names.
122
+ * @param {String} className The name of the class to be added.
123
+ * @example
124
+ * var element = new CKEDITOR.dom.element( 'div' );
125
+ * element.addClass( 'classA' ); // &lt;div class="classA"&gt;
126
+ * element.addClass( 'classB' ); // &lt;div class="classA classB"&gt;
127
+ * element.addClass( 'classA' ); // &lt;div class="classA classB"&gt;
128
+ */
129
+ addClass : function( className )
130
+ {
131
+ var c = this.$.className;
132
+ if ( c )
133
+ {
134
+ var regex = new RegExp( '(?:^|\\s)' + className + '(?:\\s|$)', '' );
135
+ if ( !regex.test( c ) )
136
+ c += ' ' + className;
137
+ }
138
+ this.$.className = c || className;
139
+ },
140
+
141
+ /**
142
+ * Removes a CSS class name from the elements classes. Other classes
143
+ * remain untouched.
144
+ * @param {String} className The name of the class to remove.
145
+ * @example
146
+ * var element = new CKEDITOR.dom.element( 'div' );
147
+ * element.addClass( 'classA' ); // &lt;div class="classA"&gt;
148
+ * element.addClass( 'classB' ); // &lt;div class="classA classB"&gt;
149
+ * element.removeClass( 'classA' ); // &lt;div class="classB"&gt;
150
+ * element.removeClass( 'classB' ); // &lt;div&gt;
151
+ */
152
+ removeClass : function( className )
153
+ {
154
+ var c = this.getAttribute( 'class' );
155
+ if ( c )
156
+ {
157
+ var regex = new RegExp( '(?:^|\\s+)' + className + '(?=\\s|$)', 'i' );
158
+ if ( regex.test( c ) )
159
+ {
160
+ c = c.replace( regex, '' ).replace( /^\s+/, '' );
161
+
162
+ if ( c )
163
+ this.setAttribute( 'class', c );
164
+ else
165
+ this.removeAttribute( 'class' );
166
+ }
167
+ }
168
+ },
169
+
170
+ hasClass : function( className )
171
+ {
172
+ var regex = new RegExp( '(?:^|\\s+)' + className + '(?=\\s|$)', '' );
173
+ return regex.test( this.getAttribute('class') );
174
+ },
175
+
176
+ /**
177
+ * Append a node as a child of this element.
178
+ * @param {CKEDITOR.dom.node|String} node The node or element name to be
179
+ * appended.
180
+ * @param {Boolean} [toStart] Indicates that the element is to be
181
+ * appended at the start.
182
+ * @returns {CKEDITOR.dom.node} The appended node.
183
+ * @example
184
+ * var p = new CKEDITOR.dom.element( 'p' );
185
+ *
186
+ * var strong = new CKEDITOR.dom.element( 'strong' );
187
+ * <b>p.append( strong );</b>
188
+ *
189
+ * var em = <b>p.append( 'em' );</b>
190
+ *
191
+ * // result: "&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;"
192
+ */
193
+ append : function( node, toStart )
194
+ {
195
+ if ( typeof node == 'string' )
196
+ node = this.getDocument().createElement( node );
197
+
198
+ if ( toStart )
199
+ this.$.insertBefore( node.$, this.$.firstChild );
200
+ else
201
+ this.$.appendChild( node.$ );
202
+
203
+ return node;
204
+ },
205
+
206
+ appendHtml : function( html )
207
+ {
208
+ if ( !this.$.childNodes.length )
209
+ this.setHtml( html );
210
+ else
211
+ {
212
+ var temp = new CKEDITOR.dom.element( 'div', this.getDocument() );
213
+ temp.setHtml( html );
214
+ temp.moveChildren( this );
215
+ }
216
+ },
217
+
218
+ /**
219
+ * Append text to this element.
220
+ * @param {String} text The text to be appended.
221
+ * @returns {CKEDITOR.dom.node} The appended node.
222
+ * @example
223
+ * var p = new CKEDITOR.dom.element( 'p' );
224
+ * p.appendText( 'This is' );
225
+ * p.appendText( ' some text' );
226
+ *
227
+ * // result: "&lt;p&gt;This is some text&lt;/p&gt;"
228
+ */
229
+ appendText : function( text )
230
+ {
231
+ if ( this.$.text != undefined )
232
+ this.$.text += text;
233
+ else
234
+ this.append( new CKEDITOR.dom.text( text ) );
235
+ },
236
+
237
+ appendBogus : function()
238
+ {
239
+ var lastChild = this.getLast() ;
240
+
241
+ // Ignore empty/spaces text.
242
+ while ( lastChild && lastChild.type == CKEDITOR.NODE_TEXT && !CKEDITOR.tools.rtrim( lastChild.getText() ) )
243
+ lastChild = lastChild.getPrevious();
244
+ if ( !lastChild || !lastChild.is || !lastChild.is( 'br' ) )
245
+ {
246
+ var bogus = CKEDITOR.env.opera ?
247
+ this.getDocument().createText('') :
248
+ this.getDocument().createElement( 'br' );
249
+
250
+ CKEDITOR.env.gecko && bogus.setAttribute( 'type', '_moz' );
251
+
252
+ this.append( bogus );
253
+ }
254
+ },
255
+
256
+ /**
257
+ * Breaks one of the ancestor element in the element position, moving
258
+ * this element between the broken parts.
259
+ * @param {CKEDITOR.dom.element} parent The anscestor element to get broken.
260
+ * @example
261
+ * // Before breaking:
262
+ * // &lt;b&gt;This &lt;i&gt;is some&lt;span /&gt; sample&lt;/i&gt; test text&lt;/b&gt;
263
+ * // If "element" is &lt;span /&gt; and "parent" is &lt;i&gt;:
264
+ * // &lt;b&gt;This &lt;i&gt;is some&lt;/i&gt;&lt;span /&gt;&lt;i&gt; sample&lt;/i&gt; test text&lt;/b&gt;
265
+ * element.breakParent( parent );
266
+ * @example
267
+ * // Before breaking:
268
+ * // &lt;b&gt;This &lt;i&gt;is some&lt;span /&gt; sample&lt;/i&gt; test text&lt;/b&gt;
269
+ * // If "element" is &lt;span /&gt; and "parent" is &lt;b&gt;:
270
+ * // &lt;b&gt;This &lt;i&gt;is some&lt;/i&gt;&lt;/b&gt;&lt;span /&gt;&lt;b&gt;&lt;i&gt; sample&lt;/i&gt; test text&lt;/b&gt;
271
+ * element.breakParent( parent );
272
+ */
273
+ breakParent : function( parent )
274
+ {
275
+ var range = new CKEDITOR.dom.range( this.getDocument() );
276
+
277
+ // We'll be extracting part of this element, so let's use our
278
+ // range to get the correct piece.
279
+ range.setStartAfter( this );
280
+ range.setEndAfter( parent );
281
+
282
+ // Extract it.
283
+ var docFrag = range.extractContents();
284
+
285
+ // Move the element outside the broken element.
286
+ range.insertNode( this.remove() );
287
+
288
+ // Re-insert the extracted piece after the element.
289
+ docFrag.insertAfterNode( this );
290
+ },
291
+
292
+ contains :
293
+ CKEDITOR.env.ie || CKEDITOR.env.webkit ?
294
+ function( node )
295
+ {
296
+ var $ = this.$;
297
+
298
+ return node.type != CKEDITOR.NODE_ELEMENT ?
299
+ $.contains( node.getParent().$ ) :
300
+ $ != node.$ && $.contains( node.$ );
301
+ }
302
+ :
303
+ function( node )
304
+ {
305
+ return !!( this.$.compareDocumentPosition( node.$ ) & 16 );
306
+ },
307
+
308
+ /**
309
+ * Moves the selection focus to this element.
310
+ * @function
311
+ * @param {Boolean} defer Whether to asynchronously defer the
312
+ * execution by 100 ms.
313
+ * @example
314
+ * var element = CKEDITOR.document.getById( 'myTextarea' );
315
+ * <b>element.focus()</b>;
316
+ */
317
+ focus : ( function()
318
+ {
319
+ function exec()
320
+ {
321
+ // IE throws error if the element is not visible.
322
+ try
323
+ {
324
+ this.$.focus();
325
+ }
326
+ catch (e)
327
+ {}
328
+ }
329
+
330
+ return function( defer )
331
+ {
332
+ if ( defer )
333
+ CKEDITOR.tools.setTimeout( exec, 100, this );
334
+ else
335
+ exec.call( this );
336
+ };
337
+ })(),
338
+
339
+ /**
340
+ * Gets the inner HTML of this element.
341
+ * @returns {String} The inner HTML of this element.
342
+ * @example
343
+ * var element = CKEDITOR.dom.element.createFromHtml( '&lt;div&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/div&gt;' );
344
+ * alert( <b>p.getHtml()</b> ); // "&lt;b&gt;Example&lt;/b&gt;"
345
+ */
346
+ getHtml : function()
347
+ {
348
+ var retval = this.$.innerHTML;
349
+ // Strip <?xml:namespace> tags in IE. (#3341).
350
+ return CKEDITOR.env.ie ? retval.replace( /<\?[^>]*>/g, '' ) : retval;
351
+ },
352
+
353
+ getOuterHtml : function()
354
+ {
355
+ if ( this.$.outerHTML )
356
+ {
357
+ // IE includes the <?xml:namespace> tag in the outerHTML of
358
+ // namespaced element. So, we must strip it here. (#3341)
359
+ return this.$.outerHTML.replace( /<\?[^>]*>/, '' );
360
+ }
361
+
362
+ var tmpDiv = this.$.ownerDocument.createElement( 'div' );
363
+ tmpDiv.appendChild( this.$.cloneNode( true ) );
364
+ return tmpDiv.innerHTML;
365
+ },
366
+
367
+ /**
368
+ * Sets the inner HTML of this element.
369
+ * @param {String} html The HTML to be set for this element.
370
+ * @returns {String} The inserted HTML.
371
+ * @example
372
+ * var p = new CKEDITOR.dom.element( 'p' );
373
+ * <b>p.setHtml( '&lt;b&gt;Inner&lt;/b&gt; HTML' );</b>
374
+ *
375
+ * // result: "&lt;p&gt;&lt;b&gt;Inner&lt;/b&gt; HTML&lt;/p&gt;"
376
+ */
377
+ setHtml : function( html )
378
+ {
379
+ return ( this.$.innerHTML = html );
380
+ },
381
+
382
+ /**
383
+ * Sets the element contents as plain text.
384
+ * @param {String} text The text to be set.
385
+ * @returns {String} The inserted text.
386
+ * @example
387
+ * var element = new CKEDITOR.dom.element( 'div' );
388
+ * element.setText( 'A > B & C < D' );
389
+ * alert( element.innerHTML ); // "A &amp;gt; B &amp;amp; C &amp;lt; D"
390
+ */
391
+ setText : function( text )
392
+ {
393
+ CKEDITOR.dom.element.prototype.setText = ( this.$.innerText != undefined ) ?
394
+ function ( text )
395
+ {
396
+ return this.$.innerText = text;
397
+ } :
398
+ function ( text )
399
+ {
400
+ return this.$.textContent = text;
401
+ };
402
+
403
+ return this.setText( text );
404
+ },
405
+
406
+ /**
407
+ * Gets the value of an element attribute.
408
+ * @function
409
+ * @param {String} name The attribute name.
410
+ * @returns {String} The attribute value or null if not defined.
411
+ * @example
412
+ * var element = CKEDITOR.dom.element.createFromHtml( '&lt;input type="text" /&gt;' );
413
+ * alert( <b>element.getAttribute( 'type' )</b> ); // "text"
414
+ */
415
+ getAttribute : (function()
416
+ {
417
+ var standard = function( name )
418
+ {
419
+ return this.$.getAttribute( name, 2 );
420
+ };
421
+
422
+ if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
423
+ {
424
+ return function( name )
425
+ {
426
+ switch ( name )
427
+ {
428
+ case 'class':
429
+ name = 'className';
430
+ break;
431
+
432
+ case 'http-equiv':
433
+ name = 'httpEquiv';
434
+ break;
435
+
436
+ case 'name':
437
+ return this.$.name;
438
+
439
+ case 'tabindex':
440
+ var tabIndex = standard.call( this, name );
441
+
442
+ // IE returns tabIndex=0 by default for all
443
+ // elements. For those elements,
444
+ // getAtrribute( 'tabindex', 2 ) returns 32768
445
+ // instead. So, we must make this check to give a
446
+ // uniform result among all browsers.
447
+ if ( tabIndex !== 0 && this.$.tabIndex === 0 )
448
+ tabIndex = null;
449
+
450
+ return tabIndex;
451
+ break;
452
+
453
+ case 'checked':
454
+ {
455
+ var attr = this.$.attributes.getNamedItem( name ),
456
+ attrValue = attr.specified ? attr.nodeValue // For value given by parser.
457
+ : this.$.checked; // For value created via DOM interface.
458
+
459
+ return attrValue ? 'checked' : null;
460
+ }
461
+
462
+ case 'hspace':
463
+ case 'value':
464
+ return this.$[ name ];
465
+
466
+ case 'style':
467
+ // IE does not return inline styles via getAttribute(). See #2947.
468
+ return this.$.style.cssText;
469
+ }
470
+
471
+ return standard.call( this, name );
472
+ };
473
+ }
474
+ else
475
+ return standard;
476
+ })(),
477
+
478
+ getChildren : function()
479
+ {
480
+ return new CKEDITOR.dom.nodeList( this.$.childNodes );
481
+ },
482
+
483
+ /**
484
+ * Gets the current computed value of one of the element CSS style
485
+ * properties.
486
+ * @function
487
+ * @param {String} propertyName The style property name.
488
+ * @returns {String} The property value.
489
+ * @example
490
+ * var element = new CKEDITOR.dom.element( 'span' );
491
+ * alert( <b>element.getComputedStyle( 'display' )</b> ); // "inline"
492
+ */
493
+ getComputedStyle :
494
+ CKEDITOR.env.ie ?
495
+ function( propertyName )
496
+ {
497
+ return this.$.currentStyle[ CKEDITOR.tools.cssStyleToDomStyle( propertyName ) ];
498
+ }
499
+ :
500
+ function( propertyName )
501
+ {
502
+ return this.getWindow().$.getComputedStyle( this.$, '' ).getPropertyValue( propertyName );
503
+ },
504
+
505
+ /**
506
+ * Gets the DTD entries for this element.
507
+ * @returns {Object} An object containing the list of elements accepted
508
+ * by this element.
509
+ */
510
+ getDtd : function()
511
+ {
512
+ var dtd = CKEDITOR.dtd[ this.getName() ];
513
+
514
+ this.getDtd = function()
515
+ {
516
+ return dtd;
517
+ };
518
+
519
+ return dtd;
520
+ },
521
+
522
+ getElementsByTag : CKEDITOR.dom.document.prototype.getElementsByTag,
523
+
524
+ /**
525
+ * Gets the computed tabindex for this element.
526
+ * @function
527
+ * @returns {Number} The tabindex value.
528
+ * @example
529
+ * var element = CKEDITOR.document.getById( 'myDiv' );
530
+ * alert( <b>element.getTabIndex()</b> ); // e.g. "-1"
531
+ */
532
+ getTabIndex :
533
+ CKEDITOR.env.ie ?
534
+ function()
535
+ {
536
+ var tabIndex = this.$.tabIndex;
537
+
538
+ // IE returns tabIndex=0 by default for all elements. In
539
+ // those cases we must check that the element really has
540
+ // the tabindex attribute set to zero, or it is one of
541
+ // those element that should have zero by default.
542
+ if ( tabIndex === 0 && !CKEDITOR.dtd.$tabIndex[ this.getName() ] && parseInt( this.getAttribute( 'tabindex' ), 10 ) !== 0 )
543
+ tabIndex = -1;
544
+
545
+ return tabIndex;
546
+ }
547
+ : CKEDITOR.env.webkit ?
548
+ function()
549
+ {
550
+ var tabIndex = this.$.tabIndex;
551
+
552
+ // Safari returns "undefined" for elements that should not
553
+ // have tabindex (like a div). So, we must try to get it
554
+ // from the attribute.
555
+ // https://bugs.webkit.org/show_bug.cgi?id=20596
556
+ if ( tabIndex == undefined )
557
+ {
558
+ tabIndex = parseInt( this.getAttribute( 'tabindex' ), 10 );
559
+
560
+ // If the element don't have the tabindex attribute,
561
+ // then we should return -1.
562
+ if ( isNaN( tabIndex ) )
563
+ tabIndex = -1;
564
+ }
565
+
566
+ return tabIndex;
567
+ }
568
+ :
569
+ function()
570
+ {
571
+ return this.$.tabIndex;
572
+ },
573
+
574
+ /**
575
+ * Gets the text value of this element.
576
+ *
577
+ * Only in IE (which uses innerText), &lt;br&gt; will cause linebreaks,
578
+ * and sucessive whitespaces (including line breaks) will be reduced to
579
+ * a single space. This behavior is ok for us, for now. It may change
580
+ * in the future.
581
+ * @returns {String} The text value.
582
+ * @example
583
+ * var element = CKEDITOR.dom.element.createFromHtml( '&lt;div&gt;Sample &lt;i&gt;text&lt;/i&gt;.&lt;/div&gt;' );
584
+ * alert( <b>element.getText()</b> ); // "Sample text."
585
+ */
586
+ getText : function()
587
+ {
588
+ return this.$.textContent || this.$.innerText || '';
589
+ },
590
+
591
+ /**
592
+ * Gets the window object that contains this element.
593
+ * @returns {CKEDITOR.dom.window} The window object.
594
+ * @example
595
+ */
596
+ getWindow : function()
597
+ {
598
+ return this.getDocument().getWindow();
599
+ },
600
+
601
+ /**
602
+ * Gets the value of the "id" attribute of this element.
603
+ * @returns {String} The element id, or null if not available.
604
+ * @example
605
+ * var element = CKEDITOR.dom.element.createFromHtml( '&lt;p id="myId"&gt;&lt;/p&gt;' );
606
+ * alert( <b>element.getId()</b> ); // "myId"
607
+ */
608
+ getId : function()
609
+ {
610
+ return this.$.id || null;
611
+ },
612
+
613
+ /**
614
+ * Gets the value of the "name" attribute of this element.
615
+ * @returns {String} The element name, or null if not available.
616
+ * @example
617
+ * var element = CKEDITOR.dom.element.createFromHtml( '&lt;input name="myName"&gt;&lt;/input&gt;' );
618
+ * alert( <b>element.getNameAtt()</b> ); // "myName"
619
+ */
620
+ getNameAtt : function()
621
+ {
622
+ return this.$.name || null;
623
+ },
624
+
625
+ /**
626
+ * Gets the element name (tag name). The returned name is guaranteed to
627
+ * be always full lowercased.
628
+ * @returns {String} The element name.
629
+ * @example
630
+ * var element = new CKEDITOR.dom.element( 'span' );
631
+ * alert( <b>element.getName()</b> ); // "span"
632
+ */
633
+ getName : function()
634
+ {
635
+ // Cache the lowercased name inside a closure.
636
+ var nodeName = this.$.nodeName.toLowerCase();
637
+
638
+ if ( CKEDITOR.env.ie && ! ( document.documentMode > 8 ) )
639
+ {
640
+ var scopeName = this.$.scopeName;
641
+ if ( scopeName != 'HTML' )
642
+ nodeName = scopeName.toLowerCase() + ':' + nodeName;
643
+ }
644
+
645
+ return (
646
+ this.getName = function()
647
+ {
648
+ return nodeName;
649
+ })();
650
+ },
651
+
652
+ /**
653
+ * Gets the value set to this element. This value is usually available
654
+ * for form field elements.
655
+ * @returns {String} The element value.
656
+ */
657
+ getValue : function()
658
+ {
659
+ return this.$.value;
660
+ },
661
+
662
+ /**
663
+ * Gets the first child node of this element.
664
+ * @param {Function} evaluator Filtering the result node.
665
+ * @returns {CKEDITOR.dom.node} The first child node or null if not
666
+ * available.
667
+ * @example
668
+ * var element = CKEDITOR.dom.element.createFromHtml( '&lt;div&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/div&gt;' );
669
+ * var first = <b>element.getFirst()</b>;
670
+ * alert( first.getName() ); // "b"
671
+ */
672
+ getFirst : function( evaluator )
673
+ {
674
+ var first = this.$.firstChild,
675
+ retval = first && new CKEDITOR.dom.node( first );
676
+ if ( retval && evaluator && !evaluator( retval ) )
677
+ retval = retval.getNext( evaluator );
678
+
679
+ return retval;
680
+ },
681
+
682
+ /**
683
+ * @param {Function} evaluator Filtering the result node.
684
+ */
685
+ getLast : function( evaluator )
686
+ {
687
+ var last = this.$.lastChild,
688
+ retval = last && new CKEDITOR.dom.node( last );
689
+ if ( retval && evaluator && !evaluator( retval ) )
690
+ retval = retval.getPrevious( evaluator );
691
+
692
+ return retval;
693
+ },
694
+
695
+ getStyle : function( name )
696
+ {
697
+ return this.$.style[ CKEDITOR.tools.cssStyleToDomStyle( name ) ];
698
+ },
699
+
700
+ /**
701
+ * Checks if the element name matches one or more names.
702
+ * @param {String} name[,name[,...]] One or more names to be checked.
703
+ * @returns {Boolean} true if the element name matches any of the names.
704
+ * @example
705
+ * var element = new CKEDITOR.element( 'span' );
706
+ * alert( <b>element.is( 'span' )</b> ); "true"
707
+ * alert( <b>element.is( 'p', 'span' )</b> ); "true"
708
+ * alert( <b>element.is( 'p' )</b> ); "false"
709
+ * alert( <b>element.is( 'p', 'div' )</b> ); "false"
710
+ */
711
+ is : function()
712
+ {
713
+ var name = this.getName();
714
+ for ( var i = 0 ; i < arguments.length ; i++ )
715
+ {
716
+ if ( arguments[ i ] == name )
717
+ return true;
718
+ }
719
+ return false;
720
+ },
721
+
722
+ /**
723
+ * Decide whether one element is able to receive cursor.
724
+ * @param {Boolean} [textCursor=true] Only consider element that could receive text child.
725
+ */
726
+ isEditable : function( textCursor )
727
+ {
728
+ var name = this.getName();
729
+
730
+ if ( this.isReadOnly()
731
+ || this.getComputedStyle( 'display' ) == 'none'
732
+ || this.getComputedStyle( 'visibility' ) == 'hidden'
733
+ || this.is( 'a' ) && this.data( 'cke-saved-name' ) && !this.getChildCount()
734
+ || CKEDITOR.dtd.$nonEditable[ name ] )
735
+ {
736
+ return false;
737
+ }
738
+
739
+ if ( textCursor !== false )
740
+ {
741
+ // Get the element DTD (defaults to span for unknown elements).
742
+ var dtd = CKEDITOR.dtd[ name ] || CKEDITOR.dtd.span;
743
+ // In the DTD # == text node.
744
+ return ( dtd && dtd[ '#'] );
745
+ }
746
+
747
+ return true;
748
+ },
749
+
750
+ isIdentical : function( otherElement )
751
+ {
752
+ if ( this.getName() != otherElement.getName() )
753
+ return false;
754
+
755
+ var thisAttribs = this.$.attributes,
756
+ otherAttribs = otherElement.$.attributes;
757
+
758
+ var thisLength = thisAttribs.length,
759
+ otherLength = otherAttribs.length;
760
+
761
+ for ( var i = 0 ; i < thisLength ; i++ )
762
+ {
763
+ var attribute = thisAttribs[ i ];
764
+
765
+ if ( attribute.nodeName == '_moz_dirty' )
766
+ continue;
767
+
768
+ if ( ( !CKEDITOR.env.ie || ( attribute.specified && attribute.nodeName != 'data-cke-expando' ) ) && attribute.nodeValue != otherElement.getAttribute( attribute.nodeName ) )
769
+ return false;
770
+ }
771
+
772
+ // For IE, we have to for both elements, because it's difficult to
773
+ // know how the atttibutes collection is organized in its DOM.
774
+ if ( CKEDITOR.env.ie )
775
+ {
776
+ for ( i = 0 ; i < otherLength ; i++ )
777
+ {
778
+ attribute = otherAttribs[ i ];
779
+ if ( attribute.specified && attribute.nodeName != 'data-cke-expando'
780
+ && attribute.nodeValue != this.getAttribute( attribute.nodeName ) )
781
+ return false;
782
+ }
783
+ }
784
+
785
+ return true;
786
+ },
787
+
788
+ /**
789
+ * Checks if this element is visible. May not work if the element is
790
+ * child of an element with visibility set to "hidden", but works well
791
+ * on the great majority of cases.
792
+ * @return {Boolean} True if the element is visible.
793
+ */
794
+ isVisible : function()
795
+ {
796
+ var isVisible = ( this.$.offsetHeight || this.$.offsetWidth ) && this.getComputedStyle( 'visibility' ) != 'hidden',
797
+ elementWindow,
798
+ elementWindowFrame;
799
+
800
+ // Webkit and Opera report non-zero offsetHeight despite that
801
+ // element is inside an invisible iframe. (#4542)
802
+ if ( isVisible && ( CKEDITOR.env.webkit || CKEDITOR.env.opera ) )
803
+ {
804
+ elementWindow = this.getWindow();
805
+
806
+ if ( !elementWindow.equals( CKEDITOR.document.getWindow() )
807
+ && ( elementWindowFrame = elementWindow.$.frameElement ) )
808
+ {
809
+ isVisible = new CKEDITOR.dom.element( elementWindowFrame ).isVisible();
810
+ }
811
+ }
812
+
813
+ return !!isVisible;
814
+ },
815
+
816
+ /**
817
+ * Whether it's an empty inline elements which has no visual impact when removed.
818
+ */
819
+ isEmptyInlineRemoveable : function()
820
+ {
821
+ if ( !CKEDITOR.dtd.$removeEmpty[ this.getName() ] )
822
+ return false;
823
+
824
+ var children = this.getChildren();
825
+ for ( var i = 0, count = children.count(); i < count; i++ )
826
+ {
827
+ var child = children.getItem( i );
828
+
829
+ if ( child.type == CKEDITOR.NODE_ELEMENT && child.data( 'cke-bookmark' ) )
830
+ continue;
831
+
832
+ if ( child.type == CKEDITOR.NODE_ELEMENT && !child.isEmptyInlineRemoveable()
833
+ || child.type == CKEDITOR.NODE_TEXT && CKEDITOR.tools.trim( child.getText() ) )
834
+ {
835
+ return false;
836
+ }
837
+ }
838
+ return true;
839
+ },
840
+
841
+ /**
842
+ * Checks if the element has any defined attributes.
843
+ * @function
844
+ * @returns {Boolean} True if the element has attributes.
845
+ * @example
846
+ * var element = CKEDITOR.dom.element.createFromHtml( '&lt;div title="Test"&gt;Example&lt;/div&gt;' );
847
+ * alert( <b>element.hasAttributes()</b> ); // "true"
848
+ * @example
849
+ * var element = CKEDITOR.dom.element.createFromHtml( '&lt;div&gt;Example&lt;/div&gt;' );
850
+ * alert( <b>element.hasAttributes()</b> ); // "false"
851
+ */
852
+ hasAttributes :
853
+ CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) ?
854
+ function()
855
+ {
856
+ var attributes = this.$.attributes;
857
+
858
+ for ( var i = 0 ; i < attributes.length ; i++ )
859
+ {
860
+ var attribute = attributes[i];
861
+
862
+ switch ( attribute.nodeName )
863
+ {
864
+ case 'class' :
865
+ // IE has a strange bug. If calling removeAttribute('className'),
866
+ // the attributes collection will still contain the "class"
867
+ // attribute, which will be marked as "specified", even if the
868
+ // outerHTML of the element is not displaying the class attribute.
869
+ // Note : I was not able to reproduce it outside the editor,
870
+ // but I've faced it while working on the TC of #1391.
871
+ if ( this.getAttribute( 'class' ) )
872
+ return true;
873
+
874
+ // Attributes to be ignored.
875
+ case 'data-cke-expando' :
876
+ continue;
877
+
878
+ /*jsl:fallthru*/
879
+
880
+ default :
881
+ if ( attribute.specified )
882
+ return true;
883
+ }
884
+ }
885
+
886
+ return false;
887
+ }
888
+ :
889
+ function()
890
+ {
891
+ var attrs = this.$.attributes,
892
+ attrsNum = attrs.length;
893
+
894
+ // The _moz_dirty attribute might get into the element after pasting (#5455)
895
+ var execludeAttrs = { 'data-cke-expando' : 1, _moz_dirty : 1 };
896
+
897
+ return attrsNum > 0 &&
898
+ ( attrsNum > 2 ||
899
+ !execludeAttrs[ attrs[0].nodeName ] ||
900
+ ( attrsNum == 2 && !execludeAttrs[ attrs[1].nodeName ] ) );
901
+ },
902
+
903
+ /**
904
+ * Checks if the specified attribute is defined for this element.
905
+ * @returns {Boolean} True if the specified attribute is defined.
906
+ * @param {String} name The attribute name.
907
+ * @example
908
+ */
909
+ hasAttribute : (function()
910
+ {
911
+ function standard( name )
912
+ {
913
+ var $attr = this.$.attributes.getNamedItem( name );
914
+ return !!( $attr && $attr.specified );
915
+ }
916
+
917
+ return ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 ) ?
918
+ function( name )
919
+ {
920
+ // On IE < 8 the name attribute cannot be retrieved
921
+ // right after the element creation and setting the
922
+ // name with setAttribute.
923
+ if ( name == 'name' )
924
+ return !!this.$.name;
925
+
926
+ return standard.call( this, name );
927
+ }
928
+ :
929
+ standard;
930
+ })(),
931
+
932
+ /**
933
+ * Hides this element (display:none).
934
+ * @example
935
+ * var element = CKEDITOR.dom.element.getById( 'myElement' );
936
+ * <b>element.hide()</b>;
937
+ */
938
+ hide : function()
939
+ {
940
+ this.setStyle( 'display', 'none' );
941
+ },
942
+
943
+ moveChildren : function( target, toStart )
944
+ {
945
+ var $ = this.$;
946
+ target = target.$;
947
+
948
+ if ( $ == target )
949
+ return;
950
+
951
+ var child;
952
+
953
+ if ( toStart )
954
+ {
955
+ while ( ( child = $.lastChild ) )
956
+ target.insertBefore( $.removeChild( child ), target.firstChild );
957
+ }
958
+ else
959
+ {
960
+ while ( ( child = $.firstChild ) )
961
+ target.appendChild( $.removeChild( child ) );
962
+ }
963
+ },
964
+
965
+ /**
966
+ * Merges sibling elements that are identical to this one.<br>
967
+ * <br>
968
+ * Identical child elements are also merged. For example:<br>
969
+ * &lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt; =&gt; &lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;
970
+ * @function
971
+ * @param {Boolean} [inlineOnly] Allow only inline elements to be merged. Defaults to "true".
972
+ */
973
+ mergeSiblings : ( function()
974
+ {
975
+ function mergeElements( element, sibling, isNext )
976
+ {
977
+ if ( sibling && sibling.type == CKEDITOR.NODE_ELEMENT )
978
+ {
979
+ // Jumping over bookmark nodes and empty inline elements, e.g. <b><i></i></b>,
980
+ // queuing them to be moved later. (#5567)
981
+ var pendingNodes = [];
982
+
983
+ while ( sibling.data( 'cke-bookmark' )
984
+ || sibling.isEmptyInlineRemoveable() )
985
+ {
986
+ pendingNodes.push( sibling );
987
+ sibling = isNext ? sibling.getNext() : sibling.getPrevious();
988
+ if ( !sibling || sibling.type != CKEDITOR.NODE_ELEMENT )
989
+ return;
990
+ }
991
+
992
+ if ( element.isIdentical( sibling ) )
993
+ {
994
+ // Save the last child to be checked too, to merge things like
995
+ // <b><i></i></b><b><i></i></b> => <b><i></i></b>
996
+ var innerSibling = isNext ? element.getLast() : element.getFirst();
997
+
998
+ // Move pending nodes first into the target element.
999
+ while( pendingNodes.length )
1000
+ pendingNodes.shift().move( element, !isNext );
1001
+
1002
+ sibling.moveChildren( element, !isNext );
1003
+ sibling.remove();
1004
+
1005
+ // Now check the last inner child (see two comments above).
1006
+ if ( innerSibling && innerSibling.type == CKEDITOR.NODE_ELEMENT )
1007
+ innerSibling.mergeSiblings();
1008
+ }
1009
+ }
1010
+ }
1011
+
1012
+ return function( inlineOnly )
1013
+ {
1014
+ if ( ! ( inlineOnly === false
1015
+ || CKEDITOR.dtd.$removeEmpty[ this.getName() ]
1016
+ || this.is( 'a' ) ) ) // Merge empty links and anchors also. (#5567)
1017
+ {
1018
+ return;
1019
+ }
1020
+
1021
+ mergeElements( this, this.getNext(), true );
1022
+ mergeElements( this, this.getPrevious() );
1023
+ };
1024
+ } )(),
1025
+
1026
+ /**
1027
+ * Shows this element (display it).
1028
+ * @example
1029
+ * var element = CKEDITOR.dom.element.getById( 'myElement' );
1030
+ * <b>element.show()</b>;
1031
+ */
1032
+ show : function()
1033
+ {
1034
+ this.setStyles(
1035
+ {
1036
+ display : '',
1037
+ visibility : ''
1038
+ });
1039
+ },
1040
+
1041
+ /**
1042
+ * Sets the value of an element attribute.
1043
+ * @param {String} name The name of the attribute.
1044
+ * @param {String} value The value to be set to the attribute.
1045
+ * @function
1046
+ * @returns {CKEDITOR.dom.element} This element instance.
1047
+ * @example
1048
+ * var element = CKEDITOR.dom.element.getById( 'myElement' );
1049
+ * <b>element.setAttribute( 'class', 'myClass' )</b>;
1050
+ * <b>element.setAttribute( 'title', 'This is an example' )</b>;
1051
+ */
1052
+ setAttribute : (function()
1053
+ {
1054
+ var standard = function( name, value )
1055
+ {
1056
+ this.$.setAttribute( name, value );
1057
+ return this;
1058
+ };
1059
+
1060
+ if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
1061
+ {
1062
+ return function( name, value )
1063
+ {
1064
+ if ( name == 'class' )
1065
+ this.$.className = value;
1066
+ else if ( name == 'style' )
1067
+ this.$.style.cssText = value;
1068
+ else if ( name == 'tabindex' ) // Case sensitive.
1069
+ this.$.tabIndex = value;
1070
+ else if ( name == 'checked' )
1071
+ this.$.checked = value;
1072
+ else
1073
+ standard.apply( this, arguments );
1074
+ return this;
1075
+ };
1076
+ }
1077
+ else if ( CKEDITOR.env.ie8Compat && CKEDITOR.env.secure )
1078
+ {
1079
+ return function( name, value )
1080
+ {
1081
+ // IE8 throws error when setting src attribute to non-ssl value. (#7847)
1082
+ if ( name == 'src' && value.match( /^http:\/\// ) )
1083
+ try { standard.apply( this, arguments ); } catch( e ){}
1084
+ else
1085
+ standard.apply( this, arguments );
1086
+ return this;
1087
+ };
1088
+ }
1089
+ else
1090
+ return standard;
1091
+ })(),
1092
+
1093
+ /**
1094
+ * Sets the value of several element attributes.
1095
+ * @param {Object} attributesPairs An object containing the names and
1096
+ * values of the attributes.
1097
+ * @returns {CKEDITOR.dom.element} This element instance.
1098
+ * @example
1099
+ * var element = CKEDITOR.dom.element.getById( 'myElement' );
1100
+ * <b>element.setAttributes({
1101
+ * 'class' : 'myClass',
1102
+ * 'title' : 'This is an example' })</b>;
1103
+ */
1104
+ setAttributes : function( attributesPairs )
1105
+ {
1106
+ for ( var name in attributesPairs )
1107
+ this.setAttribute( name, attributesPairs[ name ] );
1108
+ return this;
1109
+ },
1110
+
1111
+ /**
1112
+ * Sets the element value. This function is usually used with form
1113
+ * field element.
1114
+ * @param {String} value The element value.
1115
+ * @returns {CKEDITOR.dom.element} This element instance.
1116
+ */
1117
+ setValue : function( value )
1118
+ {
1119
+ this.$.value = value;
1120
+ return this;
1121
+ },
1122
+
1123
+ /**
1124
+ * Removes an attribute from the element.
1125
+ * @param {String} name The attribute name.
1126
+ * @function
1127
+ * @example
1128
+ * var element = CKEDITOR.dom.element.createFromHtml( '<div class="classA"></div>' );
1129
+ * element.removeAttribute( 'class' );
1130
+ */
1131
+ removeAttribute : (function()
1132
+ {
1133
+ var standard = function( name )
1134
+ {
1135
+ this.$.removeAttribute( name );
1136
+ };
1137
+
1138
+ if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
1139
+ {
1140
+ return function( name )
1141
+ {
1142
+ if ( name == 'class' )
1143
+ name = 'className';
1144
+ else if ( name == 'tabindex' )
1145
+ name = 'tabIndex';
1146
+ standard.call( this, name );
1147
+ };
1148
+ }
1149
+ else
1150
+ return standard;
1151
+ })(),
1152
+
1153
+ removeAttributes : function ( attributes )
1154
+ {
1155
+ if ( CKEDITOR.tools.isArray( attributes ) )
1156
+ {
1157
+ for ( var i = 0 ; i < attributes.length ; i++ )
1158
+ this.removeAttribute( attributes[ i ] );
1159
+ }
1160
+ else
1161
+ {
1162
+ for ( var attr in attributes )
1163
+ attributes.hasOwnProperty( attr ) && this.removeAttribute( attr );
1164
+ }
1165
+ },
1166
+
1167
+ /**
1168
+ * Removes a style from the element.
1169
+ * @param {String} name The style name.
1170
+ * @function
1171
+ * @example
1172
+ * var element = CKEDITOR.dom.element.createFromHtml( '<div style="display:none"></div>' );
1173
+ * element.removeStyle( 'display' );
1174
+ */
1175
+ removeStyle : function( name )
1176
+ {
1177
+ this.setStyle( name, '' );
1178
+ if ( this.$.style.removeAttribute )
1179
+ this.$.style.removeAttribute( CKEDITOR.tools.cssStyleToDomStyle( name ) );
1180
+
1181
+ if ( !this.$.style.cssText )
1182
+ this.removeAttribute( 'style' );
1183
+ },
1184
+
1185
+ /**
1186
+ * Sets the value of an element style.
1187
+ * @param {String} name The name of the style. The CSS naming notation
1188
+ * must be used (e.g. "background-color").
1189
+ * @param {String} value The value to be set to the style.
1190
+ * @returns {CKEDITOR.dom.element} This element instance.
1191
+ * @example
1192
+ * var element = CKEDITOR.dom.element.getById( 'myElement' );
1193
+ * <b>element.setStyle( 'background-color', '#ff0000' )</b>;
1194
+ * <b>element.setStyle( 'margin-top', '10px' )</b>;
1195
+ * <b>element.setStyle( 'float', 'right' )</b>;
1196
+ */
1197
+ setStyle : function( name, value )
1198
+ {
1199
+ this.$.style[ CKEDITOR.tools.cssStyleToDomStyle( name ) ] = value;
1200
+ return this;
1201
+ },
1202
+
1203
+ /**
1204
+ * Sets the value of several element styles.
1205
+ * @param {Object} stylesPairs An object containing the names and
1206
+ * values of the styles.
1207
+ * @returns {CKEDITOR.dom.element} This element instance.
1208
+ * @example
1209
+ * var element = CKEDITOR.dom.element.getById( 'myElement' );
1210
+ * <b>element.setStyles({
1211
+ * 'position' : 'absolute',
1212
+ * 'float' : 'right' })</b>;
1213
+ */
1214
+ setStyles : function( stylesPairs )
1215
+ {
1216
+ for ( var name in stylesPairs )
1217
+ this.setStyle( name, stylesPairs[ name ] );
1218
+ return this;
1219
+ },
1220
+
1221
+ /**
1222
+ * Sets the opacity of an element.
1223
+ * @param {Number} opacity A number within the range [0.0, 1.0].
1224
+ * @example
1225
+ * var element = CKEDITOR.dom.element.getById( 'myElement' );
1226
+ * <b>element.setOpacity( 0.75 )</b>;
1227
+ */
1228
+ setOpacity : function( opacity )
1229
+ {
1230
+ if ( CKEDITOR.env.ie )
1231
+ {
1232
+ opacity = Math.round( opacity * 100 );
1233
+ this.setStyle( 'filter', opacity >= 100 ? '' : 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')' );
1234
+ }
1235
+ else
1236
+ this.setStyle( 'opacity', opacity );
1237
+ },
1238
+
1239
+ /**
1240
+ * Makes the element and its children unselectable.
1241
+ * @function
1242
+ * @example
1243
+ * var element = CKEDITOR.dom.element.getById( 'myElement' );
1244
+ * element.unselectable();
1245
+ */
1246
+ unselectable :
1247
+ CKEDITOR.env.gecko ?
1248
+ function()
1249
+ {
1250
+ this.$.style.MozUserSelect = 'none';
1251
+ this.on( 'dragstart', function( evt ) { evt.data.preventDefault(); } );
1252
+ }
1253
+ : CKEDITOR.env.webkit ?
1254
+ function()
1255
+ {
1256
+ this.$.style.KhtmlUserSelect = 'none';
1257
+ this.on( 'dragstart', function( evt ) { evt.data.preventDefault(); } );
1258
+ }
1259
+ :
1260
+ function()
1261
+ {
1262
+ if ( CKEDITOR.env.ie || CKEDITOR.env.opera )
1263
+ {
1264
+ var element = this.$,
1265
+ elements = element.getElementsByTagName("*"),
1266
+ e,
1267
+ i = 0;
1268
+
1269
+ element.unselectable = 'on';
1270
+
1271
+ while ( ( e = elements[ i++ ] ) )
1272
+ {
1273
+ switch ( e.tagName.toLowerCase() )
1274
+ {
1275
+ case 'iframe' :
1276
+ case 'textarea' :
1277
+ case 'input' :
1278
+ case 'select' :
1279
+ /* Ignore the above tags */
1280
+ break;
1281
+ default :
1282
+ e.unselectable = 'on';
1283
+ }
1284
+ }
1285
+ }
1286
+ },
1287
+
1288
+ getPositionedAncestor : function()
1289
+ {
1290
+ var current = this;
1291
+ while ( current.getName() != 'html' )
1292
+ {
1293
+ if ( current.getComputedStyle( 'position' ) != 'static' )
1294
+ return current;
1295
+
1296
+ current = current.getParent();
1297
+ }
1298
+ return null;
1299
+ },
1300
+
1301
+ getDocumentPosition : function( refDocument )
1302
+ {
1303
+ var x = 0, y = 0,
1304
+ doc = this.getDocument(),
1305
+ body = doc.getBody(),
1306
+ quirks = doc.$.compatMode == 'BackCompat';
1307
+
1308
+ if ( document.documentElement[ "getBoundingClientRect" ] )
1309
+ {
1310
+ var box = this.$.getBoundingClientRect(),
1311
+ $doc = doc.$,
1312
+ $docElem = $doc.documentElement;
1313
+
1314
+ var clientTop = $docElem.clientTop || body.$.clientTop || 0,
1315
+ clientLeft = $docElem.clientLeft || body.$.clientLeft || 0,
1316
+ needAdjustScrollAndBorders = true;
1317
+
1318
+ /*
1319
+ * #3804: getBoundingClientRect() works differently on IE and non-IE
1320
+ * browsers, regarding scroll positions.
1321
+ *
1322
+ * On IE, the top position of the <html> element is always 0, no matter
1323
+ * how much you scrolled down.
1324
+ *
1325
+ * On other browsers, the top position of the <html> element is negative
1326
+ * scrollTop.
1327
+ */
1328
+ if ( CKEDITOR.env.ie )
1329
+ {
1330
+ var inDocElem = doc.getDocumentElement().contains( this ),
1331
+ inBody = doc.getBody().contains( this );
1332
+
1333
+ needAdjustScrollAndBorders = ( quirks && inBody ) || ( !quirks && inDocElem );
1334
+ }
1335
+
1336
+ if ( needAdjustScrollAndBorders )
1337
+ {
1338
+ x = box.left + ( !quirks && $docElem.scrollLeft || body.$.scrollLeft );
1339
+ x -= clientLeft;
1340
+ y = box.top + ( !quirks && $docElem.scrollTop || body.$.scrollTop );
1341
+ y -= clientTop;
1342
+ }
1343
+ }
1344
+ else
1345
+ {
1346
+ var current = this, previous = null, offsetParent;
1347
+ while ( current && !( current.getName() == 'body' || current.getName() == 'html' ) )
1348
+ {
1349
+ x += current.$.offsetLeft - current.$.scrollLeft;
1350
+ y += current.$.offsetTop - current.$.scrollTop;
1351
+
1352
+ // Opera includes clientTop|Left into offsetTop|Left.
1353
+ if ( !current.equals( this ) )
1354
+ {
1355
+ x += ( current.$.clientLeft || 0 );
1356
+ y += ( current.$.clientTop || 0 );
1357
+ }
1358
+
1359
+ var scrollElement = previous;
1360
+ while ( scrollElement && !scrollElement.equals( current ) )
1361
+ {
1362
+ x -= scrollElement.$.scrollLeft;
1363
+ y -= scrollElement.$.scrollTop;
1364
+ scrollElement = scrollElement.getParent();
1365
+ }
1366
+
1367
+ previous = current;
1368
+ current = ( offsetParent = current.$.offsetParent ) ?
1369
+ new CKEDITOR.dom.element( offsetParent ) : null;
1370
+ }
1371
+ }
1372
+
1373
+ if ( refDocument )
1374
+ {
1375
+ var currentWindow = this.getWindow(),
1376
+ refWindow = refDocument.getWindow();
1377
+
1378
+ if ( !currentWindow.equals( refWindow ) && currentWindow.$.frameElement )
1379
+ {
1380
+ var iframePosition = ( new CKEDITOR.dom.element( currentWindow.$.frameElement ) ).getDocumentPosition( refDocument );
1381
+
1382
+ x += iframePosition.x;
1383
+ y += iframePosition.y;
1384
+ }
1385
+ }
1386
+
1387
+ if ( !document.documentElement[ "getBoundingClientRect" ] )
1388
+ {
1389
+ // In Firefox, we'll endup one pixel before the element positions,
1390
+ // so we must add it here.
1391
+ if ( CKEDITOR.env.gecko && !quirks )
1392
+ {
1393
+ x += this.$.clientLeft ? 1 : 0;
1394
+ y += this.$.clientTop ? 1 : 0;
1395
+ }
1396
+ }
1397
+
1398
+ return { x : x, y : y };
1399
+ },
1400
+
1401
+ /**
1402
+ * Make any page element visible inside the browser viewport.
1403
+ * @param {Boolean} [alignToTop]
1404
+ */
1405
+ scrollIntoView : function( alignToTop )
1406
+ {
1407
+ var parent = this.getParent();
1408
+ if ( !parent ) return;
1409
+
1410
+ // Scroll the element into parent container from the inner out.
1411
+ do
1412
+ {
1413
+ // Check ancestors that overflows.
1414
+ var overflowed =
1415
+ parent.$.clientWidth && parent.$.clientWidth < parent.$.scrollWidth
1416
+ || parent.$.clientHeight && parent.$.clientHeight < parent.$.scrollHeight;
1417
+
1418
+ if ( overflowed )
1419
+ this.scrollIntoParent( parent, alignToTop, 1 );
1420
+
1421
+ // Walk across the frame.
1422
+ if ( parent.is( 'html' ) )
1423
+ {
1424
+ var win = parent.getWindow();
1425
+
1426
+ // Avoid security error.
1427
+ try
1428
+ {
1429
+ var iframe = win.$.frameElement;
1430
+ iframe && ( parent = new CKEDITOR.dom.element( iframe ) );
1431
+ }
1432
+ catch(er){}
1433
+ }
1434
+ }
1435
+ while ( ( parent = parent.getParent() ) );
1436
+ },
1437
+
1438
+ /**
1439
+ * Make any page element visible inside one of the ancestors by scrolling the parent.
1440
+ * @param {CKEDITOR.dom.element|CKEDITOR.dom.window} parent The container to scroll into.
1441
+ * @param {Boolean} [alignToTop] Align the element's top side with the container's
1442
+ * when <code>true</code> is specified; align the bottom with viewport bottom when
1443
+ * <code>false</code> is specified. Otherwise scroll on either side with the minimum
1444
+ * amount to show the element.
1445
+ * @param {Boolean} [hscroll] Whether horizontal overflow should be considered.
1446
+ */
1447
+ scrollIntoParent : function( parent, alignToTop, hscroll )
1448
+ {
1449
+ !parent && ( parent = this.getWindow() );
1450
+
1451
+ var doc = parent.getDocument();
1452
+ var isQuirks = doc.$.compatMode == 'BackCompat';
1453
+
1454
+ // On window <html> is scrolled while quirks scrolls <body>.
1455
+ if ( parent instanceof CKEDITOR.dom.window )
1456
+ parent = isQuirks ? doc.getBody() : doc.getDocumentElement();
1457
+
1458
+ // Scroll the parent by the specified amount.
1459
+ function scrollBy( x, y )
1460
+ {
1461
+ // Webkit doesn't support "scrollTop/scrollLeft"
1462
+ // on documentElement/body element.
1463
+ if ( /body|html/.test( parent.getName() ) )
1464
+ parent.getWindow().$.scrollBy( x, y );
1465
+ else
1466
+ {
1467
+ parent.$[ 'scrollLeft' ] += x;
1468
+ parent.$[ 'scrollTop' ] += y;
1469
+ }
1470
+ }
1471
+
1472
+ // Figure out the element position relative to the specified window.
1473
+ function screenPos( element, refWin )
1474
+ {
1475
+ var pos = { x: 0, y: 0 };
1476
+
1477
+ if ( !( element.is( isQuirks ? 'body' : 'html' ) ) )
1478
+ {
1479
+ var box = element.$.getBoundingClientRect();
1480
+ pos.x = box.left, pos.y = box.top;
1481
+ }
1482
+
1483
+ var win = element.getWindow();
1484
+ if ( !win.equals( refWin ) )
1485
+ {
1486
+ var outerPos = screenPos( CKEDITOR.dom.element.get( win.$.frameElement ), refWin );
1487
+ pos.x += outerPos.x, pos.y += outerPos.y;
1488
+ }
1489
+
1490
+ return pos;
1491
+ }
1492
+
1493
+ // calculated margin size.
1494
+ function margin( element, side )
1495
+ {
1496
+ return parseInt( element.getComputedStyle( 'margin-' + side ) || 0, 10 ) || 0;
1497
+ }
1498
+
1499
+ var win = parent.getWindow();
1500
+
1501
+ var thisPos = screenPos( this, win ),
1502
+ parentPos = screenPos( parent, win ),
1503
+ eh = this.$.offsetHeight,
1504
+ ew = this.$.offsetWidth,
1505
+ ch = parent.$.clientHeight,
1506
+ cw = parent.$.clientWidth,
1507
+ lt,
1508
+ br;
1509
+
1510
+ // Left-top margins.
1511
+ lt =
1512
+ {
1513
+ x : thisPos.x - margin( this, 'left' ) - parentPos.x || 0,
1514
+ y : thisPos.y - margin( this, 'top' ) - parentPos.y|| 0
1515
+ };
1516
+
1517
+ // Bottom-right margins.
1518
+ br =
1519
+ {
1520
+ x : thisPos.x + ew + margin( this, 'right' ) - ( ( parentPos.x ) + cw ) || 0,
1521
+ y : thisPos.y + eh + margin( this, 'bottom' ) - ( ( parentPos.y ) + ch ) || 0
1522
+ };
1523
+
1524
+ // 1. Do the specified alignment as much as possible;
1525
+ // 2. Otherwise be smart to scroll only the minimum amount;
1526
+ // 3. Never cut at the top;
1527
+ // 4. DO NOT scroll when already visible.
1528
+ if ( lt.y < 0 || br.y > 0 )
1529
+ {
1530
+ scrollBy( 0,
1531
+ alignToTop === true ? lt.y :
1532
+ alignToTop === false ? br.y :
1533
+ lt.y < 0 ? lt.y : br.y );
1534
+ }
1535
+
1536
+ if ( hscroll && ( lt.x < 0 || br.x > 0 ) )
1537
+ scrollBy( lt.x < 0 ? lt.x : br.x, 0 );
1538
+ },
1539
+
1540
+ setState : function( state )
1541
+ {
1542
+ switch ( state )
1543
+ {
1544
+ case CKEDITOR.TRISTATE_ON :
1545
+ this.addClass( 'cke_on' );
1546
+ this.removeClass( 'cke_off' );
1547
+ this.removeClass( 'cke_disabled' );
1548
+ break;
1549
+ case CKEDITOR.TRISTATE_DISABLED :
1550
+ this.addClass( 'cke_disabled' );
1551
+ this.removeClass( 'cke_off' );
1552
+ this.removeClass( 'cke_on' );
1553
+ break;
1554
+ default :
1555
+ this.addClass( 'cke_off' );
1556
+ this.removeClass( 'cke_on' );
1557
+ this.removeClass( 'cke_disabled' );
1558
+ break;
1559
+ }
1560
+ },
1561
+
1562
+ /**
1563
+ * Returns the inner document of this IFRAME element.
1564
+ * @returns {CKEDITOR.dom.document} The inner document.
1565
+ */
1566
+ getFrameDocument : function()
1567
+ {
1568
+ var $ = this.$;
1569
+
1570
+ try
1571
+ {
1572
+ // In IE, with custom document.domain, it may happen that
1573
+ // the iframe is not yet available, resulting in "Access
1574
+ // Denied" for the following property access.
1575
+ $.contentWindow.document;
1576
+ }
1577
+ catch ( e )
1578
+ {
1579
+ // Trick to solve this issue, forcing the iframe to get ready
1580
+ // by simply setting its "src" property.
1581
+ $.src = $.src;
1582
+
1583
+ // In IE6 though, the above is not enough, so we must pause the
1584
+ // execution for a while, giving it time to think.
1585
+ if ( CKEDITOR.env.ie && CKEDITOR.env.version < 7 )
1586
+ {
1587
+ window.showModalDialog(
1588
+ 'javascript:document.write("' +
1589
+ '<script>' +
1590
+ 'window.setTimeout(' +
1591
+ 'function(){window.close();}' +
1592
+ ',50);' +
1593
+ '</script>")' );
1594
+ }
1595
+ }
1596
+
1597
+ return $ && new CKEDITOR.dom.document( $.contentWindow.document );
1598
+ },
1599
+
1600
+ /**
1601
+ * Copy all the attributes from one node to the other, kinda like a clone
1602
+ * skipAttributes is an object with the attributes that must NOT be copied.
1603
+ * @param {CKEDITOR.dom.element} dest The destination element.
1604
+ * @param {Object} skipAttributes A dictionary of attributes to skip.
1605
+ * @example
1606
+ */
1607
+ copyAttributes : function( dest, skipAttributes )
1608
+ {
1609
+ var attributes = this.$.attributes;
1610
+ skipAttributes = skipAttributes || {};
1611
+
1612
+ for ( var n = 0 ; n < attributes.length ; n++ )
1613
+ {
1614
+ var attribute = attributes[n];
1615
+
1616
+ // Lowercase attribute name hard rule is broken for
1617
+ // some attribute on IE, e.g. CHECKED.
1618
+ var attrName = attribute.nodeName.toLowerCase(),
1619
+ attrValue;
1620
+
1621
+ // We can set the type only once, so do it with the proper value, not copying it.
1622
+ if ( attrName in skipAttributes )
1623
+ continue;
1624
+
1625
+ if ( attrName == 'checked' && ( attrValue = this.getAttribute( attrName ) ) )
1626
+ dest.setAttribute( attrName, attrValue );
1627
+ // IE BUG: value attribute is never specified even if it exists.
1628
+ else if ( attribute.specified ||
1629
+ ( CKEDITOR.env.ie && attribute.nodeValue && attrName == 'value' ) )
1630
+ {
1631
+ attrValue = this.getAttribute( attrName );
1632
+ if ( attrValue === null )
1633
+ attrValue = attribute.nodeValue;
1634
+
1635
+ dest.setAttribute( attrName, attrValue );
1636
+ }
1637
+ }
1638
+
1639
+ // The style:
1640
+ if ( this.$.style.cssText !== '' )
1641
+ dest.$.style.cssText = this.$.style.cssText;
1642
+ },
1643
+
1644
+ /**
1645
+ * Changes the tag name of the current element.
1646
+ * @param {String} newTag The new tag for the element.
1647
+ */
1648
+ renameNode : function( newTag )
1649
+ {
1650
+ // If it's already correct exit here.
1651
+ if ( this.getName() == newTag )
1652
+ return;
1653
+
1654
+ var doc = this.getDocument();
1655
+
1656
+ // Create the new node.
1657
+ var newNode = new CKEDITOR.dom.element( newTag, doc );
1658
+
1659
+ // Copy all attributes.
1660
+ this.copyAttributes( newNode );
1661
+
1662
+ // Move children to the new node.
1663
+ this.moveChildren( newNode );
1664
+
1665
+ // Replace the node.
1666
+ this.getParent() && this.$.parentNode.replaceChild( newNode.$, this.$ );
1667
+ newNode.$[ 'data-cke-expando' ] = this.$[ 'data-cke-expando' ];
1668
+ this.$ = newNode.$;
1669
+ },
1670
+
1671
+ /**
1672
+ * Gets a DOM tree descendant under the current node.
1673
+ * @param {Array|Number} indices The child index or array of child indices under the node.
1674
+ * @returns {CKEDITOR.dom.node} The specified DOM child under the current node. Null if child does not exist.
1675
+ * @example
1676
+ * var strong = p.getChild(0);
1677
+ */
1678
+ getChild : function( indices )
1679
+ {
1680
+ var rawNode = this.$;
1681
+
1682
+ if ( !indices.slice )
1683
+ rawNode = rawNode.childNodes[ indices ];
1684
+ else
1685
+ {
1686
+ while ( indices.length > 0 && rawNode )
1687
+ rawNode = rawNode.childNodes[ indices.shift() ];
1688
+ }
1689
+
1690
+ return rawNode ? new CKEDITOR.dom.node( rawNode ) : null;
1691
+ },
1692
+
1693
+ getChildCount : function()
1694
+ {
1695
+ return this.$.childNodes.length;
1696
+ },
1697
+
1698
+ disableContextMenu : function()
1699
+ {
1700
+ this.on( 'contextmenu', function( event )
1701
+ {
1702
+ // Cancel the browser context menu.
1703
+ if ( !event.data.getTarget().hasClass( 'cke_enable_context_menu' ) )
1704
+ event.data.preventDefault();
1705
+ } );
1706
+ },
1707
+
1708
+ /**
1709
+ * Gets element's direction. Supports both CSS 'direction' prop and 'dir' attr.
1710
+ */
1711
+ getDirection : function( useComputed )
1712
+ {
1713
+ return useComputed ?
1714
+ this.getComputedStyle( 'direction' )
1715
+ // Webkit: offline element returns empty direction (#8053).
1716
+ || this.getDirection()
1717
+ || this.getDocument().$.dir
1718
+ || this.getDocument().getBody().getDirection( 1 )
1719
+ : this.getStyle( 'direction' ) || this.getAttribute( 'dir' );
1720
+ },
1721
+
1722
+ /**
1723
+ * Gets, sets and removes custom data to be stored as HTML5 data-* attributes.
1724
+ * @param {String} name The name of the attribute, excluding the 'data-' part.
1725
+ * @param {String} [value] The value to set. If set to false, the attribute will be removed.
1726
+ * @example
1727
+ * element.data( 'extra-info', 'test' ); // appended the attribute data-extra-info="test" to the element
1728
+ * alert( element.data( 'extra-info' ) ); // "test"
1729
+ * element.data( 'extra-info', false ); // remove the data-extra-info attribute from the element
1730
+ */
1731
+ data : function ( name, value )
1732
+ {
1733
+ name = 'data-' + name;
1734
+ if ( value === undefined )
1735
+ return this.getAttribute( name );
1736
+ else if ( value === false )
1737
+ this.removeAttribute( name );
1738
+ else
1739
+ this.setAttribute( name, value );
1740
+
1741
+ return null;
1742
+ }
1743
+ });
1744
+
1745
+ ( function()
1746
+ {
1747
+ var sides = {
1748
+ width : [ "border-left-width", "border-right-width","padding-left", "padding-right" ],
1749
+ height : [ "border-top-width", "border-bottom-width", "padding-top", "padding-bottom" ]
1750
+ };
1751
+
1752
+ function marginAndPaddingSize( type )
1753
+ {
1754
+ var adjustment = 0;
1755
+ for ( var i = 0, len = sides[ type ].length; i < len; i++ )
1756
+ adjustment += parseInt( this.getComputedStyle( sides [ type ][ i ] ) || 0, 10 ) || 0;
1757
+ return adjustment;
1758
+ }
1759
+
1760
+ /**
1761
+ * Sets the element size considering the box model.
1762
+ * @name CKEDITOR.dom.element.prototype.setSize
1763
+ * @function
1764
+ * @param {String} type The dimension to set. It accepts "width" and "height".
1765
+ * @param {Number} size The length unit in px.
1766
+ * @param {Boolean} isBorderBox Apply the size based on the border box model.
1767
+ */
1768
+ CKEDITOR.dom.element.prototype.setSize = function( type, size, isBorderBox )
1769
+ {
1770
+ if ( typeof size == 'number' )
1771
+ {
1772
+ if ( isBorderBox && !( CKEDITOR.env.ie && CKEDITOR.env.quirks ) )
1773
+ size -= marginAndPaddingSize.call( this, type );
1774
+
1775
+ this.setStyle( type, size + 'px' );
1776
+ }
1777
+ };
1778
+
1779
+ /**
1780
+ * Gets the element size, possibly considering the box model.
1781
+ * @name CKEDITOR.dom.element.prototype.getSize
1782
+ * @function
1783
+ * @param {String} type The dimension to get. It accepts "width" and "height".
1784
+ * @param {Boolean} isBorderBox Get the size based on the border box model.
1785
+ */
1786
+ CKEDITOR.dom.element.prototype.getSize = function( type, isBorderBox )
1787
+ {
1788
+ var size = Math.max( this.$[ 'offset' + CKEDITOR.tools.capitalize( type ) ],
1789
+ this.$[ 'client' + CKEDITOR.tools.capitalize( type ) ] ) || 0;
1790
+
1791
+ if ( isBorderBox )
1792
+ size -= marginAndPaddingSize.call( this, type );
1793
+
1794
+ return size;
1795
+ };
1796
+ })();