ckeditor-rails 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (708) hide show
  1. data/README.md +17 -14
  2. data/lib/ckeditor-rails/version.rb +1 -1
  3. data/vendor/assets/ckeditor/ckeditor/.htaccess +1 -1
  4. data/vendor/assets/ckeditor/ckeditor/CHANGES.html +139 -3
  5. data/vendor/assets/ckeditor/ckeditor/INSTALL.html +92 -92
  6. data/vendor/assets/ckeditor/ckeditor/LICENSE.html +2 -2
  7. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/application.xml +32 -32
  8. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/run.bat +9 -9
  9. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/run.sh +1 -1
  10. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/sample.html +45 -45
  11. data/vendor/assets/ckeditor/ckeditor/_samples/ajax.html +98 -98
  12. data/vendor/assets/ckeditor/ckeditor/_samples/api.html +192 -192
  13. data/vendor/assets/ckeditor/ckeditor/_samples/api_dialog.html +198 -198
  14. data/vendor/assets/ckeditor/ckeditor/_samples/api_dialog/my_dialog.js +28 -28
  15. data/vendor/assets/ckeditor/ckeditor/_samples/asp/advanced.asp +105 -105
  16. data/vendor/assets/ckeditor/ckeditor/_samples/asp/events.asp +136 -136
  17. data/vendor/assets/ckeditor/ckeditor/_samples/asp/index.html +103 -103
  18. data/vendor/assets/ckeditor/ckeditor/_samples/asp/replace.asp +72 -72
  19. data/vendor/assets/ckeditor/ckeditor/_samples/asp/replaceall.asp +77 -77
  20. data/vendor/assets/ckeditor/ckeditor/_samples/asp/sample_posteddata.asp +46 -46
  21. data/vendor/assets/ckeditor/ckeditor/_samples/asp/standalone.asp +72 -72
  22. data/vendor/assets/ckeditor/ckeditor/_samples/assets/_posteddata.php +59 -59
  23. data/vendor/assets/ckeditor/ckeditor/_samples/assets/output_xhtml.css +204 -204
  24. data/vendor/assets/ckeditor/ckeditor/_samples/assets/parsesample.css +70 -70
  25. data/vendor/assets/ckeditor/ckeditor/_samples/assets/swfobject.js +18 -18
  26. data/vendor/assets/ckeditor/ckeditor/_samples/autogrow.html +108 -107
  27. data/vendor/assets/ckeditor/ckeditor/_samples/bbcode.html +125 -125
  28. data/vendor/assets/ckeditor/ckeditor/_samples/devtools.html +94 -94
  29. data/vendor/assets/ckeditor/ckeditor/_samples/divreplace.html +154 -154
  30. data/vendor/assets/ckeditor/ckeditor/_samples/enterkey.html +115 -115
  31. data/vendor/assets/ckeditor/ckeditor/_samples/fullpage.html +82 -82
  32. data/vendor/assets/ckeditor/ckeditor/_samples/index.html +116 -116
  33. data/vendor/assets/ckeditor/ckeditor/_samples/jqueryadapter.html +99 -99
  34. data/vendor/assets/ckeditor/ckeditor/_samples/output_for_flash.html +275 -275
  35. data/vendor/assets/ckeditor/ckeditor/_samples/output_html.html +285 -285
  36. data/vendor/assets/ckeditor/ckeditor/_samples/output_xhtml.html +181 -177
  37. data/vendor/assets/ckeditor/ckeditor/_samples/php/advanced.php +120 -120
  38. data/vendor/assets/ckeditor/ckeditor/_samples/php/events.php +153 -153
  39. data/vendor/assets/ckeditor/ckeditor/_samples/php/index.html +47 -47
  40. data/vendor/assets/ckeditor/ckeditor/_samples/php/replace.php +87 -87
  41. data/vendor/assets/ckeditor/ckeditor/_samples/php/replaceall.php +88 -88
  42. data/vendor/assets/ckeditor/ckeditor/_samples/php/standalone.php +83 -83
  43. data/vendor/assets/ckeditor/ckeditor/_samples/placeholder.html +81 -81
  44. data/vendor/assets/ckeditor/ckeditor/_samples/readonly.html +91 -91
  45. data/vendor/assets/ckeditor/ckeditor/_samples/replacebyclass.html +64 -64
  46. data/vendor/assets/ckeditor/ckeditor/_samples/replacebycode.html +97 -97
  47. data/vendor/assets/ckeditor/ckeditor/_samples/sample.css +163 -163
  48. data/vendor/assets/ckeditor/ckeditor/_samples/sample.js +65 -65
  49. data/vendor/assets/ckeditor/ckeditor/_samples/sample_posteddata.php +21 -21
  50. data/vendor/assets/ckeditor/ckeditor/_samples/sharedspaces.html +153 -153
  51. data/vendor/assets/ckeditor/ckeditor/_samples/skins.html +110 -110
  52. data/vendor/assets/ckeditor/ckeditor/_samples/stylesheetparser.html +93 -93
  53. data/vendor/assets/ckeditor/ckeditor/_samples/tableresize.html +115 -115
  54. data/vendor/assets/ckeditor/ckeditor/_samples/ui_color.html +129 -129
  55. data/vendor/assets/ckeditor/ckeditor/_samples/ui_languages.html +134 -134
  56. data/vendor/assets/ckeditor/ckeditor/_source/adapters/jquery.js +306 -306
  57. data/vendor/assets/ckeditor/ckeditor/_source/core/_bootstrap.js +87 -87
  58. data/vendor/assets/ckeditor/ckeditor/_source/core/ckeditor.js +141 -141
  59. data/vendor/assets/ckeditor/ckeditor/_source/core/ckeditor_base.js +235 -227
  60. data/vendor/assets/ckeditor/ckeditor/_source/core/ckeditor_basic.js +238 -238
  61. data/vendor/assets/ckeditor/ckeditor/_source/core/command.js +225 -209
  62. data/vendor/assets/ckeditor/ckeditor/_source/core/commanddefinition.js +129 -129
  63. data/vendor/assets/ckeditor/ckeditor/_source/core/config.js +447 -431
  64. data/vendor/assets/ckeditor/ckeditor/_source/core/dataprocessor.js +65 -65
  65. data/vendor/assets/ckeditor/ckeditor/_source/core/dom.js +20 -20
  66. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/comment.js +44 -32
  67. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/document.js +251 -251
  68. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/documentfragment.js +49 -49
  69. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/domobject.js +258 -258
  70. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/element.js +1796 -1681
  71. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/elementpath.js +117 -119
  72. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/event.js +145 -145
  73. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/node.js +691 -695
  74. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/nodelist.js +26 -26
  75. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/range.js +2068 -2032
  76. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/rangelist.js +213 -213
  77. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/text.js +128 -128
  78. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/walker.js +496 -462
  79. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/window.js +96 -96
  80. data/vendor/assets/ckeditor/ckeditor/_source/core/dtd.js +266 -266
  81. data/vendor/assets/ckeditor/ckeditor/_source/core/editor.js +1059 -1059
  82. data/vendor/assets/ckeditor/ckeditor/_source/core/editor_basic.js +186 -186
  83. data/vendor/assets/ckeditor/ckeditor/_source/core/env.js +305 -291
  84. data/vendor/assets/ckeditor/ckeditor/_source/core/event.js +342 -342
  85. data/vendor/assets/ckeditor/ckeditor/_source/core/eventInfo.js +120 -120
  86. data/vendor/assets/ckeditor/ckeditor/_source/core/focusmanager.js +152 -152
  87. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser.js +224 -224
  88. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/basicwriter.js +145 -145
  89. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/cdata.js +43 -43
  90. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/comment.js +60 -60
  91. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/element.js +308 -308
  92. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/filter.js +288 -288
  93. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/fragment.js +537 -497
  94. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/text.js +53 -55
  95. data/vendor/assets/ckeditor/ckeditor/_source/core/lang.js +157 -157
  96. data/vendor/assets/ckeditor/ckeditor/_source/core/loader.js +240 -240
  97. data/vendor/assets/ckeditor/ckeditor/_source/core/plugindefinition.js +83 -83
  98. data/vendor/assets/ckeditor/ckeditor/_source/core/plugins.js +103 -103
  99. data/vendor/assets/ckeditor/ckeditor/_source/core/resourcemanager.js +238 -238
  100. data/vendor/assets/ckeditor/ckeditor/_source/core/scriptloader.js +180 -180
  101. data/vendor/assets/ckeditor/ckeditor/_source/core/skins.js +184 -184
  102. data/vendor/assets/ckeditor/ckeditor/_source/core/themes.js +19 -19
  103. data/vendor/assets/ckeditor/ckeditor/_source/core/tools.js +763 -763
  104. data/vendor/assets/ckeditor/ckeditor/_source/core/ui.js +128 -128
  105. data/vendor/assets/ckeditor/ckeditor/_source/lang/_languages.js +84 -84
  106. data/vendor/assets/ckeditor/ckeditor/_source/lang/_translationstatus.txt +63 -61
  107. data/vendor/assets/ckeditor/ckeditor/_source/lang/af.js +815 -812
  108. data/vendor/assets/ckeditor/ckeditor/_source/lang/ar.js +815 -812
  109. data/vendor/assets/ckeditor/ckeditor/_source/lang/bg.js +815 -812
  110. data/vendor/assets/ckeditor/ckeditor/_source/lang/bn.js +815 -812
  111. data/vendor/assets/ckeditor/ckeditor/_source/lang/bs.js +815 -812
  112. data/vendor/assets/ckeditor/ckeditor/_source/lang/ca.js +815 -812
  113. data/vendor/assets/ckeditor/ckeditor/_source/lang/cs.js +815 -812
  114. data/vendor/assets/ckeditor/ckeditor/_source/lang/cy.js +815 -812
  115. data/vendor/assets/ckeditor/ckeditor/_source/lang/da.js +815 -812
  116. data/vendor/assets/ckeditor/ckeditor/_source/lang/de.js +815 -812
  117. data/vendor/assets/ckeditor/ckeditor/_source/lang/el.js +815 -812
  118. data/vendor/assets/ckeditor/ckeditor/_source/lang/en-au.js +815 -812
  119. data/vendor/assets/ckeditor/ckeditor/_source/lang/en-ca.js +815 -812
  120. data/vendor/assets/ckeditor/ckeditor/_source/lang/en-gb.js +815 -812
  121. data/vendor/assets/ckeditor/ckeditor/_source/lang/en.js +815 -812
  122. data/vendor/assets/ckeditor/ckeditor/_source/lang/eo.js +815 -812
  123. data/vendor/assets/ckeditor/ckeditor/_source/lang/es.js +815 -812
  124. data/vendor/assets/ckeditor/ckeditor/_source/lang/et.js +815 -812
  125. data/vendor/assets/ckeditor/ckeditor/_source/lang/eu.js +815 -812
  126. data/vendor/assets/ckeditor/ckeditor/_source/lang/fa.js +815 -812
  127. data/vendor/assets/ckeditor/ckeditor/_source/lang/fi.js +815 -812
  128. data/vendor/assets/ckeditor/ckeditor/_source/lang/fo.js +815 -812
  129. data/vendor/assets/ckeditor/ckeditor/_source/lang/fr-ca.js +815 -812
  130. data/vendor/assets/ckeditor/ckeditor/_source/lang/fr.js +815 -812
  131. data/vendor/assets/ckeditor/ckeditor/_source/lang/gl.js +815 -812
  132. data/vendor/assets/ckeditor/ckeditor/_source/lang/gu.js +815 -812
  133. data/vendor/assets/ckeditor/ckeditor/_source/lang/he.js +815 -812
  134. data/vendor/assets/ckeditor/ckeditor/_source/lang/hi.js +815 -812
  135. data/vendor/assets/ckeditor/ckeditor/_source/lang/hr.js +815 -812
  136. data/vendor/assets/ckeditor/ckeditor/_source/lang/hu.js +815 -812
  137. data/vendor/assets/ckeditor/ckeditor/_source/lang/is.js +815 -812
  138. data/vendor/assets/ckeditor/ckeditor/_source/lang/it.js +815 -812
  139. data/vendor/assets/ckeditor/ckeditor/_source/lang/ja.js +815 -812
  140. data/vendor/assets/ckeditor/ckeditor/_source/lang/ka.js +815 -812
  141. data/vendor/assets/ckeditor/ckeditor/_source/lang/km.js +815 -812
  142. data/vendor/assets/ckeditor/ckeditor/_source/lang/ko.js +815 -812
  143. data/vendor/assets/ckeditor/ckeditor/_source/lang/lt.js +815 -812
  144. data/vendor/assets/ckeditor/ckeditor/_source/lang/lv.js +815 -812
  145. data/vendor/assets/ckeditor/ckeditor/_source/lang/mk.js +814 -0
  146. data/vendor/assets/ckeditor/ckeditor/_source/lang/mn.js +815 -812
  147. data/vendor/assets/ckeditor/ckeditor/_source/lang/ms.js +815 -812
  148. data/vendor/assets/ckeditor/ckeditor/_source/lang/nb.js +815 -812
  149. data/vendor/assets/ckeditor/ckeditor/_source/lang/nl.js +815 -812
  150. data/vendor/assets/ckeditor/ckeditor/_source/lang/no.js +815 -812
  151. data/vendor/assets/ckeditor/ckeditor/_source/lang/pl.js +815 -812
  152. data/vendor/assets/ckeditor/ckeditor/_source/lang/pt-br.js +814 -811
  153. data/vendor/assets/ckeditor/ckeditor/_source/lang/pt.js +815 -812
  154. data/vendor/assets/ckeditor/ckeditor/_source/lang/ro.js +815 -812
  155. data/vendor/assets/ckeditor/ckeditor/_source/lang/ru.js +815 -812
  156. data/vendor/assets/ckeditor/ckeditor/_source/lang/sk.js +815 -812
  157. data/vendor/assets/ckeditor/ckeditor/_source/lang/sl.js +815 -812
  158. data/vendor/assets/ckeditor/ckeditor/_source/lang/sr-latn.js +815 -812
  159. data/vendor/assets/ckeditor/ckeditor/_source/lang/sr.js +815 -812
  160. data/vendor/assets/ckeditor/ckeditor/_source/lang/sv.js +814 -811
  161. data/vendor/assets/ckeditor/ckeditor/_source/lang/th.js +815 -812
  162. data/vendor/assets/ckeditor/ckeditor/_source/lang/tr.js +814 -811
  163. data/vendor/assets/ckeditor/ckeditor/_source/lang/ug.js +814 -0
  164. data/vendor/assets/ckeditor/ckeditor/_source/lang/uk.js +815 -812
  165. data/vendor/assets/ckeditor/ckeditor/_source/lang/vi.js +815 -812
  166. data/vendor/assets/ckeditor/ckeditor/_source/lang/zh-cn.js +815 -812
  167. data/vendor/assets/ckeditor/ckeditor/_source/lang/zh.js +815 -812
  168. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/dialogs/a11yhelp.js +222 -222
  169. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/_translationstatus.txt +23 -0
  170. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/cs.js +89 -0
  171. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/cy.js +89 -0
  172. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/da.js +89 -0
  173. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/de.js +89 -0
  174. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/el.js +89 -0
  175. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/en.js +108 -108
  176. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/eo.js +89 -0
  177. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/fa.js +89 -0
  178. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/fi.js +89 -0
  179. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/fr.js +89 -0
  180. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/gu.js +89 -0
  181. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/he.js +89 -216
  182. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/it.js +89 -0
  183. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/mk.js +89 -0
  184. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/nb.js +89 -0
  185. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/nl.js +89 -0
  186. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/no.js +89 -0
  187. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/tr.js +89 -0
  188. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/ug.js +89 -0
  189. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/vi.js +89 -0
  190. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/zh-cn.js +89 -0
  191. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/plugin.js +47 -47
  192. data/vendor/assets/ckeditor/ckeditor/_source/plugins/about/dialogs/about.js +76 -76
  193. data/vendor/assets/ckeditor/ckeditor/_source/plugins/about/plugin.js +24 -24
  194. data/vendor/assets/ckeditor/ckeditor/_source/plugins/adobeair/plugin.js +228 -228
  195. data/vendor/assets/ckeditor/ckeditor/_source/plugins/ajax/plugin.js +152 -152
  196. data/vendor/assets/ckeditor/ckeditor/_source/plugins/autogrow/plugin.js +141 -88
  197. data/vendor/assets/ckeditor/ckeditor/_source/plugins/basicstyles/plugin.js +129 -101
  198. data/vendor/assets/ckeditor/ckeditor/_source/plugins/bbcode/plugin.js +931 -931
  199. data/vendor/assets/ckeditor/ckeditor/_source/plugins/bidi/plugin.js +334 -334
  200. data/vendor/assets/ckeditor/ckeditor/_source/plugins/blockquote/plugin.js +305 -305
  201. data/vendor/assets/ckeditor/ckeditor/_source/plugins/button/plugin.js +290 -290
  202. data/vendor/assets/ckeditor/ckeditor/_source/plugins/clipboard/dialogs/paste.js +223 -223
  203. data/vendor/assets/ckeditor/ckeditor/_source/plugins/clipboard/plugin.js +479 -453
  204. data/vendor/assets/ckeditor/ckeditor/_source/plugins/colorbutton/plugin.js +300 -294
  205. data/vendor/assets/ckeditor/ckeditor/_source/plugins/colordialog/dialogs/colordialog.js +387 -340
  206. data/vendor/assets/ckeditor/ckeditor/_source/plugins/colordialog/plugin.js +15 -15
  207. data/vendor/assets/ckeditor/ckeditor/_source/plugins/contextmenu/plugin.js +179 -177
  208. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/_translationstatus.txt +27 -0
  209. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/bg.js +16 -0
  210. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/cs.js +16 -0
  211. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/cy.js +16 -0
  212. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/da.js +16 -0
  213. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/de.js +16 -0
  214. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/el.js +16 -0
  215. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/en.js +16 -16
  216. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/eo.js +16 -0
  217. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/et.js +16 -0
  218. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/fa.js +16 -0
  219. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/fi.js +16 -0
  220. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/fr.js +16 -0
  221. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/gu.js +16 -0
  222. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/he.js +16 -0
  223. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/hr.js +16 -0
  224. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/it.js +16 -0
  225. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/nb.js +16 -0
  226. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/nl.js +16 -0
  227. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/no.js +16 -0
  228. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/pl.js +16 -0
  229. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/tr.js +16 -0
  230. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/ug.js +16 -0
  231. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/uk.js +16 -0
  232. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/vi.js +16 -0
  233. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/zh-cn.js +16 -0
  234. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/plugin.js +173 -173
  235. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialog/dialogDefinition.js +1166 -1166
  236. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialog/plugin.js +3319 -3289
  237. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialogadvtab/plugin.js +208 -207
  238. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialogui/plugin.js +1549 -1541
  239. data/vendor/assets/ckeditor/ckeditor/_source/plugins/div/dialogs/div.js +535 -535
  240. data/vendor/assets/ckeditor/ckeditor/_source/plugins/div/plugin.js +121 -121
  241. data/vendor/assets/ckeditor/ckeditor/_source/plugins/docprops/dialogs/docprops.js +674 -686
  242. data/vendor/assets/ckeditor/ckeditor/_source/plugins/docprops/plugin.js +22 -22
  243. data/vendor/assets/ckeditor/ckeditor/_source/plugins/domiterator/plugin.js +366 -361
  244. data/vendor/assets/ckeditor/ckeditor/_source/plugins/editingblock/plugin.js +278 -275
  245. data/vendor/assets/ckeditor/ckeditor/_source/plugins/elementspath/plugin.js +218 -218
  246. data/vendor/assets/ckeditor/ckeditor/_source/plugins/enterkey/plugin.js +433 -413
  247. data/vendor/assets/ckeditor/ckeditor/_source/plugins/entities/plugin.js +254 -250
  248. data/vendor/assets/ckeditor/ckeditor/_source/plugins/fakeobjects/plugin.js +175 -175
  249. data/vendor/assets/ckeditor/ckeditor/_source/plugins/filebrowser/plugin.js +533 -524
  250. data/vendor/assets/ckeditor/ckeditor/_source/plugins/find/dialogs/find.js +915 -903
  251. data/vendor/assets/ckeditor/ckeditor/_source/plugins/find/plugin.js +47 -47
  252. data/vendor/assets/ckeditor/ckeditor/_source/plugins/flash/dialogs/flash.js +674 -673
  253. data/vendor/assets/ckeditor/ckeditor/_source/plugins/flash/plugin.js +154 -154
  254. data/vendor/assets/ckeditor/ckeditor/_source/plugins/floatpanel/plugin.js +476 -428
  255. data/vendor/assets/ckeditor/ckeditor/_source/plugins/font/plugin.js +234 -234
  256. data/vendor/assets/ckeditor/ckeditor/_source/plugins/format/plugin.js +197 -197
  257. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/button.js +118 -118
  258. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/checkbox.js +153 -153
  259. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/form.js +177 -177
  260. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/hiddenfield.js +100 -100
  261. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/radio.js +135 -135
  262. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/select.js +558 -558
  263. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/textarea.js +135 -114
  264. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/textfield.js +199 -199
  265. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/plugin.js +288 -288
  266. data/vendor/assets/ckeditor/ckeditor/_source/plugins/horizontalrule/plugin.js +48 -48
  267. data/vendor/assets/ckeditor/ckeditor/_source/plugins/htmldataprocessor/plugin.js +600 -595
  268. data/vendor/assets/ckeditor/ckeditor/_source/plugins/htmlwriter/plugin.js +319 -319
  269. data/vendor/assets/ckeditor/ckeditor/_source/plugins/iframe/dialogs/iframe.js +229 -229
  270. data/vendor/assets/ckeditor/ckeditor/_source/plugins/iframe/plugin.js +87 -87
  271. data/vendor/assets/ckeditor/ckeditor/_source/plugins/iframedialog/plugin.js +188 -188
  272. data/vendor/assets/ckeditor/ckeditor/_source/plugins/image/dialogs/image.js +1406 -1406
  273. data/vendor/assets/ckeditor/ckeditor/_source/plugins/image/plugin.js +164 -81
  274. data/vendor/assets/ckeditor/ckeditor/_source/plugins/indent/plugin.js +480 -461
  275. data/vendor/assets/ckeditor/ckeditor/_source/plugins/justify/plugin.js +251 -253
  276. data/vendor/assets/ckeditor/ckeditor/_source/plugins/keystrokes/plugin.js +225 -225
  277. data/vendor/assets/ckeditor/ckeditor/_source/plugins/link/dialogs/anchor.js +144 -144
  278. data/vendor/assets/ckeditor/ckeditor/_source/plugins/link/dialogs/link.js +1427 -1424
  279. data/vendor/assets/ckeditor/ckeditor/_source/plugins/link/plugin.js +374 -374
  280. data/vendor/assets/ckeditor/ckeditor/_source/plugins/list/plugin.js +967 -734
  281. data/vendor/assets/ckeditor/ckeditor/_source/plugins/listblock/plugin.js +260 -268
  282. data/vendor/assets/ckeditor/ckeditor/_source/plugins/liststyle/dialogs/liststyle.js +225 -225
  283. data/vendor/assets/ckeditor/ckeditor/_source/plugins/liststyle/plugin.js +66 -66
  284. data/vendor/assets/ckeditor/ckeditor/_source/plugins/maximize/plugin.js +353 -352
  285. data/vendor/assets/ckeditor/ckeditor/_source/plugins/menu/plugin.js +542 -541
  286. data/vendor/assets/ckeditor/ckeditor/_source/plugins/menubutton/plugin.js +98 -98
  287. data/vendor/assets/ckeditor/ckeditor/_source/plugins/newpage/plugin.js +55 -54
  288. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pagebreak/plugin.js +164 -164
  289. data/vendor/assets/ckeditor/ckeditor/_source/plugins/panel/plugin.js +396 -403
  290. data/vendor/assets/ckeditor/ckeditor/_source/plugins/panelbutton/plugin.js +144 -144
  291. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastefromword/filter/default.js +1367 -1367
  292. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastefromword/plugin.js +141 -141
  293. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastetext/dialogs/pastetext.js +67 -67
  294. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastetext/plugin.js +98 -98
  295. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/dialogs/placeholder.js +71 -71
  296. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/_translationstatus.txt +26 -0
  297. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/bg.js +16 -0
  298. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/cs.js +16 -0
  299. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/cy.js +16 -0
  300. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/da.js +16 -0
  301. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/de.js +16 -0
  302. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/el.js +16 -0
  303. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/en.js +16 -16
  304. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/eo.js +16 -0
  305. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/et.js +16 -0
  306. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/fa.js +16 -0
  307. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/fi.js +16 -0
  308. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/fr.js +16 -0
  309. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/he.js +16 -16
  310. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/hr.js +16 -0
  311. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/it.js +16 -0
  312. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/nb.js +16 -0
  313. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/nl.js +16 -0
  314. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/no.js +16 -0
  315. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/pl.js +16 -0
  316. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/tr.js +16 -0
  317. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/ug.js +16 -0
  318. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/uk.js +16 -0
  319. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/vi.js +16 -0
  320. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/zh-cn.js +16 -0
  321. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/plugin.js +171 -171
  322. data/vendor/assets/ckeditor/ckeditor/_source/plugins/popup/plugin.js +69 -64
  323. data/vendor/assets/ckeditor/ckeditor/_source/plugins/preview/plugin.js +113 -109
  324. data/vendor/assets/ckeditor/ckeditor/_source/plugins/print/plugin.js +42 -42
  325. data/vendor/assets/ckeditor/ckeditor/_source/plugins/removeformat/plugin.js +185 -185
  326. data/vendor/assets/ckeditor/ckeditor/_source/plugins/resize/plugin.js +169 -168
  327. data/vendor/assets/ckeditor/ckeditor/_source/plugins/richcombo/plugin.js +381 -381
  328. data/vendor/assets/ckeditor/ckeditor/_source/plugins/save/plugin.js +56 -56
  329. data/vendor/assets/ckeditor/ckeditor/_source/plugins/scayt/dialogs/options.js +537 -537
  330. data/vendor/assets/ckeditor/ckeditor/_source/plugins/scayt/dialogs/toolbar.css +71 -71
  331. data/vendor/assets/ckeditor/ckeditor/_source/plugins/scayt/plugin.js +973 -964
  332. data/vendor/assets/ckeditor/ckeditor/_source/plugins/selection/plugin.js +1855 -1601
  333. data/vendor/assets/ckeditor/ckeditor/_source/plugins/showblocks/plugin.js +160 -160
  334. data/vendor/assets/ckeditor/ckeditor/_source/plugins/showborders/plugin.js +207 -207
  335. data/vendor/assets/ckeditor/ckeditor/_source/plugins/smiley/dialogs/smiley.js +224 -224
  336. data/vendor/assets/ckeditor/ckeditor/_source/plugins/smiley/plugin.js +94 -94
  337. data/vendor/assets/ckeditor/ckeditor/_source/plugins/sourcearea/plugin.js +209 -209
  338. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/dialogs/specialchar.js +350 -350
  339. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/_translationstatus.txt +19 -0
  340. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/cs.js +126 -0
  341. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/cy.js +126 -0
  342. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/de.js +126 -0
  343. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/en.js +126 -89
  344. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/eo.js +126 -0
  345. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/et.js +126 -0
  346. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/fa.js +126 -0
  347. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/fi.js +126 -0
  348. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/fr.js +126 -0
  349. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/hr.js +126 -0
  350. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/it.js +126 -0
  351. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/nb.js +126 -0
  352. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/nl.js +126 -0
  353. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/no.js +126 -0
  354. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/tr.js +126 -0
  355. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/ug.js +126 -0
  356. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/zh-cn.js +126 -0
  357. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/plugin.js +70 -70
  358. data/vendor/assets/ckeditor/ckeditor/_source/plugins/styles/plugin.js +1706 -1696
  359. data/vendor/assets/ckeditor/ckeditor/_source/plugins/styles/styles/default.js +88 -88
  360. data/vendor/assets/ckeditor/ckeditor/_source/plugins/stylescombo/plugin.js +218 -218
  361. data/vendor/assets/ckeditor/ckeditor/_source/plugins/stylesheetparser/plugin.js +148 -148
  362. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tab/plugin.js +367 -367
  363. data/vendor/assets/ckeditor/ckeditor/_source/plugins/table/dialogs/table.js +618 -602
  364. data/vendor/assets/ckeditor/ckeditor/_source/plugins/table/plugin.js +78 -78
  365. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tableresize/plugin.js +443 -443
  366. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tabletools/dialogs/tableCell.js +520 -525
  367. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tabletools/plugin.js +1185 -1194
  368. data/vendor/assets/ckeditor/ckeditor/_source/plugins/templates/dialogs/templates.js +234 -234
  369. data/vendor/assets/ckeditor/ckeditor/_source/plugins/templates/plugin.js +100 -99
  370. data/vendor/assets/ckeditor/ckeditor/_source/plugins/templates/templates/default.js +94 -94
  371. data/vendor/assets/ckeditor/ckeditor/_source/plugins/toolbar/plugin.js +545 -545
  372. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/dialogs/uicolor.js +205 -205
  373. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/_translationstatus.txt +27 -0
  374. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/bg.js +15 -0
  375. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/cs.js +15 -0
  376. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/cy.js +15 -0
  377. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/da.js +15 -0
  378. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/de.js +15 -0
  379. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/el.js +15 -0
  380. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/en.js +15 -15
  381. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/eo.js +15 -0
  382. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/et.js +15 -0
  383. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/fa.js +15 -0
  384. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/fi.js +15 -0
  385. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/fr.js +15 -0
  386. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/he.js +15 -15
  387. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/hr.js +15 -0
  388. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/it.js +15 -0
  389. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/mk.js +15 -0
  390. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/nb.js +15 -0
  391. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/nl.js +15 -0
  392. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/no.js +15 -0
  393. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/pl.js +15 -0
  394. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/tr.js +15 -0
  395. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/ug.js +15 -0
  396. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/uk.js +15 -0
  397. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/vi.js +15 -0
  398. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/zh-cn.js +15 -0
  399. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/plugin.js +37 -37
  400. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/yui/assets/yui.css +15 -15
  401. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/yui/yui.js +71 -71
  402. data/vendor/assets/ckeditor/ckeditor/_source/plugins/undo/plugin.js +593 -580
  403. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/ciframe.html +49 -49
  404. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/tmpFrameset.html +52 -52
  405. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/wsc.css +82 -82
  406. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/wsc.js +192 -192
  407. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/plugin.js +33 -33
  408. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wysiwygarea/plugin.js +1346 -1351
  409. data/vendor/assets/ckeditor/ckeditor/_source/plugins/xml/plugin.js +170 -170
  410. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/dialog.css +989 -943
  411. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/editor.css +25 -25
  412. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/elementspath.css +73 -73
  413. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/icons.css +366 -366
  414. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/mainui.css +206 -203
  415. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/menu.css +232 -232
  416. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/panel.css +217 -217
  417. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/presets.css +49 -49
  418. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/reset.css +85 -84
  419. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/richcombo.css +287 -287
  420. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/skin.js +236 -236
  421. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/templates.css +88 -88
  422. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/toolbar.css +408 -407
  423. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/dialog.css +891 -844
  424. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/editor.css +25 -25
  425. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/elementspath.css +74 -74
  426. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/icons.css +363 -363
  427. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/mainui.css +153 -153
  428. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/menu.css +229 -229
  429. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/panel.css +212 -212
  430. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/presets.css +49 -49
  431. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/reset.css +85 -84
  432. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/richcombo.css +309 -309
  433. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/skin.js +74 -74
  434. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/templates.css +87 -87
  435. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/toolbar.css +522 -522
  436. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/dialog.css +907 -861
  437. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/editor.css +25 -25
  438. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/elementspath.css +74 -74
  439. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/icons.css +363 -363
  440. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/mainui.css +162 -162
  441. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/menu.css +232 -232
  442. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/panel.css +212 -212
  443. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/presets.css +50 -50
  444. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/reset.css +85 -84
  445. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/richcombo.css +302 -302
  446. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/skin.js +70 -70
  447. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/templates.css +87 -87
  448. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/toolbar.css +465 -465
  449. data/vendor/assets/ckeditor/ckeditor/_source/themes/default/theme.js +407 -395
  450. data/vendor/assets/ckeditor/ckeditor/adapters/jquery.js +6 -6
  451. data/vendor/assets/ckeditor/ckeditor/ckeditor.asp +955 -955
  452. data/vendor/assets/ckeditor/ckeditor/ckeditor.js +134 -130
  453. data/vendor/assets/ckeditor/ckeditor/ckeditor.pack +211 -211
  454. data/vendor/assets/ckeditor/ckeditor/ckeditor.php +29 -29
  455. data/vendor/assets/ckeditor/ckeditor/ckeditor_basic.js +8 -8
  456. data/vendor/assets/ckeditor/ckeditor/ckeditor_basic_source.js +20 -20
  457. data/vendor/assets/ckeditor/ckeditor/ckeditor_php4.php +566 -566
  458. data/vendor/assets/ckeditor/ckeditor/ckeditor_php5.php +556 -556
  459. data/vendor/assets/ckeditor/ckeditor/ckeditor_source.js +14 -4
  460. data/vendor/assets/ckeditor/ckeditor/config.js +11 -11
  461. data/vendor/assets/ckeditor/ckeditor/contents.css +25 -25
  462. data/vendor/assets/ckeditor/ckeditor/lang/_languages.js +1 -1
  463. data/vendor/assets/ckeditor/ckeditor/lang/_translationstatus.txt +61 -59
  464. data/vendor/assets/ckeditor/ckeditor/lang/af.js +2 -2
  465. data/vendor/assets/ckeditor/ckeditor/lang/ar.js +2 -2
  466. data/vendor/assets/ckeditor/ckeditor/lang/bg.js +2 -2
  467. data/vendor/assets/ckeditor/ckeditor/lang/bn.js +2 -2
  468. data/vendor/assets/ckeditor/ckeditor/lang/bs.js +2 -2
  469. data/vendor/assets/ckeditor/ckeditor/lang/ca.js +2 -2
  470. data/vendor/assets/ckeditor/ckeditor/lang/cs.js +2 -2
  471. data/vendor/assets/ckeditor/ckeditor/lang/cy.js +2 -2
  472. data/vendor/assets/ckeditor/ckeditor/lang/da.js +2 -2
  473. data/vendor/assets/ckeditor/ckeditor/lang/de.js +2 -2
  474. data/vendor/assets/ckeditor/ckeditor/lang/el.js +2 -2
  475. data/vendor/assets/ckeditor/ckeditor/lang/en-au.js +2 -2
  476. data/vendor/assets/ckeditor/ckeditor/lang/en-ca.js +2 -2
  477. data/vendor/assets/ckeditor/ckeditor/lang/en-gb.js +2 -2
  478. data/vendor/assets/ckeditor/ckeditor/lang/en.js +2 -2
  479. data/vendor/assets/ckeditor/ckeditor/lang/eo.js +2 -2
  480. data/vendor/assets/ckeditor/ckeditor/lang/es.js +2 -2
  481. data/vendor/assets/ckeditor/ckeditor/lang/et.js +2 -2
  482. data/vendor/assets/ckeditor/ckeditor/lang/eu.js +2 -2
  483. data/vendor/assets/ckeditor/ckeditor/lang/fa.js +2 -2
  484. data/vendor/assets/ckeditor/ckeditor/lang/fi.js +2 -2
  485. data/vendor/assets/ckeditor/ckeditor/lang/fo.js +2 -2
  486. data/vendor/assets/ckeditor/ckeditor/lang/fr-ca.js +2 -2
  487. data/vendor/assets/ckeditor/ckeditor/lang/fr.js +2 -2
  488. data/vendor/assets/ckeditor/ckeditor/lang/gl.js +2 -2
  489. data/vendor/assets/ckeditor/ckeditor/lang/gu.js +2 -2
  490. data/vendor/assets/ckeditor/ckeditor/lang/he.js +2 -2
  491. data/vendor/assets/ckeditor/ckeditor/lang/hi.js +2 -2
  492. data/vendor/assets/ckeditor/ckeditor/lang/hr.js +2 -2
  493. data/vendor/assets/ckeditor/ckeditor/lang/hu.js +2 -2
  494. data/vendor/assets/ckeditor/ckeditor/lang/is.js +2 -2
  495. data/vendor/assets/ckeditor/ckeditor/lang/it.js +2 -2
  496. data/vendor/assets/ckeditor/ckeditor/lang/ja.js +2 -2
  497. data/vendor/assets/ckeditor/ckeditor/lang/ka.js +2 -2
  498. data/vendor/assets/ckeditor/ckeditor/lang/km.js +2 -2
  499. data/vendor/assets/ckeditor/ckeditor/lang/ko.js +2 -2
  500. data/vendor/assets/ckeditor/ckeditor/lang/lt.js +2 -2
  501. data/vendor/assets/ckeditor/ckeditor/lang/lv.js +2 -2
  502. data/vendor/assets/ckeditor/ckeditor/lang/mk.js +6 -0
  503. data/vendor/assets/ckeditor/ckeditor/lang/mn.js +2 -2
  504. data/vendor/assets/ckeditor/ckeditor/lang/ms.js +2 -2
  505. data/vendor/assets/ckeditor/ckeditor/lang/nb.js +2 -2
  506. data/vendor/assets/ckeditor/ckeditor/lang/nl.js +2 -2
  507. data/vendor/assets/ckeditor/ckeditor/lang/no.js +2 -2
  508. data/vendor/assets/ckeditor/ckeditor/lang/pl.js +2 -2
  509. data/vendor/assets/ckeditor/ckeditor/lang/pt-br.js +2 -2
  510. data/vendor/assets/ckeditor/ckeditor/lang/pt.js +2 -2
  511. data/vendor/assets/ckeditor/ckeditor/lang/ro.js +2 -2
  512. data/vendor/assets/ckeditor/ckeditor/lang/ru.js +2 -2
  513. data/vendor/assets/ckeditor/ckeditor/lang/sk.js +2 -2
  514. data/vendor/assets/ckeditor/ckeditor/lang/sl.js +2 -2
  515. data/vendor/assets/ckeditor/ckeditor/lang/sr-latn.js +2 -2
  516. data/vendor/assets/ckeditor/ckeditor/lang/sr.js +2 -2
  517. data/vendor/assets/ckeditor/ckeditor/lang/sv.js +2 -2
  518. data/vendor/assets/ckeditor/ckeditor/lang/th.js +2 -2
  519. data/vendor/assets/ckeditor/ckeditor/lang/tr.js +2 -2
  520. data/vendor/assets/ckeditor/ckeditor/lang/ug.js +6 -0
  521. data/vendor/assets/ckeditor/ckeditor/lang/uk.js +2 -2
  522. data/vendor/assets/ckeditor/ckeditor/lang/vi.js +2 -2
  523. data/vendor/assets/ckeditor/ckeditor/lang/zh-cn.js +2 -2
  524. data/vendor/assets/ckeditor/ckeditor/lang/zh.js +2 -2
  525. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +1 -1
  526. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/_translationstatus.txt +23 -0
  527. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/cs.js +6 -0
  528. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/cy.js +6 -0
  529. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/da.js +6 -0
  530. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/de.js +6 -0
  531. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/el.js +6 -0
  532. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/en.js +2 -2
  533. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/eo.js +6 -0
  534. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/fa.js +6 -0
  535. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/fi.js +6 -0
  536. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/fr.js +6 -0
  537. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/gu.js +6 -0
  538. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/he.js +2 -2
  539. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/it.js +6 -0
  540. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/mk.js +6 -0
  541. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/nb.js +6 -0
  542. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/nl.js +6 -0
  543. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/no.js +6 -0
  544. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/tr.js +6 -0
  545. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/ug.js +6 -0
  546. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/vi.js +6 -0
  547. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/zh-cn.js +6 -0
  548. data/vendor/assets/ckeditor/ckeditor/plugins/about/dialogs/about.js +1 -1
  549. data/vendor/assets/ckeditor/ckeditor/plugins/adobeair/plugin.js +1 -1
  550. data/vendor/assets/ckeditor/ckeditor/plugins/ajax/plugin.js +1 -1
  551. data/vendor/assets/ckeditor/ckeditor/plugins/autogrow/plugin.js +2 -2
  552. data/vendor/assets/ckeditor/ckeditor/plugins/bbcode/plugin.js +1 -1
  553. data/vendor/assets/ckeditor/ckeditor/plugins/clipboard/dialogs/paste.js +2 -2
  554. data/vendor/assets/ckeditor/ckeditor/plugins/colordialog/dialogs/colordialog.js +3 -3
  555. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/_translationstatus.txt +27 -0
  556. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/bg.js +6 -0
  557. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/cs.js +6 -0
  558. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/cy.js +6 -0
  559. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/da.js +6 -0
  560. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/de.js +6 -0
  561. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/el.js +6 -0
  562. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/en.js +1 -1
  563. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/eo.js +6 -0
  564. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/et.js +6 -0
  565. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/fa.js +6 -0
  566. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/fi.js +6 -0
  567. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/fr.js +6 -0
  568. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/gu.js +6 -0
  569. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/he.js +6 -0
  570. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/hr.js +6 -0
  571. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/it.js +6 -0
  572. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/nb.js +6 -0
  573. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/nl.js +6 -0
  574. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/no.js +6 -0
  575. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/pl.js +6 -0
  576. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/tr.js +6 -0
  577. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/ug.js +6 -0
  578. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/uk.js +6 -0
  579. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/vi.js +6 -0
  580. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/zh-cn.js +6 -0
  581. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/plugin.js +2 -2
  582. data/vendor/assets/ckeditor/ckeditor/plugins/dialog/dialogDefinition.js +1 -1
  583. data/vendor/assets/ckeditor/ckeditor/plugins/div/dialogs/div.js +1 -1
  584. data/vendor/assets/ckeditor/ckeditor/plugins/docprops/dialogs/docprops.js +3 -3
  585. data/vendor/assets/ckeditor/ckeditor/plugins/docprops/plugin.js +1 -1
  586. data/vendor/assets/ckeditor/ckeditor/plugins/find/dialogs/find.js +6 -6
  587. data/vendor/assets/ckeditor/ckeditor/plugins/flash/dialogs/flash.js +2 -2
  588. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/button.js +1 -1
  589. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/checkbox.js +1 -1
  590. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/form.js +1 -1
  591. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/hiddenfield.js +1 -1
  592. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/radio.js +1 -1
  593. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/select.js +1 -1
  594. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/textarea.js +2 -2
  595. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/textfield.js +1 -1
  596. data/vendor/assets/ckeditor/ckeditor/plugins/iframe/dialogs/iframe.js +1 -1
  597. data/vendor/assets/ckeditor/ckeditor/plugins/iframedialog/plugin.js +1 -1
  598. data/vendor/assets/ckeditor/ckeditor/plugins/image/dialogs/image.js +9 -9
  599. data/vendor/assets/ckeditor/ckeditor/plugins/link/dialogs/anchor.js +1 -1
  600. data/vendor/assets/ckeditor/ckeditor/plugins/link/dialogs/link.js +6 -6
  601. data/vendor/assets/ckeditor/ckeditor/plugins/liststyle/dialogs/liststyle.js +1 -1
  602. data/vendor/assets/ckeditor/ckeditor/plugins/pastefromword/filter/default.js +1 -1
  603. data/vendor/assets/ckeditor/ckeditor/plugins/pastetext/dialogs/pastetext.js +1 -1
  604. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/dialogs/placeholder.js +1 -1
  605. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/_translationstatus.txt +26 -0
  606. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/bg.js +6 -0
  607. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/cs.js +6 -0
  608. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/cy.js +6 -0
  609. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/da.js +6 -0
  610. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/de.js +6 -0
  611. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/el.js +6 -0
  612. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/en.js +1 -1
  613. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/eo.js +6 -0
  614. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/et.js +6 -0
  615. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/fa.js +6 -0
  616. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/fi.js +6 -0
  617. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/fr.js +6 -0
  618. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/he.js +1 -1
  619. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/hr.js +6 -0
  620. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/it.js +6 -0
  621. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/nb.js +6 -0
  622. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/nl.js +6 -0
  623. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/no.js +6 -0
  624. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/pl.js +6 -0
  625. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/tr.js +6 -0
  626. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/ug.js +6 -0
  627. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/uk.js +6 -0
  628. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/vi.js +6 -0
  629. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/zh-cn.js +6 -0
  630. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/plugin.js +2 -2
  631. data/vendor/assets/ckeditor/ckeditor/plugins/scayt/dialogs/options.js +1 -1
  632. data/vendor/assets/ckeditor/ckeditor/plugins/scayt/dialogs/toolbar.css +1 -1
  633. data/vendor/assets/ckeditor/ckeditor/plugins/smiley/dialogs/smiley.js +1 -1
  634. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/dialogs/specialchar.js +2 -2
  635. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/_translationstatus.txt +19 -0
  636. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/cs.js +6 -0
  637. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/cy.js +6 -0
  638. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/de.js +6 -0
  639. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/en.js +2 -2
  640. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/eo.js +6 -0
  641. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/et.js +6 -0
  642. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/fa.js +6 -0
  643. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/fi.js +6 -0
  644. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/fr.js +6 -0
  645. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/hr.js +6 -0
  646. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/it.js +6 -0
  647. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/nb.js +6 -0
  648. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/nl.js +6 -0
  649. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/no.js +6 -0
  650. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/tr.js +6 -0
  651. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/ug.js +6 -0
  652. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/zh-cn.js +6 -0
  653. data/vendor/assets/ckeditor/ckeditor/plugins/styles/styles/default.js +1 -1
  654. data/vendor/assets/ckeditor/ckeditor/plugins/stylesheetparser/plugin.js +1 -1
  655. data/vendor/assets/ckeditor/ckeditor/plugins/table/dialogs/table.js +5 -5
  656. data/vendor/assets/ckeditor/ckeditor/plugins/tableresize/plugin.js +1 -1
  657. data/vendor/assets/ckeditor/ckeditor/plugins/tabletools/dialogs/tableCell.js +3 -3
  658. data/vendor/assets/ckeditor/ckeditor/plugins/templates/dialogs/templates.js +1 -1
  659. data/vendor/assets/ckeditor/ckeditor/plugins/templates/templates/default.js +1 -1
  660. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/dialogs/uicolor.js +1 -1
  661. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/_translationstatus.txt +27 -0
  662. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/bg.js +6 -0
  663. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/cs.js +6 -0
  664. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/cy.js +6 -0
  665. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/da.js +6 -0
  666. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/de.js +6 -0
  667. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/el.js +6 -0
  668. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/en.js +1 -1
  669. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/eo.js +6 -0
  670. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/et.js +6 -0
  671. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/fa.js +6 -0
  672. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/fi.js +6 -0
  673. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/fr.js +6 -0
  674. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/he.js +1 -1
  675. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/hr.js +6 -0
  676. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/it.js +6 -0
  677. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/mk.js +6 -0
  678. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/nb.js +6 -0
  679. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/nl.js +6 -0
  680. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/no.js +6 -0
  681. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/pl.js +6 -0
  682. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/tr.js +6 -0
  683. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/ug.js +6 -0
  684. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/uk.js +6 -0
  685. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/vi.js +6 -0
  686. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/zh-cn.js +6 -0
  687. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/plugin.js +2 -2
  688. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/yui/assets/yui.css +1 -1
  689. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/yui/yui.js +1 -1
  690. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/ciframe.html +1 -1
  691. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +1 -1
  692. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/wsc.css +1 -1
  693. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/wsc.js +2 -2
  694. data/vendor/assets/ckeditor/ckeditor/plugins/xml/plugin.js +1 -1
  695. data/vendor/assets/ckeditor/ckeditor/skins/kama/dialog.css +2 -2
  696. data/vendor/assets/ckeditor/ckeditor/skins/kama/editor.css +4 -4
  697. data/vendor/assets/ckeditor/ckeditor/skins/kama/skin.js +1 -1
  698. data/vendor/assets/ckeditor/ckeditor/skins/kama/templates.css +1 -1
  699. data/vendor/assets/ckeditor/ckeditor/skins/office2003/dialog.css +2 -2
  700. data/vendor/assets/ckeditor/ckeditor/skins/office2003/editor.css +2 -2
  701. data/vendor/assets/ckeditor/ckeditor/skins/office2003/skin.js +1 -1
  702. data/vendor/assets/ckeditor/ckeditor/skins/office2003/templates.css +1 -1
  703. data/vendor/assets/ckeditor/ckeditor/skins/v2/dialog.css +2 -2
  704. data/vendor/assets/ckeditor/ckeditor/skins/v2/editor.css +2 -2
  705. data/vendor/assets/ckeditor/ckeditor/skins/v2/skin.js +1 -1
  706. data/vendor/assets/ckeditor/ckeditor/skins/v2/templates.css +1 -1
  707. data/vendor/assets/ckeditor/ckeditor/themes/default/theme.js +8 -8
  708. metadata +225 -3
