editorial_logic 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (797) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Capfile +4 -0
  4. data/Gemfile +32 -0
  5. data/Rakefile +33 -0
  6. data/VERSION +1 -0
  7. data/app/controllers/admin/managed_contents_controller.rb +90 -0
  8. data/app/controllers/admin/publications_controller.rb +48 -0
  9. data/app/controllers/admin/sections_controller.rb +75 -0
  10. data/app/controllers/application_controller.rb +5 -0
  11. data/app/controllers/managed_contents_controller.rb +13 -0
  12. data/app/controllers/publications_controller.rb +20 -0
  13. data/app/controllers/sections_controller.rb +9 -0
  14. data/app/helpers/layout_helper.rb +23 -0
  15. data/app/models/faq_import.rb +34 -0
  16. data/app/models/managed_content.rb +145 -0
  17. data/app/models/publication.rb +95 -0
  18. data/app/models/section.rb +69 -0
  19. data/app/uploaders/document_uploader.rb +43 -0
  20. data/app/views/admin/managed_contents/_article_fields.html.erb +63 -0
  21. data/app/views/admin/managed_contents/_document_fields.html.erb +17 -0
  22. data/app/views/admin/managed_contents/_faq_fields.html.erb +21 -0
  23. data/app/views/admin/managed_contents/_faq_index.html.erb +39 -0
  24. data/app/views/admin/managed_contents/_form.html.erb +26 -0
  25. data/app/views/admin/managed_contents/_index.html.erb +29 -0
  26. data/app/views/admin/managed_contents/_term_fields.html.erb +36 -0
  27. data/app/views/admin/managed_contents/edit.html.erb +8 -0
  28. data/app/views/admin/managed_contents/import.html.erb +13 -0
  29. data/app/views/admin/managed_contents/new.html.erb +6 -0
  30. data/app/views/admin/managed_contents/show.html.erb +121 -0
  31. data/app/views/admin/publications/_form.html.erb +34 -0
  32. data/app/views/admin/publications/edit.html.erb +5 -0
  33. data/app/views/admin/publications/index.html.erb +33 -0
  34. data/app/views/admin/publications/new.html.erb +5 -0
  35. data/app/views/admin/publications/show.html.erb +34 -0
  36. data/app/views/admin/sections/_form.html.erb +35 -0
  37. data/app/views/admin/sections/_index.html.erb +37 -0
  38. data/app/views/admin/sections/edit.html.erb +5 -0
  39. data/app/views/admin/sections/new.html.erb +5 -0
  40. data/app/views/admin/sections/show.html.erb +26 -0
  41. data/app/views/layouts/application.html.erb +47 -0
  42. data/app/views/managed_contents/show.html.erb +34 -0
  43. data/app/views/publications/_articles.html.erb +7 -0
  44. data/app/views/publications/_documents.html.erb +7 -0
  45. data/app/views/publications/_faqs.html.erb +7 -0
  46. data/app/views/publications/_terms.html.erb +9 -0
  47. data/app/views/publications/feed.rss.builder +19 -0
  48. data/app/views/publications/show.html.erb +13 -0
  49. data/app/views/sections/_contents.html.erb +16 -0
  50. data/app/views/sections/show.html.erb +12 -0
  51. data/app/views/shared/_nav_tabs.html.erb +3 -0
  52. data/autotest/discover.rb +2 -0
  53. data/config.ru +4 -0
  54. data/config/application.rb +44 -0
  55. data/config/boot.rb +13 -0
  56. data/config/cucumber.yml +10 -0
  57. data/config/deploy.rb +40 -0
  58. data/config/environment.rb +9 -0
  59. data/config/environments/development.rb +28 -0
  60. data/config/environments/production.rb +49 -0
  61. data/config/environments/test.rb +35 -0
  62. data/config/initializers/ckeditor.rb +54 -0
  63. data/config/initializers/metric_fu.rb +9 -0
  64. data/config/initializers/secret_token.rb +7 -0
  65. data/config/initializers/session_store.rb +8 -0
  66. data/config/locales/en.yml +5 -0
  67. data/config/mongoid.yml +24 -0
  68. data/config/routes.rb +47 -0
  69. data/editorial_logic.gemspec +857 -0
  70. data/features/access_publications.feature +91 -0
  71. data/features/fixtures/test.pdf +0 -0
  72. data/features/manage_articles_content.feature +129 -0
  73. data/features/manage_documents_content.feature +58 -0
  74. data/features/manage_faq_content.feature +61 -0
  75. data/features/manage_glossary_content.feature +59 -0
  76. data/features/manage_publications.feature +55 -0
  77. data/features/step_definitions/content_steps.rb +20 -0
  78. data/features/step_definitions/general_steps.rb +17 -0
  79. data/features/step_definitions/publication_steps.rb +27 -0
  80. data/features/step_definitions/web_steps.rb +219 -0
  81. data/features/support/env.rb +42 -0
  82. data/features/support/hooks.rb +1 -0
  83. data/features/support/paths.rb +33 -0
  84. data/init.rb +1 -0
  85. data/lib/editorial_logic.rb +55 -0
  86. data/lib/editorial_logic/engine.rb +7 -0
  87. data/lib/editorial_logic/railtie.rb +10 -0
  88. data/lib/tasks/cucumber.rake +60 -0
  89. data/lib/tasks/rcov.rake +44 -0
  90. data/misc/images/src/black_bar.psd +0 -0
  91. data/misc/images/src/branding.psd +0 -0
  92. data/misc/images/src/legend_bg.psd +0 -0
  93. data/misc/images/src/menu_icons.psd +0 -0
  94. data/public/404.html +26 -0
  95. data/public/422.html +26 -0
  96. data/public/500.html +26 -0
  97. data/public/favicon.ico +0 -0
  98. data/public/images/icons/collapsed.gif +0 -0
  99. data/public/images/icons/delete.png +0 -0
  100. data/public/images/icons/drag.png +0 -0
  101. data/public/images/icons/edit.png +0 -0
  102. data/public/images/icons/expanded.gif +0 -0
  103. data/public/images/icons/help_icon.png +0 -0
  104. data/public/images/icons/link_icon.png +0 -0
  105. data/public/images/icons/move.png +0 -0
  106. data/public/images/icons/move_white.png +0 -0
  107. data/public/images/icons/note.png +0 -0
  108. data/public/images/icons/note_white.png +0 -0
  109. data/public/images/icons/notification_icon_sprite.png +0 -0
  110. data/public/images/icons/spinner.gif +0 -0
  111. data/public/images/icons/view.png +0 -0
  112. data/public/images/icons/warning.png +0 -0
  113. data/public/images/icons/warning_2.png +0 -0
  114. data/public/images/icons/warning_box.png +0 -0
  115. data/public/images/icons/warning_icon.png +0 -0
  116. data/public/images/icons/warning_white.png +0 -0
  117. data/public/images/layout/arrow_asc.png +0 -0
  118. data/public/images/layout/arrow_desc.png +0 -0
  119. data/public/images/layout/black_bar.png +0 -0
  120. data/public/images/layout/button_bg.png +0 -0
  121. data/public/images/layout/content_left_bg.png +0 -0
  122. data/public/images/layout/content_right_bg.png +0 -0
  123. data/public/images/layout/footer_bg.png +0 -0
  124. data/public/images/layout/h2_bg.png +0 -0
  125. data/public/images/layout/h2_bg_for_table.png +0 -0
  126. data/public/images/layout/header_bg_grey.png +0 -0
  127. data/public/images/layout/header_bg_purple.png +0 -0
  128. data/public/images/layout/legend_bg.png +0 -0
  129. data/public/images/layout/text_field_bg.jpg +0 -0
  130. data/public/images/layout/text_field_error_bg.png +0 -0
  131. data/public/images/layout/th_bg.png +0 -0
  132. data/public/images/layout/th_bg_selected.png +0 -0
  133. data/public/index.html +9 -0
  134. data/public/javascripts/application.js +2 -0
  135. data/public/javascripts/ckeditor/.htaccess +24 -0
  136. data/public/javascripts/ckeditor/CHANGES.html +993 -0
  137. data/public/javascripts/ckeditor/INSTALL.html +92 -0
  138. data/public/javascripts/ckeditor/LICENSE.html +1334 -0
  139. data/public/javascripts/ckeditor/_samples/ajax.html +87 -0
  140. data/public/javascripts/ckeditor/_samples/api.html +152 -0
  141. data/public/javascripts/ckeditor/_samples/api_dialog.html +188 -0
  142. data/public/javascripts/ckeditor/_samples/api_dialog/my_dialog.js +28 -0
  143. data/public/javascripts/ckeditor/_samples/asp/advanced.asp +105 -0
  144. data/public/javascripts/ckeditor/_samples/asp/events.asp +136 -0
  145. data/public/javascripts/ckeditor/_samples/asp/index.html +103 -0
  146. data/public/javascripts/ckeditor/_samples/asp/replace.asp +72 -0
  147. data/public/javascripts/ckeditor/_samples/asp/replaceall.asp +77 -0
  148. data/public/javascripts/ckeditor/_samples/asp/sample_posteddata.asp +46 -0
  149. data/public/javascripts/ckeditor/_samples/asp/standalone.asp +72 -0
  150. data/public/javascripts/ckeditor/_samples/assets/output_for_flash.fla +0 -0
  151. data/public/javascripts/ckeditor/_samples/assets/output_for_flash.swf +0 -0
  152. data/public/javascripts/ckeditor/_samples/assets/output_xhtml.css +204 -0
  153. data/public/javascripts/ckeditor/_samples/assets/swfobject.js +18 -0
  154. data/public/javascripts/ckeditor/_samples/autogrow.html +75 -0
  155. data/public/javascripts/ckeditor/_samples/divreplace.html +137 -0
  156. data/public/javascripts/ckeditor/_samples/enterkey.html +88 -0
  157. data/public/javascripts/ckeditor/_samples/fullpage.html +62 -0
  158. data/public/javascripts/ckeditor/_samples/index.html +57 -0
  159. data/public/javascripts/ckeditor/_samples/jqueryadapter.html +73 -0
  160. data/public/javascripts/ckeditor/_samples/output_for_flash.html +257 -0
  161. data/public/javascripts/ckeditor/_samples/output_html.html +259 -0
  162. data/public/javascripts/ckeditor/_samples/output_xhtml.html +159 -0
  163. data/public/javascripts/ckeditor/_samples/php/advanced.php +93 -0
  164. data/public/javascripts/ckeditor/_samples/php/events.php +130 -0
  165. data/public/javascripts/ckeditor/_samples/php/replace.php +63 -0
  166. data/public/javascripts/ckeditor/_samples/php/replaceall.php +68 -0
  167. data/public/javascripts/ckeditor/_samples/php/standalone.php +64 -0
  168. data/public/javascripts/ckeditor/_samples/replacebyclass.html +49 -0
  169. data/public/javascripts/ckeditor/_samples/replacebycode.html +80 -0
  170. data/public/javascripts/ckeditor/_samples/sample.css +81 -0
  171. data/public/javascripts/ckeditor/_samples/sample.js +65 -0
  172. data/public/javascripts/ckeditor/_samples/sample_posteddata.php +59 -0
  173. data/public/javascripts/ckeditor/_samples/sharedspaces.html +131 -0
  174. data/public/javascripts/ckeditor/_samples/skins.html +83 -0
  175. data/public/javascripts/ckeditor/_samples/ui_color.html +87 -0
  176. data/public/javascripts/ckeditor/_samples/ui_languages.html +103 -0
  177. data/public/javascripts/ckeditor/_source/adapters/jquery.js +297 -0
  178. data/public/javascripts/ckeditor/_source/core/_bootstrap.js +96 -0
  179. data/public/javascripts/ckeditor/_source/core/ajax.js +142 -0
  180. data/public/javascripts/ckeditor/_source/core/ckeditor.js +133 -0
  181. data/public/javascripts/ckeditor/_source/core/ckeditor_base.js +196 -0
  182. data/public/javascripts/ckeditor/_source/core/ckeditor_basic.js +239 -0
  183. data/public/javascripts/ckeditor/_source/core/command.js +209 -0
  184. data/public/javascripts/ckeditor/_source/core/commanddefinition.js +129 -0
  185. data/public/javascripts/ckeditor/_source/core/config.js +430 -0
  186. data/public/javascripts/ckeditor/_source/core/dataprocessor.js +65 -0
  187. data/public/javascripts/ckeditor/_source/core/dom.js +20 -0
  188. data/public/javascripts/ckeditor/_source/core/dom/comment.js +32 -0
  189. data/public/javascripts/ckeditor/_source/core/dom/document.js +224 -0
  190. data/public/javascripts/ckeditor/_source/core/dom/documentfragment.js +49 -0
  191. data/public/javascripts/ckeditor/_source/core/dom/domobject.js +255 -0
  192. data/public/javascripts/ckeditor/_source/core/dom/element.js +1564 -0
  193. data/public/javascripts/ckeditor/_source/core/dom/elementpath.js +119 -0
  194. data/public/javascripts/ckeditor/_source/core/dom/event.js +142 -0
  195. data/public/javascripts/ckeditor/_source/core/dom/node.js +683 -0
  196. data/public/javascripts/ckeditor/_source/core/dom/nodelist.js +26 -0
  197. data/public/javascripts/ckeditor/_source/core/dom/range.js +1883 -0
  198. data/public/javascripts/ckeditor/_source/core/dom/rangelist.js +214 -0
  199. data/public/javascripts/ckeditor/_source/core/dom/text.js +123 -0
  200. data/public/javascripts/ckeditor/_source/core/dom/walker.js +445 -0
  201. data/public/javascripts/ckeditor/_source/core/dom/window.js +96 -0
  202. data/public/javascripts/ckeditor/_source/core/dtd.js +238 -0
  203. data/public/javascripts/ckeditor/_source/core/editor.js +924 -0
  204. data/public/javascripts/ckeditor/_source/core/editor_basic.js +182 -0
  205. data/public/javascripts/ckeditor/_source/core/env.js +270 -0
  206. data/public/javascripts/ckeditor/_source/core/event.js +342 -0
  207. data/public/javascripts/ckeditor/_source/core/eventInfo.js +120 -0
  208. data/public/javascripts/ckeditor/_source/core/focusmanager.js +152 -0
  209. data/public/javascripts/ckeditor/_source/core/htmlparser.js +224 -0
  210. data/public/javascripts/ckeditor/_source/core/htmlparser/basicwriter.js +145 -0
  211. data/public/javascripts/ckeditor/_source/core/htmlparser/cdata.js +43 -0
  212. data/public/javascripts/ckeditor/_source/core/htmlparser/comment.js +60 -0
  213. data/public/javascripts/ckeditor/_source/core/htmlparser/element.js +240 -0
  214. data/public/javascripts/ckeditor/_source/core/htmlparser/filter.js +288 -0
  215. data/public/javascripts/ckeditor/_source/core/htmlparser/fragment.js +504 -0
  216. data/public/javascripts/ckeditor/_source/core/htmlparser/text.js +55 -0
  217. data/public/javascripts/ckeditor/_source/core/imagecacher.js +80 -0
  218. data/public/javascripts/ckeditor/_source/core/lang.js +156 -0
  219. data/public/javascripts/ckeditor/_source/core/loader.js +243 -0
  220. data/public/javascripts/ckeditor/_source/core/plugindefinition.js +66 -0
  221. data/public/javascripts/ckeditor/_source/core/plugins.js +85 -0
  222. data/public/javascripts/ckeditor/_source/core/resourcemanager.js +238 -0
  223. data/public/javascripts/ckeditor/_source/core/scriptloader.js +200 -0
  224. data/public/javascripts/ckeditor/_source/core/skins.js +212 -0
  225. data/public/javascripts/ckeditor/_source/core/themes.js +19 -0
  226. data/public/javascripts/ckeditor/_source/core/tools.js +734 -0
  227. data/public/javascripts/ckeditor/_source/core/ui.js +116 -0
  228. data/public/javascripts/ckeditor/_source/core/xml.js +165 -0
  229. data/public/javascripts/ckeditor/_source/lang/_languages.js +83 -0
  230. data/public/javascripts/ckeditor/_source/lang/_translationstatus.txt +60 -0
  231. data/public/javascripts/ckeditor/_source/lang/af.js +758 -0
  232. data/public/javascripts/ckeditor/_source/lang/ar.js +758 -0
  233. data/public/javascripts/ckeditor/_source/lang/bg.js +758 -0
  234. data/public/javascripts/ckeditor/_source/lang/bn.js +758 -0
  235. data/public/javascripts/ckeditor/_source/lang/bs.js +758 -0
  236. data/public/javascripts/ckeditor/_source/lang/ca.js +758 -0
  237. data/public/javascripts/ckeditor/_source/lang/cs.js +758 -0
  238. data/public/javascripts/ckeditor/_source/lang/cy.js +758 -0
  239. data/public/javascripts/ckeditor/_source/lang/da.js +758 -0
  240. data/public/javascripts/ckeditor/_source/lang/de.js +758 -0
  241. data/public/javascripts/ckeditor/_source/lang/el.js +758 -0
  242. data/public/javascripts/ckeditor/_source/lang/en-au.js +758 -0
  243. data/public/javascripts/ckeditor/_source/lang/en-ca.js +758 -0
  244. data/public/javascripts/ckeditor/_source/lang/en-gb.js +758 -0
  245. data/public/javascripts/ckeditor/_source/lang/en.js +758 -0
  246. data/public/javascripts/ckeditor/_source/lang/eo.js +758 -0
  247. data/public/javascripts/ckeditor/_source/lang/es.js +758 -0
  248. data/public/javascripts/ckeditor/_source/lang/et.js +758 -0
  249. data/public/javascripts/ckeditor/_source/lang/eu.js +758 -0
  250. data/public/javascripts/ckeditor/_source/lang/fa.js +758 -0
  251. data/public/javascripts/ckeditor/_source/lang/fi.js +758 -0
  252. data/public/javascripts/ckeditor/_source/lang/fo.js +758 -0
  253. data/public/javascripts/ckeditor/_source/lang/fr-ca.js +758 -0
  254. data/public/javascripts/ckeditor/_source/lang/fr.js +758 -0
  255. data/public/javascripts/ckeditor/_source/lang/gl.js +758 -0
  256. data/public/javascripts/ckeditor/_source/lang/gu.js +758 -0
  257. data/public/javascripts/ckeditor/_source/lang/he.js +758 -0
  258. data/public/javascripts/ckeditor/_source/lang/hi.js +758 -0
  259. data/public/javascripts/ckeditor/_source/lang/hr.js +758 -0
  260. data/public/javascripts/ckeditor/_source/lang/hu.js +758 -0
  261. data/public/javascripts/ckeditor/_source/lang/is.js +758 -0
  262. data/public/javascripts/ckeditor/_source/lang/it.js +758 -0
  263. data/public/javascripts/ckeditor/_source/lang/ja.js +758 -0
  264. data/public/javascripts/ckeditor/_source/lang/km.js +758 -0
  265. data/public/javascripts/ckeditor/_source/lang/ko.js +758 -0
  266. data/public/javascripts/ckeditor/_source/lang/lt.js +758 -0
  267. data/public/javascripts/ckeditor/_source/lang/lv.js +758 -0
  268. data/public/javascripts/ckeditor/_source/lang/mn.js +758 -0
  269. data/public/javascripts/ckeditor/_source/lang/ms.js +758 -0
  270. data/public/javascripts/ckeditor/_source/lang/nb.js +758 -0
  271. data/public/javascripts/ckeditor/_source/lang/nl.js +758 -0
  272. data/public/javascripts/ckeditor/_source/lang/no.js +758 -0
  273. data/public/javascripts/ckeditor/_source/lang/pl.js +758 -0
  274. data/public/javascripts/ckeditor/_source/lang/pt-br.js +757 -0
  275. data/public/javascripts/ckeditor/_source/lang/pt.js +758 -0
  276. data/public/javascripts/ckeditor/_source/lang/ro.js +758 -0
  277. data/public/javascripts/ckeditor/_source/lang/ru.js +758 -0
  278. data/public/javascripts/ckeditor/_source/lang/sk.js +758 -0
  279. data/public/javascripts/ckeditor/_source/lang/sl.js +758 -0
  280. data/public/javascripts/ckeditor/_source/lang/sr-latn.js +758 -0
  281. data/public/javascripts/ckeditor/_source/lang/sr.js +758 -0
  282. data/public/javascripts/ckeditor/_source/lang/sv.js +758 -0
  283. data/public/javascripts/ckeditor/_source/lang/th.js +758 -0
  284. data/public/javascripts/ckeditor/_source/lang/tr.js +757 -0
  285. data/public/javascripts/ckeditor/_source/lang/uk.js +758 -0
  286. data/public/javascripts/ckeditor/_source/lang/vi.js +758 -0
  287. data/public/javascripts/ckeditor/_source/lang/zh-cn.js +758 -0
  288. data/public/javascripts/ckeditor/_source/lang/zh.js +758 -0
  289. data/public/javascripts/ckeditor/_source/plugins/a11yhelp/dialogs/a11yhelp.js +211 -0
  290. data/public/javascripts/ckeditor/_source/plugins/a11yhelp/lang/en.js +108 -0
  291. data/public/javascripts/ckeditor/_source/plugins/a11yhelp/lang/he.js +216 -0
  292. data/public/javascripts/ckeditor/_source/plugins/a11yhelp/plugin.js +46 -0
  293. data/public/javascripts/ckeditor/_source/plugins/about/dialogs/about.js +73 -0
  294. data/public/javascripts/ckeditor/_source/plugins/about/dialogs/logo_ckeditor.png +0 -0
  295. data/public/javascripts/ckeditor/_source/plugins/about/plugin.js +23 -0
  296. data/public/javascripts/ckeditor/_source/plugins/ajax_save/plugin.js +44 -0
  297. data/public/javascripts/ckeditor/_source/plugins/attachment/dialogs/attachment.js +384 -0
  298. data/public/javascripts/ckeditor/_source/plugins/attachment/images/attachment.png +0 -0
  299. data/public/javascripts/ckeditor/_source/plugins/attachment/lang/en.js +10 -0
  300. data/public/javascripts/ckeditor/_source/plugins/attachment/lang/ru.js +10 -0
  301. data/public/javascripts/ckeditor/_source/plugins/attachment/lang/uk.js +10 -0
  302. data/public/javascripts/ckeditor/_source/plugins/attachment/plugin.js +44 -0
  303. data/public/javascripts/ckeditor/_source/plugins/autogrow/plugin.js +86 -0
  304. data/public/javascripts/ckeditor/_source/plugins/basicstyles/plugin.js +101 -0
  305. data/public/javascripts/ckeditor/_source/plugins/bidi/plugin.js +259 -0
  306. data/public/javascripts/ckeditor/_source/plugins/blockquote/plugin.js +301 -0
  307. data/public/javascripts/ckeditor/_source/plugins/button/plugin.js +277 -0
  308. data/public/javascripts/ckeditor/_source/plugins/clipboard/dialogs/paste.js +205 -0
  309. data/public/javascripts/ckeditor/_source/plugins/clipboard/plugin.js +412 -0
  310. data/public/javascripts/ckeditor/_source/plugins/colorbutton/plugin.js +250 -0
  311. data/public/javascripts/ckeditor/_source/plugins/colordialog/dialogs/colordialog.js +336 -0
  312. data/public/javascripts/ckeditor/_source/plugins/colordialog/plugin.js +13 -0
  313. data/public/javascripts/ckeditor/_source/plugins/contextmenu/plugin.js +290 -0
  314. data/public/javascripts/ckeditor/_source/plugins/dialog/dialogDefinition.js +315 -0
  315. data/public/javascripts/ckeditor/_source/plugins/dialog/plugin.js +3015 -0
  316. data/public/javascripts/ckeditor/_source/plugins/dialogadvtab/plugin.js +213 -0
  317. data/public/javascripts/ckeditor/_source/plugins/dialogui/plugin.js +1523 -0
  318. data/public/javascripts/ckeditor/_source/plugins/div/dialogs/div.js +535 -0
  319. data/public/javascripts/ckeditor/_source/plugins/div/plugin.js +121 -0
  320. data/public/javascripts/ckeditor/_source/plugins/domiterator/plugin.js +356 -0
  321. data/public/javascripts/ckeditor/_source/plugins/editingblock/plugin.js +229 -0
  322. data/public/javascripts/ckeditor/_source/plugins/elementspath/plugin.js +206 -0
  323. data/public/javascripts/ckeditor/_source/plugins/embed/dialogs/embed.js +65 -0
  324. data/public/javascripts/ckeditor/_source/plugins/embed/images/embed.png +0 -0
  325. data/public/javascripts/ckeditor/_source/plugins/embed/lang/en.js +9 -0
  326. data/public/javascripts/ckeditor/_source/plugins/embed/lang/ru.js +9 -0
  327. data/public/javascripts/ckeditor/_source/plugins/embed/lang/uk.js +9 -0
  328. data/public/javascripts/ckeditor/_source/plugins/embed/plugin.js +44 -0
  329. data/public/javascripts/ckeditor/_source/plugins/enterkey/plugin.js +363 -0
  330. data/public/javascripts/ckeditor/_source/plugins/entities/plugin.js +226 -0
  331. data/public/javascripts/ckeditor/_source/plugins/fakeobjects/plugin.js +122 -0
  332. data/public/javascripts/ckeditor/_source/plugins/filebrowser/plugin.js +501 -0
  333. data/public/javascripts/ckeditor/_source/plugins/find/dialogs/find.js +890 -0
  334. data/public/javascripts/ckeditor/_source/plugins/find/plugin.js +46 -0
  335. data/public/javascripts/ckeditor/_source/plugins/flash/dialogs/flash.js +698 -0
  336. data/public/javascripts/ckeditor/_source/plugins/flash/images/placeholder.png +0 -0
  337. data/public/javascripts/ckeditor/_source/plugins/flash/plugin.js +168 -0
  338. data/public/javascripts/ckeditor/_source/plugins/floatpanel/plugin.js +402 -0
  339. data/public/javascripts/ckeditor/_source/plugins/font/plugin.js +234 -0
  340. data/public/javascripts/ckeditor/_source/plugins/format/plugin.js +194 -0
  341. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/button.js +135 -0
  342. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/checkbox.js +153 -0
  343. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/form.js +177 -0
  344. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/hiddenfield.js +98 -0
  345. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/radio.js +135 -0
  346. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/select.js +556 -0
  347. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/textarea.js +114 -0
  348. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/textfield.js +199 -0
  349. data/public/javascripts/ckeditor/_source/plugins/forms/images/hiddenfield.gif +0 -0
  350. data/public/javascripts/ckeditor/_source/plugins/forms/plugin.js +284 -0
  351. data/public/javascripts/ckeditor/_source/plugins/horizontalrule/plugin.js +36 -0
  352. data/public/javascripts/ckeditor/_source/plugins/htmldataprocessor/plugin.js +502 -0
  353. data/public/javascripts/ckeditor/_source/plugins/htmlwriter/plugin.js +319 -0
  354. data/public/javascripts/ckeditor/_source/plugins/iframedialog/plugin.js +136 -0
  355. data/public/javascripts/ckeditor/_source/plugins/image/dialogs/image.js +1396 -0
  356. data/public/javascripts/ckeditor/_source/plugins/image/plugin.js +81 -0
  357. data/public/javascripts/ckeditor/_source/plugins/indent/plugin.js +455 -0
  358. data/public/javascripts/ckeditor/_source/plugins/justify/plugin.js +221 -0
  359. data/public/javascripts/ckeditor/_source/plugins/keystrokes/plugin.js +225 -0
  360. data/public/javascripts/ckeditor/_source/plugins/link/dialogs/anchor.js +99 -0
  361. data/public/javascripts/ckeditor/_source/plugins/link/dialogs/link.js +1424 -0
  362. data/public/javascripts/ckeditor/_source/plugins/link/images/anchor.gif +0 -0
  363. data/public/javascripts/ckeditor/_source/plugins/link/plugin.js +238 -0
  364. data/public/javascripts/ckeditor/_source/plugins/list/plugin.js +710 -0
  365. data/public/javascripts/ckeditor/_source/plugins/listblock/plugin.js +257 -0
  366. data/public/javascripts/ckeditor/_source/plugins/liststyle/dialogs/liststyle.js +204 -0
  367. data/public/javascripts/ckeditor/_source/plugins/liststyle/plugin.js +66 -0
  368. data/public/javascripts/ckeditor/_source/plugins/maximize/plugin.js +350 -0
  369. data/public/javascripts/ckeditor/_source/plugins/menu/plugin.js +408 -0
  370. data/public/javascripts/ckeditor/_source/plugins/menubutton/plugin.js +94 -0
  371. data/public/javascripts/ckeditor/_source/plugins/newpage/plugin.js +53 -0
  372. data/public/javascripts/ckeditor/_source/plugins/pagebreak/images/pagebreak.gif +0 -0
  373. data/public/javascripts/ckeditor/_source/plugins/pagebreak/plugin.js +121 -0
  374. data/public/javascripts/ckeditor/_source/plugins/panel/plugin.js +399 -0
  375. data/public/javascripts/ckeditor/_source/plugins/panelbutton/plugin.js +147 -0
  376. data/public/javascripts/ckeditor/_source/plugins/pastefromword/filter/default.js +1170 -0
  377. data/public/javascripts/ckeditor/_source/plugins/pastefromword/plugin.js +122 -0
  378. data/public/javascripts/ckeditor/_source/plugins/pastetext/dialogs/pastetext.js +70 -0
  379. data/public/javascripts/ckeditor/_source/plugins/pastetext/plugin.js +145 -0
  380. data/public/javascripts/ckeditor/_source/plugins/popup/plugin.js +64 -0
  381. data/public/javascripts/ckeditor/_source/plugins/preview/plugin.js +108 -0
  382. data/public/javascripts/ckeditor/_source/plugins/print/plugin.js +41 -0
  383. data/public/javascripts/ckeditor/_source/plugins/removeformat/plugin.js +184 -0
  384. data/public/javascripts/ckeditor/_source/plugins/resize/plugin.js +157 -0
  385. data/public/javascripts/ckeditor/_source/plugins/richcombo/plugin.js +370 -0
  386. data/public/javascripts/ckeditor/_source/plugins/save/plugin.js +55 -0
  387. data/public/javascripts/ckeditor/_source/plugins/scayt/dialogs/options.js +534 -0
  388. data/public/javascripts/ckeditor/_source/plugins/scayt/dialogs/toolbar.css +71 -0
  389. data/public/javascripts/ckeditor/_source/plugins/scayt/plugin.js +945 -0
  390. data/public/javascripts/ckeditor/_source/plugins/selection/plugin.js +1375 -0
  391. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_address.png +0 -0
  392. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_blockquote.png +0 -0
  393. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_div.png +0 -0
  394. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h1.png +0 -0
  395. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h2.png +0 -0
  396. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h3.png +0 -0
  397. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h4.png +0 -0
  398. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h5.png +0 -0
  399. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h6.png +0 -0
  400. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_p.png +0 -0
  401. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_pre.png +0 -0
  402. data/public/javascripts/ckeditor/_source/plugins/showblocks/plugin.js +155 -0
  403. data/public/javascripts/ckeditor/_source/plugins/showborders/plugin.js +201 -0
  404. data/public/javascripts/ckeditor/_source/plugins/smiley/dialogs/smiley.js +218 -0
  405. data/public/javascripts/ckeditor/_source/plugins/smiley/images/angel_smile.gif +0 -0
  406. data/public/javascripts/ckeditor/_source/plugins/smiley/images/angry_smile.gif +0 -0
  407. data/public/javascripts/ckeditor/_source/plugins/smiley/images/broken_heart.gif +0 -0
  408. data/public/javascripts/ckeditor/_source/plugins/smiley/images/confused_smile.gif +0 -0
  409. data/public/javascripts/ckeditor/_source/plugins/smiley/images/cry_smile.gif +0 -0
  410. data/public/javascripts/ckeditor/_source/plugins/smiley/images/devil_smile.gif +0 -0
  411. data/public/javascripts/ckeditor/_source/plugins/smiley/images/embaressed_smile.gif +0 -0
  412. data/public/javascripts/ckeditor/_source/plugins/smiley/images/envelope.gif +0 -0
  413. data/public/javascripts/ckeditor/_source/plugins/smiley/images/heart.gif +0 -0
  414. data/public/javascripts/ckeditor/_source/plugins/smiley/images/kiss.gif +0 -0
  415. data/public/javascripts/ckeditor/_source/plugins/smiley/images/lightbulb.gif +0 -0
  416. data/public/javascripts/ckeditor/_source/plugins/smiley/images/omg_smile.gif +0 -0
  417. data/public/javascripts/ckeditor/_source/plugins/smiley/images/regular_smile.gif +0 -0
  418. data/public/javascripts/ckeditor/_source/plugins/smiley/images/sad_smile.gif +0 -0
  419. data/public/javascripts/ckeditor/_source/plugins/smiley/images/shades_smile.gif +0 -0
  420. data/public/javascripts/ckeditor/_source/plugins/smiley/images/teeth_smile.gif +0 -0
  421. data/public/javascripts/ckeditor/_source/plugins/smiley/images/thumbs_down.gif +0 -0
  422. data/public/javascripts/ckeditor/_source/plugins/smiley/images/thumbs_up.gif +0 -0
  423. data/public/javascripts/ckeditor/_source/plugins/smiley/images/tounge_smile.gif +0 -0
  424. data/public/javascripts/ckeditor/_source/plugins/smiley/images/whatchutalkingabout_smile.gif +0 -0
  425. data/public/javascripts/ckeditor/_source/plugins/smiley/images/wink_smile.gif +0 -0
  426. data/public/javascripts/ckeditor/_source/plugins/smiley/plugin.js +94 -0
  427. data/public/javascripts/ckeditor/_source/plugins/sourcearea/plugin.js +207 -0
  428. data/public/javascripts/ckeditor/_source/plugins/specialchar/dialogs/specialchar.js +409 -0
  429. data/public/javascripts/ckeditor/_source/plugins/specialchar/plugin.js +29 -0
  430. data/public/javascripts/ckeditor/_source/plugins/styles/plugin.js +1479 -0
  431. data/public/javascripts/ckeditor/_source/plugins/styles/styles/default.js +88 -0
  432. data/public/javascripts/ckeditor/_source/plugins/stylescombo/plugin.js +206 -0
  433. data/public/javascripts/ckeditor/_source/plugins/tab/plugin.js +367 -0
  434. data/public/javascripts/ckeditor/_source/plugins/table/dialogs/table.js +672 -0
  435. data/public/javascripts/ckeditor/_source/plugins/table/plugin.js +78 -0
  436. data/public/javascripts/ckeditor/_source/plugins/tableresize/plugin.js +450 -0
  437. data/public/javascripts/ckeditor/_source/plugins/tabletools/dialogs/tableCell.js +533 -0
  438. data/public/javascripts/ckeditor/_source/plugins/tabletools/plugin.js +1120 -0
  439. data/public/javascripts/ckeditor/_source/plugins/templates/dialogs/templates.js +233 -0
  440. data/public/javascripts/ckeditor/_source/plugins/templates/plugin.js +99 -0
  441. data/public/javascripts/ckeditor/_source/plugins/templates/templates/default.js +94 -0
  442. data/public/javascripts/ckeditor/_source/plugins/templates/templates/images/template1.gif +0 -0
  443. data/public/javascripts/ckeditor/_source/plugins/templates/templates/images/template2.gif +0 -0
  444. data/public/javascripts/ckeditor/_source/plugins/templates/templates/images/template3.gif +0 -0
  445. data/public/javascripts/ckeditor/_source/plugins/toolbar/plugin.js +481 -0
  446. data/public/javascripts/ckeditor/_source/plugins/uicolor/dialogs/uicolor.js +205 -0
  447. data/public/javascripts/ckeditor/_source/plugins/uicolor/lang/en.js +15 -0
  448. data/public/javascripts/ckeditor/_source/plugins/uicolor/lang/he.js +15 -0
  449. data/public/javascripts/ckeditor/_source/plugins/uicolor/plugin.js +37 -0
  450. data/public/javascripts/ckeditor/_source/plugins/uicolor/uicolor.gif +0 -0
  451. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/assets/hue_bg.png +0 -0
  452. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/assets/hue_thumb.png +0 -0
  453. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/assets/picker_mask.png +0 -0
  454. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/assets/picker_thumb.png +0 -0
  455. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/assets/yui.css +15 -0
  456. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/yui.js +71 -0
  457. data/public/javascripts/ckeditor/_source/plugins/undo/plugin.js +554 -0
  458. data/public/javascripts/ckeditor/_source/plugins/wsc/dialogs/ciframe.html +49 -0
  459. data/public/javascripts/ckeditor/_source/plugins/wsc/dialogs/tmpFrameset.html +52 -0
  460. data/public/javascripts/ckeditor/_source/plugins/wsc/dialogs/wsc.css +82 -0
  461. data/public/javascripts/ckeditor/_source/plugins/wsc/dialogs/wsc.js +176 -0
  462. data/public/javascripts/ckeditor/_source/plugins/wsc/plugin.js +33 -0
  463. data/public/javascripts/ckeditor/_source/plugins/wysiwygarea/plugin.js +1146 -0
  464. data/public/javascripts/ckeditor/_source/skins/kama/dialog.css +882 -0
  465. data/public/javascripts/ckeditor/_source/skins/kama/editor.css +25 -0
  466. data/public/javascripts/ckeditor/_source/skins/kama/elementspath.css +73 -0
  467. data/public/javascripts/ckeditor/_source/skins/kama/icons.css +357 -0
  468. data/public/javascripts/ckeditor/_source/skins/kama/icons.png +0 -0
  469. data/public/javascripts/ckeditor/_source/skins/kama/icons_rtl.png +0 -0
  470. data/public/javascripts/ckeditor/_source/skins/kama/images/dialog_sides.gif +0 -0
  471. data/public/javascripts/ckeditor/_source/skins/kama/images/dialog_sides.png +0 -0
  472. data/public/javascripts/ckeditor/_source/skins/kama/images/dialog_sides_rtl.png +0 -0
  473. data/public/javascripts/ckeditor/_source/skins/kama/images/mini.gif +0 -0
  474. data/public/javascripts/ckeditor/_source/skins/kama/images/noimage.png +0 -0
  475. data/public/javascripts/ckeditor/_source/skins/kama/images/sprites.png +0 -0
  476. data/public/javascripts/ckeditor/_source/skins/kama/images/sprites_ie6.png +0 -0
  477. data/public/javascripts/ckeditor/_source/skins/kama/images/toolbar_start.gif +0 -0
  478. data/public/javascripts/ckeditor/_source/skins/kama/mainui.css +195 -0
  479. data/public/javascripts/ckeditor/_source/skins/kama/menu.css +216 -0
  480. data/public/javascripts/ckeditor/_source/skins/kama/panel.css +217 -0
  481. data/public/javascripts/ckeditor/_source/skins/kama/presets.css +49 -0
  482. data/public/javascripts/ckeditor/_source/skins/kama/reset.css +84 -0
  483. data/public/javascripts/ckeditor/_source/skins/kama/richcombo.css +277 -0
  484. data/public/javascripts/ckeditor/_source/skins/kama/skin.js +268 -0
  485. data/public/javascripts/ckeditor/_source/skins/kama/templates.css +88 -0
  486. data/public/javascripts/ckeditor/_source/skins/kama/toolbar.css +409 -0
  487. data/public/javascripts/ckeditor/_source/skins/office2003/dialog.css +785 -0
  488. data/public/javascripts/ckeditor/_source/skins/office2003/editor.css +25 -0
  489. data/public/javascripts/ckeditor/_source/skins/office2003/elementspath.css +74 -0
  490. data/public/javascripts/ckeditor/_source/skins/office2003/icons.css +354 -0
  491. data/public/javascripts/ckeditor/_source/skins/office2003/icons.png +0 -0
  492. data/public/javascripts/ckeditor/_source/skins/office2003/icons_rtl.png +0 -0
  493. data/public/javascripts/ckeditor/_source/skins/office2003/images/dialog_sides.gif +0 -0
  494. data/public/javascripts/ckeditor/_source/skins/office2003/images/dialog_sides.png +0 -0
  495. data/public/javascripts/ckeditor/_source/skins/office2003/images/dialog_sides_rtl.png +0 -0
  496. data/public/javascripts/ckeditor/_source/skins/office2003/images/mini.gif +0 -0
  497. data/public/javascripts/ckeditor/_source/skins/office2003/images/noimage.png +0 -0
  498. data/public/javascripts/ckeditor/_source/skins/office2003/images/sprites.png +0 -0
  499. data/public/javascripts/ckeditor/_source/skins/office2003/images/sprites_ie6.png +0 -0
  500. data/public/javascripts/ckeditor/_source/skins/office2003/mainui.css +145 -0
  501. data/public/javascripts/ckeditor/_source/skins/office2003/menu.css +213 -0
  502. data/public/javascripts/ckeditor/_source/skins/office2003/panel.css +212 -0
  503. data/public/javascripts/ckeditor/_source/skins/office2003/presets.css +49 -0
  504. data/public/javascripts/ckeditor/_source/skins/office2003/reset.css +84 -0
  505. data/public/javascripts/ckeditor/_source/skins/office2003/richcombo.css +297 -0
  506. data/public/javascripts/ckeditor/_source/skins/office2003/skin.js +81 -0
  507. data/public/javascripts/ckeditor/_source/skins/office2003/templates.css +87 -0
  508. data/public/javascripts/ckeditor/_source/skins/office2003/toolbar.css +470 -0
  509. data/public/javascripts/ckeditor/_source/skins/v2/dialog.css +800 -0
  510. data/public/javascripts/ckeditor/_source/skins/v2/editor.css +25 -0
  511. data/public/javascripts/ckeditor/_source/skins/v2/elementspath.css +74 -0
  512. data/public/javascripts/ckeditor/_source/skins/v2/icons.css +354 -0
  513. data/public/javascripts/ckeditor/_source/skins/v2/icons.png +0 -0
  514. data/public/javascripts/ckeditor/_source/skins/v2/icons_rtl.png +0 -0
  515. data/public/javascripts/ckeditor/_source/skins/v2/images/dialog_sides.gif +0 -0
  516. data/public/javascripts/ckeditor/_source/skins/v2/images/dialog_sides.png +0 -0
  517. data/public/javascripts/ckeditor/_source/skins/v2/images/dialog_sides_rtl.png +0 -0
  518. data/public/javascripts/ckeditor/_source/skins/v2/images/mini.gif +0 -0
  519. data/public/javascripts/ckeditor/_source/skins/v2/images/noimage.png +0 -0
  520. data/public/javascripts/ckeditor/_source/skins/v2/images/sprites.png +0 -0
  521. data/public/javascripts/ckeditor/_source/skins/v2/images/sprites_ie6.png +0 -0
  522. data/public/javascripts/ckeditor/_source/skins/v2/images/toolbar_start.gif +0 -0
  523. data/public/javascripts/ckeditor/_source/skins/v2/mainui.css +154 -0
  524. data/public/javascripts/ckeditor/_source/skins/v2/menu.css +215 -0
  525. data/public/javascripts/ckeditor/_source/skins/v2/panel.css +212 -0
  526. data/public/javascripts/ckeditor/_source/skins/v2/presets.css +50 -0
  527. data/public/javascripts/ckeditor/_source/skins/v2/reset.css +84 -0
  528. data/public/javascripts/ckeditor/_source/skins/v2/richcombo.css +297 -0
  529. data/public/javascripts/ckeditor/_source/skins/v2/skin.js +77 -0
  530. data/public/javascripts/ckeditor/_source/skins/v2/templates.css +87 -0
  531. data/public/javascripts/ckeditor/_source/skins/v2/toolbar.css +423 -0
  532. data/public/javascripts/ckeditor/_source/themes/default/theme.js +361 -0
  533. data/public/javascripts/ckeditor/adapters/jquery.js +6 -0
  534. data/public/javascripts/ckeditor/ckeditor.js +137 -0
  535. data/public/javascripts/ckeditor/ckeditor.pack +211 -0
  536. data/public/javascripts/ckeditor/ckeditor_basic.js +8 -0
  537. data/public/javascripts/ckeditor/ckeditor_basic_source.js +20 -0
  538. data/public/javascripts/ckeditor/ckeditor_source.js +25 -0
  539. data/public/javascripts/ckeditor/config.js +43 -0
  540. data/public/javascripts/ckeditor/contents.css +39 -0
  541. data/public/javascripts/ckeditor/css/ckfinder.css +299 -0
  542. data/public/javascripts/ckeditor/css/fck_dialog.css +119 -0
  543. data/public/javascripts/ckeditor/css/fck_editor.css +448 -0
  544. data/public/javascripts/ckeditor/css/swfupload.css +94 -0
  545. data/public/javascripts/ckeditor/images/add.gif +0 -0
  546. data/public/javascripts/ckeditor/images/cancelbutton.gif +0 -0
  547. data/public/javascripts/ckeditor/images/ckfnothumb.gif +0 -0
  548. data/public/javascripts/ckeditor/images/doc.gif +0 -0
  549. data/public/javascripts/ckeditor/images/mp3.gif +0 -0
  550. data/public/javascripts/ckeditor/images/pdf.gif +0 -0
  551. data/public/javascripts/ckeditor/images/rar.gif +0 -0
  552. data/public/javascripts/ckeditor/images/refresh.gif +0 -0
  553. data/public/javascripts/ckeditor/images/select_files.png +0 -0
  554. data/public/javascripts/ckeditor/images/spacer.gif +0 -0
  555. data/public/javascripts/ckeditor/images/swf.gif +0 -0
  556. data/public/javascripts/ckeditor/images/toolbar.start.gif +0 -0
  557. data/public/javascripts/ckeditor/images/xls.gif +0 -0
  558. data/public/javascripts/ckeditor/lang/_languages.js +6 -0
  559. data/public/javascripts/ckeditor/lang/_translationstatus.txt +60 -0
  560. data/public/javascripts/ckeditor/lang/af.js +6 -0
  561. data/public/javascripts/ckeditor/lang/ar.js +6 -0
  562. data/public/javascripts/ckeditor/lang/bg.js +6 -0
  563. data/public/javascripts/ckeditor/lang/bn.js +6 -0
  564. data/public/javascripts/ckeditor/lang/bs.js +6 -0
  565. data/public/javascripts/ckeditor/lang/ca.js +6 -0
  566. data/public/javascripts/ckeditor/lang/cs.js +6 -0
  567. data/public/javascripts/ckeditor/lang/cy.js +6 -0
  568. data/public/javascripts/ckeditor/lang/da.js +6 -0
  569. data/public/javascripts/ckeditor/lang/de.js +6 -0
  570. data/public/javascripts/ckeditor/lang/el.js +6 -0
  571. data/public/javascripts/ckeditor/lang/en-au.js +6 -0
  572. data/public/javascripts/ckeditor/lang/en-ca.js +6 -0
  573. data/public/javascripts/ckeditor/lang/en-gb.js +6 -0
  574. data/public/javascripts/ckeditor/lang/en.js +6 -0
  575. data/public/javascripts/ckeditor/lang/eo.js +6 -0
  576. data/public/javascripts/ckeditor/lang/es.js +6 -0
  577. data/public/javascripts/ckeditor/lang/et.js +6 -0
  578. data/public/javascripts/ckeditor/lang/eu.js +6 -0
  579. data/public/javascripts/ckeditor/lang/fa.js +6 -0
  580. data/public/javascripts/ckeditor/lang/fi.js +6 -0
  581. data/public/javascripts/ckeditor/lang/fo.js +6 -0
  582. data/public/javascripts/ckeditor/lang/fr-ca.js +6 -0
  583. data/public/javascripts/ckeditor/lang/fr.js +6 -0
  584. data/public/javascripts/ckeditor/lang/gl.js +6 -0
  585. data/public/javascripts/ckeditor/lang/gu.js +6 -0
  586. data/public/javascripts/ckeditor/lang/he.js +6 -0
  587. data/public/javascripts/ckeditor/lang/hi.js +6 -0
  588. data/public/javascripts/ckeditor/lang/hr.js +6 -0
  589. data/public/javascripts/ckeditor/lang/hu.js +6 -0
  590. data/public/javascripts/ckeditor/lang/is.js +6 -0
  591. data/public/javascripts/ckeditor/lang/it.js +6 -0
  592. data/public/javascripts/ckeditor/lang/ja.js +6 -0
  593. data/public/javascripts/ckeditor/lang/km.js +6 -0
  594. data/public/javascripts/ckeditor/lang/ko.js +6 -0
  595. data/public/javascripts/ckeditor/lang/lt.js +6 -0
  596. data/public/javascripts/ckeditor/lang/lv.js +6 -0
  597. data/public/javascripts/ckeditor/lang/mn.js +6 -0
  598. data/public/javascripts/ckeditor/lang/ms.js +6 -0
  599. data/public/javascripts/ckeditor/lang/nb.js +6 -0
  600. data/public/javascripts/ckeditor/lang/nl.js +6 -0
  601. data/public/javascripts/ckeditor/lang/no.js +6 -0
  602. data/public/javascripts/ckeditor/lang/pl.js +6 -0
  603. data/public/javascripts/ckeditor/lang/pt-br.js +6 -0
  604. data/public/javascripts/ckeditor/lang/pt.js +6 -0
  605. data/public/javascripts/ckeditor/lang/ro.js +6 -0
  606. data/public/javascripts/ckeditor/lang/ru.js +6 -0
  607. data/public/javascripts/ckeditor/lang/sk.js +6 -0
  608. data/public/javascripts/ckeditor/lang/sl.js +6 -0
  609. data/public/javascripts/ckeditor/lang/sr-latn.js +6 -0
  610. data/public/javascripts/ckeditor/lang/sr.js +6 -0
  611. data/public/javascripts/ckeditor/lang/sv.js +6 -0
  612. data/public/javascripts/ckeditor/lang/th.js +6 -0
  613. data/public/javascripts/ckeditor/lang/tr.js +6 -0
  614. data/public/javascripts/ckeditor/lang/uk.js +6 -0
  615. data/public/javascripts/ckeditor/lang/vi.js +6 -0
  616. data/public/javascripts/ckeditor/lang/zh-cn.js +6 -0
  617. data/public/javascripts/ckeditor/lang/zh.js +6 -0
  618. data/public/javascripts/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +7 -0
  619. data/public/javascripts/ckeditor/plugins/a11yhelp/lang/en.js +6 -0
  620. data/public/javascripts/ckeditor/plugins/a11yhelp/lang/he.js +6 -0
  621. data/public/javascripts/ckeditor/plugins/about/dialogs/about.js +6 -0
  622. data/public/javascripts/ckeditor/plugins/about/dialogs/logo_ckeditor.png +0 -0
  623. data/public/javascripts/ckeditor/plugins/ajax_save/plugin.js +1 -0
  624. data/public/javascripts/ckeditor/plugins/attachment/dialogs/attachment.js +1 -0
  625. data/public/javascripts/ckeditor/plugins/attachment/images/attachment.png +0 -0
  626. data/public/javascripts/ckeditor/plugins/attachment/lang/en.js +10 -0
  627. data/public/javascripts/ckeditor/plugins/attachment/lang/ru.js +10 -0
  628. data/public/javascripts/ckeditor/plugins/attachment/lang/uk.js +10 -0
  629. data/public/javascripts/ckeditor/plugins/attachment/plugin.js +1 -0
  630. data/public/javascripts/ckeditor/plugins/autogrow/plugin.js +6 -0
  631. data/public/javascripts/ckeditor/plugins/clipboard/dialogs/paste.js +7 -0
  632. data/public/javascripts/ckeditor/plugins/colordialog/dialogs/colordialog.js +7 -0
  633. data/public/javascripts/ckeditor/plugins/dialog/dialogDefinition.js +4 -0
  634. data/public/javascripts/ckeditor/plugins/div/dialogs/div.js +8 -0
  635. data/public/javascripts/ckeditor/plugins/embed/dialogs/embed.js +1 -0
  636. data/public/javascripts/ckeditor/plugins/embed/images/embed.png +0 -0
  637. data/public/javascripts/ckeditor/plugins/embed/lang/en.js +9 -0
  638. data/public/javascripts/ckeditor/plugins/embed/lang/ru.js +9 -0
  639. data/public/javascripts/ckeditor/plugins/embed/lang/uk.js +9 -0
  640. data/public/javascripts/ckeditor/plugins/embed/plugin.js +1 -0
  641. data/public/javascripts/ckeditor/plugins/find/dialogs/find.js +9 -0
  642. data/public/javascripts/ckeditor/plugins/flash/dialogs/flash.js +9 -0
  643. data/public/javascripts/ckeditor/plugins/flash/images/placeholder.png +0 -0
  644. data/public/javascripts/ckeditor/plugins/forms/dialogs/button.js +6 -0
  645. data/public/javascripts/ckeditor/plugins/forms/dialogs/checkbox.js +6 -0
  646. data/public/javascripts/ckeditor/plugins/forms/dialogs/form.js +6 -0
  647. data/public/javascripts/ckeditor/plugins/forms/dialogs/hiddenfield.js +6 -0
  648. data/public/javascripts/ckeditor/plugins/forms/dialogs/radio.js +6 -0
  649. data/public/javascripts/ckeditor/plugins/forms/dialogs/select.js +9 -0
  650. data/public/javascripts/ckeditor/plugins/forms/dialogs/textarea.js +6 -0
  651. data/public/javascripts/ckeditor/plugins/forms/dialogs/textfield.js +7 -0
  652. data/public/javascripts/ckeditor/plugins/forms/images/hiddenfield.gif +0 -0
  653. data/public/javascripts/ckeditor/plugins/iframedialog/plugin.js +6 -0
  654. data/public/javascripts/ckeditor/plugins/image/dialogs/image.js +13 -0
  655. data/public/javascripts/ckeditor/plugins/link/dialogs/anchor.js +6 -0
  656. data/public/javascripts/ckeditor/plugins/link/dialogs/link.js +11 -0
  657. data/public/javascripts/ckeditor/plugins/link/images/anchor.gif +0 -0
  658. data/public/javascripts/ckeditor/plugins/liststyle/dialogs/liststyle.js +6 -0
  659. data/public/javascripts/ckeditor/plugins/pagebreak/images/pagebreak.gif +0 -0
  660. data/public/javascripts/ckeditor/plugins/pastefromword/filter/default.js +10 -0
  661. data/public/javascripts/ckeditor/plugins/pastetext/dialogs/pastetext.js +6 -0
  662. data/public/javascripts/ckeditor/plugins/scayt/dialogs/options.js +8 -0
  663. data/public/javascripts/ckeditor/plugins/scayt/dialogs/toolbar.css +6 -0
  664. data/public/javascripts/ckeditor/plugins/showblocks/images/block_address.png +0 -0
  665. data/public/javascripts/ckeditor/plugins/showblocks/images/block_blockquote.png +0 -0
  666. data/public/javascripts/ckeditor/plugins/showblocks/images/block_div.png +0 -0
  667. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h1.png +0 -0
  668. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h2.png +0 -0
  669. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h3.png +0 -0
  670. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h4.png +0 -0
  671. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h5.png +0 -0
  672. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h6.png +0 -0
  673. data/public/javascripts/ckeditor/plugins/showblocks/images/block_p.png +0 -0
  674. data/public/javascripts/ckeditor/plugins/showblocks/images/block_pre.png +0 -0
  675. data/public/javascripts/ckeditor/plugins/smiley/dialogs/smiley.js +7 -0
  676. data/public/javascripts/ckeditor/plugins/smiley/images/angel_smile.gif +0 -0
  677. data/public/javascripts/ckeditor/plugins/smiley/images/angry_smile.gif +0 -0
  678. data/public/javascripts/ckeditor/plugins/smiley/images/broken_heart.gif +0 -0
  679. data/public/javascripts/ckeditor/plugins/smiley/images/confused_smile.gif +0 -0
  680. data/public/javascripts/ckeditor/plugins/smiley/images/cry_smile.gif +0 -0
  681. data/public/javascripts/ckeditor/plugins/smiley/images/devil_smile.gif +0 -0
  682. data/public/javascripts/ckeditor/plugins/smiley/images/embaressed_smile.gif +0 -0
  683. data/public/javascripts/ckeditor/plugins/smiley/images/envelope.gif +0 -0
  684. data/public/javascripts/ckeditor/plugins/smiley/images/heart.gif +0 -0
  685. data/public/javascripts/ckeditor/plugins/smiley/images/kiss.gif +0 -0
  686. data/public/javascripts/ckeditor/plugins/smiley/images/lightbulb.gif +0 -0
  687. data/public/javascripts/ckeditor/plugins/smiley/images/omg_smile.gif +0 -0
  688. data/public/javascripts/ckeditor/plugins/smiley/images/regular_smile.gif +0 -0
  689. data/public/javascripts/ckeditor/plugins/smiley/images/sad_smile.gif +0 -0
  690. data/public/javascripts/ckeditor/plugins/smiley/images/shades_smile.gif +0 -0
  691. data/public/javascripts/ckeditor/plugins/smiley/images/teeth_smile.gif +0 -0
  692. data/public/javascripts/ckeditor/plugins/smiley/images/thumbs_down.gif +0 -0
  693. data/public/javascripts/ckeditor/plugins/smiley/images/thumbs_up.gif +0 -0
  694. data/public/javascripts/ckeditor/plugins/smiley/images/tounge_smile.gif +0 -0
  695. data/public/javascripts/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif +0 -0
  696. data/public/javascripts/ckeditor/plugins/smiley/images/wink_smile.gif +0 -0
  697. data/public/javascripts/ckeditor/plugins/specialchar/dialogs/specialchar.js +7 -0
  698. data/public/javascripts/ckeditor/plugins/styles/styles/default.js +6 -0
  699. data/public/javascripts/ckeditor/plugins/table/dialogs/table.js +9 -0
  700. data/public/javascripts/ckeditor/plugins/tableresize/plugin.js +7 -0
  701. data/public/javascripts/ckeditor/plugins/tabletools/dialogs/tableCell.js +8 -0
  702. data/public/javascripts/ckeditor/plugins/templates/dialogs/templates.js +7 -0
  703. data/public/javascripts/ckeditor/plugins/templates/templates/default.js +6 -0
  704. data/public/javascripts/ckeditor/plugins/templates/templates/images/template1.gif +0 -0
  705. data/public/javascripts/ckeditor/plugins/templates/templates/images/template2.gif +0 -0
  706. data/public/javascripts/ckeditor/plugins/templates/templates/images/template3.gif +0 -0
  707. data/public/javascripts/ckeditor/plugins/uicolor/dialogs/uicolor.js +7 -0
  708. data/public/javascripts/ckeditor/plugins/uicolor/lang/en.js +6 -0
  709. data/public/javascripts/ckeditor/plugins/uicolor/lang/he.js +6 -0
  710. data/public/javascripts/ckeditor/plugins/uicolor/plugin.js +6 -0
  711. data/public/javascripts/ckeditor/plugins/uicolor/uicolor.gif +0 -0
  712. data/public/javascripts/ckeditor/plugins/uicolor/yui/assets/hue_bg.png +0 -0
  713. data/public/javascripts/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png +0 -0
  714. data/public/javascripts/ckeditor/plugins/uicolor/yui/assets/picker_mask.png +0 -0
  715. data/public/javascripts/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png +0 -0
  716. data/public/javascripts/ckeditor/plugins/uicolor/yui/assets/yui.css +6 -0
  717. data/public/javascripts/ckeditor/plugins/uicolor/yui/yui.js +76 -0
  718. data/public/javascripts/ckeditor/plugins/wsc/dialogs/ciframe.html +49 -0
  719. data/public/javascripts/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +52 -0
  720. data/public/javascripts/ckeditor/plugins/wsc/dialogs/wsc.css +6 -0
  721. data/public/javascripts/ckeditor/plugins/wsc/dialogs/wsc.js +7 -0
  722. data/public/javascripts/ckeditor/skins/kama/dialog.css +9 -0
  723. data/public/javascripts/ckeditor/skins/kama/editor.css +12 -0
  724. data/public/javascripts/ckeditor/skins/kama/icons.png +0 -0
  725. data/public/javascripts/ckeditor/skins/kama/icons_rtl.png +0 -0
  726. data/public/javascripts/ckeditor/skins/kama/images/dialog_sides.gif +0 -0
  727. data/public/javascripts/ckeditor/skins/kama/images/dialog_sides.png +0 -0
  728. data/public/javascripts/ckeditor/skins/kama/images/dialog_sides_rtl.png +0 -0
  729. data/public/javascripts/ckeditor/skins/kama/images/mini.gif +0 -0
  730. data/public/javascripts/ckeditor/skins/kama/images/noimage.png +0 -0
  731. data/public/javascripts/ckeditor/skins/kama/images/sprites.png +0 -0
  732. data/public/javascripts/ckeditor/skins/kama/images/sprites_ie6.png +0 -0
  733. data/public/javascripts/ckeditor/skins/kama/images/toolbar_start.gif +0 -0
  734. data/public/javascripts/ckeditor/skins/kama/skin.js +7 -0
  735. data/public/javascripts/ckeditor/skins/kama/templates.css +6 -0
  736. data/public/javascripts/ckeditor/skins/office2003/dialog.css +9 -0
  737. data/public/javascripts/ckeditor/skins/office2003/editor.css +13 -0
  738. data/public/javascripts/ckeditor/skins/office2003/icons.png +0 -0
  739. data/public/javascripts/ckeditor/skins/office2003/icons_rtl.png +0 -0
  740. data/public/javascripts/ckeditor/skins/office2003/images/dialog_sides.gif +0 -0
  741. data/public/javascripts/ckeditor/skins/office2003/images/dialog_sides.png +0 -0
  742. data/public/javascripts/ckeditor/skins/office2003/images/dialog_sides_rtl.png +0 -0
  743. data/public/javascripts/ckeditor/skins/office2003/images/mini.gif +0 -0
  744. data/public/javascripts/ckeditor/skins/office2003/images/noimage.png +0 -0
  745. data/public/javascripts/ckeditor/skins/office2003/images/sprites.png +0 -0
  746. data/public/javascripts/ckeditor/skins/office2003/images/sprites_ie6.png +0 -0
  747. data/public/javascripts/ckeditor/skins/office2003/skin.js +6 -0
  748. data/public/javascripts/ckeditor/skins/office2003/templates.css +6 -0
  749. data/public/javascripts/ckeditor/skins/v2/dialog.css +9 -0
  750. data/public/javascripts/ckeditor/skins/v2/editor.css +12 -0
  751. data/public/javascripts/ckeditor/skins/v2/icons.png +0 -0
  752. data/public/javascripts/ckeditor/skins/v2/icons_rtl.png +0 -0
  753. data/public/javascripts/ckeditor/skins/v2/images/dialog_sides.gif +0 -0
  754. data/public/javascripts/ckeditor/skins/v2/images/dialog_sides.png +0 -0
  755. data/public/javascripts/ckeditor/skins/v2/images/dialog_sides_rtl.png +0 -0
  756. data/public/javascripts/ckeditor/skins/v2/images/mini.gif +0 -0
  757. data/public/javascripts/ckeditor/skins/v2/images/noimage.png +0 -0
  758. data/public/javascripts/ckeditor/skins/v2/images/sprites.png +0 -0
  759. data/public/javascripts/ckeditor/skins/v2/images/sprites_ie6.png +0 -0
  760. data/public/javascripts/ckeditor/skins/v2/images/toolbar_start.gif +0 -0
  761. data/public/javascripts/ckeditor/skins/v2/skin.js +6 -0
  762. data/public/javascripts/ckeditor/skins/v2/templates.css +6 -0
  763. data/public/javascripts/ckeditor/swfupload/fileprogress.js +275 -0
  764. data/public/javascripts/ckeditor/swfupload/handlers.js +170 -0
  765. data/public/javascripts/ckeditor/swfupload/mootools-1.2.3-core-yc.js +356 -0
  766. data/public/javascripts/ckeditor/swfupload/querystring.js +40 -0
  767. data/public/javascripts/ckeditor/swfupload/swfupload.js +1 -0
  768. data/public/javascripts/ckeditor/swfupload/swfupload.queue.js +1 -0
  769. data/public/javascripts/ckeditor/swfupload/swfupload.swf +0 -0
  770. data/public/javascripts/ckeditor/swfupload/swfupload.swfobject.js +111 -0
  771. data/public/javascripts/ckeditor/themes/default/theme.js +8 -0
  772. data/public/javascripts/controls.js +965 -0
  773. data/public/javascripts/dragdrop.js +974 -0
  774. data/public/javascripts/effects.js +1123 -0
  775. data/public/javascripts/prototype.js +6001 -0
  776. data/public/javascripts/rails.js +175 -0
  777. data/public/robots.txt +5 -0
  778. data/public/stylesheets/.gitkeep +0 -0
  779. data/public/stylesheets/application.css +688 -0
  780. data/public/stylesheets/core.css +1147 -0
  781. data/public/stylesheets/core_ie.css +52 -0
  782. data/public/stylesheets/csshover3.htc +14 -0
  783. data/script/cucumber +10 -0
  784. data/script/rails +6 -0
  785. data/spec/blueprints.rb +14 -0
  786. data/spec/controllers/admin/managed_contents_controller_spec.rb +57 -0
  787. data/spec/controllers/admin/publications_controller_spec.rb +62 -0
  788. data/spec/controllers/managed_contents_controller_spec.rb +18 -0
  789. data/spec/controllers/publications_controller_spec.rb +17 -0
  790. data/spec/editorial_logic_spec.rb +42 -0
  791. data/spec/models/managed_content_spec.rb +111 -0
  792. data/spec/models/publication_spec.rb +97 -0
  793. data/spec/models/section_spec.rb +47 -0
  794. data/spec/spec_helper.rb +13 -0
  795. data/spec/support/be_valid_asset.rb +5 -0
  796. data/tasks/editorial_logic.rake +30 -0
  797. metadata +1009 -0
