ckeditor-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (646) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/Rakefile +1 -0
  4. data/ckeditor-rails.gemspec +20 -0
  5. data/lib/ckeditor-rails.rb +8 -0
  6. data/lib/ckeditor-rails/engine.rb +6 -0
  7. data/lib/ckeditor-rails/version.rb +5 -0
  8. data/vendor/assets/ckeditor/.htaccess +24 -0
  9. data/vendor/assets/ckeditor/CHANGES.html +1367 -0
  10. data/vendor/assets/ckeditor/INSTALL.html +92 -0
  11. data/vendor/assets/ckeditor/LICENSE.html +1327 -0
  12. data/vendor/assets/ckeditor/_samples/adobeair/application.xml +32 -0
  13. data/vendor/assets/ckeditor/_samples/adobeair/run.bat +9 -0
  14. data/vendor/assets/ckeditor/_samples/adobeair/run.sh +8 -0
  15. data/vendor/assets/ckeditor/_samples/adobeair/sample.html +45 -0
  16. data/vendor/assets/ckeditor/_samples/ajax.html +98 -0
  17. data/vendor/assets/ckeditor/_samples/api.html +192 -0
  18. data/vendor/assets/ckeditor/_samples/api_dialog.html +198 -0
  19. data/vendor/assets/ckeditor/_samples/api_dialog/my_dialog.js +28 -0
  20. data/vendor/assets/ckeditor/_samples/asp/advanced.asp +105 -0
  21. data/vendor/assets/ckeditor/_samples/asp/events.asp +136 -0
  22. data/vendor/assets/ckeditor/_samples/asp/index.html +103 -0
  23. data/vendor/assets/ckeditor/_samples/asp/replace.asp +72 -0
  24. data/vendor/assets/ckeditor/_samples/asp/replaceall.asp +77 -0
  25. data/vendor/assets/ckeditor/_samples/asp/sample_posteddata.asp +46 -0
  26. data/vendor/assets/ckeditor/_samples/asp/standalone.asp +72 -0
  27. data/vendor/assets/ckeditor/_samples/assets/_posteddata.php +59 -0
  28. data/vendor/assets/ckeditor/_samples/assets/output_for_flash.fla +0 -0
  29. data/vendor/assets/ckeditor/_samples/assets/output_for_flash.swf +0 -0
  30. data/vendor/assets/ckeditor/_samples/assets/output_xhtml.css +204 -0
  31. data/vendor/assets/ckeditor/_samples/assets/parsesample.css +70 -0
  32. data/vendor/assets/ckeditor/_samples/assets/swfobject.js +18 -0
  33. data/vendor/assets/ckeditor/_samples/autogrow.html +107 -0
  34. data/vendor/assets/ckeditor/_samples/bbcode.html +125 -0
  35. data/vendor/assets/ckeditor/_samples/devtools.html +94 -0
  36. data/vendor/assets/ckeditor/_samples/divreplace.html +154 -0
  37. data/vendor/assets/ckeditor/_samples/enterkey.html +115 -0
  38. data/vendor/assets/ckeditor/_samples/fullpage.html +82 -0
  39. data/vendor/assets/ckeditor/_samples/index.html +116 -0
  40. data/vendor/assets/ckeditor/_samples/jqueryadapter.html +99 -0
  41. data/vendor/assets/ckeditor/_samples/output_for_flash.html +275 -0
  42. data/vendor/assets/ckeditor/_samples/output_html.html +285 -0
  43. data/vendor/assets/ckeditor/_samples/output_xhtml.html +177 -0
  44. data/vendor/assets/ckeditor/_samples/php/advanced.php +120 -0
  45. data/vendor/assets/ckeditor/_samples/php/events.php +153 -0
  46. data/vendor/assets/ckeditor/_samples/php/index.html +47 -0
  47. data/vendor/assets/ckeditor/_samples/php/replace.php +87 -0
  48. data/vendor/assets/ckeditor/_samples/php/replaceall.php +88 -0
  49. data/vendor/assets/ckeditor/_samples/php/standalone.php +83 -0
  50. data/vendor/assets/ckeditor/_samples/placeholder.html +81 -0
  51. data/vendor/assets/ckeditor/_samples/readonly.html +91 -0
  52. data/vendor/assets/ckeditor/_samples/replacebyclass.html +64 -0
  53. data/vendor/assets/ckeditor/_samples/replacebycode.html +97 -0
  54. data/vendor/assets/ckeditor/_samples/sample.css +163 -0
  55. data/vendor/assets/ckeditor/_samples/sample.js +65 -0
  56. data/vendor/assets/ckeditor/_samples/sample_posteddata.php +21 -0
  57. data/vendor/assets/ckeditor/_samples/sharedspaces.html +153 -0
  58. data/vendor/assets/ckeditor/_samples/skins.html +110 -0
  59. data/vendor/assets/ckeditor/_samples/stylesheetparser.html +93 -0
  60. data/vendor/assets/ckeditor/_samples/tableresize.html +115 -0
  61. data/vendor/assets/ckeditor/_samples/ui_color.html +129 -0
  62. data/vendor/assets/ckeditor/_samples/ui_languages.html +134 -0
  63. data/vendor/assets/ckeditor/_source/adapters/jquery.js +306 -0
  64. data/vendor/assets/ckeditor/_source/core/_bootstrap.js +87 -0
  65. data/vendor/assets/ckeditor/_source/core/ckeditor.js +141 -0
  66. data/vendor/assets/ckeditor/_source/core/ckeditor_base.js +227 -0
  67. data/vendor/assets/ckeditor/_source/core/ckeditor_basic.js +238 -0
  68. data/vendor/assets/ckeditor/_source/core/command.js +209 -0
  69. data/vendor/assets/ckeditor/_source/core/commanddefinition.js +129 -0
  70. data/vendor/assets/ckeditor/_source/core/config.js +431 -0
  71. data/vendor/assets/ckeditor/_source/core/dataprocessor.js +65 -0
  72. data/vendor/assets/ckeditor/_source/core/dom.js +20 -0
  73. data/vendor/assets/ckeditor/_source/core/dom/comment.js +32 -0
  74. data/vendor/assets/ckeditor/_source/core/dom/document.js +251 -0
  75. data/vendor/assets/ckeditor/_source/core/dom/documentfragment.js +49 -0
  76. data/vendor/assets/ckeditor/_source/core/dom/domobject.js +258 -0
  77. data/vendor/assets/ckeditor/_source/core/dom/element.js +1681 -0
  78. data/vendor/assets/ckeditor/_source/core/dom/elementpath.js +119 -0
  79. data/vendor/assets/ckeditor/_source/core/dom/event.js +145 -0
  80. data/vendor/assets/ckeditor/_source/core/dom/node.js +695 -0
  81. data/vendor/assets/ckeditor/_source/core/dom/nodelist.js +26 -0
  82. data/vendor/assets/ckeditor/_source/core/dom/range.js +2032 -0
  83. data/vendor/assets/ckeditor/_source/core/dom/rangelist.js +213 -0
  84. data/vendor/assets/ckeditor/_source/core/dom/text.js +128 -0
  85. data/vendor/assets/ckeditor/_source/core/dom/walker.js +462 -0
  86. data/vendor/assets/ckeditor/_source/core/dom/window.js +96 -0
  87. data/vendor/assets/ckeditor/_source/core/dtd.js +266 -0
  88. data/vendor/assets/ckeditor/_source/core/editor.js +1059 -0
  89. data/vendor/assets/ckeditor/_source/core/editor_basic.js +186 -0
  90. data/vendor/assets/ckeditor/_source/core/env.js +291 -0
  91. data/vendor/assets/ckeditor/_source/core/event.js +342 -0
  92. data/vendor/assets/ckeditor/_source/core/eventInfo.js +120 -0
  93. data/vendor/assets/ckeditor/_source/core/focusmanager.js +152 -0
  94. data/vendor/assets/ckeditor/_source/core/htmlparser.js +224 -0
  95. data/vendor/assets/ckeditor/_source/core/htmlparser/basicwriter.js +145 -0
  96. data/vendor/assets/ckeditor/_source/core/htmlparser/cdata.js +43 -0
  97. data/vendor/assets/ckeditor/_source/core/htmlparser/comment.js +60 -0
  98. data/vendor/assets/ckeditor/_source/core/htmlparser/element.js +308 -0
  99. data/vendor/assets/ckeditor/_source/core/htmlparser/filter.js +288 -0
  100. data/vendor/assets/ckeditor/_source/core/htmlparser/fragment.js +497 -0
  101. data/vendor/assets/ckeditor/_source/core/htmlparser/text.js +55 -0
  102. data/vendor/assets/ckeditor/_source/core/lang.js +157 -0
  103. data/vendor/assets/ckeditor/_source/core/loader.js +240 -0
  104. data/vendor/assets/ckeditor/_source/core/plugindefinition.js +83 -0
  105. data/vendor/assets/ckeditor/_source/core/plugins.js +103 -0
  106. data/vendor/assets/ckeditor/_source/core/resourcemanager.js +238 -0
  107. data/vendor/assets/ckeditor/_source/core/scriptloader.js +180 -0
  108. data/vendor/assets/ckeditor/_source/core/skins.js +184 -0
  109. data/vendor/assets/ckeditor/_source/core/themes.js +19 -0
  110. data/vendor/assets/ckeditor/_source/core/tools.js +763 -0
  111. data/vendor/assets/ckeditor/_source/core/ui.js +128 -0
  112. data/vendor/assets/ckeditor/_source/lang/_languages.js +84 -0
  113. data/vendor/assets/ckeditor/_source/lang/_translationstatus.txt +61 -0
  114. data/vendor/assets/ckeditor/_source/lang/af.js +812 -0
  115. data/vendor/assets/ckeditor/_source/lang/ar.js +812 -0
  116. data/vendor/assets/ckeditor/_source/lang/bg.js +812 -0
  117. data/vendor/assets/ckeditor/_source/lang/bn.js +812 -0
  118. data/vendor/assets/ckeditor/_source/lang/bs.js +812 -0
  119. data/vendor/assets/ckeditor/_source/lang/ca.js +812 -0
  120. data/vendor/assets/ckeditor/_source/lang/cs.js +812 -0
  121. data/vendor/assets/ckeditor/_source/lang/cy.js +812 -0
  122. data/vendor/assets/ckeditor/_source/lang/da.js +812 -0
  123. data/vendor/assets/ckeditor/_source/lang/de.js +812 -0
  124. data/vendor/assets/ckeditor/_source/lang/el.js +812 -0
  125. data/vendor/assets/ckeditor/_source/lang/en-au.js +812 -0
  126. data/vendor/assets/ckeditor/_source/lang/en-ca.js +812 -0
  127. data/vendor/assets/ckeditor/_source/lang/en-gb.js +812 -0
  128. data/vendor/assets/ckeditor/_source/lang/en.js +812 -0
  129. data/vendor/assets/ckeditor/_source/lang/eo.js +812 -0
  130. data/vendor/assets/ckeditor/_source/lang/es.js +812 -0
  131. data/vendor/assets/ckeditor/_source/lang/et.js +812 -0
  132. data/vendor/assets/ckeditor/_source/lang/eu.js +812 -0
  133. data/vendor/assets/ckeditor/_source/lang/fa.js +812 -0
  134. data/vendor/assets/ckeditor/_source/lang/fi.js +812 -0
  135. data/vendor/assets/ckeditor/_source/lang/fo.js +812 -0
  136. data/vendor/assets/ckeditor/_source/lang/fr-ca.js +812 -0
  137. data/vendor/assets/ckeditor/_source/lang/fr.js +812 -0
  138. data/vendor/assets/ckeditor/_source/lang/gl.js +812 -0
  139. data/vendor/assets/ckeditor/_source/lang/gu.js +812 -0
  140. data/vendor/assets/ckeditor/_source/lang/he.js +812 -0
  141. data/vendor/assets/ckeditor/_source/lang/hi.js +812 -0
  142. data/vendor/assets/ckeditor/_source/lang/hr.js +812 -0
  143. data/vendor/assets/ckeditor/_source/lang/hu.js +812 -0
  144. data/vendor/assets/ckeditor/_source/lang/is.js +812 -0
  145. data/vendor/assets/ckeditor/_source/lang/it.js +812 -0
  146. data/vendor/assets/ckeditor/_source/lang/ja.js +812 -0
  147. data/vendor/assets/ckeditor/_source/lang/ka.js +812 -0
  148. data/vendor/assets/ckeditor/_source/lang/km.js +812 -0
  149. data/vendor/assets/ckeditor/_source/lang/ko.js +812 -0
  150. data/vendor/assets/ckeditor/_source/lang/lt.js +812 -0
  151. data/vendor/assets/ckeditor/_source/lang/lv.js +812 -0
  152. data/vendor/assets/ckeditor/_source/lang/mn.js +812 -0
  153. data/vendor/assets/ckeditor/_source/lang/ms.js +812 -0
  154. data/vendor/assets/ckeditor/_source/lang/nb.js +812 -0
  155. data/vendor/assets/ckeditor/_source/lang/nl.js +812 -0
  156. data/vendor/assets/ckeditor/_source/lang/no.js +812 -0
  157. data/vendor/assets/ckeditor/_source/lang/pl.js +812 -0
  158. data/vendor/assets/ckeditor/_source/lang/pt-br.js +811 -0
  159. data/vendor/assets/ckeditor/_source/lang/pt.js +812 -0
  160. data/vendor/assets/ckeditor/_source/lang/ro.js +812 -0
  161. data/vendor/assets/ckeditor/_source/lang/ru.js +812 -0
  162. data/vendor/assets/ckeditor/_source/lang/sk.js +812 -0
  163. data/vendor/assets/ckeditor/_source/lang/sl.js +812 -0
  164. data/vendor/assets/ckeditor/_source/lang/sr-latn.js +812 -0
  165. data/vendor/assets/ckeditor/_source/lang/sr.js +812 -0
  166. data/vendor/assets/ckeditor/_source/lang/sv.js +811 -0
  167. data/vendor/assets/ckeditor/_source/lang/th.js +812 -0
  168. data/vendor/assets/ckeditor/_source/lang/tr.js +811 -0
  169. data/vendor/assets/ckeditor/_source/lang/uk.js +812 -0
  170. data/vendor/assets/ckeditor/_source/lang/vi.js +812 -0
  171. data/vendor/assets/ckeditor/_source/lang/zh-cn.js +812 -0
  172. data/vendor/assets/ckeditor/_source/lang/zh.js +812 -0
  173. data/vendor/assets/ckeditor/_source/plugins/a11yhelp/dialogs/a11yhelp.js +222 -0
  174. data/vendor/assets/ckeditor/_source/plugins/a11yhelp/lang/en.js +108 -0
  175. data/vendor/assets/ckeditor/_source/plugins/a11yhelp/lang/he.js +216 -0
  176. data/vendor/assets/ckeditor/_source/plugins/a11yhelp/plugin.js +47 -0
  177. data/vendor/assets/ckeditor/_source/plugins/about/dialogs/about.js +76 -0
  178. data/vendor/assets/ckeditor/_source/plugins/about/dialogs/logo_ckeditor.png +0 -0
  179. data/vendor/assets/ckeditor/_source/plugins/about/plugin.js +24 -0
  180. data/vendor/assets/ckeditor/_source/plugins/adobeair/plugin.js +228 -0
  181. data/vendor/assets/ckeditor/_source/plugins/ajax/plugin.js +152 -0
  182. data/vendor/assets/ckeditor/_source/plugins/autogrow/plugin.js +88 -0
  183. data/vendor/assets/ckeditor/_source/plugins/basicstyles/plugin.js +101 -0
  184. data/vendor/assets/ckeditor/_source/plugins/bbcode/plugin.js +931 -0
  185. data/vendor/assets/ckeditor/_source/plugins/bidi/plugin.js +334 -0
  186. data/vendor/assets/ckeditor/_source/plugins/blockquote/plugin.js +305 -0
  187. data/vendor/assets/ckeditor/_source/plugins/button/plugin.js +290 -0
  188. data/vendor/assets/ckeditor/_source/plugins/clipboard/dialogs/paste.js +223 -0
  189. data/vendor/assets/ckeditor/_source/plugins/clipboard/plugin.js +453 -0
  190. data/vendor/assets/ckeditor/_source/plugins/colorbutton/plugin.js +294 -0
  191. data/vendor/assets/ckeditor/_source/plugins/colordialog/dialogs/colordialog.js +340 -0
  192. data/vendor/assets/ckeditor/_source/plugins/colordialog/plugin.js +15 -0
  193. data/vendor/assets/ckeditor/_source/plugins/contextmenu/plugin.js +177 -0
  194. data/vendor/assets/ckeditor/_source/plugins/devtools/lang/en.js +16 -0
  195. data/vendor/assets/ckeditor/_source/plugins/devtools/plugin.js +173 -0
  196. data/vendor/assets/ckeditor/_source/plugins/dialog/dialogDefinition.js +1166 -0
  197. data/vendor/assets/ckeditor/_source/plugins/dialog/plugin.js +3289 -0
  198. data/vendor/assets/ckeditor/_source/plugins/dialogadvtab/plugin.js +207 -0
  199. data/vendor/assets/ckeditor/_source/plugins/dialogui/plugin.js +1541 -0
  200. data/vendor/assets/ckeditor/_source/plugins/div/dialogs/div.js +535 -0
  201. data/vendor/assets/ckeditor/_source/plugins/div/plugin.js +121 -0
  202. data/vendor/assets/ckeditor/_source/plugins/docprops/dialogs/docprops.js +686 -0
  203. data/vendor/assets/ckeditor/_source/plugins/docprops/plugin.js +22 -0
  204. data/vendor/assets/ckeditor/_source/plugins/domiterator/plugin.js +361 -0
  205. data/vendor/assets/ckeditor/_source/plugins/editingblock/plugin.js +275 -0
  206. data/vendor/assets/ckeditor/_source/plugins/elementspath/plugin.js +218 -0
  207. data/vendor/assets/ckeditor/_source/plugins/enterkey/plugin.js +413 -0
  208. data/vendor/assets/ckeditor/_source/plugins/entities/plugin.js +250 -0
  209. data/vendor/assets/ckeditor/_source/plugins/fakeobjects/plugin.js +175 -0
  210. data/vendor/assets/ckeditor/_source/plugins/filebrowser/plugin.js +524 -0
  211. data/vendor/assets/ckeditor/_source/plugins/find/dialogs/find.js +903 -0
  212. data/vendor/assets/ckeditor/_source/plugins/find/plugin.js +47 -0
  213. data/vendor/assets/ckeditor/_source/plugins/flash/dialogs/flash.js +673 -0
  214. data/vendor/assets/ckeditor/_source/plugins/flash/images/placeholder.png +0 -0
  215. data/vendor/assets/ckeditor/_source/plugins/flash/plugin.js +154 -0
  216. data/vendor/assets/ckeditor/_source/plugins/floatpanel/plugin.js +428 -0
  217. data/vendor/assets/ckeditor/_source/plugins/font/plugin.js +234 -0
  218. data/vendor/assets/ckeditor/_source/plugins/format/plugin.js +197 -0
  219. data/vendor/assets/ckeditor/_source/plugins/forms/dialogs/button.js +118 -0
  220. data/vendor/assets/ckeditor/_source/plugins/forms/dialogs/checkbox.js +153 -0
  221. data/vendor/assets/ckeditor/_source/plugins/forms/dialogs/form.js +177 -0
  222. data/vendor/assets/ckeditor/_source/plugins/forms/dialogs/hiddenfield.js +100 -0
  223. data/vendor/assets/ckeditor/_source/plugins/forms/dialogs/radio.js +135 -0
  224. data/vendor/assets/ckeditor/_source/plugins/forms/dialogs/select.js +558 -0
  225. data/vendor/assets/ckeditor/_source/plugins/forms/dialogs/textarea.js +114 -0
  226. data/vendor/assets/ckeditor/_source/plugins/forms/dialogs/textfield.js +199 -0
  227. data/vendor/assets/ckeditor/_source/plugins/forms/images/hiddenfield.gif +0 -0
  228. data/vendor/assets/ckeditor/_source/plugins/forms/plugin.js +288 -0
  229. data/vendor/assets/ckeditor/_source/plugins/horizontalrule/plugin.js +48 -0
  230. data/vendor/assets/ckeditor/_source/plugins/htmldataprocessor/plugin.js +595 -0
  231. data/vendor/assets/ckeditor/_source/plugins/htmlwriter/plugin.js +319 -0
  232. data/vendor/assets/ckeditor/_source/plugins/iframe/dialogs/iframe.js +229 -0
  233. data/vendor/assets/ckeditor/_source/plugins/iframe/images/placeholder.png +0 -0
  234. data/vendor/assets/ckeditor/_source/plugins/iframe/plugin.js +87 -0
  235. data/vendor/assets/ckeditor/_source/plugins/iframedialog/plugin.js +188 -0
  236. data/vendor/assets/ckeditor/_source/plugins/image/dialogs/image.js +1406 -0
  237. data/vendor/assets/ckeditor/_source/plugins/image/plugin.js +81 -0
  238. data/vendor/assets/ckeditor/_source/plugins/indent/plugin.js +461 -0
  239. data/vendor/assets/ckeditor/_source/plugins/justify/plugin.js +253 -0
  240. data/vendor/assets/ckeditor/_source/plugins/keystrokes/plugin.js +225 -0
  241. data/vendor/assets/ckeditor/_source/plugins/link/dialogs/anchor.js +144 -0
  242. data/vendor/assets/ckeditor/_source/plugins/link/dialogs/link.js +1424 -0
  243. data/vendor/assets/ckeditor/_source/plugins/link/images/anchor.gif +0 -0
  244. data/vendor/assets/ckeditor/_source/plugins/link/plugin.js +374 -0
  245. data/vendor/assets/ckeditor/_source/plugins/list/plugin.js +734 -0
  246. data/vendor/assets/ckeditor/_source/plugins/listblock/plugin.js +268 -0
  247. data/vendor/assets/ckeditor/_source/plugins/liststyle/dialogs/liststyle.js +225 -0
  248. data/vendor/assets/ckeditor/_source/plugins/liststyle/plugin.js +66 -0
  249. data/vendor/assets/ckeditor/_source/plugins/maximize/plugin.js +352 -0
  250. data/vendor/assets/ckeditor/_source/plugins/menu/plugin.js +541 -0
  251. data/vendor/assets/ckeditor/_source/plugins/menubutton/plugin.js +98 -0
  252. data/vendor/assets/ckeditor/_source/plugins/newpage/plugin.js +54 -0
  253. data/vendor/assets/ckeditor/_source/plugins/pagebreak/images/pagebreak.gif +0 -0
  254. data/vendor/assets/ckeditor/_source/plugins/pagebreak/plugin.js +164 -0
  255. data/vendor/assets/ckeditor/_source/plugins/panel/plugin.js +403 -0
  256. data/vendor/assets/ckeditor/_source/plugins/panelbutton/plugin.js +144 -0
  257. data/vendor/assets/ckeditor/_source/plugins/pastefromword/filter/default.js +1367 -0
  258. data/vendor/assets/ckeditor/_source/plugins/pastefromword/plugin.js +141 -0
  259. data/vendor/assets/ckeditor/_source/plugins/pastetext/dialogs/pastetext.js +67 -0
  260. data/vendor/assets/ckeditor/_source/plugins/pastetext/plugin.js +98 -0
  261. data/vendor/assets/ckeditor/_source/plugins/placeholder/dialogs/placeholder.js +71 -0
  262. data/vendor/assets/ckeditor/_source/plugins/placeholder/lang/en.js +16 -0
  263. data/vendor/assets/ckeditor/_source/plugins/placeholder/lang/he.js +16 -0
  264. data/vendor/assets/ckeditor/_source/plugins/placeholder/placeholder.gif +0 -0
  265. data/vendor/assets/ckeditor/_source/plugins/placeholder/plugin.js +171 -0
  266. data/vendor/assets/ckeditor/_source/plugins/popup/plugin.js +64 -0
  267. data/vendor/assets/ckeditor/_source/plugins/preview/plugin.js +109 -0
  268. data/vendor/assets/ckeditor/_source/plugins/print/plugin.js +42 -0
  269. data/vendor/assets/ckeditor/_source/plugins/removeformat/plugin.js +185 -0
  270. data/vendor/assets/ckeditor/_source/plugins/resize/plugin.js +168 -0
  271. data/vendor/assets/ckeditor/_source/plugins/richcombo/plugin.js +381 -0
  272. data/vendor/assets/ckeditor/_source/plugins/save/plugin.js +56 -0
  273. data/vendor/assets/ckeditor/_source/plugins/scayt/dialogs/options.js +537 -0
  274. data/vendor/assets/ckeditor/_source/plugins/scayt/dialogs/toolbar.css +71 -0
  275. data/vendor/assets/ckeditor/_source/plugins/scayt/plugin.js +964 -0
  276. data/vendor/assets/ckeditor/_source/plugins/selection/plugin.js +1601 -0
  277. data/vendor/assets/ckeditor/_source/plugins/showblocks/images/block_address.png +0 -0
  278. data/vendor/assets/ckeditor/_source/plugins/showblocks/images/block_blockquote.png +0 -0
  279. data/vendor/assets/ckeditor/_source/plugins/showblocks/images/block_div.png +0 -0
  280. data/vendor/assets/ckeditor/_source/plugins/showblocks/images/block_h1.png +0 -0
  281. data/vendor/assets/ckeditor/_source/plugins/showblocks/images/block_h2.png +0 -0
  282. data/vendor/assets/ckeditor/_source/plugins/showblocks/images/block_h3.png +0 -0
  283. data/vendor/assets/ckeditor/_source/plugins/showblocks/images/block_h4.png +0 -0
  284. data/vendor/assets/ckeditor/_source/plugins/showblocks/images/block_h5.png +0 -0
  285. data/vendor/assets/ckeditor/_source/plugins/showblocks/images/block_h6.png +0 -0
  286. data/vendor/assets/ckeditor/_source/plugins/showblocks/images/block_p.png +0 -0
  287. data/vendor/assets/ckeditor/_source/plugins/showblocks/images/block_pre.png +0 -0
  288. data/vendor/assets/ckeditor/_source/plugins/showblocks/plugin.js +160 -0
  289. data/vendor/assets/ckeditor/_source/plugins/showborders/plugin.js +207 -0
  290. data/vendor/assets/ckeditor/_source/plugins/smiley/dialogs/smiley.js +224 -0
  291. data/vendor/assets/ckeditor/_source/plugins/smiley/images/angel_smile.gif +0 -0
  292. data/vendor/assets/ckeditor/_source/plugins/smiley/images/angry_smile.gif +0 -0
  293. data/vendor/assets/ckeditor/_source/plugins/smiley/images/broken_heart.gif +0 -0
  294. data/vendor/assets/ckeditor/_source/plugins/smiley/images/confused_smile.gif +0 -0
  295. data/vendor/assets/ckeditor/_source/plugins/smiley/images/cry_smile.gif +0 -0
  296. data/vendor/assets/ckeditor/_source/plugins/smiley/images/devil_smile.gif +0 -0
  297. data/vendor/assets/ckeditor/_source/plugins/smiley/images/embaressed_smile.gif +0 -0
  298. data/vendor/assets/ckeditor/_source/plugins/smiley/images/envelope.gif +0 -0
  299. data/vendor/assets/ckeditor/_source/plugins/smiley/images/heart.gif +0 -0
  300. data/vendor/assets/ckeditor/_source/plugins/smiley/images/kiss.gif +0 -0
  301. data/vendor/assets/ckeditor/_source/plugins/smiley/images/lightbulb.gif +0 -0
  302. data/vendor/assets/ckeditor/_source/plugins/smiley/images/omg_smile.gif +0 -0
  303. data/vendor/assets/ckeditor/_source/plugins/smiley/images/regular_smile.gif +0 -0
  304. data/vendor/assets/ckeditor/_source/plugins/smiley/images/sad_smile.gif +0 -0
  305. data/vendor/assets/ckeditor/_source/plugins/smiley/images/shades_smile.gif +0 -0
  306. data/vendor/assets/ckeditor/_source/plugins/smiley/images/teeth_smile.gif +0 -0
  307. data/vendor/assets/ckeditor/_source/plugins/smiley/images/thumbs_down.gif +0 -0
  308. data/vendor/assets/ckeditor/_source/plugins/smiley/images/thumbs_up.gif +0 -0
  309. data/vendor/assets/ckeditor/_source/plugins/smiley/images/tounge_smile.gif +0 -0
  310. data/vendor/assets/ckeditor/_source/plugins/smiley/images/whatchutalkingabout_smile.gif +0 -0
  311. data/vendor/assets/ckeditor/_source/plugins/smiley/images/wink_smile.gif +0 -0
  312. data/vendor/assets/ckeditor/_source/plugins/smiley/plugin.js +94 -0
  313. data/vendor/assets/ckeditor/_source/plugins/sourcearea/plugin.js +209 -0
  314. data/vendor/assets/ckeditor/_source/plugins/specialchar/dialogs/specialchar.js +350 -0
  315. data/vendor/assets/ckeditor/_source/plugins/specialchar/lang/en.js +89 -0
  316. data/vendor/assets/ckeditor/_source/plugins/specialchar/plugin.js +70 -0
  317. data/vendor/assets/ckeditor/_source/plugins/styles/plugin.js +1696 -0
  318. data/vendor/assets/ckeditor/_source/plugins/styles/styles/default.js +88 -0
  319. data/vendor/assets/ckeditor/_source/plugins/stylescombo/plugin.js +218 -0
  320. data/vendor/assets/ckeditor/_source/plugins/stylesheetparser/plugin.js +148 -0
  321. data/vendor/assets/ckeditor/_source/plugins/tab/plugin.js +367 -0
  322. data/vendor/assets/ckeditor/_source/plugins/table/dialogs/table.js +602 -0
  323. data/vendor/assets/ckeditor/_source/plugins/table/plugin.js +78 -0
  324. data/vendor/assets/ckeditor/_source/plugins/tableresize/plugin.js +443 -0
  325. data/vendor/assets/ckeditor/_source/plugins/tabletools/dialogs/tableCell.js +525 -0
  326. data/vendor/assets/ckeditor/_source/plugins/tabletools/plugin.js +1194 -0
  327. data/vendor/assets/ckeditor/_source/plugins/templates/dialogs/templates.js +234 -0
  328. data/vendor/assets/ckeditor/_source/plugins/templates/plugin.js +99 -0
  329. data/vendor/assets/ckeditor/_source/plugins/templates/templates/default.js +94 -0
  330. data/vendor/assets/ckeditor/_source/plugins/templates/templates/images/template1.gif +0 -0
  331. data/vendor/assets/ckeditor/_source/plugins/templates/templates/images/template2.gif +0 -0
  332. data/vendor/assets/ckeditor/_source/plugins/templates/templates/images/template3.gif +0 -0
  333. data/vendor/assets/ckeditor/_source/plugins/toolbar/plugin.js +545 -0
  334. data/vendor/assets/ckeditor/_source/plugins/uicolor/dialogs/uicolor.js +205 -0
  335. data/vendor/assets/ckeditor/_source/plugins/uicolor/lang/en.js +15 -0
  336. data/vendor/assets/ckeditor/_source/plugins/uicolor/lang/he.js +15 -0
  337. data/vendor/assets/ckeditor/_source/plugins/uicolor/plugin.js +37 -0
  338. data/vendor/assets/ckeditor/_source/plugins/uicolor/uicolor.gif +0 -0
  339. data/vendor/assets/ckeditor/_source/plugins/uicolor/yui/assets/hue_bg.png +0 -0
  340. data/vendor/assets/ckeditor/_source/plugins/uicolor/yui/assets/hue_thumb.png +0 -0
  341. data/vendor/assets/ckeditor/_source/plugins/uicolor/yui/assets/picker_mask.png +0 -0
  342. data/vendor/assets/ckeditor/_source/plugins/uicolor/yui/assets/picker_thumb.png +0 -0
  343. data/vendor/assets/ckeditor/_source/plugins/uicolor/yui/assets/yui.css +15 -0
  344. data/vendor/assets/ckeditor/_source/plugins/uicolor/yui/yui.js +71 -0
  345. data/vendor/assets/ckeditor/_source/plugins/undo/plugin.js +580 -0
  346. data/vendor/assets/ckeditor/_source/plugins/wsc/dialogs/ciframe.html +49 -0
  347. data/vendor/assets/ckeditor/_source/plugins/wsc/dialogs/tmpFrameset.html +52 -0
  348. data/vendor/assets/ckeditor/_source/plugins/wsc/dialogs/wsc.css +82 -0
  349. data/vendor/assets/ckeditor/_source/plugins/wsc/dialogs/wsc.js +192 -0
  350. data/vendor/assets/ckeditor/_source/plugins/wsc/plugin.js +33 -0
  351. data/vendor/assets/ckeditor/_source/plugins/wysiwygarea/plugin.js +1351 -0
  352. data/vendor/assets/ckeditor/_source/plugins/xml/plugin.js +170 -0
  353. data/vendor/assets/ckeditor/_source/skins/kama/dialog.css +943 -0
  354. data/vendor/assets/ckeditor/_source/skins/kama/editor.css +25 -0
  355. data/vendor/assets/ckeditor/_source/skins/kama/elementspath.css +73 -0
  356. data/vendor/assets/ckeditor/_source/skins/kama/icons.css +366 -0
  357. data/vendor/assets/ckeditor/_source/skins/kama/icons.png +0 -0
  358. data/vendor/assets/ckeditor/_source/skins/kama/icons_rtl.png +0 -0
  359. data/vendor/assets/ckeditor/_source/skins/kama/images/dialog_sides.gif +0 -0
  360. data/vendor/assets/ckeditor/_source/skins/kama/images/dialog_sides.png +0 -0
  361. data/vendor/assets/ckeditor/_source/skins/kama/images/dialog_sides_rtl.png +0 -0
  362. data/vendor/assets/ckeditor/_source/skins/kama/images/mini.gif +0 -0
  363. data/vendor/assets/ckeditor/_source/skins/kama/images/noimage.png +0 -0
  364. data/vendor/assets/ckeditor/_source/skins/kama/images/sprites.png +0 -0
  365. data/vendor/assets/ckeditor/_source/skins/kama/images/sprites_ie6.png +0 -0
  366. data/vendor/assets/ckeditor/_source/skins/kama/images/toolbar_start.gif +0 -0
  367. data/vendor/assets/ckeditor/_source/skins/kama/mainui.css +203 -0
  368. data/vendor/assets/ckeditor/_source/skins/kama/menu.css +232 -0
  369. data/vendor/assets/ckeditor/_source/skins/kama/panel.css +217 -0
  370. data/vendor/assets/ckeditor/_source/skins/kama/presets.css +49 -0
  371. data/vendor/assets/ckeditor/_source/skins/kama/reset.css +84 -0
  372. data/vendor/assets/ckeditor/_source/skins/kama/richcombo.css +287 -0
  373. data/vendor/assets/ckeditor/_source/skins/kama/skin.js +236 -0
  374. data/vendor/assets/ckeditor/_source/skins/kama/templates.css +88 -0
  375. data/vendor/assets/ckeditor/_source/skins/kama/toolbar.css +407 -0
  376. data/vendor/assets/ckeditor/_source/skins/office2003/dialog.css +844 -0
  377. data/vendor/assets/ckeditor/_source/skins/office2003/editor.css +25 -0
  378. data/vendor/assets/ckeditor/_source/skins/office2003/elementspath.css +74 -0
  379. data/vendor/assets/ckeditor/_source/skins/office2003/icons.css +363 -0
  380. data/vendor/assets/ckeditor/_source/skins/office2003/icons.png +0 -0
  381. data/vendor/assets/ckeditor/_source/skins/office2003/icons_rtl.png +0 -0
  382. data/vendor/assets/ckeditor/_source/skins/office2003/images/dialog_sides.gif +0 -0
  383. data/vendor/assets/ckeditor/_source/skins/office2003/images/dialog_sides.png +0 -0
  384. data/vendor/assets/ckeditor/_source/skins/office2003/images/dialog_sides_rtl.png +0 -0
  385. data/vendor/assets/ckeditor/_source/skins/office2003/images/mini.gif +0 -0
  386. data/vendor/assets/ckeditor/_source/skins/office2003/images/noimage.png +0 -0
  387. data/vendor/assets/ckeditor/_source/skins/office2003/images/sprites.png +0 -0
  388. data/vendor/assets/ckeditor/_source/skins/office2003/images/sprites_ie6.png +0 -0
  389. data/vendor/assets/ckeditor/_source/skins/office2003/mainui.css +153 -0
  390. data/vendor/assets/ckeditor/_source/skins/office2003/menu.css +229 -0
  391. data/vendor/assets/ckeditor/_source/skins/office2003/panel.css +212 -0
  392. data/vendor/assets/ckeditor/_source/skins/office2003/presets.css +49 -0
  393. data/vendor/assets/ckeditor/_source/skins/office2003/reset.css +84 -0
  394. data/vendor/assets/ckeditor/_source/skins/office2003/richcombo.css +309 -0
  395. data/vendor/assets/ckeditor/_source/skins/office2003/skin.js +74 -0
  396. data/vendor/assets/ckeditor/_source/skins/office2003/templates.css +87 -0
  397. data/vendor/assets/ckeditor/_source/skins/office2003/toolbar.css +522 -0
  398. data/vendor/assets/ckeditor/_source/skins/v2/dialog.css +861 -0
  399. data/vendor/assets/ckeditor/_source/skins/v2/editor.css +25 -0
  400. data/vendor/assets/ckeditor/_source/skins/v2/elementspath.css +74 -0
  401. data/vendor/assets/ckeditor/_source/skins/v2/icons.css +363 -0
  402. data/vendor/assets/ckeditor/_source/skins/v2/icons.png +0 -0
  403. data/vendor/assets/ckeditor/_source/skins/v2/icons_rtl.png +0 -0
  404. data/vendor/assets/ckeditor/_source/skins/v2/images/dialog_sides.gif +0 -0
  405. data/vendor/assets/ckeditor/_source/skins/v2/images/dialog_sides.png +0 -0
  406. data/vendor/assets/ckeditor/_source/skins/v2/images/dialog_sides_rtl.png +0 -0
  407. data/vendor/assets/ckeditor/_source/skins/v2/images/mini.gif +0 -0
  408. data/vendor/assets/ckeditor/_source/skins/v2/images/noimage.png +0 -0
  409. data/vendor/assets/ckeditor/_source/skins/v2/images/sprites.png +0 -0
  410. data/vendor/assets/ckeditor/_source/skins/v2/images/sprites_ie6.png +0 -0
  411. data/vendor/assets/ckeditor/_source/skins/v2/images/toolbar_start.gif +0 -0
  412. data/vendor/assets/ckeditor/_source/skins/v2/mainui.css +162 -0
  413. data/vendor/assets/ckeditor/_source/skins/v2/menu.css +232 -0
  414. data/vendor/assets/ckeditor/_source/skins/v2/panel.css +212 -0
  415. data/vendor/assets/ckeditor/_source/skins/v2/presets.css +50 -0
  416. data/vendor/assets/ckeditor/_source/skins/v2/reset.css +84 -0
  417. data/vendor/assets/ckeditor/_source/skins/v2/richcombo.css +302 -0
  418. data/vendor/assets/ckeditor/_source/skins/v2/skin.js +70 -0
  419. data/vendor/assets/ckeditor/_source/skins/v2/templates.css +87 -0
  420. data/vendor/assets/ckeditor/_source/skins/v2/toolbar.css +465 -0
  421. data/vendor/assets/ckeditor/_source/themes/default/theme.js +395 -0
  422. data/vendor/assets/ckeditor/adapters/jquery.js +6 -0
  423. data/vendor/assets/ckeditor/ckeditor.asp +955 -0
  424. data/vendor/assets/ckeditor/ckeditor.js +147 -0
  425. data/vendor/assets/ckeditor/ckeditor.pack +211 -0
  426. data/vendor/assets/ckeditor/ckeditor.php +29 -0
  427. data/vendor/assets/ckeditor/ckeditor_basic.js +8 -0
  428. data/vendor/assets/ckeditor/ckeditor_basic_source.js +20 -0
  429. data/vendor/assets/ckeditor/ckeditor_php4.php +566 -0
  430. data/vendor/assets/ckeditor/ckeditor_php5.php +556 -0
  431. data/vendor/assets/ckeditor/ckeditor_source.js +25 -0
  432. data/vendor/assets/ckeditor/config.js +11 -0
  433. data/vendor/assets/ckeditor/contents.css +25 -0
  434. data/vendor/assets/ckeditor/images/spacer.gif +0 -0
  435. data/vendor/assets/ckeditor/lang/_languages.js +6 -0
  436. data/vendor/assets/ckeditor/lang/_translationstatus.txt +61 -0
  437. data/vendor/assets/ckeditor/lang/af.js +6 -0
  438. data/vendor/assets/ckeditor/lang/ar.js +6 -0
  439. data/vendor/assets/ckeditor/lang/bg.js +6 -0
  440. data/vendor/assets/ckeditor/lang/bn.js +6 -0
  441. data/vendor/assets/ckeditor/lang/bs.js +6 -0
  442. data/vendor/assets/ckeditor/lang/ca.js +6 -0
  443. data/vendor/assets/ckeditor/lang/cs.js +6 -0
  444. data/vendor/assets/ckeditor/lang/cy.js +6 -0
  445. data/vendor/assets/ckeditor/lang/da.js +6 -0
  446. data/vendor/assets/ckeditor/lang/de.js +6 -0
  447. data/vendor/assets/ckeditor/lang/el.js +6 -0
  448. data/vendor/assets/ckeditor/lang/en-au.js +6 -0
  449. data/vendor/assets/ckeditor/lang/en-ca.js +6 -0
  450. data/vendor/assets/ckeditor/lang/en-gb.js +6 -0
  451. data/vendor/assets/ckeditor/lang/en.js +6 -0
  452. data/vendor/assets/ckeditor/lang/eo.js +6 -0
  453. data/vendor/assets/ckeditor/lang/es.js +6 -0
  454. data/vendor/assets/ckeditor/lang/et.js +6 -0
  455. data/vendor/assets/ckeditor/lang/eu.js +6 -0
  456. data/vendor/assets/ckeditor/lang/fa.js +6 -0
  457. data/vendor/assets/ckeditor/lang/fi.js +6 -0
  458. data/vendor/assets/ckeditor/lang/fo.js +6 -0
  459. data/vendor/assets/ckeditor/lang/fr-ca.js +6 -0
  460. data/vendor/assets/ckeditor/lang/fr.js +6 -0
  461. data/vendor/assets/ckeditor/lang/gl.js +6 -0
  462. data/vendor/assets/ckeditor/lang/gu.js +6 -0
  463. data/vendor/assets/ckeditor/lang/he.js +6 -0
  464. data/vendor/assets/ckeditor/lang/hi.js +6 -0
  465. data/vendor/assets/ckeditor/lang/hr.js +6 -0
  466. data/vendor/assets/ckeditor/lang/hu.js +6 -0
  467. data/vendor/assets/ckeditor/lang/is.js +6 -0
  468. data/vendor/assets/ckeditor/lang/it.js +6 -0
  469. data/vendor/assets/ckeditor/lang/ja.js +6 -0
  470. data/vendor/assets/ckeditor/lang/ka.js +6 -0
  471. data/vendor/assets/ckeditor/lang/km.js +6 -0
  472. data/vendor/assets/ckeditor/lang/ko.js +6 -0
  473. data/vendor/assets/ckeditor/lang/lt.js +6 -0
  474. data/vendor/assets/ckeditor/lang/lv.js +6 -0
  475. data/vendor/assets/ckeditor/lang/mn.js +6 -0
  476. data/vendor/assets/ckeditor/lang/ms.js +6 -0
  477. data/vendor/assets/ckeditor/lang/nb.js +6 -0
  478. data/vendor/assets/ckeditor/lang/nl.js +6 -0
  479. data/vendor/assets/ckeditor/lang/no.js +6 -0
  480. data/vendor/assets/ckeditor/lang/pl.js +6 -0
  481. data/vendor/assets/ckeditor/lang/pt-br.js +6 -0
  482. data/vendor/assets/ckeditor/lang/pt.js +6 -0
  483. data/vendor/assets/ckeditor/lang/ro.js +6 -0
  484. data/vendor/assets/ckeditor/lang/ru.js +6 -0
  485. data/vendor/assets/ckeditor/lang/sk.js +6 -0
  486. data/vendor/assets/ckeditor/lang/sl.js +6 -0
  487. data/vendor/assets/ckeditor/lang/sr-latn.js +6 -0
  488. data/vendor/assets/ckeditor/lang/sr.js +6 -0
  489. data/vendor/assets/ckeditor/lang/sv.js +6 -0
  490. data/vendor/assets/ckeditor/lang/th.js +6 -0
  491. data/vendor/assets/ckeditor/lang/tr.js +6 -0
  492. data/vendor/assets/ckeditor/lang/uk.js +6 -0
  493. data/vendor/assets/ckeditor/lang/vi.js +6 -0
  494. data/vendor/assets/ckeditor/lang/zh-cn.js +6 -0
  495. data/vendor/assets/ckeditor/lang/zh.js +6 -0
  496. data/vendor/assets/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +7 -0
  497. data/vendor/assets/ckeditor/plugins/a11yhelp/lang/en.js +6 -0
  498. data/vendor/assets/ckeditor/plugins/a11yhelp/lang/he.js +6 -0
  499. data/vendor/assets/ckeditor/plugins/about/dialogs/about.js +6 -0
  500. data/vendor/assets/ckeditor/plugins/about/dialogs/logo_ckeditor.png +0 -0
  501. data/vendor/assets/ckeditor/plugins/adobeair/plugin.js +6 -0
  502. data/vendor/assets/ckeditor/plugins/ajax/plugin.js +6 -0
  503. data/vendor/assets/ckeditor/plugins/autogrow/plugin.js +6 -0
  504. data/vendor/assets/ckeditor/plugins/bbcode/plugin.js +9 -0
  505. data/vendor/assets/ckeditor/plugins/clipboard/dialogs/paste.js +7 -0
  506. data/vendor/assets/ckeditor/plugins/colordialog/dialogs/colordialog.js +7 -0
  507. data/vendor/assets/ckeditor/plugins/devtools/lang/en.js +6 -0
  508. data/vendor/assets/ckeditor/plugins/devtools/plugin.js +6 -0
  509. data/vendor/assets/ckeditor/plugins/dialog/dialogDefinition.js +4 -0
  510. data/vendor/assets/ckeditor/plugins/div/dialogs/div.js +8 -0
  511. data/vendor/assets/ckeditor/plugins/docprops/dialogs/docprops.js +10 -0
  512. data/vendor/assets/ckeditor/plugins/docprops/plugin.js +6 -0
  513. data/vendor/assets/ckeditor/plugins/find/dialogs/find.js +10 -0
  514. data/vendor/assets/ckeditor/plugins/flash/dialogs/flash.js +9 -0
  515. data/vendor/assets/ckeditor/plugins/flash/images/placeholder.png +0 -0
  516. data/vendor/assets/ckeditor/plugins/forms/dialogs/button.js +6 -0
  517. data/vendor/assets/ckeditor/plugins/forms/dialogs/checkbox.js +6 -0
  518. data/vendor/assets/ckeditor/plugins/forms/dialogs/form.js +6 -0
  519. data/vendor/assets/ckeditor/plugins/forms/dialogs/hiddenfield.js +6 -0
  520. data/vendor/assets/ckeditor/plugins/forms/dialogs/radio.js +6 -0
  521. data/vendor/assets/ckeditor/plugins/forms/dialogs/select.js +9 -0
  522. data/vendor/assets/ckeditor/plugins/forms/dialogs/textarea.js +6 -0
  523. data/vendor/assets/ckeditor/plugins/forms/dialogs/textfield.js +6 -0
  524. data/vendor/assets/ckeditor/plugins/forms/images/hiddenfield.gif +0 -0
  525. data/vendor/assets/ckeditor/plugins/iframe/dialogs/iframe.js +7 -0
  526. data/vendor/assets/ckeditor/plugins/iframe/images/placeholder.png +0 -0
  527. data/vendor/assets/ckeditor/plugins/iframedialog/plugin.js +6 -0
  528. data/vendor/assets/ckeditor/plugins/image/dialogs/image.js +13 -0
  529. data/vendor/assets/ckeditor/plugins/link/dialogs/anchor.js +6 -0
  530. data/vendor/assets/ckeditor/plugins/link/dialogs/link.js +12 -0
  531. data/vendor/assets/ckeditor/plugins/link/images/anchor.gif +0 -0
  532. data/vendor/assets/ckeditor/plugins/liststyle/dialogs/liststyle.js +7 -0
  533. data/vendor/assets/ckeditor/plugins/pagebreak/images/pagebreak.gif +0 -0
  534. data/vendor/assets/ckeditor/plugins/pastefromword/filter/default.js +11 -0
  535. data/vendor/assets/ckeditor/plugins/pastetext/dialogs/pastetext.js +6 -0
  536. data/vendor/assets/ckeditor/plugins/placeholder/dialogs/placeholder.js +6 -0
  537. data/vendor/assets/ckeditor/plugins/placeholder/lang/en.js +6 -0
  538. data/vendor/assets/ckeditor/plugins/placeholder/lang/he.js +6 -0
  539. data/vendor/assets/ckeditor/plugins/placeholder/placeholder.gif +0 -0
  540. data/vendor/assets/ckeditor/plugins/placeholder/plugin.js +6 -0
  541. data/vendor/assets/ckeditor/plugins/scayt/dialogs/options.js +8 -0
  542. data/vendor/assets/ckeditor/plugins/scayt/dialogs/toolbar.css +6 -0
  543. data/vendor/assets/ckeditor/plugins/showblocks/images/block_address.png +0 -0
  544. data/vendor/assets/ckeditor/plugins/showblocks/images/block_blockquote.png +0 -0
  545. data/vendor/assets/ckeditor/plugins/showblocks/images/block_div.png +0 -0
  546. data/vendor/assets/ckeditor/plugins/showblocks/images/block_h1.png +0 -0
  547. data/vendor/assets/ckeditor/plugins/showblocks/images/block_h2.png +0 -0
  548. data/vendor/assets/ckeditor/plugins/showblocks/images/block_h3.png +0 -0
  549. data/vendor/assets/ckeditor/plugins/showblocks/images/block_h4.png +0 -0
  550. data/vendor/assets/ckeditor/plugins/showblocks/images/block_h5.png +0 -0
  551. data/vendor/assets/ckeditor/plugins/showblocks/images/block_h6.png +0 -0
  552. data/vendor/assets/ckeditor/plugins/showblocks/images/block_p.png +0 -0
  553. data/vendor/assets/ckeditor/plugins/showblocks/images/block_pre.png +0 -0
  554. data/vendor/assets/ckeditor/plugins/smiley/dialogs/smiley.js +7 -0
  555. data/vendor/assets/ckeditor/plugins/smiley/images/angel_smile.gif +0 -0
  556. data/vendor/assets/ckeditor/plugins/smiley/images/angry_smile.gif +0 -0
  557. data/vendor/assets/ckeditor/plugins/smiley/images/broken_heart.gif +0 -0
  558. data/vendor/assets/ckeditor/plugins/smiley/images/confused_smile.gif +0 -0
  559. data/vendor/assets/ckeditor/plugins/smiley/images/cry_smile.gif +0 -0
  560. data/vendor/assets/ckeditor/plugins/smiley/images/devil_smile.gif +0 -0
  561. data/vendor/assets/ckeditor/plugins/smiley/images/embaressed_smile.gif +0 -0
  562. data/vendor/assets/ckeditor/plugins/smiley/images/envelope.gif +0 -0
  563. data/vendor/assets/ckeditor/plugins/smiley/images/heart.gif +0 -0
  564. data/vendor/assets/ckeditor/plugins/smiley/images/kiss.gif +0 -0
  565. data/vendor/assets/ckeditor/plugins/smiley/images/lightbulb.gif +0 -0
  566. data/vendor/assets/ckeditor/plugins/smiley/images/omg_smile.gif +0 -0
  567. data/vendor/assets/ckeditor/plugins/smiley/images/regular_smile.gif +0 -0
  568. data/vendor/assets/ckeditor/plugins/smiley/images/sad_smile.gif +0 -0
  569. data/vendor/assets/ckeditor/plugins/smiley/images/shades_smile.gif +0 -0
  570. data/vendor/assets/ckeditor/plugins/smiley/images/teeth_smile.gif +0 -0
  571. data/vendor/assets/ckeditor/plugins/smiley/images/thumbs_down.gif +0 -0
  572. data/vendor/assets/ckeditor/plugins/smiley/images/thumbs_up.gif +0 -0
  573. data/vendor/assets/ckeditor/plugins/smiley/images/tounge_smile.gif +0 -0
  574. data/vendor/assets/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif +0 -0
  575. data/vendor/assets/ckeditor/plugins/smiley/images/wink_smile.gif +0 -0
  576. data/vendor/assets/ckeditor/plugins/specialchar/dialogs/specialchar.js +7 -0
  577. data/vendor/assets/ckeditor/plugins/specialchar/lang/en.js +6 -0
  578. data/vendor/assets/ckeditor/plugins/styles/styles/default.js +6 -0
  579. data/vendor/assets/ckeditor/plugins/stylesheetparser/plugin.js +6 -0
  580. data/vendor/assets/ckeditor/plugins/table/dialogs/table.js +9 -0
  581. data/vendor/assets/ckeditor/plugins/tableresize/plugin.js +7 -0
  582. data/vendor/assets/ckeditor/plugins/tabletools/dialogs/tableCell.js +8 -0
  583. data/vendor/assets/ckeditor/plugins/templates/dialogs/templates.js +7 -0
  584. data/vendor/assets/ckeditor/plugins/templates/templates/default.js +6 -0
  585. data/vendor/assets/ckeditor/plugins/templates/templates/images/template1.gif +0 -0
  586. data/vendor/assets/ckeditor/plugins/templates/templates/images/template2.gif +0 -0
  587. data/vendor/assets/ckeditor/plugins/templates/templates/images/template3.gif +0 -0
  588. data/vendor/assets/ckeditor/plugins/uicolor/dialogs/uicolor.js +7 -0
  589. data/vendor/assets/ckeditor/plugins/uicolor/lang/en.js +6 -0
  590. data/vendor/assets/ckeditor/plugins/uicolor/lang/he.js +6 -0
  591. data/vendor/assets/ckeditor/plugins/uicolor/plugin.js +6 -0
  592. data/vendor/assets/ckeditor/plugins/uicolor/uicolor.gif +0 -0
  593. data/vendor/assets/ckeditor/plugins/uicolor/yui/assets/hue_bg.png +0 -0
  594. data/vendor/assets/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png +0 -0
  595. data/vendor/assets/ckeditor/plugins/uicolor/yui/assets/picker_mask.png +0 -0
  596. data/vendor/assets/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png +0 -0
  597. data/vendor/assets/ckeditor/plugins/uicolor/yui/assets/yui.css +6 -0
  598. data/vendor/assets/ckeditor/plugins/uicolor/yui/yui.js +76 -0
  599. data/vendor/assets/ckeditor/plugins/wsc/dialogs/ciframe.html +49 -0
  600. data/vendor/assets/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +52 -0
  601. data/vendor/assets/ckeditor/plugins/wsc/dialogs/wsc.css +6 -0
  602. data/vendor/assets/ckeditor/plugins/wsc/dialogs/wsc.js +7 -0
  603. data/vendor/assets/ckeditor/plugins/xml/plugin.js +6 -0
  604. data/vendor/assets/ckeditor/skins/kama/dialog.css +10 -0
  605. data/vendor/assets/ckeditor/skins/kama/editor.css +13 -0
  606. data/vendor/assets/ckeditor/skins/kama/icons.png +0 -0
  607. data/vendor/assets/ckeditor/skins/kama/icons_rtl.png +0 -0
  608. data/vendor/assets/ckeditor/skins/kama/images/dialog_sides.gif +0 -0
  609. data/vendor/assets/ckeditor/skins/kama/images/dialog_sides.png +0 -0
  610. data/vendor/assets/ckeditor/skins/kama/images/dialog_sides_rtl.png +0 -0
  611. data/vendor/assets/ckeditor/skins/kama/images/mini.gif +0 -0
  612. data/vendor/assets/ckeditor/skins/kama/images/noimage.png +0 -0
  613. data/vendor/assets/ckeditor/skins/kama/images/sprites.png +0 -0
  614. data/vendor/assets/ckeditor/skins/kama/images/sprites_ie6.png +0 -0
  615. data/vendor/assets/ckeditor/skins/kama/images/toolbar_start.gif +0 -0
  616. data/vendor/assets/ckeditor/skins/kama/skin.js +7 -0
  617. data/vendor/assets/ckeditor/skins/kama/templates.css +6 -0
  618. data/vendor/assets/ckeditor/skins/office2003/dialog.css +9 -0
  619. data/vendor/assets/ckeditor/skins/office2003/editor.css +14 -0
  620. data/vendor/assets/ckeditor/skins/office2003/icons.png +0 -0
  621. data/vendor/assets/ckeditor/skins/office2003/icons_rtl.png +0 -0
  622. data/vendor/assets/ckeditor/skins/office2003/images/dialog_sides.gif +0 -0
  623. data/vendor/assets/ckeditor/skins/office2003/images/dialog_sides.png +0 -0
  624. data/vendor/assets/ckeditor/skins/office2003/images/dialog_sides_rtl.png +0 -0
  625. data/vendor/assets/ckeditor/skins/office2003/images/mini.gif +0 -0
  626. data/vendor/assets/ckeditor/skins/office2003/images/noimage.png +0 -0
  627. data/vendor/assets/ckeditor/skins/office2003/images/sprites.png +0 -0
  628. data/vendor/assets/ckeditor/skins/office2003/images/sprites_ie6.png +0 -0
  629. data/vendor/assets/ckeditor/skins/office2003/skin.js +6 -0
  630. data/vendor/assets/ckeditor/skins/office2003/templates.css +6 -0
  631. data/vendor/assets/ckeditor/skins/v2/dialog.css +9 -0
  632. data/vendor/assets/ckeditor/skins/v2/editor.css +13 -0
  633. data/vendor/assets/ckeditor/skins/v2/icons.png +0 -0
  634. data/vendor/assets/ckeditor/skins/v2/icons_rtl.png +0 -0
  635. data/vendor/assets/ckeditor/skins/v2/images/dialog_sides.gif +0 -0
  636. data/vendor/assets/ckeditor/skins/v2/images/dialog_sides.png +0 -0
  637. data/vendor/assets/ckeditor/skins/v2/images/dialog_sides_rtl.png +0 -0
  638. data/vendor/assets/ckeditor/skins/v2/images/mini.gif +0 -0
  639. data/vendor/assets/ckeditor/skins/v2/images/noimage.png +0 -0
  640. data/vendor/assets/ckeditor/skins/v2/images/sprites.png +0 -0
  641. data/vendor/assets/ckeditor/skins/v2/images/sprites_ie6.png +0 -0
  642. data/vendor/assets/ckeditor/skins/v2/images/toolbar_start.gif +0 -0
  643. data/vendor/assets/ckeditor/skins/v2/skin.js +6 -0
  644. data/vendor/assets/ckeditor/skins/v2/templates.css +6 -0
  645. data/vendor/assets/ckeditor/themes/default/theme.js +8 -0
  646. metadata +692 -0
@@ -0,0 +1,1601 @@
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
+ } )();