@@ -1,1601 +1,1855 @@
1
- /*
2
- Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
3
- For licensing, see LICENSE.html or http://ckeditor.com/license
4
- */
5
-
6
- (function()
7
- {
8
- // #### checkSelectionChange : START
9
-
10
- // The selection change check basically saves the element parent tree of
11
- // the current node and check it on successive requests. If there is any
12
- // change on the tree, then the selectionChange event gets fired.
13
- function checkSelectionChange()
14
- {
15
- try
16
- {
17
- // In IE, the "selectionchange" event may still get thrown when
18
- // releasing the WYSIWYG mode, so we need to check it first.
19
- var sel = this.getSelection();
20
- if ( !sel || !sel.document.getWindow().$ )
21
- return;
22
-
23
- var firstElement = sel.getStartElement();
24
- var currentPath = new CKEDITOR.dom.elementPath( firstElement );
25
-
26
- if ( !currentPath.compare( this._.selectionPreviousPath ) )
27
- {
28
- this._.selectionPreviousPath = currentPath;
29
- this.fire( 'selectionChange', { selection : sel, path : currentPath, element : firstElement } );
30
- }
31
- }
32
- catch (e)
33
- {}
34
- }
35
-
36
- var checkSelectionChangeTimer,
37
- checkSelectionChangeTimeoutPending;
38
-
39
- function checkSelectionChangeTimeout()
40
- {
41
- // Firing the "OnSelectionChange" event on every key press started to
42
- // be too slow. This function guarantees that there will be at least
43
- // 200ms delay between selection checks.
44
-
45
- checkSelectionChangeTimeoutPending = true;
46
-
47
- if ( checkSelectionChangeTimer )
48
- return;
49
-
50
- checkSelectionChangeTimeoutExec.call( this );
51
-
52
- checkSelectionChangeTimer = CKEDITOR.tools.setTimeout( checkSelectionChangeTimeoutExec, 200, this );
53
- }
54
-
55
- function checkSelectionChangeTimeoutExec()
56
- {
57
- checkSelectionChangeTimer = null;
58
-
59
- if ( checkSelectionChangeTimeoutPending )
60
- {
61
- // Call this with a timeout so the browser properly moves the
62
- // selection after the mouseup. It happened that the selection was
63
- // being moved after the mouseup when clicking inside selected text
64
- // with Firefox.
65
- CKEDITOR.tools.setTimeout( checkSelectionChange, 0, this );
66
-
67
- checkSelectionChangeTimeoutPending = false;
68
- }
69
- }
70
-
71
- // #### checkSelectionChange : END
72
-
73
- function rangeRequiresFix( range )
74
- {
75
- function isInlineCt( node )
76
- {
77
- return node && node.type == CKEDITOR.NODE_ELEMENT
78
- && node.getName() in CKEDITOR.dtd.$removeEmpty;
79
- }
80
-
81
- function singletonBlock( node )
82
- {
83
- var body = range.document.getBody();
84
- return !node.is( 'body' ) && body.getChildCount() == 1;
85
- }
86
-
87
- var start = range.startContainer,
88
- offset = range.startOffset;
89
-
90
- if ( start.type == CKEDITOR.NODE_TEXT )
91
- return false;
92
-
93
- // 1. Empty inline element. <span>^</span>
94
- // 2. Adjoin to inline element. <p><strong>text</strong>^</p>
95
- // 3. The only empty block in document. <body><p>^</p></body> (#7222)
96
- return !CKEDITOR.tools.trim( start.getHtml() ) ? isInlineCt( start ) || singletonBlock( start )
97
- : isInlineCt( start.getChild( offset - 1 ) ) || isInlineCt( start.getChild( offset ) );
98
- }
99
-
100
- var selectAllCmd =
101
- {
102
- modes : { wysiwyg : 1, source : 1 },
103
- readOnly : CKEDITOR.env.ie || CKEDITOR.env.webkit,
104
- exec : function( editor )
105
- {
106
- switch ( editor.mode )
107
- {
108
- case 'wysiwyg' :
109
- editor.document.$.execCommand( 'SelectAll', false, null );
110
- // Force triggering selectionChange (#7008)
111
- editor.forceNextSelectionCheck();
112
- editor.selectionChange();
113
- break;
114
- case 'source' :
115
- // Select the contents of the textarea
116
- var textarea = editor.textarea.$;
117
- if ( CKEDITOR.env.ie )
118
- textarea.createTextRange().execCommand( 'SelectAll' );
119
- else
120
- {
121
- textarea.selectionStart = 0;
122
- textarea.selectionEnd = textarea.value.length;
123
- }
124
- textarea.focus();
125
- }
126
- },
127
- canUndo : false
128
- };
129
-
130
- function createFillingChar( doc )
131
- {
132
- removeFillingChar( doc );
133
-
134
- var fillingChar = doc.createText( '\u200B' );
135
- doc.setCustomData( 'cke-fillingChar', fillingChar );
136
-
137
- return fillingChar;
138
- }
139
-
140
- function getFillingChar( doc )
141
- {
142
- return doc && doc.getCustomData( 'cke-fillingChar' );
143
- }
144
-
145
- // Checks if a filling char has been used, eventualy removing it (#1272).
146
- function checkFillingChar( doc )
147
- {
148
- var fillingChar = doc && getFillingChar( doc );
149
- if ( fillingChar )
150
- {
151
- // Use this flag to avoid removing the filling char right after
152
- // creating it.
153
- if ( fillingChar.getCustomData( 'ready' ) )
154
- removeFillingChar( doc );
155
- else
156
- fillingChar.setCustomData( 'ready', 1 );
157
- }
158
- }
159
-
160
- function removeFillingChar( doc )
161
- {
162
- var fillingChar = doc && doc.removeCustomData( 'cke-fillingChar' );
163
- if ( fillingChar )
164
- {
165
- // We can't simply remove the filling node because the user
166
- // will actually enlarge it when typing, so we just remove the
167
- // invisible char from it.
168
- fillingChar.setText( fillingChar.getText().replace( /\u200B/g, '' ) );
169
- fillingChar = 0;
170
- }
171
- }
172
-
173
- CKEDITOR.plugins.add( 'selection',
174
- {
175
- init : function( editor )
176
- {
177
- // On WebKit only, we need a special "filling" char on some situations
178
- // (#1272). Here we set the events that should invalidate that char.
179
- if ( CKEDITOR.env.webkit )
180
- {
181
- editor.on( 'selectionChange', function() { checkFillingChar( editor.document ); } );
182
- editor.on( 'beforeSetMode', function() { removeFillingChar( editor.document ); } );
183
- editor.on( 'key', function( e )
184
- {
185
- // Remove the filling char before some keys get
186
- // executed, so they'll not get blocked by it.
187
- switch ( e.data.keyCode )
188
- {
189
- case 13 : // ENTER
190
- case CKEDITOR.SHIFT + 13 : // SHIFT-ENTER
191
- case 37 : // LEFT-ARROW
192
- case 39 : // RIGHT-ARROW
193
- case 8 : // BACKSPACE
194
- removeFillingChar( editor.document );
195
- }
196
- }, null, null, 10 );
197
-
198
- var fillingCharBefore,
199
- resetSelection;
200
-
201
- function beforeData()
202
- {
203
- var doc = editor.document,
204
- fillingChar = getFillingChar( doc );
205
-
206
- if ( fillingChar )
207
- {
208
- // If cursor is right blinking by side of the filler node, save it for restoring,
209
- // as the following text substitution will blind it. (#7437)
210
- var sel = doc.$.defaultView.getSelection();
211
- if ( sel.type == 'Caret' && sel.anchorNode == fillingChar.$ )
212
- resetSelection = 1;
213
-
214
- fillingCharBefore = fillingChar.getText();
215
- fillingChar.setText( fillingCharBefore.replace( /\u200B/g, '' ) );
216
- }
217
- }
218
- function afterData()
219
- {
220
- var doc = editor.document,
221
- fillingChar = getFillingChar( doc );
222
-
223
- if ( fillingChar )
224
- {
225
- fillingChar.setText( fillingCharBefore );
226
-
227
- if ( resetSelection )
228
- {
229
- doc.$.defaultView.getSelection().setPosition( fillingChar.$,fillingChar.getLength() );
230
- resetSelection = 0;
231
- }
232
- }
233
- }
234
- editor.on( 'beforeUndoImage', beforeData );
235
- editor.on( 'afterUndoImage', afterData );
236
- editor.on( 'beforeGetData', beforeData, null, null, 0 );
237
- editor.on( 'getData', afterData );
238
- }
239
-
240
- editor.on( 'contentDom', function()
241
- {
242
- var doc = editor.document,
243
- body = doc.getBody(),
244
- html = doc.getDocumentElement();
245
-
246
- if ( CKEDITOR.env.ie )
247
- {
248
- // Other browsers don't loose the selection if the
249
- // editor document loose the focus. In IE, we don't
250
- // have support for it, so we reproduce it here, other
251
- // than firing the selection change event.
252
-
253
- var savedRange,
254
- saveEnabled,
255
- restoreEnabled = 1;
256
-
257
- // "onfocusin" is fired before "onfocus". It makes it
258
- // possible to restore the selection before click
259
- // events get executed.
260
- body.on( 'focusin', function( evt )
261
- {
262
- // If there are elements with layout they fire this event but
263
- // it must be ignored to allow edit its contents #4682
264
- if ( evt.data.$.srcElement.nodeName != 'BODY' )
265
- return;
266
-
267
- // If we have saved a range, restore it at this
268
- // point.
269
- if ( savedRange )
270
- {
271
- if ( restoreEnabled )
272
- {
273
- // Well not break because of this.
274
- try
275
- {
276
- savedRange.select();
277
- }
278
- catch (e)
279
- {}
280
-
281
- // Update locked selection because of the normalized text nodes. (#6083, #6987)
282
- var lockedSelection = doc.getCustomData( 'cke_locked_selection' );
283
- if ( lockedSelection )
284
- {
285
- lockedSelection.unlock();
286
- lockedSelection.lock();
287
- }
288
- }
289
-
290
- savedRange = null;
291
- }
292
- });
293
-
294
- body.on( 'focus', function()
295
- {
296
- // Enable selections to be saved.
297
- saveEnabled = 1;
298
-
299
- saveSelection();
300
- });
301
-
302
- body.on( 'beforedeactivate', function( evt )
303
- {
304
- // Ignore this event if it's caused by focus switch between
305
- // internal editable control type elements, e.g. layouted paragraph. (#4682)
306
- if ( evt.data.$.toElement )
307
- return;
308
-
309
- // Disable selections from being saved.
310
- saveEnabled = 0;
311
- restoreEnabled = 1;
312
- });
313
-
314
- // IE before version 8 will leave cursor blinking inside the document after
315
- // editor blurred unless we clean up the selection. (#4716)
316
- if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 )
317
- {
318
- editor.on( 'blur', function( evt )
319
- {
320
- // Try/Catch to avoid errors if the editor is hidden. (#6375)
321
- try
322
- {
323
- editor.document && editor.document.$.selection.empty();
324
- }
325
- catch (e) {}
326
- });
327
- }
328
-
329
- // Listening on document element ensures that
330
- // scrollbar is included. (#5280)
331
- html.on( 'mousedown', function()
332
- {
333
- // Lock restore selection now, as we have
334
- // a followed 'click' event which introduce
335
- // new selection. (#5735)
336
- restoreEnabled = 0;
337
- });
338
-
339
- html.on( 'mouseup', function()
340
- {
341
- restoreEnabled = 1;
342
- });
343
-
344
- // In IE6/7 the blinking cursor appears, but contents are
345
- // not editable. (#5634)
346
- if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.version < 8 || CKEDITOR.env.quirks ) )
347
- {
348
- // The 'click' event is not fired when clicking the
349
- // scrollbars, so we can use it to check whether
350
- // the empty space following <body> has been clicked.
351
- html.on( 'click', function( evt )
352
- {
353
- if ( evt.data.getTarget().getName() == 'html' )
354
- editor.getSelection().getRanges()[ 0 ].select();
355
- });
356
- }
357
-
358
- var scroll;
359
- // IE fires the "selectionchange" event when clicking
360
- // inside a selection. We don't want to capture that.
361
- body.on( 'mousedown', function( evt )
362
- {
363
- // IE scrolls document to top on right mousedown
364
- // when editor has no focus, remember this scroll
365
- // position and revert it before context menu opens. (#5778)
366
- if ( evt.data.$.button == 2 )
367
- {
368
- var sel = editor.document.$.selection;
369
- if ( sel.type == 'None' )
370
- scroll = editor.window.getScrollPosition();
371
- }
372
- disableSave();
373
- });
374
-
375
- body.on( 'mouseup',
376
- function( evt )
377
- {
378
- // Restore recorded scroll position when needed on right mouseup.
379
- if ( evt.data.$.button == 2 && scroll )
380
- {
381
- editor.document.$.documentElement.scrollLeft = scroll.x;
382
- editor.document.$.documentElement.scrollTop = scroll.y;
383
- }
384
- scroll = null;
385
-
386
- saveEnabled = 1;
387
- setTimeout( function()
388
- {
389
- saveSelection( true );
390
- },
391
- 0 );
392
- });
393
-
394
- body.on( 'keydown', disableSave );
395
- body.on( 'keyup',
396
- function()
397
- {
398
- saveEnabled = 1;
399
- saveSelection();
400
- });
401
-
402
-
403
- // IE is the only to provide the "selectionchange"
404
- // event.
405
- doc.on( 'selectionchange', saveSelection );
406
-
407
- function disableSave()
408
- {
409
- saveEnabled = 0;
410
- }
411
-
412
- function saveSelection( testIt )
413
- {
414
- if ( saveEnabled )
415
- {
416
- var doc = editor.document,
417
- sel = editor.getSelection(),
418
- nativeSel = sel && sel.getNative();
419
-
420
- // There is a very specific case, when clicking
421
- // inside a text selection. In that case, the
422
- // selection collapses at the clicking point,
423
- // but the selection object remains in an
424
- // unknown state, making createRange return a
425
- // range at the very start of the document. In
426
- // such situation we have to test the range, to
427
- // be sure it's valid.
428
- if ( testIt && nativeSel && nativeSel.type == 'None' )
429
- {
430
- // The "InsertImage" command can be used to
431
- // test whether the selection is good or not.
432
- // If not, it's enough to give some time to
433
- // IE to put things in order for us.
434
- if ( !doc.$.queryCommandEnabled( 'InsertImage' ) )
435
- {
436
- CKEDITOR.tools.setTimeout( saveSelection, 50, this, true );
437
- return;
438
- }
439
- }
440
-
441
- // Avoid saving selection from within text input. (#5747)
442
- var parentTag;
443
- if ( nativeSel && nativeSel.type && nativeSel.type != 'Control'
444
- && ( parentTag = nativeSel.createRange() )
445
- && ( parentTag = parentTag.parentElement() )
446
- && ( parentTag = parentTag.nodeName )
447
- && parentTag.toLowerCase() in { input: 1, textarea : 1 } )
448
- {
449
- return;
450
- }
451
-
452
- savedRange = nativeSel && sel.getRanges()[ 0 ];
453
-
454
- checkSelectionChangeTimeout.call( editor );
455
- }
456
- }
457
- }
458
- else
459
- {
460
- // In other browsers, we make the selection change
461
- // check based on other events, like clicks or keys
462
- // press.
463
-
464
- doc.on( 'mouseup', checkSelectionChangeTimeout, editor );
465
- doc.on( 'keyup', checkSelectionChangeTimeout, editor );
466
- }
467
- });
468
-
469
- // Clear the cached range path before unload. (#7174)
470
- editor.on( 'contentDomUnload', editor.forceNextSelectionCheck, editor );
471
-
472
- editor.addCommand( 'selectAll', selectAllCmd );
473
- editor.ui.addButton( 'SelectAll',
474
- {
475
- label : editor.lang.selectAll,
476
- command : 'selectAll'
477
- });
478
-
479
- editor.selectionChange = checkSelectionChangeTimeout;
480
-
481
- // IE9 might cease to work if there's an object selection inside the iframe (#7639).
482
- CKEDITOR.env.ie9Compat && editor.on( 'destroy', function()
483
- {
484
- var sel = editor.getSelection();
485
- sel && sel.getNative().clear();
486
- }, null, null, 9 );
487
- }
488
- });
489
-
490
- /**
491
- * Gets the current selection from the editing area when in WYSIWYG mode.
492
- * @returns {CKEDITOR.dom.selection} A selection object or null if not on
493
- * WYSIWYG mode or no selection is available.
494
- * @example
495
- * var selection = CKEDITOR.instances.editor1.<b>getSelection()</b>;
496
- * alert( selection.getType() );
497
- */
498
- CKEDITOR.editor.prototype.getSelection = function()
499
- {
500
- return this.document && this.document.getSelection();
501
- };
502
-
503
- CKEDITOR.editor.prototype.forceNextSelectionCheck = function()
504
- {
505
- delete this._.selectionPreviousPath;
506
- };
507
-
508
- /**
509
- * Gets the current selection from the document.
510
- * @returns {CKEDITOR.dom.selection} A selection object.
511
- * @example
512
- * var selection = CKEDITOR.instances.editor1.document.<b>getSelection()</b>;
513
- * alert( selection.getType() );
514
- */
515
- CKEDITOR.dom.document.prototype.getSelection = function()
516
- {
517
- var sel = new CKEDITOR.dom.selection( this );
518
- return ( !sel || sel.isInvalid ) ? null : sel;
519
- };
520
-
521
- /**
522
- * No selection.
523
- * @constant
524
- * @example
525
- * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_NONE )
526
- * alert( 'Nothing is selected' );
527
- */
528
- CKEDITOR.SELECTION_NONE = 1;
529
-
530
- /**
531
- * Text or collapsed selection.
532
- * @constant
533
- * @example
534
- * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_TEXT )
535
- * alert( 'Text is selected' );
536
- */
537
- CKEDITOR.SELECTION_TEXT = 2;
538
-
539
- /**
540
- * Element selection.
541
- * @constant
542
- * @example
543
- * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_ELEMENT )
544
- * alert( 'An element is selected' );
545
- */
546
- CKEDITOR.SELECTION_ELEMENT = 3;
547
-
548
- /**
549
- * Manipulates the selection in a DOM document.
550
- * @constructor
551
- * @example
552
- */
553
- CKEDITOR.dom.selection = function( document )
554
- {
555
- var lockedSelection = document.getCustomData( 'cke_locked_selection' );
556
-
557
- if ( lockedSelection )
558
- return lockedSelection;
559
-
560
- this.document = document;
561
- this.isLocked = 0;
562
- this._ =
563
- {
564
- cache : {}
565
- };
566
-
567
- /**
568
- * IE BUG: The selection's document may be a different document than the
569
- * editor document. Return null if that's the case.
570
- */
571
- if ( CKEDITOR.env.ie )
572
- {
573
- var range = this.getNative().createRange();
574
- if ( !range
575
- || ( range.item && range.item(0).ownerDocument != this.document.$ )
576
- || ( range.parentElement && range.parentElement().ownerDocument != this.document.$ ) )
577
- {
578
- this.isInvalid = true;
579
- }
580
- }
581
-
582
- return this;
583
- };
584
-
585
- var styleObjectElements =
586
- {
587
- img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,
588
- a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1
589
- };
590
-
591
- CKEDITOR.dom.selection.prototype =
592
- {
593
- /**
594
- * Gets the native selection object from the browser.
595
- * @function
596
- * @returns {Object} The native selection object.
597
- * @example
598
- * var selection = editor.getSelection().<b>getNative()</b>;
599
- */
600
- getNative :
601
- CKEDITOR.env.ie ?
602
- function()
603
- {
604
- return this._.cache.nativeSel || ( this._.cache.nativeSel = this.document.$.selection );
605
- }
606
- :
607
- function()
608
- {
609
- return this._.cache.nativeSel || ( this._.cache.nativeSel = this.document.getWindow().$.getSelection() );
610
- },
611
-
612
- /**
613
- * Gets the type of the current selection. The following values are
614
- * available:
615
- * <ul>
616
- * <li>{@link CKEDITOR.SELECTION_NONE} (1): No selection.</li>
617
- * <li>{@link CKEDITOR.SELECTION_TEXT} (2): Text is selected or
618
- * collapsed selection.</li>
619
- * <li>{@link CKEDITOR.SELECTION_ELEMENT} (3): A element
620
- * selection.</li>
621
- * </ul>
622
- * @function
623
- * @returns {Number} One of the following constant values:
624
- * {@link CKEDITOR.SELECTION_NONE}, {@link CKEDITOR.SELECTION_TEXT} or
625
- * {@link CKEDITOR.SELECTION_ELEMENT}.
626
- * @example
627
- * if ( editor.getSelection().<b>getType()</b> == CKEDITOR.SELECTION_TEXT )
628
- * alert( 'Text is selected' );
629
- */
630
- getType :
631
- CKEDITOR.env.ie ?
632
- function()
633
- {
634
- var cache = this._.cache;
635
- if ( cache.type )
636
- return cache.type;
637
-
638
- var type = CKEDITOR.SELECTION_NONE;
639
-
640
- try
641
- {
642
- var sel = this.getNative(),
643
- ieType = sel.type;
644
-
645
- if ( ieType == 'Text' )
646
- type = CKEDITOR.SELECTION_TEXT;
647
-
648
- if ( ieType == 'Control' )
649
- type = CKEDITOR.SELECTION_ELEMENT;
650
-
651
- // It is possible that we can still get a text range
652
- // object even when type == 'None' is returned by IE.
653
- // So we'd better check the object returned by
654
- // createRange() rather than by looking at the type.
655
- if ( sel.createRange().parentElement )
656
- type = CKEDITOR.SELECTION_TEXT;
657
- }
658
- catch(e) {}
659
-
660
- return ( cache.type = type );
661
- }
662
- :
663
- function()
664
- {
665
- var cache = this._.cache;
666
- if ( cache.type )
667
- return cache.type;
668
-
669
- var type = CKEDITOR.SELECTION_TEXT;
670
-
671
- var sel = this.getNative();
672
-
673
- if ( !sel )
674
- type = CKEDITOR.SELECTION_NONE;
675
- else if ( sel.rangeCount == 1 )
676
- {
677
- // Check if the actual selection is a control (IMG,
678
- // TABLE, HR, etc...).
679
-
680
- var range = sel.getRangeAt(0),
681
- startContainer = range.startContainer;
682
-
683
- if ( startContainer == range.endContainer
684
- && startContainer.nodeType == 1
685
- && ( range.endOffset - range.startOffset ) == 1
686
- && styleObjectElements[ startContainer.childNodes[ range.startOffset ].nodeName.toLowerCase() ] )
687
- {
688
- type = CKEDITOR.SELECTION_ELEMENT;
689
- }
690
- }
691
-
692
- return ( cache.type = type );
693
- },
694
-
695
- /**
696
- * Retrieve the {@link CKEDITOR.dom.range} instances that represent the current selection.
697
- * Note: Some browsers returns multiple ranges even on a sequent selection, e.g. Firefox returns
698
- * one range for each table cell when one or more table row is selected.
699
- * @return {Array}
700
- * @example
701
- * var ranges = selection.getRanges();
702
- * alert(ranges.length);
703
- */
704
- getRanges : (function()
705
- {
706
- var func = CKEDITOR.env.ie ?
707
- ( function()
708
- {
709
- function getNodeIndex( node ) { return new CKEDITOR.dom.node( node ).getIndex(); }
710
-
711
- // Finds the container and offset for a specific boundary
712
- // of an IE range.
713
- var getBoundaryInformation = function( range, start )
714
- {
715
- // Creates a collapsed range at the requested boundary.
716
- range = range.duplicate();
717
- range.collapse( start );
718
-
719
- // Gets the element that encloses the range entirely.
720
- var parent = range.parentElement(),
721
- doc = parent.ownerDocument;
722
-
723
- // Empty parent element, e.g. <i>^</i>
724
- if ( !parent.hasChildNodes() )
725
- return { container : parent, offset : 0 };
726
-
727
- var siblings = parent.children,
728
- child,
729
- sibling,
730
- testRange = range.duplicate(),
731
- startIndex = 0,
732
- endIndex = siblings.length - 1,
733
- index = -1,
734
- position,
735
- distance;
736
-
737
- // Binary search over all element childs to test the range to see whether
738
- // range is right on the boundary of one element.
739
- while ( startIndex <= endIndex )
740
- {
741
- index = Math.floor( ( startIndex + endIndex ) / 2 );
742
- child = siblings[ index ];
743
- testRange.moveToElementText( child );
744
- position = testRange.compareEndPoints( 'StartToStart', range );
745
-
746
- if ( position > 0 )
747
- endIndex = index - 1;
748
- else if ( position < 0 )
749
- startIndex = index + 1;
750
- else
751
- {
752
- // IE9 report wrong measurement with compareEndPoints when range anchors between two BRs.
753
- // e.g. <p>text<br />^<br /></p> (#7433)
754
- if ( CKEDITOR.env.ie9Compat && child.tagName == 'BR' )
755
- {
756
- var bmId = 'cke_range_marker';
757
- range.execCommand( 'CreateBookmark', false, bmId );
758
- child = doc.getElementsByName( bmId )[ 0 ];
759
- var offset = getNodeIndex( child );
760
- parent.removeChild( child );
761
- return { container : parent, offset : offset };
762
- }
763
- else
764
- return { container : parent, offset : getNodeIndex( child ) };
765
- }
766
- }
767
-
768
- // All childs are text nodes,
769
- // or to the right hand of test range are all text nodes. (#6992)
770
- if ( index == -1 || index == siblings.length - 1 && position < 0 )
771
- {
772
- // Adapt test range to embrace the entire parent contents.
773
- testRange.moveToElementText( parent );
774
- testRange.setEndPoint( 'StartToStart', range );
775
-
776
- // IE report line break as CRLF with range.text but
777
- // only LF with textnode.nodeValue, normalize them to avoid
778
- // breaking character counting logic below. (#3949)
779
- distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length;
780
-
781
- siblings = parent.childNodes;
782
-
783
- // Actual range anchor right beside test range at the boundary of text node.
784
- if ( !distance )
785
- {
786
- child = siblings[ siblings.length - 1 ];
787
-
788
- if ( child.nodeType == CKEDITOR.NODE_ELEMENT )
789
- return { container : parent, offset : siblings.length };
790
- else
791
- return { container : child, offset : child.nodeValue.length };
792
- }
793
-
794
- // Start the measuring until distance overflows, meanwhile count the text nodes.
795
- var i = siblings.length;
796
- while ( distance > 0 )
797
- distance -= siblings[ --i ].nodeValue.length;
798
-
799
- return { container : siblings[ i ], offset : -distance };
800
- }
801
- // Test range was one offset beyond OR behind the anchored text node.
802
- else
803
- {
804
- // Adapt one side of test range to the actual range
805
- // for measuring the offset between them.
806
- testRange.collapse( position > 0 ? true : false );
807
- testRange.setEndPoint( position > 0 ? 'StartToStart' : 'EndToStart', range );
808
-
809
- // IE report line break as CRLF with range.text but
810
- // only LF with textnode.nodeValue, normalize them to avoid
811
- // breaking character counting logic below. (#3949)
812
- distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length;
813
-
814
- // Actual range anchor right beside test range at the inner boundary of text node.
815
- if ( !distance )
816
- return { container : parent, offset : getNodeIndex( child ) + ( position > 0 ? 0 : 1 ) };
817
-
818
- // Start the measuring until distance overflows, meanwhile count the text nodes.
819
- while ( distance > 0 )
820
- {
821
- try
822
- {
823
- sibling = child[ position > 0 ? 'previousSibling' : 'nextSibling' ];
824
- distance -= sibling.nodeValue.length;
825
- child = sibling;
826
- }
827
- // Measurement in IE could be somtimes wrong because of <select> element. (#4611)
828
- catch( e )
829
- {
830
- return { container : parent, offset : getNodeIndex( child ) };
831
- }
832
- }
833
-
834
- return { container : child, offset : position > 0 ? -distance : child.nodeValue.length + distance };
835
- }
836
- };
837
-
838
- return function()
839
- {
840
- // IE doesn't have range support (in the W3C way), so we
841
- // need to do some magic to transform selections into
842
- // CKEDITOR.dom.range instances.
843
-
844
- var sel = this.getNative(),
845
- nativeRange = sel && sel.createRange(),
846
- type = this.getType(),
847
- range;
848
-
849
- if ( !sel )
850
- return [];
851
-
852
- if ( type == CKEDITOR.SELECTION_TEXT )
853
- {
854
- range = new CKEDITOR.dom.range( this.document );
855
-
856
- var boundaryInfo = getBoundaryInformation( nativeRange, true );
857
- range.setStart( new CKEDITOR.dom.node( boundaryInfo.container ), boundaryInfo.offset );
858
-
859
- boundaryInfo = getBoundaryInformation( nativeRange );
860
- range.setEnd( new CKEDITOR.dom.node( boundaryInfo.container ), boundaryInfo.offset );
861
-
862
- // Correct an invalid IE range case on empty list item. (#5850)
863
- if ( range.endContainer.getPosition( range.startContainer ) & CKEDITOR.POSITION_PRECEDING
864
- && range.endOffset <= range.startContainer.getIndex() )
865
- {
866
- range.collapse();
867
- }
868
-
869
- return [ range ];
870
- }
871
- else if ( type == CKEDITOR.SELECTION_ELEMENT )
872
- {
873
- var retval = [];
874
-
875
- for ( var i = 0 ; i < nativeRange.length ; i++ )
876
- {
877
- var element = nativeRange.item( i ),
878
- parentElement = element.parentNode,
879
- j = 0;
880
-
881
- range = new CKEDITOR.dom.range( this.document );
882
-
883
- for (; j < parentElement.childNodes.length && parentElement.childNodes[j] != element ; j++ )
884
- { /*jsl:pass*/ }
885
-
886
- range.setStart( new CKEDITOR.dom.node( parentElement ), j );
887
- range.setEnd( new CKEDITOR.dom.node( parentElement ), j + 1 );
888
- retval.push( range );
889
- }
890
-
891
- return retval;
892
- }
893
-
894
- return [];
895
- };
896
- })()
897
- :
898
- function()
899
- {
900
-
901
- // On browsers implementing the W3C range, we simply
902
- // tranform the native ranges in CKEDITOR.dom.range
903
- // instances.
904
-
905
- var ranges = [],
906
- range,
907
- doc = this.document,
908
- sel = this.getNative();
909
-
910
- if ( !sel )
911
- return ranges;
912
-
913
- // On WebKit, it may happen that we'll have no selection
914
- // available. We normalize it here by replicating the
915
- // behavior of other browsers.
916
- if ( !sel.rangeCount )
917
- {
918
- range = new CKEDITOR.dom.range( doc );
919
- range.moveToElementEditStart( doc.getBody() );
920
- ranges.push( range );
921
- }
922
-
923
- for ( var i = 0 ; i < sel.rangeCount ; i++ )
924
- {
925
- var nativeRange = sel.getRangeAt( i );
926
-
927
- range = new CKEDITOR.dom.range( doc );
928
-
929
- range.setStart( new CKEDITOR.dom.node( nativeRange.startContainer ), nativeRange.startOffset );
930
- range.setEnd( new CKEDITOR.dom.node( nativeRange.endContainer ), nativeRange.endOffset );
931
- ranges.push( range );
932
- }
933
- return ranges;
934
- };
935
-
936
- return function( onlyEditables )
937
- {
938
- var cache = this._.cache;
939
- if ( cache.ranges && !onlyEditables )
940
- return cache.ranges;
941
- else if ( !cache.ranges )
942
- cache.ranges = new CKEDITOR.dom.rangeList( func.call( this ) );
943
-
944
- // Split range into multiple by read-only nodes.
945
- if ( onlyEditables )
946
- {
947
- var ranges = cache.ranges;
948
- for ( var i = 0; i < ranges.length; i++ )
949
- {
950
- var range = ranges[ i ];
951
-
952
- // Drop range spans inside one ready-only node.
953
- var parent = range.getCommonAncestor();
954
- if ( parent.isReadOnly() )
955
- ranges.splice( i, 1 );
956
-
957
- if ( range.collapsed )
958
- continue;
959
-
960
- var startContainer = range.startContainer,
961
- endContainer = range.endContainer,
962
- startOffset = range.startOffset,
963
- endOffset = range.endOffset,
964
- walkerRange = range.clone();
965
-
966
- // Range may start inside a non-editable element, restart range
967
- // by the end of it.
968
- var readOnly;
969
- if ( ( readOnly = startContainer.isReadOnly() ) )
970
- range.setStartAfter( readOnly );
971
-
972
- // Enlarge range start/end with text node to avoid walker
973
- // being DOM destructive, it doesn't interfere our checking
974
- // of elements below as well.
975
- if ( startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
976
- {
977
- if ( startOffset >= startContainer.getLength() )
978
- walkerRange.setStartAfter( startContainer );
979
- else
980
- walkerRange.setStartBefore( startContainer );
981
- }
982
-
983
- if ( endContainer && endContainer.type == CKEDITOR.NODE_TEXT )
984
- {
985
- if ( !endOffset )
986
- walkerRange.setEndBefore( endContainer );
987
- else
988
- walkerRange.setEndAfter( endContainer );
989
- }
990
-
991
- // Looking for non-editable element inside the range.
992
- var walker = new CKEDITOR.dom.walker( walkerRange );
993
- walker.evaluator = function( node )
994
- {
995
- if ( node.type == CKEDITOR.NODE_ELEMENT
996
- && node.isReadOnly() )
997
- {
998
- var newRange = range.clone();
999
- range.setEndBefore( node );
1000
-
1001
- // Drop collapsed range around read-only elements,
1002
- // it make sure the range list empty when selecting
1003
- // only non-editable elements.
1004
- if ( range.collapsed )
1005
- ranges.splice( i--, 1 );
1006
-
1007
- // Avoid creating invalid range.
1008
- if ( !( node.getPosition( walkerRange.endContainer ) & CKEDITOR.POSITION_CONTAINS ) )
1009
- {
1010
- newRange.setStartAfter( node );
1011
- if ( !newRange.collapsed )
1012
- ranges.splice( i + 1, 0, newRange );
1013
- }
1014
-
1015
- return true;
1016
- }
1017
-
1018
- return false;
1019
- };
1020
-
1021
- walker.next();
1022
- }
1023
- }
1024
-
1025
- return cache.ranges;
1026
- };
1027
- })(),
1028
-
1029
- /**
1030
- * Gets the DOM element in which the selection starts.
1031
- * @returns {CKEDITOR.dom.element} The element at the beginning of the
1032
- * selection.
1033
- * @example
1034
- * var element = editor.getSelection().<b>getStartElement()</b>;
1035
- * alert( element.getName() );
1036
- */
1037
- getStartElement : function()
1038
- {
1039
- var cache = this._.cache;
1040
- if ( cache.startElement !== undefined )
1041
- return cache.startElement;
1042
-
1043
- var node,
1044
- sel = this.getNative();
1045
-
1046
- switch ( this.getType() )
1047
- {
1048
- case CKEDITOR.SELECTION_ELEMENT :
1049
- return this.getSelectedElement();
1050
-
1051
- case CKEDITOR.SELECTION_TEXT :
1052
-
1053
- var range = this.getRanges()[0];
1054
-
1055
- if ( range )
1056
- {
1057
- if ( !range.collapsed )
1058
- {
1059
- range.optimize();
1060
-
1061
- // Decrease the range content to exclude particial
1062
- // selected node on the start which doesn't have
1063
- // visual impact. ( #3231 )
1064
- while ( 1 )
1065
- {
1066
- var startContainer = range.startContainer,
1067
- startOffset = range.startOffset;
1068
- // Limit the fix only to non-block elements.(#3950)
1069
- if ( startOffset == ( startContainer.getChildCount ?
1070
- startContainer.getChildCount() : startContainer.getLength() )
1071
- && !startContainer.isBlockBoundary() )
1072
- range.setStartAfter( startContainer );
1073
- else break;
1074
- }
1075
-
1076
- node = range.startContainer;
1077
-
1078
- if ( node.type != CKEDITOR.NODE_ELEMENT )
1079
- return node.getParent();
1080
-
1081
- node = node.getChild( range.startOffset );
1082
-
1083
- if ( !node || node.type != CKEDITOR.NODE_ELEMENT )
1084
- node = range.startContainer;
1085
- else
1086
- {
1087
- var child = node.getFirst();
1088
- while ( child && child.type == CKEDITOR.NODE_ELEMENT )
1089
- {
1090
- node = child;
1091
- child = child.getFirst();
1092
- }
1093
- }
1094
- }
1095
- else
1096
- {
1097
- node = range.startContainer;
1098
- if ( node.type != CKEDITOR.NODE_ELEMENT )
1099
- node = node.getParent();
1100
- }
1101
-
1102
- node = node.$;
1103
- }
1104
- }
1105
-
1106
- return cache.startElement = ( node ? new CKEDITOR.dom.element( node ) : null );
1107
- },
1108
-
1109
- /**
1110
- * Gets the current selected element.
1111
- * @returns {CKEDITOR.dom.element} The selected element. Null if no
1112
- * selection is available or the selection type is not
1113
- * {@link CKEDITOR.SELECTION_ELEMENT}.
1114
- * @example
1115
- * var element = editor.getSelection().<b>getSelectedElement()</b>;
1116
- * alert( element.getName() );
1117
- */
1118
- getSelectedElement : function()
1119
- {
1120
- var cache = this._.cache;
1121
- if ( cache.selectedElement !== undefined )
1122
- return cache.selectedElement;
1123
-
1124
- var self = this;
1125
-
1126
- var node = CKEDITOR.tools.tryThese(
1127
- // Is it native IE control type selection?
1128
- function()
1129
- {
1130
- return self.getNative().createRange().item( 0 );
1131
- },
1132
- // Figure it out by checking if there's a single enclosed
1133
- // node of the range.
1134
- function()
1135
- {
1136
- var range = self.getRanges()[ 0 ],
1137
- enclosed,
1138
- selected;
1139
-
1140
- // Check first any enclosed element, e.g. <ul>[<li><a href="#">item</a></li>]</ul>
1141
- for ( var i = 2; i && !( ( enclosed = range.getEnclosedNode() )
1142
- && ( enclosed.type == CKEDITOR.NODE_ELEMENT )
1143
- && styleObjectElements[ enclosed.getName() ]
1144
- && ( selected = enclosed ) ); i-- )
1145
- {
1146
- // Then check any deep wrapped element, e.g. [<b><i><img /></i></b>]
1147
- range.shrink( CKEDITOR.SHRINK_ELEMENT );
1148
- }
1149
-
1150
- return selected.$;
1151
- });
1152
-
1153
- return cache.selectedElement = ( node ? new CKEDITOR.dom.element( node ) : null );
1154
- },
1155
-
1156
- /**
1157
- * Retrieves the text contained within the range, empty string is returned for non-text selection.
1158
- * @returns {String} string of text within the current selection.
1159
- * @since 3.6.1
1160
- * @example
1161
- * var text = editor.getSelectedText();
1162
- * alert( text );
1163
- */
1164
- getSelectedText : function()
1165
- {
1166
- var cache = this._.cache;
1167
- if ( cache.selectedText !== undefined )
1168
- return cache.selectedText;
1169
-
1170
- var text = '',
1171
- nativeSel = this.getNative();
1172
- if ( this.getType() == CKEDITOR.SELECTION_TEXT )
1173
- text = CKEDITOR.env.ie ? nativeSel.createRange().text : nativeSel.toString();
1174
-
1175
- return ( cache.selectedText = text );
1176
- },
1177
-
1178
- lock : function()
1179
- {
1180
- // Call all cacheable function.
1181
- this.getRanges();
1182
- this.getStartElement();
1183
- this.getSelectedElement();
1184
- this.getSelectedText();
1185
-
1186
- // The native selection is not available when locked.
1187
- this._.cache.nativeSel = {};
1188
-
1189
- this.isLocked = 1;
1190
-
1191
- // Save this selection inside the DOM document.
1192
- this.document.setCustomData( 'cke_locked_selection', this );
1193
- },
1194
-
1195
- unlock : function( restore )
1196
- {
1197
- var doc = this.document,
1198
- lockedSelection = doc.getCustomData( 'cke_locked_selection' );
1199
-
1200
- if ( lockedSelection )
1201
- {
1202
- doc.setCustomData( 'cke_locked_selection', null );
1203
-
1204
- if ( restore )
1205
- {
1206
- var selectedElement = lockedSelection.getSelectedElement(),
1207
- ranges = !selectedElement && lockedSelection.getRanges();
1208
-
1209
- this.isLocked = 0;
1210
- this.reset();
1211
-
1212
- doc.getBody().focus();
1213
-
1214
- if ( selectedElement )
1215
- this.selectElement( selectedElement );
1216
- else
1217
- this.selectRanges( ranges );
1218
- }
1219
- }
1220
-
1221
- if ( !lockedSelection || !restore )
1222
- {
1223
- this.isLocked = 0;
1224
- this.reset();
1225
- }
1226
- },
1227
-
1228
- reset : function()
1229
- {
1230
- this._.cache = {};
1231
- },
1232
-
1233
- /**
1234
- * Make the current selection of type {@link CKEDITOR.SELECTION_ELEMENT} by enclosing the specified element.
1235
- * @param element
1236
- */
1237
- selectElement : function( element )
1238
- {
1239
- if ( this.isLocked )
1240
- {
1241
- var range = new CKEDITOR.dom.range( this.document );
1242
- range.setStartBefore( element );
1243
- range.setEndAfter( element );
1244
-
1245
- this._.cache.selectedElement = element;
1246
- this._.cache.startElement = element;
1247
- this._.cache.ranges = new CKEDITOR.dom.rangeList( range );
1248
- this._.cache.type = CKEDITOR.SELECTION_ELEMENT;
1249
-
1250
- return;
1251
- }
1252
-
1253
- range = new CKEDITOR.dom.range( element.getDocument() );
1254
- range.setStartBefore( element );
1255
- range.setEndAfter( element );
1256
- range.select();
1257
-
1258
- this.document.fire( 'selectionchange' );
1259
- this.reset();
1260
-
1261
- },
1262
-
1263
- /**
1264
- * Adding the specified ranges to document selection preceding
1265
- * by clearing up the original selection.
1266
- * @param {CKEDITOR.dom.range} ranges
1267
- */
1268
- selectRanges : function( ranges )
1269
- {
1270
- if ( this.isLocked )
1271
- {
1272
- this._.cache.selectedElement = null;
1273
- this._.cache.startElement = ranges[ 0 ] && ranges[ 0 ].getTouchedStartNode();
1274
- this._.cache.ranges = new CKEDITOR.dom.rangeList( ranges );
1275
- this._.cache.type = CKEDITOR.SELECTION_TEXT;
1276
-
1277
- return;
1278
- }
1279
-
1280
- if ( CKEDITOR.env.ie )
1281
- {
1282
- if ( ranges.length > 1 )
1283
- {
1284
- // IE doesn't accept multiple ranges selection, so we join all into one.
1285
- var last = ranges[ ranges.length -1 ] ;
1286
- ranges[ 0 ].setEnd( last.endContainer, last.endOffset );
1287
- ranges.length = 1;
1288
- }
1289
-
1290
- if ( ranges[ 0 ] )
1291
- ranges[ 0 ].select();
1292
-
1293
- this.reset();
1294
- }
1295
- else
1296
- {
1297
- var sel = this.getNative();
1298
-
1299
- // getNative() returns null if iframe is "display:none" in FF. (#6577)
1300
- if ( !sel )
1301
- return;
1302
-
1303
- if ( ranges.length )
1304
- {
1305
- sel.removeAllRanges();
1306
- // Remove any existing filling char first.
1307
- CKEDITOR.env.webkit && removeFillingChar( this.document );
1308
- }
1309
-
1310
- for ( var i = 0 ; i < ranges.length ; i++ )
1311
- {
1312
- // Joining sequential ranges introduced by
1313
- // readonly elements protection.
1314
- if ( i < ranges.length -1 )
1315
- {
1316
- var left = ranges[ i ], right = ranges[ i +1 ],
1317
- between = left.clone();
1318
- between.setStart( left.endContainer, left.endOffset );
1319
- between.setEnd( right.startContainer, right.startOffset );
1320
-
1321
- // Don't confused by Firefox adjancent multi-ranges
1322
- // introduced by table cells selection.
1323
- if ( !between.collapsed )
1324
- {
1325
- between.shrink( CKEDITOR.NODE_ELEMENT, true );
1326
- var ancestor = between.getCommonAncestor(),
1327
- enclosed = between.getEnclosedNode();
1328
-
1329
- // The following cases has to be considered:
1330
- // 1. <span contenteditable="false">[placeholder]</span>
1331
- // 2. <input contenteditable="false" type="radio"/> (#6621)
1332
- if ( ancestor.isReadOnly() || enclosed && enclosed.isReadOnly() )
1333
- {
1334
- right.setStart( left.startContainer, left.startOffset );
1335
- ranges.splice( i--, 1 );
1336
- continue;
1337
- }
1338
- }
1339
- }
1340
-
1341
- var range = ranges[ i ];
1342
- var nativeRange = this.document.$.createRange();
1343
- var startContainer = range.startContainer;
1344
-
1345
- // In FF2, if we have a collapsed range, inside an empty
1346
- // element, we must add something to it otherwise the caret
1347
- // will not be visible.
1348
- // In Opera instead, the selection will be moved out of the
1349
- // element. (#4657)
1350
- if ( range.collapsed &&
1351
- ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 ) ) &&
1352
- startContainer.type == CKEDITOR.NODE_ELEMENT &&
1353
- !startContainer.getChildCount() )
1354
- {
1355
- startContainer.appendText( '' );
1356
- }
1357
-
1358
- if ( range.collapsed
1359
- && CKEDITOR.env.webkit
1360
- && rangeRequiresFix( range ) )
1361
- {
1362
- // Append a zero-width space so WebKit will not try to
1363
- // move the selection by itself (#1272).
1364
- var fillingChar = createFillingChar( this.document );
1365
- range.insertNode( fillingChar ) ;
1366
-
1367
- var next = fillingChar.getNext();
1368
-
1369
- // If the filling char is followed by a <br>, whithout
1370
- // having something before it, it'll not blink.
1371
- // Let's remove it in this case.
1372
- if ( next && !fillingChar.getPrevious() && next.type == CKEDITOR.NODE_ELEMENT && next.getName() == 'br' )
1373
- {
1374
- removeFillingChar( this.document );
1375
- range.moveToPosition( next, CKEDITOR.POSITION_BEFORE_START );
1376
- }
1377
- else
1378
- range.moveToPosition( fillingChar, CKEDITOR.POSITION_AFTER_END );
1379
- }
1380
-
1381
- nativeRange.setStart( range.startContainer.$, range.startOffset );
1382
-
1383
- try
1384
- {
1385
- nativeRange.setEnd( range.endContainer.$, range.endOffset );
1386
- }
1387
- catch ( e )
1388
- {
1389
- // There is a bug in Firefox implementation (it would be too easy
1390
- // otherwise). The new start can't be after the end (W3C says it can).
1391
- // So, let's create a new range and collapse it to the desired point.
1392
- if ( e.toString().indexOf( 'NS_ERROR_ILLEGAL_VALUE' ) >= 0 )
1393
- {
1394
- range.collapse( 1 );
1395
- nativeRange.setEnd( range.endContainer.$, range.endOffset );
1396
- }
1397
- else
1398
- throw e;
1399
- }
1400
-
1401
- // Select the range.
1402
- sel.addRange( nativeRange );
1403
- }
1404
-
1405
- this.reset();
1406
- }
1407
- },
1408
-
1409
- /**
1410
- * Create bookmark for every single of this selection range (from #getRanges)
1411
- * by calling the {@link CKEDITOR.dom.range.prototype.createBookmark} method,
1412
- * with extra cares to avoid interferon among those ranges. Same arguments are
1413
- * received as with the underlay range method.
1414
- */
1415
- createBookmarks : function( serializable )
1416
- {
1417
- return this.getRanges().createBookmarks( serializable );
1418
- },
1419
-
1420
- /**
1421
- * Create bookmark for every single of this selection range (from #getRanges)
1422
- * by calling the {@link CKEDITOR.dom.range.prototype.createBookmark2} method,
1423
- * with extra cares to avoid interferon among those ranges. Same arguments are
1424
- * received as with the underlay range method.
1425
- */
1426
- createBookmarks2 : function( normalized )
1427
- {
1428
- return this.getRanges().createBookmarks2( normalized );
1429
- },
1430
-
1431
- /**
1432
- * Select the virtual ranges denote by the bookmarks by calling #selectRanges.
1433
- * @param bookmarks
1434
- */
1435
- selectBookmarks : function( bookmarks )
1436
- {
1437
- var ranges = [];
1438
- for ( var i = 0 ; i < bookmarks.length ; i++ )
1439
- {
1440
- var range = new CKEDITOR.dom.range( this.document );
1441
- range.moveToBookmark( bookmarks[i] );
1442
- ranges.push( range );
1443
- }
1444
- this.selectRanges( ranges );
1445
- return this;
1446
- },
1447
-
1448
- /**
1449
- * Retrieve the common ancestor node of the first range and the last range.
1450
- */
1451
- getCommonAncestor : function()
1452
- {
1453
- var ranges = this.getRanges(),
1454
- startNode = ranges[ 0 ].startContainer,
1455
- endNode = ranges[ ranges.length - 1 ].endContainer;
1456
- return startNode.getCommonAncestor( endNode );
1457
- },
1458
-
1459
- /**
1460
- * Moving scroll bar to the current selection's start position.
1461
- */
1462
- scrollIntoView : function()
1463
- {
1464
- // If we have split the block, adds a temporary span at the
1465
- // range position and scroll relatively to it.
1466
- var start = this.getStartElement();
1467
- start.scrollIntoView();
1468
- }
1469
- };
1470
- })();
1471
-
1472
- ( function()
1473
- {
1474
- var notWhitespaces = CKEDITOR.dom.walker.whitespaces( true ),
1475
- fillerTextRegex = /\ufeff|\u00a0/,
1476
- nonCells = { table:1,tbody:1,tr:1 };
1477
-
1478
- CKEDITOR.dom.range.prototype.select =
1479
- CKEDITOR.env.ie ?
1480
- // V2
1481
- function( forceExpand )
1482
- {
1483
- var collapsed = this.collapsed,
1484
- isStartMarkerAlone, dummySpan, ieRange;
1485
-
1486
- // Try to make a object selection.
1487
- var selected = this.getEnclosedNode();
1488
- if ( selected )
1489
- {
1490
- try
1491
- {
1492
- ieRange = this.document.$.body.createControlRange();
1493
- ieRange.addElement( selected.$ );
1494
- ieRange.select();
1495
- return;
1496
- }
1497
- catch( er ) {}
1498
- }
1499
-
1500
- // IE doesn't support selecting the entire table row/cell, move the selection into cells, e.g.
1501
- // <table><tbody><tr>[<td>cell</b></td>... => <table><tbody><tr><td>[cell</td>...
1502
- if ( this.startContainer.type == CKEDITOR.NODE_ELEMENT && this.startContainer.getName() in nonCells
1503
- || this.endContainer.type == CKEDITOR.NODE_ELEMENT && this.endContainer.getName() in nonCells )
1504
- {
1505
- this.shrink( CKEDITOR.NODE_ELEMENT, true );
1506
- }
1507
-
1508
- var bookmark = this.createBookmark();
1509
-
1510
- // Create marker tags for the start and end boundaries.
1511
- var startNode = bookmark.startNode;
1512
-
1513
- var endNode;
1514
- if ( !collapsed )
1515
- endNode = bookmark.endNode;
1516
-
1517
- // Create the main range which will be used for the selection.
1518
- ieRange = this.document.$.body.createTextRange();
1519
-
1520
- // Position the range at the start boundary.
1521
- ieRange.moveToElementText( startNode.$ );
1522
- ieRange.moveStart( 'character', 1 );
1523
-
1524
- if ( endNode )
1525
- {
1526
- // Create a tool range for the end.
1527
- var ieRangeEnd = this.document.$.body.createTextRange();
1528
-
1529
- // Position the tool range at the end.
1530
- ieRangeEnd.moveToElementText( endNode.$ );
1531
-
1532
- // Move the end boundary of the main range to match the tool range.
1533
- ieRange.setEndPoint( 'EndToEnd', ieRangeEnd );
1534
- ieRange.moveEnd( 'character', -1 );
1535
- }
1536
- else
1537
- {
1538
- // The isStartMarkerAlone logic comes from V2. It guarantees that the lines
1539
- // will expand and that the cursor will be blinking on the right place.
1540
- // Actually, we are using this flag just to avoid using this hack in all
1541
- // situations, but just on those needed.
1542
- var next = startNode.getNext( notWhitespaces );
1543
- isStartMarkerAlone = ( !( next && next.getText && next.getText().match( fillerTextRegex ) ) // already a filler there?
1544
- && ( forceExpand || !startNode.hasPrevious() || ( startNode.getPrevious().is && startNode.getPrevious().is( 'br' ) ) ) );
1545
-
1546
- // Append a temporary <span>&#65279;</span> before the selection.
1547
- // This is needed to avoid IE destroying selections inside empty
1548
- // inline elements, like <b></b> (#253).
1549
- // It is also needed when placing the selection right after an inline
1550
- // element to avoid the selection moving inside of it.
1551
- dummySpan = this.document.createElement( 'span' );
1552
- dummySpan.setHtml( '&#65279;' ); // Zero Width No-Break Space (U+FEFF). See #1359.
1553
- dummySpan.insertBefore( startNode );
1554
-
1555
- if ( isStartMarkerAlone )
1556
- {
1557
- // To expand empty blocks or line spaces after <br>, we need
1558
- // instead to have any char, which will be later deleted using the
1559
- // selection.
1560
- // \ufeff = Zero Width No-Break Space (U+FEFF). (#1359)
1561
- this.document.createText( '\ufeff' ).insertBefore( startNode );
1562
- }
1563
- }
1564
-
1565
- // Remove the markers (reset the position, because of the changes in the DOM tree).
1566
- this.setStartBefore( startNode );
1567
- startNode.remove();
1568
-
1569
- if ( collapsed )
1570
- {
1571
- if ( isStartMarkerAlone )
1572
- {
1573
- // Move the selection start to include the temporary \ufeff.
1574
- ieRange.moveStart( 'character', -1 );
1575
-
1576
- ieRange.select();
1577
-
1578
- // Remove our temporary stuff.
1579
- this.document.$.selection.clear();
1580
- }
1581
- else
1582
- ieRange.select();
1583
-
1584
- this.moveToPosition( dummySpan, CKEDITOR.POSITION_BEFORE_START );
1585
- dummySpan.remove();
1586
- }
1587
- else
1588
- {
1589
- this.setEndBefore( endNode );
1590
- endNode.remove();
1591
- ieRange.select();
1592
- }
1593
-
1594
- this.document.fire( 'selectionchange' );
1595
- }
1596
- :
1597
- function()
1598
- {
1599
- this.document.getSelection().selectRanges( [ this ] );
1600
- };
1601
- } )();
1
+ /*
2
+ Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
3
+ For licensing, see LICENSE.html or http://ckeditor.com/license
4
+ */
5
+
6
+ (function()
7
+ {
8
+ // #### checkSelectionChange : START
9
+
10
+ // The selection change check basically saves the element parent tree of
11
+ // the current node and check it on successive requests. If there is any
12
+ // change on the tree, then the selectionChange event gets fired.
13
+ function checkSelectionChange()
14
+ {
15
+ try
16
+ {
17
+ // In IE, the "selectionchange" event may still get thrown when
18
+ // releasing the WYSIWYG mode, so we need to check it first.
19
+ var sel = this.getSelection();
20
+ if ( !sel || !sel.document.getWindow().$ )
21
+ return;
22
+
23
+ var firstElement = sel.getStartElement();
24
+ var currentPath = new CKEDITOR.dom.elementPath( firstElement );
25
+
26
+ if ( !currentPath.compare( this._.selectionPreviousPath ) )
27
+ {
28
+ this._.selectionPreviousPath = currentPath;
29
+ this.fire( 'selectionChange', { selection : sel, path : currentPath, element : firstElement } );
30
+ }
31
+ }
32
+ catch (e)
33
+ {}
34
+ }
35
+
36
+ var checkSelectionChangeTimer,
37
+ checkSelectionChangeTimeoutPending;
38
+
39
+ function checkSelectionChangeTimeout()
40
+ {
41
+ // Firing the "OnSelectionChange" event on every key press started to
42
+ // be too slow. This function guarantees that there will be at least
43
+ // 200ms delay between selection checks.
44
+
45
+ checkSelectionChangeTimeoutPending = true;
46
+
47
+ if ( checkSelectionChangeTimer )
48
+ return;
49
+
50
+ checkSelectionChangeTimeoutExec.call( this );
51
+
52
+ checkSelectionChangeTimer = CKEDITOR.tools.setTimeout( checkSelectionChangeTimeoutExec, 200, this );
53
+ }
54
+
55
+ function checkSelectionChangeTimeoutExec()
56
+ {
57
+ checkSelectionChangeTimer = null;
58
+
59
+ if ( checkSelectionChangeTimeoutPending )
60
+ {
61
+ // Call this with a timeout so the browser properly moves the
62
+ // selection after the mouseup. It happened that the selection was
63
+ // being moved after the mouseup when clicking inside selected text
64
+ // with Firefox.
65
+ CKEDITOR.tools.setTimeout( checkSelectionChange, 0, this );
66
+
67
+ checkSelectionChangeTimeoutPending = false;
68
+ }
69
+ }
70
+
71
+ // #### checkSelectionChange : END
72
+
73
+ function rangeRequiresFix( range )
74
+ {
75
+ function isInlineCt( node )
76
+ {
77
+ return node && node.type == CKEDITOR.NODE_ELEMENT
78
+ && node.getName() in CKEDITOR.dtd.$removeEmpty;
79
+ }
80
+
81
+ function singletonBlock( node )
82
+ {
83
+ var body = range.document.getBody();
84
+ return !node.is( 'body' ) && body.getChildCount() == 1;
85
+ }
86
+
87
+ var start = range.startContainer,
88
+ offset = range.startOffset;
89
+
90
+ if ( start.type == CKEDITOR.NODE_TEXT )
91
+ return false;
92
+
93
+ // 1. Empty inline element. <span>^</span>
94
+ // 2. Adjoin to inline element. <p><strong>text</strong>^</p>
95
+ // 3. The only empty block in document. <body><p>^</p></body> (#7222)
96
+ return !CKEDITOR.tools.trim( start.getHtml() ) ? isInlineCt( start ) || singletonBlock( start )
97
+ : isInlineCt( start.getChild( offset - 1 ) ) || isInlineCt( start.getChild( offset ) );
98
+ }
99
+
100
+ var selectAllCmd =
101
+ {
102
+ modes : { wysiwyg : 1, source : 1 },
103
+ readOnly : CKEDITOR.env.ie || CKEDITOR.env.webkit,
104
+ exec : function( editor )
105
+ {
106
+ switch ( editor.mode )
107
+ {
108
+ case 'wysiwyg' :
109
+ editor.document.$.execCommand( 'SelectAll', false, null );
110
+ // Force triggering selectionChange (#7008)
111
+ editor.forceNextSelectionCheck();
112
+ editor.selectionChange();
113
+ break;
114
+ case 'source' :
115
+ // Select the contents of the textarea
116
+ var textarea = editor.textarea.$;
117
+ if ( CKEDITOR.env.ie )
118
+ textarea.createTextRange().execCommand( 'SelectAll' );
119
+ else
120
+ {
121
+ textarea.selectionStart = 0;
122
+ textarea.selectionEnd = textarea.value.length;
123
+ }
124
+ textarea.focus();
125
+ }
126
+ },
127
+ canUndo : false
128
+ };
129
+
130
+ function createFillingChar( doc )
131
+ {
132
+ removeFillingChar( doc );
133
+
134
+ var fillingChar = doc.createText( '\u200B' );
135
+ doc.setCustomData( 'cke-fillingChar', fillingChar );
136
+
137
+ return fillingChar;
138
+ }
139
+
140
+ function getFillingChar( doc )
141
+ {
142
+ return doc && doc.getCustomData( 'cke-fillingChar' );
143
+ }
144
+
145
+ // Checks if a filling char has been used, eventualy removing it (#1272).
146
+ function checkFillingChar( doc )
147
+ {
148
+ var fillingChar = doc && getFillingChar( doc );
149
+ if ( fillingChar )
150
+ {
151
+ // Use this flag to avoid removing the filling char right after
152
+ // creating it.
153
+ if ( fillingChar.getCustomData( 'ready' ) )
154
+ removeFillingChar( doc );
155
+ else
156
+ fillingChar.setCustomData( 'ready', 1 );
157
+ }
158
+ }
159
+
160
+ function removeFillingChar( doc )
161
+ {
162
+ var fillingChar = doc && doc.removeCustomData( 'cke-fillingChar' );
163
+ if ( fillingChar )
164
+ {
165
+ var bm,
166
+ sel = doc.getSelection().getNative(),
167
+ // Be error proof.
168
+ range = sel && sel.type != 'None' && sel.getRangeAt( 0 );
169
+
170
+ // Text selection position might get mangled by
171
+ // subsequent dom modification, save it now for restoring. (#8617)
172
+ if ( fillingChar.getLength() > 1
173
+ && range && range.intersectsNode( fillingChar.$ ) )
174
+ {
175
+ bm = [ sel.anchorOffset, sel.focusOffset ];
176
+
177
+ // Anticipate the offset change brought by the removed char.
178
+ var startAffected = sel.anchorNode == fillingChar.$ && sel.anchorOffset > 0,
179
+ endAffected = sel.focusNode == fillingChar.$ && sel.focusOffset > 0;
180
+ startAffected && bm[ 0 ]--;
181
+ endAffected && bm[ 1 ]--;
182
+
183
+ // Revert the bookmark order on reverse selection.
184
+ isReversedSelection( sel ) && bm.unshift( bm.pop() );
185
+ }
186
+
187
+ // We can't simply remove the filling node because the user
188
+ // will actually enlarge it when typing, so we just remove the
189
+ // invisible char from it.
190
+ fillingChar.setText( fillingChar.getText().replace( /\u200B/g, '' ) );
191
+
192
+ // Restore the bookmark.
193
+ if ( bm )
194
+ {
195
+ var rng = sel.getRangeAt( 0 );
196
+ rng.setStart( rng.startContainer, bm[ 0 ] );
197
+ rng.setEnd( rng.startContainer, bm[ 1 ] );
198
+ sel.removeAllRanges();
199
+ sel.addRange( rng );
200
+ }
201
+ }
202
+ }
203
+
204
+ function isReversedSelection( sel )
205
+ {
206
+ if ( !sel.isCollapsed )
207
+ {
208
+ var range = sel.getRangeAt( 0 );
209
+ // Potentially alter an reversed selection range.
210
+ range.setStart( sel.anchorNode, sel.anchorOffset );
211
+ range.setEnd( sel.focusNode, sel.focusOffset );
212
+ return range.collapsed;
213
+ }
214
+ }
215
+
216
+ CKEDITOR.plugins.add( 'selection',
217
+ {
218
+ init : function( editor )
219
+ {
220
+ // On WebKit only, we need a special "filling" char on some situations
221
+ // (#1272). Here we set the events that should invalidate that char.
222
+ if ( CKEDITOR.env.webkit )
223
+ {
224
+ editor.on( 'selectionChange', function() { checkFillingChar( editor.document ); } );
225
+ editor.on( 'beforeSetMode', function() { removeFillingChar( editor.document ); } );
226
+
227
+ var fillingCharBefore,
228
+ resetSelection;
229
+
230
+ function beforeData()
231
+ {
232
+ var doc = editor.document,
233
+ fillingChar = getFillingChar( doc );
234
+
235
+ if ( fillingChar )
236
+ {
237
+ // If cursor is right blinking by side of the filler node, save it for restoring,
238
+ // as the following text substitution will blind it. (#7437)
239
+ var sel = doc.$.defaultView.getSelection();
240
+ if ( sel.type == 'Caret' && sel.anchorNode == fillingChar.$ )
241
+ resetSelection = 1;
242
+
243
+ fillingCharBefore = fillingChar.getText();
244
+ fillingChar.setText( fillingCharBefore.replace( /\u200B/g, '' ) );
245
+ }
246
+ }
247
+ function afterData()
248
+ {
249
+ var doc = editor.document,
250
+ fillingChar = getFillingChar( doc );
251
+
252
+ if ( fillingChar )
253
+ {
254
+ fillingChar.setText( fillingCharBefore );
255
+
256
+ if ( resetSelection )
257
+ {
258
+ doc.$.defaultView.getSelection().setPosition( fillingChar.$,fillingChar.getLength() );
259
+ resetSelection = 0;
260
+ }
261
+ }
262
+ }
263
+ editor.on( 'beforeUndoImage', beforeData );
264
+ editor.on( 'afterUndoImage', afterData );
265
+ editor.on( 'beforeGetData', beforeData, null, null, 0 );
266
+ editor.on( 'getData', afterData );
267
+ }
268
+
269
+ editor.on( 'contentDom', function()
270
+ {
271
+ var doc = editor.document,
272
+ body = doc.getBody(),
273
+ html = doc.getDocumentElement();
274
+
275
+ if ( CKEDITOR.env.ie )
276
+ {
277
+ // Other browsers don't loose the selection if the
278
+ // editor document loose the focus. In IE, we don't
279
+ // have support for it, so we reproduce it here, other
280
+ // than firing the selection change event.
281
+
282
+ var savedRange,
283
+ saveEnabled,
284
+ restoreEnabled = 1;
285
+
286
+ // "onfocusin" is fired before "onfocus". It makes it
287
+ // possible to restore the selection before click
288
+ // events get executed.
289
+ body.on( 'focusin', function( evt )
290
+ {
291
+ // If there are elements with layout they fire this event but
292
+ // it must be ignored to allow edit its contents #4682
293
+ if ( evt.data.$.srcElement.nodeName != 'BODY' )
294
+ return;
295
+
296
+ // Give the priority to locked selection since it probably
297
+ // reflects the actual situation, besides locked selection
298
+ // could be interfered because of text nodes normalizing.
299
+ // (#6083, #6987)
300
+ var lockedSelection = doc.getCustomData( 'cke_locked_selection' );
301
+ if ( lockedSelection )
302
+ {
303
+ lockedSelection.unlock( 1 );
304
+ lockedSelection.lock();
305
+ }
306
+ // Then check ff we have saved a range, restore it at this
307
+ // point.
308
+ else if ( savedRange && restoreEnabled )
309
+ {
310
+ // Well not break because of this.
311
+ try { savedRange.select(); } catch (e) {}
312
+ savedRange = null;
313
+ }
314
+ });
315
+
316
+ body.on( 'focus', function()
317
+ {
318
+ // Enable selections to be saved.
319
+ saveEnabled = 1;
320
+
321
+ saveSelection();
322
+ });
323
+
324
+ body.on( 'beforedeactivate', function( evt )
325
+ {
326
+ // Ignore this event if it's caused by focus switch between
327
+ // internal editable control type elements, e.g. layouted paragraph. (#4682)
328
+ if ( evt.data.$.toElement )
329
+ return;
330
+
331
+ // Disable selections from being saved.
332
+ saveEnabled = 0;
333
+ restoreEnabled = 1;
334
+ });
335
+
336
+ // [IE] Iframe will still keep the selection when blurred, if
337
+ // focus is moved onto a non-editing host, e.g. link or button, but
338
+ // it becomes a problem for the object type selection, since the resizer
339
+ // handler attached on it will mark other part of the UI, especially
340
+ // for the dialog. (#8157)
341
+ // [IE<8] Even worse For old IEs, the cursor will not vanish even if
342
+ // the selection has been moved to another text input in some cases. (#4716)
343
+ //
344
+ // Now the range restore is disabled, so we simply force IE to clean
345
+ // up the selection before blur.
346
+ CKEDITOR.env.ie && editor.on( 'blur', function()
347
+ {
348
+ // Error proof when the editor is not visible. (#6375)
349
+ try{ doc.$.selection.empty(); } catch ( er){}
350
+ });
351
+
352
+ // Listening on document element ensures that
353
+ // scrollbar is included. (#5280)
354
+ html.on( 'mousedown', function()
355
+ {
356
+ // Lock restore selection now, as we have
357
+ // a followed 'click' event which introduce
358
+ // new selection. (#5735)
359
+ restoreEnabled = 0;
360
+ });
361
+
362
+ html.on( 'mouseup', function()
363
+ {
364
+ restoreEnabled = 1;
365
+ });
366
+
367
+ var scroll;
368
+ // IE fires the "selectionchange" event when clicking
369
+ // inside a selection. We don't want to capture that.
370
+ body.on( 'mousedown', function( evt )
371
+ {
372
+ // IE scrolls document to top on right mousedown
373
+ // when editor has no focus, remember this scroll
374
+ // position and revert it before context menu opens. (#5778)
375
+ if ( evt.data.$.button == 2 )
376
+ {
377
+ var sel = editor.document.$.selection;
378
+ if ( sel.type == 'None' )
379
+ scroll = editor.window.getScrollPosition();
380
+ }
381
+ disableSave();
382
+ });
383
+
384
+ body.on( 'mouseup',
385
+ function( evt )
386
+ {
387
+ // Restore recorded scroll position when needed on right mouseup.
388
+ if ( evt.data.$.button == 2 && scroll )
389
+ {
390
+ editor.document.$.documentElement.scrollLeft = scroll.x;
391
+ editor.document.$.documentElement.scrollTop = scroll.y;
392
+ }
393
+ scroll = null;
394
+
395
+ saveEnabled = 1;
396
+ setTimeout( function()
397
+ {
398
+ saveSelection( true );
399
+ },
400
+ 0 );
401
+ });
402
+
403
+ body.on( 'keydown', disableSave );
404
+ body.on( 'keyup',
405
+ function()
406
+ {
407
+ saveEnabled = 1;
408
+ saveSelection();
409
+ });
410
+
411
+ // When content doc is in standards mode, IE doesn't focus the editor when
412
+ // clicking at the region below body (on html element) content, we emulate
413
+ // the normal behavior on old IEs. (#1659, #7932)
414
+ if ( ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat )
415
+ && doc.$.compatMode != 'BackCompat' )
416
+ {
417
+ html.on( 'mousedown', function( evt )
418
+ {
419
+ evt = evt.data.$;
420
+
421
+ // Expand the text range along with mouse move.
422
+ function onHover( evt )
423
+ {
424
+ evt = evt.data.$;
425
+ if ( textRng )
426
+ {
427
+ // Read the current cursor.
428
+ var rngEnd = body.$.createTextRange();
429
+ rngEnd.moveToPoint( evt.x, evt.y );
430
+
431
+ // Handle drag directions.
432
+ textRng.setEndPoint(
433
+ textRng.compareEndPoints( 'StartToStart', rngEnd ) < 0 ?
434
+ 'EndToEnd' :
435
+ 'StartToStart',
436
+ rngEnd );
437
+
438
+ // Update selection with new range.
439
+ textRng.select();
440
+ }
441
+ }
442
+
443
+ // We're sure that the click happens at the region
444
+ // below body, but not on scrollbar.
445
+ if ( evt.y < html.$.clientHeight
446
+ && evt.y > body.$.offsetTop + body.$.clientHeight
447
+ && evt.x < html.$.clientWidth )
448
+ {
449
+ // Start to build the text range.
450
+ var textRng = body.$.createTextRange();
451
+ textRng.moveToPoint( evt.x, evt.y );
452
+ textRng.select();
453
+
454
+ html.on( 'mousemove', onHover );
455
+
456
+ html.on( 'mouseup', function( evt )
457
+ {
458
+ html.removeListener( 'mousemove', onHover );
459
+ evt.removeListener();
460
+ textRng.select();
461
+ textRng = null;
462
+ } );
463
+ }
464
+ });
465
+ }
466
+
467
+ // It's much simpler for IE8, we just need to reselect the reported range.
468
+ if ( CKEDITOR.env.ie8 )
469
+ {
470
+ html.on( 'mouseup', function( evt )
471
+ {
472
+ // The event is not fired when clicking on the scrollbars,
473
+ // so we can safely check the following to understand
474
+ // whether the empty space following <body> has been clicked.
475
+ if ( evt.data.getTarget().getName() == 'html' )
476
+ {
477
+ var sel = CKEDITOR.document.$.selection,
478
+ range = sel.createRange();
479
+ // The selection range is reported on host, but actually it should applies to the content doc.
480
+ if ( sel.type != 'None' && range.parentElement().ownerDocument == doc.$ )
481
+ range.select();
482
+ }
483
+ } );
484
+ }
485
+
486
+ // IE is the only to provide the "selectionchange"
487
+ // event.
488
+ doc.on( 'selectionchange', saveSelection );
489
+
490
+ function disableSave()
491
+ {
492
+ saveEnabled = 0;
493
+ }
494
+
495
+ function saveSelection( testIt )
496
+ {
497
+ if ( saveEnabled )
498
+ {
499
+ var doc = editor.document,
500
+ sel = editor.getSelection(),
501
+ nativeSel = sel && sel.getNative();
502
+
503
+ // There is a very specific case, when clicking
504
+ // inside a text selection. In that case, the
505
+ // selection collapses at the clicking point,
506
+ // but the selection object remains in an
507
+ // unknown state, making createRange return a
508
+ // range at the very start of the document. In
509
+ // such situation we have to test the range, to
510
+ // be sure it's valid.
511
+ if ( testIt && nativeSel && nativeSel.type == 'None' )
512
+ {
513
+ // The "InsertImage" command can be used to
514
+ // test whether the selection is good or not.
515
+ // If not, it's enough to give some time to
516
+ // IE to put things in order for us.
517
+ if ( !doc.$.queryCommandEnabled( 'InsertImage' ) )
518
+ {
519
+ CKEDITOR.tools.setTimeout( saveSelection, 50, this, true );
520
+ return;
521
+ }
522
+ }
523
+
524
+ // Avoid saving selection from within text input. (#5747)
525
+ var parentTag;
526
+ if ( nativeSel && nativeSel.type && nativeSel.type != 'Control'
527
+ && ( parentTag = nativeSel.createRange() )
528
+ && ( parentTag = parentTag.parentElement() )
529
+ && ( parentTag = parentTag.nodeName )
530
+ && parentTag.toLowerCase() in { input: 1, textarea : 1 } )
531
+ {
532
+ return;
533
+ }
534
+
535
+ savedRange = nativeSel && sel.getRanges()[ 0 ];
536
+
537
+ checkSelectionChangeTimeout.call( editor );
538
+ }
539
+ }
540
+ }
541
+ else
542
+ {
543
+ // In other browsers, we make the selection change
544
+ // check based on other events, like clicks or keys
545
+ // press.
546
+
547
+ doc.on( 'mouseup', checkSelectionChangeTimeout, editor );
548
+ doc.on( 'keyup', checkSelectionChangeTimeout, editor );
549
+ doc.on( 'selectionchange', checkSelectionChangeTimeout, editor );
550
+ }
551
+
552
+ if ( CKEDITOR.env.webkit )
553
+ {
554
+ doc.on( 'keydown', function( evt )
555
+ {
556
+ var key = evt.data.getKey();
557
+ // Remove the filling char before some keys get
558
+ // executed, so they'll not get blocked by it.
559
+ switch ( key )
560
+ {
561
+ case 13 : // ENTER
562
+ case 33 : // PAGEUP
563
+ case 34 : // PAGEDOWN
564
+ case 35 : // HOME
565
+ case 36 : // END
566
+ case 37 : // LEFT-ARROW
567
+ case 39 : // RIGHT-ARROW
568
+ case 8 : // BACKSPACE
569
+ case 45 : // INS
570
+ case 46 : // DEl
571
+ removeFillingChar( editor.document );
572
+ }
573
+
574
+ }, null, null, 10 );
575
+ }
576
+ });
577
+
578
+ // Clear the cached range path before unload. (#7174)
579
+ editor.on( 'contentDomUnload', editor.forceNextSelectionCheck, editor );
580
+
581
+ editor.addCommand( 'selectAll', selectAllCmd );
582
+ editor.ui.addButton( 'SelectAll',
583
+ {
584
+ label : editor.lang.selectAll,
585
+ command : 'selectAll'
586
+ });
587
+
588
+ editor.selectionChange = checkSelectionChangeTimeout;
589
+
590
+ // IE9 might cease to work if there's an object selection inside the iframe (#7639).
591
+ CKEDITOR.env.ie9Compat && editor.on( 'destroy', function()
592
+ {
593
+ var sel = editor.getSelection();
594
+ sel && sel.getNative().clear();
595
+ }, null, null, 9 );
596
+ }
597
+ });
598
+
599
+ /**
600
+ * Gets the current selection from the editing area when in WYSIWYG mode.
601
+ * @returns {CKEDITOR.dom.selection} A selection object or null if not in
602
+ * WYSIWYG mode or no selection is available.
603
+ * @example
604
+ * var selection = CKEDITOR.instances.editor1.<strong>getSelection()</strong>;
605
+ * alert( selection.getType() );
606
+ */
607
+ CKEDITOR.editor.prototype.getSelection = function()
608
+ {
609
+ return this.document && this.document.getSelection();
610
+ };
611
+
612
+ CKEDITOR.editor.prototype.forceNextSelectionCheck = function()
613
+ {
614
+ delete this._.selectionPreviousPath;
615
+ };
616
+
617
+ /**
618
+ * Gets the current selection from the document.
619
+ * @returns {CKEDITOR.dom.selection} A selection object.
620
+ * @example
621
+ * var selection = CKEDITOR.instances.editor1.document.<strong>getSelection()</strong>;
622
+ * alert( selection.getType() );
623
+ */
624
+ CKEDITOR.dom.document.prototype.getSelection = function()
625
+ {
626
+ var sel = new CKEDITOR.dom.selection( this );
627
+ return ( !sel || sel.isInvalid ) ? null : sel;
628
+ };
629
+
630
+ /**
631
+ * No selection.
632
+ * @constant
633
+ * @example
634
+ * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_NONE )
635
+ * alert( 'Nothing is selected' );
636
+ */
637
+ CKEDITOR.SELECTION_NONE = 1;
638
+
639
+ /**
640
+ * A text or a collapsed selection.
641
+ * @constant
642
+ * @example
643
+ * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_TEXT )
644
+ * alert( 'A text is selected' );
645
+ */
646
+ CKEDITOR.SELECTION_TEXT = 2;
647
+
648
+ /**
649
+ * Element selection.
650
+ * @constant
651
+ * @example
652
+ * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_ELEMENT )
653
+ * alert( 'An element is selected' );
654
+ */
655
+ CKEDITOR.SELECTION_ELEMENT = 3;
656
+
657
+ /**
658
+ * Manipulates the selection in a DOM document.
659
+ * @constructor
660
+ * @param {CKEDITOR.dom.document} document The DOM document that contains the selection.
661
+ * @example
662
+ * var sel = new <strong>CKEDITOR.dom.selection( CKEDITOR.document )</strong>;
663
+ */
664
+ CKEDITOR.dom.selection = function( document )
665
+ {
666
+ var lockedSelection = document.getCustomData( 'cke_locked_selection' );
667
+
668
+ if ( lockedSelection )
669
+ return lockedSelection;
670
+
671
+ this.document = document;
672
+ this.isLocked = 0;
673
+ this._ =
674
+ {
675
+ cache : {}
676
+ };
677
+
678
+ /**
679
+ * IE BUG: The selection's document may be a different document than the
680
+ * editor document. Return null if that is the case.
681
+ */
682
+ if ( CKEDITOR.env.ie )
683
+ {
684
+ // Avoid breaking because of it. (#8836)
685
+ try
686
+ {
687
+ var range = this.getNative().createRange();
688
+ if ( !range ||
689
+ ( range.item && range.item( 0 ).ownerDocument != this.document.$ ) ||
690
+ ( range.parentElement && range.parentElement().ownerDocument != this.document.$ ) )
691
+ {
692
+ throw 0;
693
+ }
694
+ }
695
+ catch ( e )
696
+ {
697
+ this.isInvalid = true;
698
+ }
699
+ }
700
+
701
+ return this;
702
+ };
703
+
704
+ var styleObjectElements =
705
+ {
706
+ img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,
707
+ a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1
708
+ };
709
+
710
+ CKEDITOR.dom.selection.prototype =
711
+ {
712
+ /**
713
+ * Gets the native selection object from the browser.
714
+ * @function
715
+ * @returns {Object} The native browser selection object.
716
+ * @example
717
+ * var selection = editor.getSelection().<strong>getNative()</strong>;
718
+ */
719
+ getNative :
720
+ CKEDITOR.env.ie ?
721
+ function()
722
+ {
723
+ return this._.cache.nativeSel || ( this._.cache.nativeSel = this.document.$.selection );
724
+ }
725
+ :
726
+ function()
727
+ {
728
+ return this._.cache.nativeSel || ( this._.cache.nativeSel = this.document.getWindow().$.getSelection() );
729
+ },
730
+
731
+ /**
732
+ * Gets the type of the current selection. The following values are
733
+ * available:
734
+ * <ul>
735
+ * <li><code>{@link CKEDITOR.SELECTION_NONE}</code> (1): No selection.</li>
736
+ * <li><code>{@link CKEDITOR.SELECTION_TEXT}</code> (2): A text or a collapsed
737
+ * selection is selected.</li>
738
+ * <li><code>{@link CKEDITOR.SELECTION_ELEMENT}</code> (3): An element is
739
+ * selected.</li>
740
+ * </ul>
741
+ * @function
742
+ * @returns {Number} One of the following constant values:
743
+ * <code>{@link CKEDITOR.SELECTION_NONE}</code>, <code>{@link CKEDITOR.SELECTION_TEXT}</code>, or
744
+ * <code>{@link CKEDITOR.SELECTION_ELEMENT}</code>.
745
+ * @example
746
+ * if ( editor.getSelection().<strong>getType()</strong> == CKEDITOR.SELECTION_TEXT )
747
+ * alert( 'A text is selected' );
748
+ */
749
+ getType :
750
+ CKEDITOR.env.ie ?
751
+ function()
752
+ {
753
+ var cache = this._.cache;
754
+ if ( cache.type )
755
+ return cache.type;
756
+
757
+ var type = CKEDITOR.SELECTION_NONE;
758
+
759
+ try
760
+ {
761
+ var sel = this.getNative(),
762
+ ieType = sel.type;
763
+
764
+ if ( ieType == 'Text' )
765
+ type = CKEDITOR.SELECTION_TEXT;
766
+
767
+ if ( ieType == 'Control' )
768
+ type = CKEDITOR.SELECTION_ELEMENT;
769
+
770
+ // It is possible that we can still get a text range
771
+ // object even when type == 'None' is returned by IE.
772
+ // So we'd better check the object returned by
773
+ // createRange() rather than by looking at the type.
774
+ if ( sel.createRange().parentElement )
775
+ type = CKEDITOR.SELECTION_TEXT;
776
+ }
777
+ catch(e) {}
778
+
779
+ return ( cache.type = type );
780
+ }
781
+ :
782
+ function()
783
+ {
784
+ var cache = this._.cache;
785
+ if ( cache.type )
786
+ return cache.type;
787
+
788
+ var type = CKEDITOR.SELECTION_TEXT;
789
+
790
+ var sel = this.getNative();
791
+
792
+ if ( !sel )
793
+ type = CKEDITOR.SELECTION_NONE;
794
+ else if ( sel.rangeCount == 1 )
795
+ {
796
+ // Check if the actual selection is a control (IMG,
797
+ // TABLE, HR, etc...).
798
+
799
+ var range = sel.getRangeAt(0),
800
+ startContainer = range.startContainer;
801
+
802
+ if ( startContainer == range.endContainer
803
+ && startContainer.nodeType == 1
804
+ && ( range.endOffset - range.startOffset ) == 1
805
+ && styleObjectElements[ startContainer.childNodes[ range.startOffset ].nodeName.toLowerCase() ] )
806
+ {
807
+ type = CKEDITOR.SELECTION_ELEMENT;
808
+ }
809
+ }
810
+
811
+ return ( cache.type = type );
812
+ },
813
+
814
+ /**
815
+ * Retrieves the <code>{@link CKEDITOR.dom.range}</code> instances that represent the current selection.
816
+ * Note: Some browsers return multiple ranges even for a continuous selection. Firefox, for example, returns
817
+ * one range for each table cell when one or more table rows are selected.
818
+ * @function
819
+ * @param {Boolean} [onlyEditables] If set to <code>true</code>, this function retrives editable ranges only.
820
+ * @return {Array} Range instances that represent the current selection.
821
+ * @example
822
+ * var ranges = selection.<strong>getRanges()</strong>;
823
+ * alert( ranges.length );
824
+ */
825
+ getRanges : (function()
826
+ {
827
+ var func = CKEDITOR.env.ie ?
828
+ ( function()
829
+ {
830
+ function getNodeIndex( node ) { return new CKEDITOR.dom.node( node ).getIndex(); }
831
+
832
+ // Finds the container and offset for a specific boundary
833
+ // of an IE range.
834
+ var getBoundaryInformation = function( range, start )
835
+ {
836
+ // Creates a collapsed range at the requested boundary.
837
+ range = range.duplicate();
838
+ range.collapse( start );
839
+
840
+ // Gets the element that encloses the range entirely.
841
+ var parent = range.parentElement(),
842
+ doc = parent.ownerDocument;
843
+
844
+ // Empty parent element, e.g. <i>^</i>
845
+ if ( !parent.hasChildNodes() )
846
+ return { container : parent, offset : 0 };
847
+
848
+ var siblings = parent.children,
849
+ child,
850
+ sibling,
851
+ testRange = range.duplicate(),
852
+ startIndex = 0,
853
+ endIndex = siblings.length - 1,
854
+ index = -1,
855
+ position,
856
+ distance,
857
+ container;
858
+
859
+ // Binary search over all element childs to test the range to see whether
860
+ // range is right on the boundary of one element.
861
+ while ( startIndex <= endIndex )
862
+ {
863
+ index = Math.floor( ( startIndex + endIndex ) / 2 );
864
+ child = siblings[ index ];
865
+ testRange.moveToElementText( child );
866
+ position = testRange.compareEndPoints( 'StartToStart', range );
867
+
868
+ if ( position > 0 )
869
+ endIndex = index - 1;
870
+ else if ( position < 0 )
871
+ startIndex = index + 1;
872
+ else
873
+ {
874
+ // IE9 report wrong measurement with compareEndPoints when range anchors between two BRs.
875
+ // e.g. <p>text<br />^<br /></p> (#7433)
876
+ if ( CKEDITOR.env.ie9Compat && child.tagName == 'BR' )
877
+ {
878
+ // "Fall back" to w3c selection.
879
+ var sel = doc.defaultView.getSelection();
880
+ return { container : sel[ start ? 'anchorNode' : 'focusNode' ],
881
+ offset : sel[ start ? 'anchorOffset' : 'focusOffset' ] };
882
+ }
883
+ else
884
+ return { container : parent, offset : getNodeIndex( child ) };
885
+ }
886
+ }
887
+
888
+ // All childs are text nodes,
889
+ // or to the right hand of test range are all text nodes. (#6992)
890
+ if ( index == -1 || index == siblings.length - 1 && position < 0 )
891
+ {
892
+ // Adapt test range to embrace the entire parent contents.
893
+ testRange.moveToElementText( parent );
894
+ testRange.setEndPoint( 'StartToStart', range );
895
+
896
+ // IE report line break as CRLF with range.text but
897
+ // only LF with textnode.nodeValue, normalize them to avoid
898
+ // breaking character counting logic below. (#3949)
899
+ distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length;
900
+
901
+ siblings = parent.childNodes;
902
+
903
+ // Actual range anchor right beside test range at the boundary of text node.
904
+ if ( !distance )
905
+ {
906
+ child = siblings[ siblings.length - 1 ];
907
+
908
+ if ( child.nodeType != CKEDITOR.NODE_TEXT )
909
+ return { container : parent, offset : siblings.length };
910
+ else
911
+ return { container : child, offset : child.nodeValue.length };
912
+ }
913
+
914
+ // Start the measuring until distance overflows, meanwhile count the text nodes.
915
+ var i = siblings.length;
916
+ while ( distance > 0 && i > 0 )
917
+ {
918
+ sibling = siblings[ --i ];
919
+ if ( sibling.nodeType == CKEDITOR.NODE_TEXT )
920
+ {
921
+ container = sibling;
922
+ distance -= sibling.nodeValue.length;
923
+ }
924
+ }
925
+
926
+ return { container : container, offset : -distance };
927
+ }
928
+ // Test range was one offset beyond OR behind the anchored text node.
929
+ else
930
+ {
931
+ // Adapt one side of test range to the actual range
932
+ // for measuring the offset between them.
933
+ testRange.collapse( position > 0 ? true : false );
934
+ testRange.setEndPoint( position > 0 ? 'StartToStart' : 'EndToStart', range );
935
+
936
+ // IE report line break as CRLF with range.text but
937
+ // only LF with textnode.nodeValue, normalize them to avoid
938
+ // breaking character counting logic below. (#3949)
939
+ distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length;
940
+
941
+ // Actual range anchor right beside test range at the inner boundary of text node.
942
+ if ( !distance )
943
+ return { container : parent, offset : getNodeIndex( child ) + ( position > 0 ? 0 : 1 ) };
944
+
945
+ // Start the measuring until distance overflows, meanwhile count the text nodes.
946
+ while ( distance > 0 )
947
+ {
948
+ try
949
+ {
950
+ sibling = child[ position > 0 ? 'previousSibling' : 'nextSibling' ];
951
+ if ( sibling.nodeType == CKEDITOR.NODE_TEXT )
952
+ {
953
+ distance -= sibling.nodeValue.length;
954
+ container = sibling;
955
+ }
956
+ child = sibling;
957
+ }
958
+ // Measurement in IE could be somtimes wrong because of <select> element. (#4611)
959
+ catch( e )
960
+ {
961
+ return { container : parent, offset : getNodeIndex( child ) };
962
+ }
963
+ }
964
+
965
+ return { container : container, offset : position > 0 ? -distance : container.nodeValue.length + distance };
966
+ }
967
+ };
968
+
969
+ return function()
970
+ {
971
+ // IE doesn't have range support (in the W3C way), so we
972
+ // need to do some magic to transform selections into
973
+ // CKEDITOR.dom.range instances.
974
+
975
+ var sel = this.getNative(),
976
+ nativeRange = sel && sel.createRange(),
977
+ type = this.getType(),
978
+ range;
979
+
980
+ if ( !sel )
981
+ return [];
982
+
983
+ if ( type == CKEDITOR.SELECTION_TEXT )
984
+ {
985
+ range = new CKEDITOR.dom.range( this.document );
986
+
987
+ var boundaryInfo = getBoundaryInformation( nativeRange, true );
988
+ range.setStart( new CKEDITOR.dom.node( boundaryInfo.container ), boundaryInfo.offset );
989
+
990
+ boundaryInfo = getBoundaryInformation( nativeRange );
991
+ range.setEnd( new CKEDITOR.dom.node( boundaryInfo.container ), boundaryInfo.offset );
992
+
993
+ // Correct an invalid IE range case on empty list item. (#5850)
994
+ if ( range.endContainer.getPosition( range.startContainer ) & CKEDITOR.POSITION_PRECEDING
995
+ && range.endOffset <= range.startContainer.getIndex() )
996
+ {
997
+ range.collapse();
998
+ }
999
+
1000
+ return [ range ];
1001
+ }
1002
+ else if ( type == CKEDITOR.SELECTION_ELEMENT )
1003
+ {
1004
+ var retval = [];
1005
+
1006
+ for ( var i = 0 ; i < nativeRange.length ; i++ )
1007
+ {
1008
+ var element = nativeRange.item( i ),
1009
+ parentElement = element.parentNode,
1010
+ j = 0;
1011
+
1012
+ range = new CKEDITOR.dom.range( this.document );
1013
+
1014
+ for (; j < parentElement.childNodes.length && parentElement.childNodes[j] != element ; j++ )
1015
+ { /*jsl:pass*/ }
1016
+
1017
+ range.setStart( new CKEDITOR.dom.node( parentElement ), j );
1018
+ range.setEnd( new CKEDITOR.dom.node( parentElement ), j + 1 );
1019
+ retval.push( range );
1020
+ }
1021
+
1022
+ return retval;
1023
+ }
1024
+
1025
+ return [];
1026
+ };
1027
+ })()
1028
+ :
1029
+ function()
1030
+ {
1031
+
1032
+ // On browsers implementing the W3C range, we simply
1033
+ // tranform the native ranges in CKEDITOR.dom.range
1034
+ // instances.
1035
+
1036
+ var ranges = [],
1037
+ range,
1038
+ doc = this.document,
1039
+ sel = this.getNative();
1040
+
1041
+ if ( !sel )
1042
+ return ranges;
1043
+
1044
+ // On WebKit, it may happen that we'll have no selection
1045
+ // available. We normalize it here by replicating the
1046
+ // behavior of other browsers.
1047
+ if ( !sel.rangeCount )
1048
+ {
1049
+ range = new CKEDITOR.dom.range( doc );
1050
+ range.moveToElementEditStart( doc.getBody() );
1051
+ ranges.push( range );
1052
+ }
1053
+
1054
+ for ( var i = 0 ; i < sel.rangeCount ; i++ )
1055
+ {
1056
+ var nativeRange = sel.getRangeAt( i );
1057
+
1058
+ range = new CKEDITOR.dom.range( doc );
1059
+
1060
+ range.setStart( new CKEDITOR.dom.node( nativeRange.startContainer ), nativeRange.startOffset );
1061
+ range.setEnd( new CKEDITOR.dom.node( nativeRange.endContainer ), nativeRange.endOffset );
1062
+ ranges.push( range );
1063
+ }
1064
+ return ranges;
1065
+ };
1066
+
1067
+ return function( onlyEditables )
1068
+ {
1069
+ var cache = this._.cache;
1070
+ if ( cache.ranges && !onlyEditables )
1071
+ return cache.ranges;
1072
+ else if ( !cache.ranges )
1073
+ cache.ranges = new CKEDITOR.dom.rangeList( func.call( this ) );
1074
+
1075
+ // Split range into multiple by read-only nodes.
1076
+ if ( onlyEditables )
1077
+ {
1078
+ var ranges = cache.ranges;
1079
+ for ( var i = 0; i < ranges.length; i++ )
1080
+ {
1081
+ var range = ranges[ i ];
1082
+
1083
+ // Drop range spans inside one ready-only node.
1084
+ var parent = range.getCommonAncestor();
1085
+ if ( parent.isReadOnly() )
1086
+ ranges.splice( i, 1 );
1087
+
1088
+ if ( range.collapsed )
1089
+ continue;
1090
+
1091
+ // Range may start inside a non-editable element,
1092
+ // replace the range start after it.
1093
+ if ( range.startContainer.isReadOnly() )
1094
+ {
1095
+ var current = range.startContainer;
1096
+ while( current )
1097
+ {
1098
+ if ( current.is( 'body' ) || !current.isReadOnly() )
1099
+ break;
1100
+
1101
+ if ( current.type == CKEDITOR.NODE_ELEMENT
1102
+ && current.getAttribute( 'contentEditable' ) == 'false' )
1103
+ range.setStartAfter( current );
1104
+
1105
+ current = current.getParent();
1106
+ }
1107
+ }
1108
+
1109
+ var startContainer = range.startContainer,
1110
+ endContainer = range.endContainer,
1111
+ startOffset = range.startOffset,
1112
+ endOffset = range.endOffset,
1113
+ walkerRange = range.clone();
1114
+
1115
+ // Enlarge range start/end with text node to avoid walker
1116
+ // being DOM destructive, it doesn't interfere our checking
1117
+ // of elements below as well.
1118
+ if ( startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
1119
+ {
1120
+ if ( startOffset >= startContainer.getLength() )
1121
+ walkerRange.setStartAfter( startContainer );
1122
+ else
1123
+ walkerRange.setStartBefore( startContainer );
1124
+ }
1125
+
1126
+ if ( endContainer && endContainer.type == CKEDITOR.NODE_TEXT )
1127
+ {
1128
+ if ( !endOffset )
1129
+ walkerRange.setEndBefore( endContainer );
1130
+ else
1131
+ walkerRange.setEndAfter( endContainer );
1132
+ }
1133
+
1134
+ // Looking for non-editable element inside the range.
1135
+ var walker = new CKEDITOR.dom.walker( walkerRange );
1136
+ walker.evaluator = function( node )
1137
+ {
1138
+ if ( node.type == CKEDITOR.NODE_ELEMENT
1139
+ && node.isReadOnly() )
1140
+ {
1141
+ var newRange = range.clone();
1142
+ range.setEndBefore( node );
1143
+
1144
+ // Drop collapsed range around read-only elements,
1145
+ // it make sure the range list empty when selecting
1146
+ // only non-editable elements.
1147
+ if ( range.collapsed )
1148
+ ranges.splice( i--, 1 );
1149
+
1150
+ // Avoid creating invalid range.
1151
+ if ( !( node.getPosition( walkerRange.endContainer ) & CKEDITOR.POSITION_CONTAINS ) )
1152
+ {
1153
+ newRange.setStartAfter( node );
1154
+ if ( !newRange.collapsed )
1155
+ ranges.splice( i + 1, 0, newRange );
1156
+ }
1157
+
1158
+ return true;
1159
+ }
1160
+
1161
+ return false;
1162
+ };
1163
+
1164
+ walker.next();
1165
+ }
1166
+ }
1167
+
1168
+ return cache.ranges;
1169
+ };
1170
+ })(),
1171
+
1172
+ /**
1173
+ * Gets the DOM element in which the selection starts.
1174
+ * @returns {CKEDITOR.dom.element} The element at the beginning of the
1175
+ * selection.
1176
+ * @example
1177
+ * var element = editor.getSelection().<strong>getStartElement()</strong>;
1178
+ * alert( element.getName() );
1179
+ */
1180
+ getStartElement : function()
1181
+ {
1182
+ var cache = this._.cache;
1183
+ if ( cache.startElement !== undefined )
1184
+ return cache.startElement;
1185
+
1186
+ var node,
1187
+ sel = this.getNative();
1188
+
1189
+ switch ( this.getType() )
1190
+ {
1191
+ case CKEDITOR.SELECTION_ELEMENT :
1192
+ return this.getSelectedElement();
1193
+
1194
+ case CKEDITOR.SELECTION_TEXT :
1195
+
1196
+ var range = this.getRanges()[0];
1197
+
1198
+ if ( range )
1199
+ {
1200
+ if ( !range.collapsed )
1201
+ {
1202
+ range.optimize();
1203
+
1204
+ // Decrease the range content to exclude particial
1205
+ // selected node on the start which doesn't have
1206
+ // visual impact. ( #3231 )
1207
+ while ( 1 )
1208
+ {
1209
+ var startContainer = range.startContainer,
1210
+ startOffset = range.startOffset;
1211
+ // Limit the fix only to non-block elements.(#3950)
1212
+ if ( startOffset == ( startContainer.getChildCount ?
1213
+ startContainer.getChildCount() : startContainer.getLength() )
1214
+ && !startContainer.isBlockBoundary() )
1215
+ range.setStartAfter( startContainer );
1216
+ else break;
1217
+ }
1218
+
1219
+ node = range.startContainer;
1220
+
1221
+ if ( node.type != CKEDITOR.NODE_ELEMENT )
1222
+ return node.getParent();
1223
+
1224
+ node = node.getChild( range.startOffset );
1225
+
1226
+ if ( !node || node.type != CKEDITOR.NODE_ELEMENT )
1227
+ node = range.startContainer;
1228
+ else
1229
+ {
1230
+ var child = node.getFirst();
1231
+ while ( child && child.type == CKEDITOR.NODE_ELEMENT )
1232
+ {
1233
+ node = child;
1234
+ child = child.getFirst();
1235
+ }
1236
+ }
1237
+ }
1238
+ else
1239
+ {
1240
+ node = range.startContainer;
1241
+ if ( node.type != CKEDITOR.NODE_ELEMENT )
1242
+ node = node.getParent();
1243
+ }
1244
+
1245
+ node = node.$;
1246
+ }
1247
+ }
1248
+
1249
+ return cache.startElement = ( node ? new CKEDITOR.dom.element( node ) : null );
1250
+ },
1251
+
1252
+ /**
1253
+ * Gets the currently selected element.
1254
+ * @returns {CKEDITOR.dom.element} The selected element. Null if no
1255
+ * selection is available or the selection type is not
1256
+ * <code>{@link CKEDITOR.SELECTION_ELEMENT}</code>.
1257
+ * @example
1258
+ * var element = editor.getSelection().<strong>getSelectedElement()</strong>;
1259
+ * alert( element.getName() );
1260
+ */
1261
+ getSelectedElement : function()
1262
+ {
1263
+ var cache = this._.cache;
1264
+ if ( cache.selectedElement !== undefined )
1265
+ return cache.selectedElement;
1266
+
1267
+ var self = this;
1268
+
1269
+ var node = CKEDITOR.tools.tryThese(
1270
+ // Is it native IE control type selection?
1271
+ function()
1272
+ {
1273
+ return self.getNative().createRange().item( 0 );
1274
+ },
1275
+ // If a table or list is fully selected.
1276
+ function()
1277
+ {
1278
+ var root,
1279
+ retval,
1280
+ range = self.getRanges()[ 0 ],
1281
+ ancestor = range.getCommonAncestor( 1, 1 ),
1282
+ tags = { table:1,ul:1,ol:1,dl:1 };
1283
+
1284
+ for ( var t in tags )
1285
+ {
1286
+ if ( ( root = ancestor.getAscendant( t, 1 ) ) )
1287
+ break;
1288
+ }
1289
+
1290
+ if ( root )
1291
+ {
1292
+ // Enlarging the start boundary.
1293
+ var testRange = new CKEDITOR.dom.range( this.document );
1294
+ testRange.setStartAt( root, CKEDITOR.POSITION_AFTER_START );
1295
+ testRange.setEnd( range.startContainer, range.startOffset );
1296
+
1297
+ var enlargeables = CKEDITOR.tools.extend( tags, CKEDITOR.dtd.$listItem, CKEDITOR.dtd.$tableContent ),
1298
+ walker = new CKEDITOR.dom.walker( testRange ),
1299
+ // Check the range is at the inner boundary of the structural element.
1300
+ guard = function( walker, isEnd )
1301
+ {
1302
+ return function( node, isWalkOut )
1303
+ {
1304
+ if ( node.type == CKEDITOR.NODE_TEXT && ( !CKEDITOR.tools.trim( node.getText() ) || node.getParent().data( 'cke-bookmark' ) ) )
1305
+ return true;
1306
+
1307
+ var tag;
1308
+ if ( node.type == CKEDITOR.NODE_ELEMENT )
1309
+ {
1310
+ tag = node.getName();
1311
+
1312
+ // Bypass bogus br at the end of block.
1313
+ if ( tag == 'br' && isEnd && node.equals( node.getParent().getBogus() ) )
1314
+ return true;
1315
+
1316
+ if ( isWalkOut && tag in enlargeables || tag in CKEDITOR.dtd.$removeEmpty )
1317
+ return true;
1318
+ }
1319
+
1320
+ walker.halted = 1;
1321
+ return false;
1322
+ };
1323
+ };
1324
+
1325
+ walker.guard = guard( walker );
1326
+
1327
+ if ( walker.checkBackward() && !walker.halted )
1328
+ {
1329
+ walker = new CKEDITOR.dom.walker( testRange );
1330
+ testRange.setStart( range.endContainer, range.endOffset );
1331
+ testRange.setEndAt( root, CKEDITOR.POSITION_BEFORE_END );
1332
+ walker.guard = guard( walker, 1 );
1333
+ if ( walker.checkForward() && !walker.halted )
1334
+ retval = root.$;
1335
+ }
1336
+ }
1337
+
1338
+ if ( !retval )
1339
+ throw 0;
1340
+
1341
+ return retval;
1342
+ },
1343
+ // Figure it out by checking if there's a single enclosed
1344
+ // node of the range.
1345
+ function()
1346
+ {
1347
+ var range = self.getRanges()[ 0 ],
1348
+ enclosed,
1349
+ selected;
1350
+
1351
+ // Check first any enclosed element, e.g. <ul>[<li><a href="#">item</a></li>]</ul>
1352
+ for ( var i = 2; i && !( ( enclosed = range.getEnclosedNode() )
1353
+ && ( enclosed.type == CKEDITOR.NODE_ELEMENT )
1354
+ && styleObjectElements[ enclosed.getName() ]
1355
+ && ( selected = enclosed ) ); i-- )
1356
+ {
1357
+ // Then check any deep wrapped element, e.g. [<b><i><img /></i></b>]
1358
+ range.shrink( CKEDITOR.SHRINK_ELEMENT );
1359
+ }
1360
+
1361
+ return selected.$;
1362
+ });
1363
+
1364
+ return cache.selectedElement = ( node ? new CKEDITOR.dom.element( node ) : null );
1365
+ },
1366
+
1367
+ /**
1368
+ * Retrieves the text contained within the range. An empty string is returned for non-text selection.
1369
+ * @returns {String} A string of text within the current selection.
1370
+ * @since 3.6.1
1371
+ * @example
1372
+ * var text = editor.getSelection().<strong>getSelectedText()</strong>;
1373
+ * alert( text );
1374
+ */
1375
+ getSelectedText : function()
1376
+ {
1377
+ var cache = this._.cache;
1378
+ if ( cache.selectedText !== undefined )
1379
+ return cache.selectedText;
1380
+
1381
+ var text = '',
1382
+ nativeSel = this.getNative();
1383
+ if ( this.getType() == CKEDITOR.SELECTION_TEXT )
1384
+ text = CKEDITOR.env.ie ? nativeSel.createRange().text : nativeSel.toString();
1385
+
1386
+ return ( cache.selectedText = text );
1387
+ },
1388
+
1389
+ /**
1390
+ * Locks the selection made in the editor in order to make it possible to
1391
+ * manipulate it without browser interference. A locked selection is
1392
+ * cached and remains unchanged until it is released with the <code>#unlock</code>
1393
+ * method.
1394
+ * @example
1395
+ * editor.getSelection().<strong>lock()</strong>;
1396
+ */
1397
+ lock : function()
1398
+ {
1399
+ // Call all cacheable function.
1400
+ this.getRanges();
1401
+ this.getStartElement();
1402
+ this.getSelectedElement();
1403
+ this.getSelectedText();
1404
+
1405
+ // The native selection is not available when locked.
1406
+ this._.cache.nativeSel = {};
1407
+
1408
+ this.isLocked = 1;
1409
+
1410
+ // Save this selection inside the DOM document.
1411
+ this.document.setCustomData( 'cke_locked_selection', this );
1412
+ },
1413
+
1414
+ /**
1415
+ * Unlocks the selection made in the editor and locked with the <code>#lock</code> method.
1416
+ * An unlocked selection is no longer cached and can be changed.
1417
+ * @param {Boolean} [restore] If set to <code>true</code>, the selection is restored back to the selection saved earlier by using the <code>#lock</code> method.
1418
+ * @example
1419
+ * editor.getSelection().<strong>unlock()</strong>;
1420
+ */
1421
+ unlock : function( restore )
1422
+ {
1423
+ var doc = this.document,
1424
+ lockedSelection = doc.getCustomData( 'cke_locked_selection' );
1425
+
1426
+ if ( lockedSelection )
1427
+ {
1428
+ doc.setCustomData( 'cke_locked_selection', null );
1429
+
1430
+ if ( restore )
1431
+ {
1432
+ var selectedElement = lockedSelection.getSelectedElement(),
1433
+ ranges = !selectedElement && lockedSelection.getRanges();
1434
+
1435
+ this.isLocked = 0;
1436
+ this.reset();
1437
+
1438
+ doc.getBody().focus();
1439
+
1440
+ if ( selectedElement )
1441
+ this.selectElement( selectedElement );
1442
+ else
1443
+ this.selectRanges( ranges );
1444
+ }
1445
+ }
1446
+
1447
+ if ( !lockedSelection || !restore )
1448
+ {
1449
+ this.isLocked = 0;
1450
+ this.reset();
1451
+ }
1452
+ },
1453
+
1454
+ /**
1455
+ * Clears the selection cache.
1456
+ * @example
1457
+ * editor.getSelection().<strong>reset()</strong>;
1458
+ */
1459
+ reset : function()
1460
+ {
1461
+ this._.cache = {};
1462
+ },
1463
+
1464
+ /**
1465
+ * Makes the current selection of type <code>{@link CKEDITOR.SELECTION_ELEMENT}</code> by enclosing the specified element.
1466
+ * @param {CKEDITOR.dom.element} element The element to enclose in the selection.
1467
+ * @example
1468
+ * var element = editor.document.getById( 'sampleElement' );
1469
+ * editor.getSelection.<strong>selectElement( element )</strong>;
1470
+ */
1471
+ selectElement : function( element )
1472
+ {
1473
+ if ( this.isLocked )
1474
+ {
1475
+ var range = new CKEDITOR.dom.range( this.document );
1476
+ range.setStartBefore( element );
1477
+ range.setEndAfter( element );
1478
+
1479
+ this._.cache.selectedElement = element;
1480
+ this._.cache.startElement = element;
1481
+ this._.cache.ranges = new CKEDITOR.dom.rangeList( range );
1482
+ this._.cache.type = CKEDITOR.SELECTION_ELEMENT;
1483
+
1484
+ return;
1485
+ }
1486
+
1487
+ range = new CKEDITOR.dom.range( element.getDocument() );
1488
+ range.setStartBefore( element );
1489
+ range.setEndAfter( element );
1490
+ range.select();
1491
+
1492
+ this.document.fire( 'selectionchange' );
1493
+ this.reset();
1494
+
1495
+ },
1496
+
1497
+ /**
1498
+ * Clears the original selection and adds the specified ranges
1499
+ * to the document selection.
1500
+ * @param {Array} ranges An array of <code>{@link CKEDITOR.dom.range}</code> instances representing ranges to be added to the document.
1501
+ * @example
1502
+ * var ranges = new CKEDITOR.dom.range( editor.document );
1503
+ * editor.getSelection().<strong>selectRanges( [ ranges ] )</strong>;
1504
+ */
1505
+ selectRanges : function( ranges )
1506
+ {
1507
+ if ( this.isLocked )
1508
+ {
1509
+ this._.cache.selectedElement = null;
1510
+ this._.cache.startElement = ranges[ 0 ] && ranges[ 0 ].getTouchedStartNode();
1511
+ this._.cache.ranges = new CKEDITOR.dom.rangeList( ranges );
1512
+ this._.cache.type = CKEDITOR.SELECTION_TEXT;
1513
+
1514
+ return;
1515
+ }
1516
+
1517
+ if ( CKEDITOR.env.ie )
1518
+ {
1519
+ if ( ranges.length > 1 )
1520
+ {
1521
+ // IE doesn't accept multiple ranges selection, so we join all into one.
1522
+ var last = ranges[ ranges.length -1 ] ;
1523
+ ranges[ 0 ].setEnd( last.endContainer, last.endOffset );
1524
+ ranges.length = 1;
1525
+ }
1526
+
1527
+ if ( ranges[ 0 ] )
1528
+ ranges[ 0 ].select();
1529
+
1530
+ this.reset();
1531
+ }
1532
+ else
1533
+ {
1534
+ var sel = this.getNative();
1535
+
1536
+ // getNative() returns null if iframe is "display:none" in FF. (#6577)
1537
+ if ( !sel )
1538
+ return;
1539
+
1540
+ if ( ranges.length )
1541
+ {
1542
+ sel.removeAllRanges();
1543
+ // Remove any existing filling char first.
1544
+ CKEDITOR.env.webkit && removeFillingChar( this.document );
1545
+ }
1546
+
1547
+ for ( var i = 0 ; i < ranges.length ; i++ )
1548
+ {
1549
+ // Joining sequential ranges introduced by
1550
+ // readonly elements protection.
1551
+ if ( i < ranges.length -1 )
1552
+ {
1553
+ var left = ranges[ i ], right = ranges[ i +1 ],
1554
+ between = left.clone();
1555
+ between.setStart( left.endContainer, left.endOffset );
1556
+ between.setEnd( right.startContainer, right.startOffset );
1557
+
1558
+ // Don't confused by Firefox adjancent multi-ranges
1559
+ // introduced by table cells selection.
1560
+ if ( !between.collapsed )
1561
+ {
1562
+ between.shrink( CKEDITOR.NODE_ELEMENT, true );
1563
+ var ancestor = between.getCommonAncestor(),
1564
+ enclosed = between.getEnclosedNode();
1565
+
1566
+ // The following cases has to be considered:
1567
+ // 1. <span contenteditable="false">[placeholder]</span>
1568
+ // 2. <input contenteditable="false" type="radio"/> (#6621)
1569
+ if ( ancestor.isReadOnly() || enclosed && enclosed.isReadOnly() )
1570
+ {
1571
+ right.setStart( left.startContainer, left.startOffset );
1572
+ ranges.splice( i--, 1 );
1573
+ continue;
1574
+ }
1575
+ }
1576
+ }
1577
+
1578
+ var range = ranges[ i ];
1579
+ var nativeRange = this.document.$.createRange();
1580
+ var startContainer = range.startContainer;
1581
+
1582
+ // In FF2, if we have a collapsed range, inside an empty
1583
+ // element, we must add something to it otherwise the caret
1584
+ // will not be visible.
1585
+ // In Opera instead, the selection will be moved out of the
1586
+ // element. (#4657)
1587
+ if ( range.collapsed &&
1588
+ ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 ) ) &&
1589
+ startContainer.type == CKEDITOR.NODE_ELEMENT &&
1590
+ !startContainer.getChildCount() )
1591
+ {
1592
+ startContainer.appendText( '' );
1593
+ }
1594
+
1595
+ if ( range.collapsed
1596
+ && CKEDITOR.env.webkit
1597
+ && rangeRequiresFix( range ) )
1598
+ {
1599
+ // Append a zero-width space so WebKit will not try to
1600
+ // move the selection by itself (#1272).
1601
+ var fillingChar = createFillingChar( this.document );
1602
+ range.insertNode( fillingChar ) ;
1603
+
1604
+ var next = fillingChar.getNext();
1605
+
1606
+ // If the filling char is followed by a <br>, whithout
1607
+ // having something before it, it'll not blink.
1608
+ // Let's remove it in this case.
1609
+ if ( next && !fillingChar.getPrevious() && next.type == CKEDITOR.NODE_ELEMENT && next.getName() == 'br' )
1610
+ {
1611
+ removeFillingChar( this.document );
1612
+ range.moveToPosition( next, CKEDITOR.POSITION_BEFORE_START );
1613
+ }
1614
+ else
1615
+ range.moveToPosition( fillingChar, CKEDITOR.POSITION_AFTER_END );
1616
+ }
1617
+
1618
+ nativeRange.setStart( range.startContainer.$, range.startOffset );
1619
+
1620
+ try
1621
+ {
1622
+ nativeRange.setEnd( range.endContainer.$, range.endOffset );
1623
+ }
1624
+ catch ( e )
1625
+ {
1626
+ // There is a bug in Firefox implementation (it would be too easy
1627
+ // otherwise). The new start can't be after the end (W3C says it can).
1628
+ // So, let's create a new range and collapse it to the desired point.
1629
+ if ( e.toString().indexOf( 'NS_ERROR_ILLEGAL_VALUE' ) >= 0 )
1630
+ {
1631
+ range.collapse( 1 );
1632
+ nativeRange.setEnd( range.endContainer.$, range.endOffset );
1633
+ }
1634
+ else
1635
+ throw e;
1636
+ }
1637
+
1638
+ // Select the range.
1639
+ sel.addRange( nativeRange );
1640
+ }
1641
+
1642
+ // Don't miss selection change event for non-IEs.
1643
+ this.document.fire( 'selectionchange' );
1644
+ this.reset();
1645
+ }
1646
+ },
1647
+
1648
+ /**
1649
+ * Creates a bookmark for each range of this selection (from <code>#getRanges</code>)
1650
+ * by calling the <code>{@link CKEDITOR.dom.range.prototype.createBookmark}</code> method,
1651
+ * with extra care taken to avoid interference among those ranges. The arguments
1652
+ * received are the same as with the underlying range method.
1653
+ * @returns {Array} Array of bookmarks for each range.
1654
+ * @example
1655
+ * var bookmarks = editor.getSelection().<strong>createBookmarks()</strong>;
1656
+ */
1657
+ createBookmarks : function( serializable )
1658
+ {
1659
+ return this.getRanges().createBookmarks( serializable );
1660
+ },
1661
+
1662
+ /**
1663
+ * Creates a bookmark for each range of this selection (from <code>#getRanges</code>)
1664
+ * by calling the <code>{@link CKEDITOR.dom.range.prototype.createBookmark2}</code> method,
1665
+ * with extra care taken to avoid interference among those ranges. The arguments
1666
+ * received are the same as with the underlying range method.
1667
+ * @returns {Array} Array of bookmarks for each range.
1668
+ * @example
1669
+ * var bookmarks = editor.getSelection().<strong>createBookmarks2()</strong>;
1670
+ */
1671
+ createBookmarks2 : function( normalized )
1672
+ {
1673
+ return this.getRanges().createBookmarks2( normalized );
1674
+ },
1675
+
1676
+ /**
1677
+ * Selects the virtual ranges denoted by the bookmarks by calling <code>#selectRanges</code>.
1678
+ * @param {Array} bookmarks The bookmarks representing ranges to be selected.
1679
+ * @returns {CKEDITOR.dom.selection} This selection object, after the ranges were selected.
1680
+ * @example
1681
+ * var bookmarks = editor.getSelection().createBookmarks();
1682
+ * editor.getSelection().<strong>selectBookmarks( bookmarks )</strong>;
1683
+ */
1684
+ selectBookmarks : function( bookmarks )
1685
+ {
1686
+ var ranges = [];
1687
+ for ( var i = 0 ; i < bookmarks.length ; i++ )
1688
+ {
1689
+ var range = new CKEDITOR.dom.range( this.document );
1690
+ range.moveToBookmark( bookmarks[i] );
1691
+ ranges.push( range );
1692
+ }
1693
+ this.selectRanges( ranges );
1694
+ return this;
1695
+ },
1696
+
1697
+ /**
1698
+ * Retrieves the common ancestor node of the first range and the last range.
1699
+ * @returns {CKEDITOR.dom.element} The common ancestor of the selection.
1700
+ * @example
1701
+ * var ancestor = editor.getSelection().<strong>getCommonAncestor()</strong>;
1702
+ */
1703
+ getCommonAncestor : function()
1704
+ {
1705
+ var ranges = this.getRanges(),
1706
+ startNode = ranges[ 0 ].startContainer,
1707
+ endNode = ranges[ ranges.length - 1 ].endContainer;
1708
+ return startNode.getCommonAncestor( endNode );
1709
+ },
1710
+
1711
+ /**
1712
+ * Moves the scrollbar to the starting position of the current selection.
1713
+ * @example
1714
+ * editor.getSelection().<strong>scrollIntoView()</strong>;
1715
+ */
1716
+ scrollIntoView : function()
1717
+ {
1718
+ // If we have split the block, adds a temporary span at the
1719
+ // range position and scroll relatively to it.
1720
+ var start = this.getStartElement();
1721
+ start.scrollIntoView();
1722
+ }
1723
+ };
1724
+ })();
1725
+
1726
+ ( function()
1727
+ {
1728
+ var notWhitespaces = CKEDITOR.dom.walker.whitespaces( true ),
1729
+ fillerTextRegex = /\ufeff|\u00a0/,
1730
+ nonCells = { table:1,tbody:1,tr:1 };
1731
+
1732
+ CKEDITOR.dom.range.prototype.select =
1733
+ CKEDITOR.env.ie ?
1734
+ // V2
1735
+ function( forceExpand )
1736
+ {
1737
+ var collapsed = this.collapsed,
1738
+ isStartMarkerAlone, dummySpan, ieRange;
1739
+
1740
+ // Try to make a object selection.
1741
+ var selected = this.getEnclosedNode();
1742
+ if ( selected )
1743
+ {
1744
+ try
1745
+ {
1746
+ ieRange = this.document.$.body.createControlRange();
1747
+ ieRange.addElement( selected.$ );
1748
+ ieRange.select();
1749
+ return;
1750
+ }
1751
+ catch( er ) {}
1752
+ }
1753
+
1754
+ // IE doesn't support selecting the entire table row/cell, move the selection into cells, e.g.
1755
+ // <table><tbody><tr>[<td>cell</b></td>... => <table><tbody><tr><td>[cell</td>...
1756
+ if ( this.startContainer.type == CKEDITOR.NODE_ELEMENT && this.startContainer.getName() in nonCells
1757
+ || this.endContainer.type == CKEDITOR.NODE_ELEMENT && this.endContainer.getName() in nonCells )
1758
+ {
1759
+ this.shrink( CKEDITOR.NODE_ELEMENT, true );
1760
+ }
1761
+
1762
+ var bookmark = this.createBookmark();
1763
+
1764
+ // Create marker tags for the start and end boundaries.
1765
+ var startNode = bookmark.startNode;
1766
+
1767
+ var endNode;
1768
+ if ( !collapsed )
1769
+ endNode = bookmark.endNode;
1770
+
1771
+ // Create the main range which will be used for the selection.
1772
+ ieRange = this.document.$.body.createTextRange();
1773
+
1774
+ // Position the range at the start boundary.
1775
+ ieRange.moveToElementText( startNode.$ );
1776
+ ieRange.moveStart( 'character', 1 );
1777
+
1778
+ if ( endNode )
1779
+ {
1780
+ // Create a tool range for the end.
1781
+ var ieRangeEnd = this.document.$.body.createTextRange();
1782
+
1783
+ // Position the tool range at the end.
1784
+ ieRangeEnd.moveToElementText( endNode.$ );
1785
+
1786
+ // Move the end boundary of the main range to match the tool range.
1787
+ ieRange.setEndPoint( 'EndToEnd', ieRangeEnd );
1788
+ ieRange.moveEnd( 'character', -1 );
1789
+ }
1790
+ else
1791
+ {
1792
+ // The isStartMarkerAlone logic comes from V2. It guarantees that the lines
1793
+ // will expand and that the cursor will be blinking on the right place.
1794
+ // Actually, we are using this flag just to avoid using this hack in all
1795
+ // situations, but just on those needed.
1796
+ var next = startNode.getNext( notWhitespaces );
1797
+ isStartMarkerAlone = ( !( next && next.getText && next.getText().match( fillerTextRegex ) ) // already a filler there?
1798
+ && ( forceExpand || !startNode.hasPrevious() || ( startNode.getPrevious().is && startNode.getPrevious().is( 'br' ) ) ) );
1799
+
1800
+ // Append a temporary <span>&#65279;</span> before the selection.
1801
+ // This is needed to avoid IE destroying selections inside empty
1802
+ // inline elements, like <b></b> (#253).
1803
+ // It is also needed when placing the selection right after an inline
1804
+ // element to avoid the selection moving inside of it.
1805
+ dummySpan = this.document.createElement( 'span' );
1806
+ dummySpan.setHtml( '&#65279;' ); // Zero Width No-Break Space (U+FEFF). See #1359.
1807
+ dummySpan.insertBefore( startNode );
1808
+
1809
+ if ( isStartMarkerAlone )
1810
+ {
1811
+ // To expand empty blocks or line spaces after <br>, we need
1812
+ // instead to have any char, which will be later deleted using the
1813
+ // selection.
1814
+ // \ufeff = Zero Width No-Break Space (U+FEFF). (#1359)
1815
+ this.document.createText( '\ufeff' ).insertBefore( startNode );
1816
+ }
1817
+ }
1818
+
1819
+ // Remove the markers (reset the position, because of the changes in the DOM tree).
1820
+ this.setStartBefore( startNode );
1821
+ startNode.remove();
1822
+
1823
+ if ( collapsed )
1824
+ {
1825
+ if ( isStartMarkerAlone )
1826
+ {
1827
+ // Move the selection start to include the temporary \ufeff.
1828
+ ieRange.moveStart( 'character', -1 );
1829
+
1830
+ ieRange.select();
1831
+
1832
+ // Remove our temporary stuff.
1833
+ this.document.$.selection.clear();
1834
+ }
1835
+ else
1836
+ ieRange.select();
1837
+
1838
+ this.moveToPosition( dummySpan, CKEDITOR.POSITION_BEFORE_START );
1839
+ dummySpan.remove();
1840
+ }
1841
+ else
1842
+ {
1843
+ this.setEndBefore( endNode );
1844
+ endNode.remove();
1845
+ ieRange.select();
1846
+ }
1847
+
1848
+ this.document.fire( 'selectionchange' );
1849
+ }
1850
+ :
1851
+ function()
1852
+ {
1853
+ this.document.getSelection().selectRanges( [ this ] );
1854
+ };
1855
+ } )();