@@ -0,0 +1,1375 @@
1
+ /*
2
+ Copyright (c) 2003-2010, 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
+ var selectAllCmd =
74
+ {
75
+ modes : { wysiwyg : 1, source : 1 },
76
+ exec : function( editor )
77
+ {
78
+ switch ( editor.mode )
79
+ {
80
+ case 'wysiwyg' :
81
+ editor.document.$.execCommand( 'SelectAll', false, null );
82
+ break;
83
+ case 'source' :
84
+ // Select the contents of the textarea
85
+ var textarea = editor.textarea.$ ;
86
+ if ( CKEDITOR.env.ie )
87
+ {
88
+ textarea.createTextRange().execCommand( 'SelectAll' ) ;
89
+ }
90
+ else
91
+ {
92
+ textarea.selectionStart = 0 ;
93
+ textarea.selectionEnd = textarea.value.length ;
94
+ }
95
+ textarea.focus() ;
96
+ }
97
+ },
98
+ canUndo : false
99
+ };
100
+
101
+ CKEDITOR.plugins.add( 'selection',
102
+ {
103
+ init : function( editor )
104
+ {
105
+ editor.on( 'contentDom', function()
106
+ {
107
+ var doc = editor.document,
108
+ body = doc.getBody(),
109
+ html = doc.getDocumentElement();
110
+
111
+ if ( CKEDITOR.env.ie )
112
+ {
113
+ // Other browsers don't loose the selection if the
114
+ // editor document loose the focus. In IE, we don't
115
+ // have support for it, so we reproduce it here, other
116
+ // than firing the selection change event.
117
+
118
+ var savedRange,
119
+ saveEnabled,
120
+ restoreEnabled = 1;
121
+
122
+ // "onfocusin" is fired before "onfocus". It makes it
123
+ // possible to restore the selection before click
124
+ // events get executed.
125
+ body.on( 'focusin', function( evt )
126
+ {
127
+ // If there are elements with layout they fire this event but
128
+ // it must be ignored to allow edit its contents #4682
129
+ if ( evt.data.$.srcElement.nodeName != 'BODY' )
130
+ return;
131
+
132
+ // If we have saved a range, restore it at this
133
+ // point.
134
+ if ( savedRange )
135
+ {
136
+ // Range restored here might invalidate the DOM structure thus break up
137
+ // the locked selection, give it up. (#6083)
138
+ var lockedSelection = doc.getCustomData( 'cke_locked_selection' );
139
+ if ( restoreEnabled && !lockedSelection )
140
+ {
141
+ // Well not break because of this.
142
+ try
143
+ {
144
+ savedRange.select();
145
+ }
146
+ catch (e)
147
+ {}
148
+ }
149
+
150
+ savedRange = null;
151
+ }
152
+ });
153
+
154
+ body.on( 'focus', function()
155
+ {
156
+ // Enable selections to be saved.
157
+ saveEnabled = 1;
158
+
159
+ saveSelection();
160
+ });
161
+
162
+ body.on( 'beforedeactivate', function( evt )
163
+ {
164
+ // Ignore this event if it's caused by focus switch between
165
+ // internal editable control type elements, e.g. layouted paragraph. (#4682)
166
+ if ( evt.data.$.toElement )
167
+ return;
168
+
169
+ // Disable selections from being saved.
170
+ saveEnabled = 0;
171
+ restoreEnabled = 1;
172
+ });
173
+
174
+ // IE before version 8 will leave cursor blinking inside the document after
175
+ // editor blurred unless we clean up the selection. (#4716)
176
+ if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 )
177
+ {
178
+ editor.on( 'blur', function( evt )
179
+ {
180
+ // Try/Catch to avoid errors if the editor is hidden. (#6375)
181
+ try
182
+ {
183
+ editor.document && editor.document.$.selection.empty();
184
+ }
185
+ catch (e) {}
186
+ });
187
+ }
188
+
189
+ // Listening on document element ensures that
190
+ // scrollbar is included. (#5280)
191
+ html.on( 'mousedown', function()
192
+ {
193
+ // Lock restore selection now, as we have
194
+ // a followed 'click' event which introduce
195
+ // new selection. (#5735)
196
+ restoreEnabled = 0;
197
+ });
198
+
199
+ html.on( 'mouseup', function()
200
+ {
201
+ restoreEnabled = 1;
202
+ });
203
+
204
+ // In IE6/7 the blinking cursor appears, but contents are
205
+ // not editable. (#5634)
206
+ if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.version < 8 || CKEDITOR.env.quirks ) )
207
+ {
208
+ // The 'click' event is not fired when clicking the
209
+ // scrollbars, so we can use it to check whether
210
+ // the empty space following <body> has been clicked.
211
+ html.on( 'click', function( evt )
212
+ {
213
+ if ( evt.data.getTarget().getName() == 'html' )
214
+ editor.getSelection().getRanges()[ 0 ].select();
215
+ });
216
+ }
217
+
218
+ var scroll;
219
+ // IE fires the "selectionchange" event when clicking
220
+ // inside a selection. We don't want to capture that.
221
+ body.on( 'mousedown', function( evt )
222
+ {
223
+ // IE scrolls document to top on right mousedown
224
+ // when editor has no focus, remember this scroll
225
+ // position and revert it before context menu opens. (#5778)
226
+ if ( evt.data.$.button == 2 )
227
+ {
228
+ var sel = editor.document.$.selection;
229
+ if ( sel.type == 'None' )
230
+ scroll = editor.window.getScrollPosition();
231
+ }
232
+ disableSave();
233
+ });
234
+
235
+ body.on( 'mouseup',
236
+ function( evt )
237
+ {
238
+ // Restore recorded scroll position when needed on right mouseup.
239
+ if ( evt.data.$.button == 2 && scroll )
240
+ {
241
+ editor.document.$.documentElement.scrollLeft = scroll.x;
242
+ editor.document.$.documentElement.scrollTop = scroll.y;
243
+ }
244
+ scroll = null;
245
+
246
+ saveEnabled = 1;
247
+ setTimeout( function()
248
+ {
249
+ saveSelection( true );
250
+ },
251
+ 0 );
252
+ });
253
+
254
+ body.on( 'keydown', disableSave );
255
+ body.on( 'keyup',
256
+ function()
257
+ {
258
+ saveEnabled = 1;
259
+ saveSelection();
260
+ });
261
+
262
+
263
+ // IE is the only to provide the "selectionchange"
264
+ // event.
265
+ doc.on( 'selectionchange', saveSelection );
266
+
267
+ function disableSave()
268
+ {
269
+ saveEnabled = 0;
270
+ }
271
+
272
+ function saveSelection( testIt )
273
+ {
274
+ if ( saveEnabled )
275
+ {
276
+ var doc = editor.document,
277
+ sel = editor.getSelection(),
278
+ nativeSel = sel && sel.getNative();
279
+
280
+ // There is a very specific case, when clicking
281
+ // inside a text selection. In that case, the
282
+ // selection collapses at the clicking point,
283
+ // but the selection object remains in an
284
+ // unknown state, making createRange return a
285
+ // range at the very start of the document. In
286
+ // such situation we have to test the range, to
287
+ // be sure it's valid.
288
+ if ( testIt && nativeSel && nativeSel.type == 'None' )
289
+ {
290
+ // The "InsertImage" command can be used to
291
+ // test whether the selection is good or not.
292
+ // If not, it's enough to give some time to
293
+ // IE to put things in order for us.
294
+ if ( !doc.$.queryCommandEnabled( 'InsertImage' ) )
295
+ {
296
+ CKEDITOR.tools.setTimeout( saveSelection, 50, this, true );
297
+ return;
298
+ }
299
+ }
300
+
301
+ // Avoid saving selection from within text input. (#5747)
302
+ var parentTag;
303
+ if ( nativeSel && nativeSel.type && nativeSel.type != 'Control'
304
+ && ( parentTag = nativeSel.createRange() )
305
+ && ( parentTag = parentTag.parentElement() )
306
+ && ( parentTag = parentTag.nodeName )
307
+ && parentTag.toLowerCase() in { input: 1, textarea : 1 } )
308
+ {
309
+ return;
310
+ }
311
+
312
+ savedRange = nativeSel && sel.getRanges()[ 0 ];
313
+
314
+ checkSelectionChangeTimeout.call( editor );
315
+ }
316
+ }
317
+ }
318
+ else
319
+ {
320
+ // In other browsers, we make the selection change
321
+ // check based on other events, like clicks or keys
322
+ // press.
323
+
324
+ doc.on( 'mouseup', checkSelectionChangeTimeout, editor );
325
+ doc.on( 'keyup', checkSelectionChangeTimeout, editor );
326
+ }
327
+ });
328
+
329
+ editor.addCommand( 'selectAll', selectAllCmd );
330
+ editor.ui.addButton( 'SelectAll',
331
+ {
332
+ label : editor.lang.selectAll,
333
+ command : 'selectAll'
334
+ });
335
+
336
+ editor.selectionChange = checkSelectionChangeTimeout;
337
+ }
338
+ });
339
+
340
+ /**
341
+ * Gets the current selection from the editing area when in WYSIWYG mode.
342
+ * @returns {CKEDITOR.dom.selection} A selection object or null if not on
343
+ * WYSIWYG mode or no selection is available.
344
+ * @example
345
+ * var selection = CKEDITOR.instances.editor1.<b>getSelection()</b>;
346
+ * alert( selection.getType() );
347
+ */
348
+ CKEDITOR.editor.prototype.getSelection = function()
349
+ {
350
+ return this.document && this.document.getSelection();
351
+ };
352
+
353
+ CKEDITOR.editor.prototype.forceNextSelectionCheck = function()
354
+ {
355
+ delete this._.selectionPreviousPath;
356
+ };
357
+
358
+ /**
359
+ * Gets the current selection from the document.
360
+ * @returns {CKEDITOR.dom.selection} A selection object.
361
+ * @example
362
+ * var selection = CKEDITOR.instances.editor1.document.<b>getSelection()</b>;
363
+ * alert( selection.getType() );
364
+ */
365
+ CKEDITOR.dom.document.prototype.getSelection = function()
366
+ {
367
+ var sel = new CKEDITOR.dom.selection( this );
368
+ return ( !sel || sel.isInvalid ) ? null : sel;
369
+ };
370
+
371
+ /**
372
+ * No selection.
373
+ * @constant
374
+ * @example
375
+ * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_NONE )
376
+ * alert( 'Nothing is selected' );
377
+ */
378
+ CKEDITOR.SELECTION_NONE = 1;
379
+
380
+ /**
381
+ * Text or collapsed selection.
382
+ * @constant
383
+ * @example
384
+ * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_TEXT )
385
+ * alert( 'Text is selected' );
386
+ */
387
+ CKEDITOR.SELECTION_TEXT = 2;
388
+
389
+ /**
390
+ * Element selection.
391
+ * @constant
392
+ * @example
393
+ * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_ELEMENT )
394
+ * alert( 'An element is selected' );
395
+ */
396
+ CKEDITOR.SELECTION_ELEMENT = 3;
397
+
398
+ /**
399
+ * Manipulates the selection in a DOM document.
400
+ * @constructor
401
+ * @example
402
+ */
403
+ CKEDITOR.dom.selection = function( document )
404
+ {
405
+ var lockedSelection = document.getCustomData( 'cke_locked_selection' );
406
+
407
+ if ( lockedSelection )
408
+ return lockedSelection;
409
+
410
+ this.document = document;
411
+ this.isLocked = 0;
412
+ this._ =
413
+ {
414
+ cache : {}
415
+ };
416
+
417
+ /**
418
+ * IE BUG: The selection's document may be a different document than the
419
+ * editor document. Return null if that's the case.
420
+ */
421
+ if ( CKEDITOR.env.ie )
422
+ {
423
+ var range = this.getNative().createRange();
424
+ if ( !range
425
+ || ( range.item && range.item(0).ownerDocument != this.document.$ )
426
+ || ( range.parentElement && range.parentElement().ownerDocument != this.document.$ ) )
427
+ {
428
+ this.isInvalid = true;
429
+ }
430
+ }
431
+
432
+ return this;
433
+ };
434
+
435
+ var styleObjectElements =
436
+ {
437
+ img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,
438
+ a:1, input:1, form:1, select:1, textarea:1, button:1, fieldset:1, th:1, thead:1, tfoot:1
439
+ };
440
+
441
+ CKEDITOR.dom.selection.prototype =
442
+ {
443
+ /**
444
+ * Gets the native selection object from the browser.
445
+ * @function
446
+ * @returns {Object} The native selection object.
447
+ * @example
448
+ * var selection = editor.getSelection().<b>getNative()</b>;
449
+ */
450
+ getNative :
451
+ CKEDITOR.env.ie ?
452
+ function()
453
+ {
454
+ return this._.cache.nativeSel || ( this._.cache.nativeSel = this.document.$.selection );
455
+ }
456
+ :
457
+ function()
458
+ {
459
+ return this._.cache.nativeSel || ( this._.cache.nativeSel = this.document.getWindow().$.getSelection() );
460
+ },
461
+
462
+ /**
463
+ * Gets the type of the current selection. The following values are
464
+ * available:
465
+ * <ul>
466
+ * <li>{@link CKEDITOR.SELECTION_NONE} (1): No selection.</li>
467
+ * <li>{@link CKEDITOR.SELECTION_TEXT} (2): Text is selected or
468
+ * collapsed selection.</li>
469
+ * <li>{@link CKEDITOR.SELECTION_ELEMENT} (3): A element
470
+ * selection.</li>
471
+ * </ul>
472
+ * @function
473
+ * @returns {Number} One of the following constant values:
474
+ * {@link CKEDITOR.SELECTION_NONE}, {@link CKEDITOR.SELECTION_TEXT} or
475
+ * {@link CKEDITOR.SELECTION_ELEMENT}.
476
+ * @example
477
+ * if ( editor.getSelection().<b>getType()</b> == CKEDITOR.SELECTION_TEXT )
478
+ * alert( 'Text is selected' );
479
+ */
480
+ getType :
481
+ CKEDITOR.env.ie ?
482
+ function()
483
+ {
484
+ var cache = this._.cache;
485
+ if ( cache.type )
486
+ return cache.type;
487
+
488
+ var type = CKEDITOR.SELECTION_NONE;
489
+
490
+ try
491
+ {
492
+ var sel = this.getNative(),
493
+ ieType = sel.type;
494
+
495
+ if ( ieType == 'Text' )
496
+ type = CKEDITOR.SELECTION_TEXT;
497
+
498
+ if ( ieType == 'Control' )
499
+ type = CKEDITOR.SELECTION_ELEMENT;
500
+
501
+ // It is possible that we can still get a text range
502
+ // object even when type == 'None' is returned by IE.
503
+ // So we'd better check the object returned by
504
+ // createRange() rather than by looking at the type.
505
+ if ( sel.createRange().parentElement )
506
+ type = CKEDITOR.SELECTION_TEXT;
507
+ }
508
+ catch(e) {}
509
+
510
+ return ( cache.type = type );
511
+ }
512
+ :
513
+ function()
514
+ {
515
+ var cache = this._.cache;
516
+ if ( cache.type )
517
+ return cache.type;
518
+
519
+ var type = CKEDITOR.SELECTION_TEXT;
520
+
521
+ var sel = this.getNative();
522
+
523
+ if ( !sel )
524
+ type = CKEDITOR.SELECTION_NONE;
525
+ else if ( sel.rangeCount == 1 )
526
+ {
527
+ // Check if the actual selection is a control (IMG,
528
+ // TABLE, HR, etc...).
529
+
530
+ var range = sel.getRangeAt(0),
531
+ startContainer = range.startContainer;
532
+
533
+ if ( startContainer == range.endContainer
534
+ && startContainer.nodeType == 1
535
+ && ( range.endOffset - range.startOffset ) == 1
536
+ && styleObjectElements[ startContainer.childNodes[ range.startOffset ].nodeName.toLowerCase() ] )
537
+ {
538
+ type = CKEDITOR.SELECTION_ELEMENT;
539
+ }
540
+ }
541
+
542
+ return ( cache.type = type );
543
+ },
544
+
545
+ /**
546
+ * Retrieve the {@link CKEDITOR.dom.range} instances that represent the current selection.
547
+ * Note: Some browsers returns multiple ranges even on a sequent selection, e.g. Firefox returns
548
+ * one range for each table cell when one or more table row is selected.
549
+ * @return {Array}
550
+ * @example
551
+ * var ranges = selection.getRanges();
552
+ * alert(ranges.length);
553
+ */
554
+ getRanges : (function()
555
+ {
556
+ var func = CKEDITOR.env.ie ?
557
+ ( function()
558
+ {
559
+ // Finds the container and offset for a specific boundary
560
+ // of an IE range.
561
+ var getBoundaryInformation = function( range, start )
562
+ {
563
+ // Creates a collapsed range at the requested boundary.
564
+ range = range.duplicate();
565
+ range.collapse( start );
566
+
567
+ // Gets the element that encloses the range entirely.
568
+ var parent = range.parentElement();
569
+ var siblings = parent.childNodes;
570
+
571
+ var testRange;
572
+
573
+ for ( var i = 0 ; i < siblings.length ; i++ )
574
+ {
575
+ var child = siblings[ i ];
576
+ if ( child.nodeType == 1 )
577
+ {
578
+ testRange = range.duplicate();
579
+
580
+ testRange.moveToElementText( child );
581
+
582
+ var comparisonStart = testRange.compareEndPoints( 'StartToStart', range ),
583
+ comparisonEnd = testRange.compareEndPoints( 'EndToStart', range );
584
+
585
+ testRange.collapse();
586
+
587
+ if ( comparisonStart > 0 )
588
+ break;
589
+ // When selection stay at the side of certain self-closing elements, e.g. BR,
590
+ // our comparison will never shows an equality. (#4824)
591
+ else if ( !comparisonStart
592
+ || comparisonEnd == 1 && comparisonStart == -1 )
593
+ return { container : parent, offset : i };
594
+ else if ( !comparisonEnd )
595
+ return { container : parent, offset : i + 1 };
596
+
597
+ testRange = null;
598
+ }
599
+ }
600
+
601
+ if ( !testRange )
602
+ {
603
+ testRange = range.duplicate();
604
+ testRange.moveToElementText( parent );
605
+ testRange.collapse( false );
606
+ }
607
+
608
+ testRange.setEndPoint( 'StartToStart', range );
609
+ // IE report line break as CRLF with range.text but
610
+ // only LF with textnode.nodeValue, normalize them to avoid
611
+ // breaking character counting logic below. (#3949)
612
+ var distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length;
613
+
614
+ try
615
+ {
616
+ while ( distance > 0 )
617
+ distance -= siblings[ --i ].nodeValue.length;
618
+ }
619
+ // Measurement in IE could be somtimes wrong because of <select> element. (#4611)
620
+ catch( e )
621
+ {
622
+ distance = 0;
623
+ }
624
+
625
+
626
+ if ( distance === 0 )
627
+ {
628
+ return {
629
+ container : parent,
630
+ offset : i
631
+ };
632
+ }
633
+ else
634
+ {
635
+ return {
636
+ container : siblings[ i ],
637
+ offset : -distance
638
+ };
639
+ }
640
+ };
641
+
642
+ return function()
643
+ {
644
+ // IE doesn't have range support (in the W3C way), so we
645
+ // need to do some magic to transform selections into
646
+ // CKEDITOR.dom.range instances.
647
+
648
+ var sel = this.getNative(),
649
+ nativeRange = sel && sel.createRange(),
650
+ type = this.getType(),
651
+ range;
652
+
653
+ if ( !sel )
654
+ return [];
655
+
656
+ if ( type == CKEDITOR.SELECTION_TEXT )
657
+ {
658
+ range = new CKEDITOR.dom.range( this.document );
659
+
660
+ var boundaryInfo = getBoundaryInformation( nativeRange, true );
661
+ range.setStart( new CKEDITOR.dom.node( boundaryInfo.container ), boundaryInfo.offset );
662
+
663
+ boundaryInfo = getBoundaryInformation( nativeRange );
664
+ range.setEnd( new CKEDITOR.dom.node( boundaryInfo.container ), boundaryInfo.offset );
665
+
666
+ // Correct an invalid IE range case on empty list item. (#5850)
667
+ if ( range.endContainer.getPosition( range.startContainer ) & CKEDITOR.POSITION_PRECEDING
668
+ && range.endOffset <= range.startContainer.getIndex() )
669
+ {
670
+ range.collapse();
671
+ }
672
+
673
+ return [ range ];
674
+ }
675
+ else if ( type == CKEDITOR.SELECTION_ELEMENT )
676
+ {
677
+ var retval = [];
678
+
679
+ for ( var i = 0 ; i < nativeRange.length ; i++ )
680
+ {
681
+ var element = nativeRange.item( i ),
682
+ parentElement = element.parentNode,
683
+ j = 0;
684
+
685
+ range = new CKEDITOR.dom.range( this.document );
686
+
687
+ for (; j < parentElement.childNodes.length && parentElement.childNodes[j] != element ; j++ )
688
+ { /*jsl:pass*/ }
689
+
690
+ range.setStart( new CKEDITOR.dom.node( parentElement ), j );
691
+ range.setEnd( new CKEDITOR.dom.node( parentElement ), j + 1 );
692
+ retval.push( range );
693
+ }
694
+
695
+ return retval;
696
+ }
697
+
698
+ return [];
699
+ };
700
+ })()
701
+ :
702
+ function()
703
+ {
704
+
705
+ // On browsers implementing the W3C range, we simply
706
+ // tranform the native ranges in CKEDITOR.dom.range
707
+ // instances.
708
+
709
+ var ranges = [],
710
+ range,
711
+ doc = this.document,
712
+ sel = this.getNative();
713
+
714
+ if ( !sel )
715
+ return ranges;
716
+
717
+ // On WebKit, it may happen that we'll have no selection
718
+ // available. We normalize it here by replicating the
719
+ // behavior of other browsers.
720
+ if ( !sel.rangeCount )
721
+ {
722
+ range = new CKEDITOR.dom.range( doc );
723
+ range.moveToElementEditStart( doc.getBody() );
724
+ ranges.push( range );
725
+ }
726
+
727
+ for ( var i = 0 ; i < sel.rangeCount ; i++ )
728
+ {
729
+ var nativeRange = sel.getRangeAt( i );
730
+
731
+ range = new CKEDITOR.dom.range( doc );
732
+
733
+ range.setStart( new CKEDITOR.dom.node( nativeRange.startContainer ), nativeRange.startOffset );
734
+ range.setEnd( new CKEDITOR.dom.node( nativeRange.endContainer ), nativeRange.endOffset );
735
+ ranges.push( range );
736
+ }
737
+ return ranges;
738
+ };
739
+
740
+ return function( onlyEditables )
741
+ {
742
+ var cache = this._.cache;
743
+ if ( cache.ranges && !onlyEditables )
744
+ return cache.ranges;
745
+ else if ( !cache.ranges )
746
+ cache.ranges = new CKEDITOR.dom.rangeList( func.call( this ) );
747
+
748
+ // Split range into multiple by read-only nodes.
749
+ if ( onlyEditables )
750
+ {
751
+ var ranges = cache.ranges;
752
+ for ( var i = 0; i < ranges.length; i++ )
753
+ {
754
+ var range = ranges[ i ];
755
+
756
+ // Drop range spans inside one ready-only node.
757
+ var parent = range.getCommonAncestor();
758
+ if ( parent.isReadOnly() )
759
+ ranges.splice( i, 1 );
760
+
761
+ if ( range.collapsed )
762
+ continue;
763
+
764
+ var startContainer = range.startContainer,
765
+ endContainer = range.endContainer,
766
+ startOffset = range.startOffset,
767
+ endOffset = range.endOffset,
768
+ walkerRange = range.clone();
769
+
770
+ // Range may start inside a non-editable element, restart range
771
+ // by the end of it.
772
+ var readOnly;
773
+ if ( ( readOnly = startContainer.isReadOnly() ) )
774
+ range.setStartAfter( readOnly );
775
+
776
+ // Enlarge range start/end with text node to avoid walker
777
+ // being DOM destructive, it doesn't interfere our checking
778
+ // of elements below as well.
779
+ if ( startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
780
+ {
781
+ if ( startOffset >= startContainer.getLength() )
782
+ walkerRange.setStartAfter( startContainer );
783
+ else
784
+ walkerRange.setStartBefore( startContainer );
785
+ }
786
+
787
+ if ( endContainer && endContainer.type == CKEDITOR.NODE_TEXT )
788
+ {
789
+ if ( !endOffset )
790
+ walkerRange.setEndBefore( endContainer );
791
+ else
792
+ walkerRange.setEndAfter( endContainer );
793
+ }
794
+
795
+ // Looking for non-editable element inside the range.
796
+ var walker = new CKEDITOR.dom.walker( walkerRange );
797
+ walker.evaluator = function( node )
798
+ {
799
+ if ( node.type == CKEDITOR.NODE_ELEMENT
800
+ && node.getAttribute( 'contenteditable' ) == 'false' )
801
+ {
802
+ var newRange = range.clone();
803
+ range.setEndBefore( node );
804
+
805
+ // Drop collapsed range around read-only elements,
806
+ // it make sure the range list empty when selecting
807
+ // only non-editable elements.
808
+ if ( range.collapsed )
809
+ ranges.splice( i--, 1 );
810
+
811
+ // Avoid creating invalid range.
812
+ if ( !( node.getPosition( walkerRange.endContainer ) & CKEDITOR.POSITION_CONTAINS ) )
813
+ {
814
+ newRange.setStartAfter( node );
815
+ if ( !newRange.collapsed )
816
+ ranges.splice( i + 1, 0, newRange );
817
+ }
818
+
819
+ return true;
820
+ }
821
+
822
+ return false;
823
+ };
824
+
825
+ walker.next();
826
+ }
827
+ }
828
+
829
+ return cache.ranges;
830
+ };
831
+ })(),
832
+
833
+ /**
834
+ * Gets the DOM element in which the selection starts.
835
+ * @returns {CKEDITOR.dom.element} The element at the beginning of the
836
+ * selection.
837
+ * @example
838
+ * var element = editor.getSelection().<b>getStartElement()</b>;
839
+ * alert( element.getName() );
840
+ */
841
+ getStartElement : function()
842
+ {
843
+ var cache = this._.cache;
844
+ if ( cache.startElement !== undefined )
845
+ return cache.startElement;
846
+
847
+ var node,
848
+ sel = this.getNative();
849
+
850
+ switch ( this.getType() )
851
+ {
852
+ case CKEDITOR.SELECTION_ELEMENT :
853
+ return this.getSelectedElement();
854
+
855
+ case CKEDITOR.SELECTION_TEXT :
856
+
857
+ var range = this.getRanges()[0];
858
+
859
+ if ( range )
860
+ {
861
+ if ( !range.collapsed )
862
+ {
863
+ range.optimize();
864
+
865
+ // Decrease the range content to exclude particial
866
+ // selected node on the start which doesn't have
867
+ // visual impact. ( #3231 )
868
+ while ( 1 )
869
+ {
870
+ var startContainer = range.startContainer,
871
+ startOffset = range.startOffset;
872
+ // Limit the fix only to non-block elements.(#3950)
873
+ if ( startOffset == ( startContainer.getChildCount ?
874
+ startContainer.getChildCount() : startContainer.getLength() )
875
+ && !startContainer.isBlockBoundary() )
876
+ range.setStartAfter( startContainer );
877
+ else break;
878
+ }
879
+
880
+ node = range.startContainer;
881
+
882
+ if ( node.type != CKEDITOR.NODE_ELEMENT )
883
+ return node.getParent();
884
+
885
+ node = node.getChild( range.startOffset );
886
+
887
+ if ( !node || node.type != CKEDITOR.NODE_ELEMENT )
888
+ node = range.startContainer;
889
+ else
890
+ {
891
+ var child = node.getFirst();
892
+ while ( child && child.type == CKEDITOR.NODE_ELEMENT )
893
+ {
894
+ node = child;
895
+ child = child.getFirst();
896
+ }
897
+ }
898
+ }
899
+ else
900
+ {
901
+ node = range.startContainer;
902
+ if ( node.type != CKEDITOR.NODE_ELEMENT )
903
+ node = node.getParent();
904
+ }
905
+
906
+ node = node.$;
907
+ }
908
+ }
909
+
910
+ return cache.startElement = ( node ? new CKEDITOR.dom.element( node ) : null );
911
+ },
912
+
913
+ /**
914
+ * Gets the current selected element.
915
+ * @returns {CKEDITOR.dom.element} The selected element. Null if no
916
+ * selection is available or the selection type is not
917
+ * {@link CKEDITOR.SELECTION_ELEMENT}.
918
+ * @example
919
+ * var element = editor.getSelection().<b>getSelectedElement()</b>;
920
+ * alert( element.getName() );
921
+ */
922
+ getSelectedElement : function()
923
+ {
924
+ var cache = this._.cache;
925
+ if ( cache.selectedElement !== undefined )
926
+ return cache.selectedElement;
927
+
928
+ var self = this;
929
+
930
+ var node = CKEDITOR.tools.tryThese(
931
+ // Is it native IE control type selection?
932
+ function()
933
+ {
934
+ return self.getNative().createRange().item( 0 );
935
+ },
936
+ // Figure it out by checking if there's a single enclosed
937
+ // node of the range.
938
+ function()
939
+ {
940
+ var range = self.getRanges()[ 0 ],
941
+ enclosed,
942
+ selected;
943
+
944
+ // Check first any enclosed element, e.g. <ul>[<li><a href="#">item</a></li>]</ul>
945
+ for ( var i = 2; i && !( ( enclosed = range.getEnclosedNode() )
946
+ && ( enclosed.type == CKEDITOR.NODE_ELEMENT )
947
+ && styleObjectElements[ enclosed.getName() ]
948
+ && ( selected = enclosed ) ); i-- )
949
+ {
950
+ // Then check any deep wrapped element, e.g. [<b><i><img /></i></b>]
951
+ range.shrink( CKEDITOR.SHRINK_ELEMENT );
952
+ }
953
+
954
+ return selected.$;
955
+ });
956
+
957
+ return cache.selectedElement = ( node ? new CKEDITOR.dom.element( node ) : null );
958
+ },
959
+
960
+ lock : function()
961
+ {
962
+ // Call all cacheable function.
963
+ this.getRanges();
964
+ this.getStartElement();
965
+ this.getSelectedElement();
966
+
967
+ // The native selection is not available when locked.
968
+ this._.cache.nativeSel = {};
969
+
970
+ this.isLocked = 1;
971
+
972
+ // Save this selection inside the DOM document.
973
+ this.document.setCustomData( 'cke_locked_selection', this );
974
+ },
975
+
976
+ unlock : function( restore )
977
+ {
978
+ var doc = this.document,
979
+ lockedSelection = doc.getCustomData( 'cke_locked_selection' );
980
+
981
+ if ( lockedSelection )
982
+ {
983
+ doc.setCustomData( 'cke_locked_selection', null );
984
+
985
+ if ( restore )
986
+ {
987
+ var selectedElement = lockedSelection.getSelectedElement(),
988
+ ranges = !selectedElement && lockedSelection.getRanges();
989
+
990
+ this.isLocked = 0;
991
+ this.reset();
992
+
993
+ doc.getBody().focus();
994
+
995
+ if ( selectedElement )
996
+ this.selectElement( selectedElement );
997
+ else
998
+ this.selectRanges( ranges );
999
+ }
1000
+ }
1001
+
1002
+ if ( !lockedSelection || !restore )
1003
+ {
1004
+ this.isLocked = 0;
1005
+ this.reset();
1006
+ }
1007
+ },
1008
+
1009
+ reset : function()
1010
+ {
1011
+ this._.cache = {};
1012
+ },
1013
+
1014
+ /**
1015
+ * Make the current selection of type {@link CKEDITOR.SELECTION_ELEMENT} by enclosing the specified element.
1016
+ * @param element
1017
+ */
1018
+ selectElement : function( element )
1019
+ {
1020
+ if ( this.isLocked )
1021
+ {
1022
+ var range = new CKEDITOR.dom.range( this.document );
1023
+ range.setStartBefore( element );
1024
+ range.setEndAfter( element );
1025
+
1026
+ this._.cache.selectedElement = element;
1027
+ this._.cache.startElement = element;
1028
+ this._.cache.ranges = new CKEDITOR.dom.rangeList( range );
1029
+ this._.cache.type = CKEDITOR.SELECTION_ELEMENT;
1030
+
1031
+ return;
1032
+ }
1033
+
1034
+ if ( CKEDITOR.env.ie )
1035
+ {
1036
+ this.getNative().empty();
1037
+
1038
+ try
1039
+ {
1040
+ // Try to select the node as a control.
1041
+ range = this.document.$.body.createControlRange();
1042
+ range.addElement( element.$ );
1043
+ range.select();
1044
+ }
1045
+ catch( e )
1046
+ {
1047
+ // If failed, select it as a text range.
1048
+ range = this.document.$.body.createTextRange();
1049
+ range.moveToElementText( element.$ );
1050
+ range.select();
1051
+ }
1052
+ finally
1053
+ {
1054
+ this.document.fire( 'selectionchange' );
1055
+ }
1056
+
1057
+ this.reset();
1058
+ }
1059
+ else
1060
+ {
1061
+ // Create the range for the element.
1062
+ range = this.document.$.createRange();
1063
+ range.selectNode( element.$ );
1064
+
1065
+ // Select the range.
1066
+ var sel = this.getNative();
1067
+ sel.removeAllRanges();
1068
+ sel.addRange( range );
1069
+
1070
+ this.reset();
1071
+ }
1072
+ },
1073
+
1074
+ /**
1075
+ * Adding the specified ranges to document selection preceding
1076
+ * by clearing up the original selection.
1077
+ * @param {CKEDITOR.dom.range} ranges
1078
+ */
1079
+ selectRanges : function( ranges )
1080
+ {
1081
+ if ( this.isLocked )
1082
+ {
1083
+ this._.cache.selectedElement = null;
1084
+ this._.cache.startElement = ranges[ 0 ] && ranges[ 0 ].getTouchedStartNode();
1085
+ this._.cache.ranges = new CKEDITOR.dom.rangeList( ranges );
1086
+ this._.cache.type = CKEDITOR.SELECTION_TEXT;
1087
+
1088
+ return;
1089
+ }
1090
+
1091
+ if ( CKEDITOR.env.ie )
1092
+ {
1093
+ if ( ranges.length > 1 )
1094
+ {
1095
+ // IE doesn't accept multiple ranges selection, so we join all into one.
1096
+ var last = ranges[ ranges.length -1 ] ;
1097
+ ranges[ 0 ].setEnd( last.endContainer, last.endOffset );
1098
+ ranges.length = 1;
1099
+ }
1100
+
1101
+ if ( ranges[ 0 ] )
1102
+ ranges[ 0 ].select();
1103
+
1104
+ this.reset();
1105
+ }
1106
+ else
1107
+ {
1108
+ var sel = this.getNative();
1109
+
1110
+ if ( ranges.length )
1111
+ sel.removeAllRanges();
1112
+
1113
+ for ( var i = 0 ; i < ranges.length ; i++ )
1114
+ {
1115
+ // Joining sequential ranges introduced by
1116
+ // readonly elements protection.
1117
+ if ( i < ranges.length -1 )
1118
+ {
1119
+ var left = ranges[ i ], right = ranges[ i +1 ],
1120
+ between = left.clone();
1121
+ between.setStart( left.endContainer, left.endOffset );
1122
+ between.setEnd( right.startContainer, right.startOffset );
1123
+
1124
+ // Don't confused by Firefox adjancent multi-ranges
1125
+ // introduced by table cells selection.
1126
+ if ( !between.collapsed )
1127
+ {
1128
+ between.shrink( CKEDITOR.NODE_ELEMENT, true );
1129
+ if ( between.getCommonAncestor().isReadOnly())
1130
+ {
1131
+ right.setStart( left.startContainer, left.startOffset );
1132
+ ranges.splice( i--, 1 );
1133
+ continue;
1134
+ }
1135
+ }
1136
+ }
1137
+
1138
+ var range = ranges[ i ];
1139
+ var nativeRange = this.document.$.createRange();
1140
+ var startContainer = range.startContainer;
1141
+
1142
+ // In FF2, if we have a collapsed range, inside an empty
1143
+ // element, we must add something to it otherwise the caret
1144
+ // will not be visible.
1145
+ // In Opera instead, the selection will be moved out of the
1146
+ // element. (#4657)
1147
+ if ( range.collapsed &&
1148
+ ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 ) ) &&
1149
+ startContainer.type == CKEDITOR.NODE_ELEMENT &&
1150
+ !startContainer.getChildCount() )
1151
+ {
1152
+ startContainer.appendText( '' );
1153
+ }
1154
+
1155
+ nativeRange.setStart( startContainer.$, range.startOffset );
1156
+ nativeRange.setEnd( range.endContainer.$, range.endOffset );
1157
+
1158
+ // Select the range.
1159
+ sel.addRange( nativeRange );
1160
+ }
1161
+
1162
+ this.reset();
1163
+ }
1164
+ },
1165
+
1166
+ /**
1167
+ * Create bookmark for every single of this selection range (from #getRanges)
1168
+ * by calling the {@link CKEDITOR.dom.range.prototype.createBookmark} method,
1169
+ * with extra cares to avoid interferon among those ranges. Same arguments are
1170
+ * received as with the underlay range method.
1171
+ */
1172
+ createBookmarks : function( serializable )
1173
+ {
1174
+ return this.getRanges().createBookmarks( serializable );
1175
+ },
1176
+
1177
+ /**
1178
+ * Create bookmark for every single of this selection range (from #getRanges)
1179
+ * by calling the {@link CKEDITOR.dom.range.prototype.createBookmark2} method,
1180
+ * with extra cares to avoid interferon among those ranges. Same arguments are
1181
+ * received as with the underlay range method.
1182
+ */
1183
+ createBookmarks2 : function( normalized )
1184
+ {
1185
+ return this.getRanges().createBookmarks2( normalized );
1186
+ },
1187
+
1188
+ /**
1189
+ * Select the virtual ranges denote by the bookmarks by calling #selectRanges.
1190
+ * @param bookmarks
1191
+ */
1192
+ selectBookmarks : function( bookmarks )
1193
+ {
1194
+ var ranges = [];
1195
+ for ( var i = 0 ; i < bookmarks.length ; i++ )
1196
+ {
1197
+ var range = new CKEDITOR.dom.range( this.document );
1198
+ range.moveToBookmark( bookmarks[i] );
1199
+ ranges.push( range );
1200
+ }
1201
+ this.selectRanges( ranges );
1202
+ return this;
1203
+ },
1204
+
1205
+ /**
1206
+ * Retrieve the common ancestor node of the first range and the last range.
1207
+ */
1208
+ getCommonAncestor : function()
1209
+ {
1210
+ var ranges = this.getRanges(),
1211
+ startNode = ranges[ 0 ].startContainer,
1212
+ endNode = ranges[ ranges.length - 1 ].endContainer;
1213
+ return startNode.getCommonAncestor( endNode );
1214
+ },
1215
+
1216
+ /**
1217
+ * Moving scroll bar to the current selection's start position.
1218
+ */
1219
+ scrollIntoView : function()
1220
+ {
1221
+ // If we have split the block, adds a temporary span at the
1222
+ // range position and scroll relatively to it.
1223
+ var start = this.getStartElement();
1224
+ start.scrollIntoView();
1225
+ }
1226
+ };
1227
+ })();
1228
+
1229
+ ( function()
1230
+ {
1231
+ var notWhitespaces = CKEDITOR.dom.walker.whitespaces( true ),
1232
+ fillerTextRegex = /\ufeff|\u00a0/,
1233
+ nonCells = { table:1,tbody:1,tr:1 };
1234
+
1235
+ CKEDITOR.dom.range.prototype.select =
1236
+ CKEDITOR.env.ie ?
1237
+ // V2
1238
+ function( forceExpand )
1239
+ {
1240
+ var collapsed = this.collapsed;
1241
+ var isStartMarkerAlone;
1242
+ var dummySpan;
1243
+
1244
+ // IE doesn't support selecting the entire table row/cell, move the selection into cells, e.g.
1245
+ // <table><tbody><tr>[<td>cell</b></td>... => <table><tbody><tr><td>[cell</td>...
1246
+ if ( this.startContainer.type == CKEDITOR.NODE_ELEMENT && this.startContainer.getName() in nonCells
1247
+ || this.endContainer.type == CKEDITOR.NODE_ELEMENT && this.endContainer.getName() in nonCells )
1248
+ {
1249
+ this.shrink( CKEDITOR.NODE_ELEMENT, true );
1250
+ }
1251
+
1252
+ var bookmark = this.createBookmark();
1253
+
1254
+ // Create marker tags for the start and end boundaries.
1255
+ var startNode = bookmark.startNode;
1256
+
1257
+ var endNode;
1258
+ if ( !collapsed )
1259
+ endNode = bookmark.endNode;
1260
+
1261
+ // Create the main range which will be used for the selection.
1262
+ var ieRange = this.document.$.body.createTextRange();
1263
+
1264
+ // Position the range at the start boundary.
1265
+ ieRange.moveToElementText( startNode.$ );
1266
+ ieRange.moveStart( 'character', 1 );
1267
+
1268
+ if ( endNode )
1269
+ {
1270
+ // Create a tool range for the end.
1271
+ var ieRangeEnd = this.document.$.body.createTextRange();
1272
+
1273
+ // Position the tool range at the end.
1274
+ ieRangeEnd.moveToElementText( endNode.$ );
1275
+
1276
+ // Move the end boundary of the main range to match the tool range.
1277
+ ieRange.setEndPoint( 'EndToEnd', ieRangeEnd );
1278
+ ieRange.moveEnd( 'character', -1 );
1279
+ }
1280
+ else
1281
+ {
1282
+ // The isStartMarkerAlone logic comes from V2. It guarantees that the lines
1283
+ // will expand and that the cursor will be blinking on the right place.
1284
+ // Actually, we are using this flag just to avoid using this hack in all
1285
+ // situations, but just on those needed.
1286
+ var next = startNode.getNext( notWhitespaces );
1287
+ isStartMarkerAlone = ( !( next && next.getText && next.getText().match( fillerTextRegex ) ) // already a filler there?
1288
+ && ( forceExpand || !startNode.hasPrevious() || ( startNode.getPrevious().is && startNode.getPrevious().is( 'br' ) ) ) );
1289
+
1290
+ // Append a temporary <span>&#65279;</span> before the selection.
1291
+ // This is needed to avoid IE destroying selections inside empty
1292
+ // inline elements, like <b></b> (#253).
1293
+ // It is also needed when placing the selection right after an inline
1294
+ // element to avoid the selection moving inside of it.
1295
+ dummySpan = this.document.createElement( 'span' );
1296
+ dummySpan.setHtml( '&#65279;' ); // Zero Width No-Break Space (U+FEFF). See #1359.
1297
+ dummySpan.insertBefore( startNode );
1298
+
1299
+ if ( isStartMarkerAlone )
1300
+ {
1301
+ // To expand empty blocks or line spaces after <br>, we need
1302
+ // instead to have any char, which will be later deleted using the
1303
+ // selection.
1304
+ // \ufeff = Zero Width No-Break Space (U+FEFF). (#1359)
1305
+ this.document.createText( '\ufeff' ).insertBefore( startNode );
1306
+ }
1307
+ }
1308
+
1309
+ // Remove the markers (reset the position, because of the changes in the DOM tree).
1310
+ this.setStartBefore( startNode );
1311
+ startNode.remove();
1312
+
1313
+ if ( collapsed )
1314
+ {
1315
+ if ( isStartMarkerAlone )
1316
+ {
1317
+ // Move the selection start to include the temporary \ufeff.
1318
+ ieRange.moveStart( 'character', -1 );
1319
+
1320
+ ieRange.select();
1321
+
1322
+ // Remove our temporary stuff.
1323
+ this.document.$.selection.clear();
1324
+ }
1325
+ else
1326
+ ieRange.select();
1327
+
1328
+ this.moveToPosition( dummySpan, CKEDITOR.POSITION_BEFORE_START );
1329
+ dummySpan.remove();
1330
+ }
1331
+ else
1332
+ {
1333
+ this.setEndBefore( endNode );
1334
+ endNode.remove();
1335
+ ieRange.select();
1336
+ }
1337
+
1338
+ this.document.fire( 'selectionchange' );
1339
+ }
1340
+ :
1341
+ function()
1342
+ {
1343
+ var startContainer = this.startContainer;
1344
+
1345
+ // If we have a collapsed range, inside an empty element, we must add
1346
+ // something to it, otherwise the caret will not be visible.
1347
+ if ( this.collapsed && startContainer.type == CKEDITOR.NODE_ELEMENT && !startContainer.getChildCount() )
1348
+ startContainer.append( new CKEDITOR.dom.text( '' ) );
1349
+
1350
+ var nativeRange = this.document.$.createRange();
1351
+ nativeRange.setStart( startContainer.$, this.startOffset );
1352
+
1353
+ try
1354
+ {
1355
+ nativeRange.setEnd( this.endContainer.$, this.endOffset );
1356
+ }
1357
+ catch ( e )
1358
+ {
1359
+ // There is a bug in Firefox implementation (it would be too easy
1360
+ // otherwise). The new start can't be after the end (W3C says it can).
1361
+ // So, let's create a new range and collapse it to the desired point.
1362
+ if ( e.toString().indexOf( 'NS_ERROR_ILLEGAL_VALUE' ) >= 0 )
1363
+ {
1364
+ this.collapse( true );
1365
+ nativeRange.setEnd( this.endContainer.$, this.endOffset );
1366
+ }
1367
+ else
1368
+ throw( e );
1369
+ }
1370
+
1371
+ var selection = this.document.getSelection().getNative();
1372
+ selection.removeAllRanges();
1373
+ selection.addRange( nativeRange );
1374
+ };
1375
+ } )();