ppc_logic 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (870) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Capfile +4 -0
  4. data/Gemfile +31 -0
  5. data/Rakefile +32 -0
  6. data/VERSION +1 -0
  7. data/app/controllers/admin/ads_controller.rb +43 -0
  8. data/app/controllers/admin/branches_controller.rb +48 -0
  9. data/app/controllers/admin/campaigns_controller.rb +67 -0
  10. data/app/controllers/admin/landing_pages_controller.rb +63 -0
  11. data/app/controllers/admin/local_offers_controller.rb +44 -0
  12. data/app/controllers/admin/ppc_controller.rb +6 -0
  13. data/app/controllers/application_controller.rb +4 -0
  14. data/app/controllers/landing_pages_controller.rb +16 -0
  15. data/app/helpers/application_helper.rb +19 -0
  16. data/app/helpers/layout_helper.rb +18 -0
  17. data/app/models/ad.rb +49 -0
  18. data/app/models/branch.rb +35 -0
  19. data/app/models/campaign.rb +59 -0
  20. data/app/models/landing_page.rb +174 -0
  21. data/app/models/landing_page_report.rb +132 -0
  22. data/app/models/landing_page_stat.rb +43 -0
  23. data/app/models/local_offer.rb +38 -0
  24. data/app/views/admin/ads/_form.html.erb +215 -0
  25. data/app/views/admin/ads/edit.html.erb +5 -0
  26. data/app/views/admin/ads/index.html.erb +27 -0
  27. data/app/views/admin/ads/new.html.erb +5 -0
  28. data/app/views/admin/ads/show.html.erb +23 -0
  29. data/app/views/admin/branches/_form.html.erb +37 -0
  30. data/app/views/admin/branches/edit.html.erb +5 -0
  31. data/app/views/admin/branches/index.html.erb +25 -0
  32. data/app/views/admin/branches/new.html.erb +5 -0
  33. data/app/views/admin/branches/show.html.erb +23 -0
  34. data/app/views/admin/campaigns/_form.html.erb +95 -0
  35. data/app/views/admin/campaigns/_locale_select.html.erb +12 -0
  36. data/app/views/admin/campaigns/_targeting.html.erb +11 -0
  37. data/app/views/admin/campaigns/edit.html.erb +5 -0
  38. data/app/views/admin/campaigns/index.html.erb +35 -0
  39. data/app/views/admin/campaigns/new.html.erb +5 -0
  40. data/app/views/admin/campaigns/show.html.erb +23 -0
  41. data/app/views/admin/landing_pages/_form.html.erb +52 -0
  42. data/app/views/admin/landing_pages/_landing_page.html.erb +21 -0
  43. data/app/views/admin/landing_pages/edit.html.erb +5 -0
  44. data/app/views/admin/landing_pages/index.html.erb +30 -0
  45. data/app/views/admin/landing_pages/landing_page_report.html.erb +126 -0
  46. data/app/views/admin/landing_pages/new.html.erb +5 -0
  47. data/app/views/admin/landing_pages/show.html.erb +39 -0
  48. data/app/views/admin/local_offers/_form.html.erb +40 -0
  49. data/app/views/admin/local_offers/edit.html.erb +5 -0
  50. data/app/views/admin/local_offers/index.html.erb +31 -0
  51. data/app/views/admin/local_offers/new.html.erb +5 -0
  52. data/app/views/admin/local_offers/show.html.erb +22 -0
  53. data/app/views/admin/ppc/index.html.erb +15 -0
  54. data/app/views/landing_pages/show.html.erb +2 -0
  55. data/app/views/layouts/application.html.erb +52 -0
  56. data/config.ru +2 -0
  57. data/config/application.rb +11 -0
  58. data/config/boot.rb +3 -0
  59. data/config/cucumber.yml +10 -0
  60. data/config/environment.rb +3 -0
  61. data/config/environments/development.rb +12 -0
  62. data/config/environments/production.rb +9 -0
  63. data/config/environments/test.rb +15 -0
  64. data/config/initializers/campfire_logic.rb +10 -0
  65. data/config/initializers/formats.rb +19 -0
  66. data/config/initializers/metric_fu.rb +9 -0
  67. data/config/initializers/ppc_logic.rb +9 -0
  68. data/config/initializers/secret_token.rb +1 -0
  69. data/config/initializers/session_store.rb +1 -0
  70. data/config/mongoid.yml +18 -0
  71. data/config/routes.rb +23 -0
  72. data/features/manage_landing_pages.feature +47 -0
  73. data/features/manage_local_offers.feature +47 -0
  74. data/features/step_definitions/general_steps.rb +7 -0
  75. data/features/step_definitions/landing_page_steps.rb +7 -0
  76. data/features/step_definitions/site_steps.rb +19 -0
  77. data/features/step_definitions/web_steps.rb +219 -0
  78. data/features/support/env.rb +33 -0
  79. data/features/support/hooks.rb +4 -0
  80. data/features/support/paths.rb +33 -0
  81. data/init.rb +1 -0
  82. data/lib/.DS_Store +0 -0
  83. data/lib/madmen.rb +9 -0
  84. data/lib/madmen/google.rb +97 -0
  85. data/lib/madmen/google/ad.rb +177 -0
  86. data/lib/madmen/google/ad_group.rb +209 -0
  87. data/lib/madmen/google/campaign.rb +307 -0
  88. data/lib/madmen/google/keyword.rb +123 -0
  89. data/lib/ppc_logic.rb +19 -0
  90. data/lib/ppc_logic/engine.rb +7 -0
  91. data/lib/ppc_logic/railtie.rb +10 -0
  92. data/lib/tasks/cucumber.rake +53 -0
  93. data/lib/tasks/rcov.rake +76 -0
  94. data/ppc_logic.gemspec +939 -0
  95. data/public/404.html +26 -0
  96. data/public/422.html +26 -0
  97. data/public/500.html +26 -0
  98. data/public/favicon.ico +0 -0
  99. data/public/images/icons/add.png +0 -0
  100. data/public/images/icons/checkmark.gif +0 -0
  101. data/public/images/icons/collapsed.gif +0 -0
  102. data/public/images/icons/delete.png +0 -0
  103. data/public/images/icons/drag.png +0 -0
  104. data/public/images/icons/edit.png +0 -0
  105. data/public/images/icons/expanded.gif +0 -0
  106. data/public/images/icons/help_icon.png +0 -0
  107. data/public/images/icons/link_icon.png +0 -0
  108. data/public/images/icons/move.png +0 -0
  109. data/public/images/icons/move_white.png +0 -0
  110. data/public/images/icons/note.png +0 -0
  111. data/public/images/icons/note_white.png +0 -0
  112. data/public/images/icons/notification_icon_sprite.png +0 -0
  113. data/public/images/icons/spinner.gif +0 -0
  114. data/public/images/icons/view.png +0 -0
  115. data/public/images/icons/warning.png +0 -0
  116. data/public/images/icons/warning_2.png +0 -0
  117. data/public/images/icons/warning_box.png +0 -0
  118. data/public/images/icons/warning_icon.png +0 -0
  119. data/public/images/icons/warning_white.png +0 -0
  120. data/public/images/layout/arrow_asc.png +0 -0
  121. data/public/images/layout/arrow_desc.png +0 -0
  122. data/public/images/layout/back.png +0 -0
  123. data/public/images/layout/black_bar.png +0 -0
  124. data/public/images/layout/branding.png +0 -0
  125. data/public/images/layout/breadcrumb_bg.png +0 -0
  126. data/public/images/layout/button_bg.png +0 -0
  127. data/public/images/layout/content_left_bg.png +0 -0
  128. data/public/images/layout/content_right_bg.png +0 -0
  129. data/public/images/layout/footer_bg.png +0 -0
  130. data/public/images/layout/h1_bg.png +0 -0
  131. data/public/images/layout/h2_bg.png +0 -0
  132. data/public/images/layout/h2_bg_for_table.png +0 -0
  133. data/public/images/layout/header_bg_grey.png +0 -0
  134. data/public/images/layout/header_bg_purple.png +0 -0
  135. data/public/images/layout/legend_bg.png +0 -0
  136. data/public/images/layout/menu_box_bg.png +0 -0
  137. data/public/images/layout/shadow_border.png +0 -0
  138. data/public/images/layout/shadow_border_2.png +0 -0
  139. data/public/images/layout/shadow_border_3.png +0 -0
  140. data/public/images/layout/shadow_border_4.png +0 -0
  141. data/public/images/layout/tab.png +0 -0
  142. data/public/images/layout/tab_active.png +0 -0
  143. data/public/images/layout/table_header.png +0 -0
  144. data/public/images/layout/text_field_bg.jpg +0 -0
  145. data/public/images/layout/text_field_error_bg.png +0 -0
  146. data/public/images/layout/th_bg.png +0 -0
  147. data/public/images/layout/th_bg_selected.png +0 -0
  148. data/public/images/menu_icons/account.png +0 -0
  149. data/public/images/menu_icons/affiliates.png +0 -0
  150. data/public/images/menu_icons/banner_ad.png +0 -0
  151. data/public/images/menu_icons/banner_ad_disabled.png +0 -0
  152. data/public/images/menu_icons/banner_ad_on.png +0 -0
  153. data/public/images/menu_icons/banner_ads_disabled.png +0 -0
  154. data/public/images/menu_icons/billing.png +0 -0
  155. data/public/images/menu_icons/campaigns.png +0 -0
  156. data/public/images/menu_icons/campaigns_disabled.png +0 -0
  157. data/public/images/menu_icons/campaigns_on.png +0 -0
  158. data/public/images/menu_icons/categories.png +0 -0
  159. data/public/images/menu_icons/clients.png +0 -0
  160. data/public/images/menu_icons/clients_on.png +0 -0
  161. data/public/images/menu_icons/contact.png +0 -0
  162. data/public/images/menu_icons/directories.png +0 -0
  163. data/public/images/menu_icons/document.png +0 -0
  164. data/public/images/menu_icons/document_on.png +0 -0
  165. data/public/images/menu_icons/help.png +0 -0
  166. data/public/images/menu_icons/images.png +0 -0
  167. data/public/images/menu_icons/images_on.png +0 -0
  168. data/public/images/menu_icons/keywords.png +0 -0
  169. data/public/images/menu_icons/landing_pages.png +0 -0
  170. data/public/images/menu_icons/landing_pages_disabled.png +0 -0
  171. data/public/images/menu_icons/landing_pages_on.png +0 -0
  172. data/public/images/menu_icons/library.png +0 -0
  173. data/public/images/menu_icons/library_on.png +0 -0
  174. data/public/images/menu_icons/local_site.png +0 -0
  175. data/public/images/menu_icons/local_site_on.png +0 -0
  176. data/public/images/menu_icons/locations.png +0 -0
  177. data/public/images/menu_icons/locations_on.png +0 -0
  178. data/public/images/menu_icons/messages.png +0 -0
  179. data/public/images/menu_icons/messages_on.png +0 -0
  180. data/public/images/menu_icons/ppc_ads.png +0 -0
  181. data/public/images/menu_icons/ppc_ads_disabled.png +0 -0
  182. data/public/images/menu_icons/ppc_ads_on.png +0 -0
  183. data/public/images/menu_icons/print_collaterals.png +0 -0
  184. data/public/images/menu_icons/print_collaterals_disabled.png +0 -0
  185. data/public/images/menu_icons/print_collaterals_on.png +0 -0
  186. data/public/images/menu_icons/reports.png +0 -0
  187. data/public/images/menu_icons/reports_on.png +0 -0
  188. data/public/images/menu_icons/services.png +0 -0
  189. data/public/images/menu_icons/services_on.png +0 -0
  190. data/public/images/menu_icons/settings.png +0 -0
  191. data/public/images/menu_icons/site_template.png +0 -0
  192. data/public/images/menu_icons/site_template_on.png +0 -0
  193. data/public/images/menu_icons/survey.png +0 -0
  194. data/public/images/menu_icons/survey_on.png +0 -0
  195. data/public/images/menu_icons/users.png +0 -0
  196. data/public/images/menu_icons/users_on.png +0 -0
  197. data/public/images/menu_icons/video.png +0 -0
  198. data/public/images/menu_icons/video_on.png +0 -0
  199. data/public/index.html +9 -0
  200. data/public/javascripts/application.js +2 -0
  201. data/public/javascripts/ckeditor/.htaccess +24 -0
  202. data/public/javascripts/ckeditor/CHANGES.html +993 -0
  203. data/public/javascripts/ckeditor/INSTALL.html +92 -0
  204. data/public/javascripts/ckeditor/LICENSE.html +1334 -0
  205. data/public/javascripts/ckeditor/_samples/ajax.html +87 -0
  206. data/public/javascripts/ckeditor/_samples/api.html +152 -0
  207. data/public/javascripts/ckeditor/_samples/api_dialog.html +188 -0
  208. data/public/javascripts/ckeditor/_samples/api_dialog/my_dialog.js +28 -0
  209. data/public/javascripts/ckeditor/_samples/asp/advanced.asp +105 -0
  210. data/public/javascripts/ckeditor/_samples/asp/events.asp +136 -0
  211. data/public/javascripts/ckeditor/_samples/asp/index.html +103 -0
  212. data/public/javascripts/ckeditor/_samples/asp/replace.asp +72 -0
  213. data/public/javascripts/ckeditor/_samples/asp/replaceall.asp +77 -0
  214. data/public/javascripts/ckeditor/_samples/asp/sample_posteddata.asp +46 -0
  215. data/public/javascripts/ckeditor/_samples/asp/standalone.asp +72 -0
  216. data/public/javascripts/ckeditor/_samples/assets/output_for_flash.fla +0 -0
  217. data/public/javascripts/ckeditor/_samples/assets/output_for_flash.swf +0 -0
  218. data/public/javascripts/ckeditor/_samples/assets/output_xhtml.css +204 -0
  219. data/public/javascripts/ckeditor/_samples/assets/swfobject.js +18 -0
  220. data/public/javascripts/ckeditor/_samples/autogrow.html +75 -0
  221. data/public/javascripts/ckeditor/_samples/divreplace.html +137 -0
  222. data/public/javascripts/ckeditor/_samples/enterkey.html +88 -0
  223. data/public/javascripts/ckeditor/_samples/fullpage.html +62 -0
  224. data/public/javascripts/ckeditor/_samples/index.html +57 -0
  225. data/public/javascripts/ckeditor/_samples/jqueryadapter.html +73 -0
  226. data/public/javascripts/ckeditor/_samples/output_for_flash.html +257 -0
  227. data/public/javascripts/ckeditor/_samples/output_html.html +259 -0
  228. data/public/javascripts/ckeditor/_samples/output_xhtml.html +159 -0
  229. data/public/javascripts/ckeditor/_samples/php/advanced.php +93 -0
  230. data/public/javascripts/ckeditor/_samples/php/events.php +130 -0
  231. data/public/javascripts/ckeditor/_samples/php/replace.php +63 -0
  232. data/public/javascripts/ckeditor/_samples/php/replaceall.php +68 -0
  233. data/public/javascripts/ckeditor/_samples/php/standalone.php +64 -0
  234. data/public/javascripts/ckeditor/_samples/replacebyclass.html +49 -0
  235. data/public/javascripts/ckeditor/_samples/replacebycode.html +80 -0
  236. data/public/javascripts/ckeditor/_samples/sample.css +81 -0
  237. data/public/javascripts/ckeditor/_samples/sample.js +65 -0
  238. data/public/javascripts/ckeditor/_samples/sample_posteddata.php +59 -0
  239. data/public/javascripts/ckeditor/_samples/sharedspaces.html +131 -0
  240. data/public/javascripts/ckeditor/_samples/skins.html +83 -0
  241. data/public/javascripts/ckeditor/_samples/ui_color.html +87 -0
  242. data/public/javascripts/ckeditor/_samples/ui_languages.html +103 -0
  243. data/public/javascripts/ckeditor/_source/adapters/jquery.js +297 -0
  244. data/public/javascripts/ckeditor/_source/core/_bootstrap.js +96 -0
  245. data/public/javascripts/ckeditor/_source/core/ajax.js +142 -0
  246. data/public/javascripts/ckeditor/_source/core/ckeditor.js +133 -0
  247. data/public/javascripts/ckeditor/_source/core/ckeditor_base.js +196 -0
  248. data/public/javascripts/ckeditor/_source/core/ckeditor_basic.js +239 -0
  249. data/public/javascripts/ckeditor/_source/core/command.js +209 -0
  250. data/public/javascripts/ckeditor/_source/core/commanddefinition.js +129 -0
  251. data/public/javascripts/ckeditor/_source/core/config.js +430 -0
  252. data/public/javascripts/ckeditor/_source/core/dataprocessor.js +65 -0
  253. data/public/javascripts/ckeditor/_source/core/dom.js +20 -0
  254. data/public/javascripts/ckeditor/_source/core/dom/comment.js +32 -0
  255. data/public/javascripts/ckeditor/_source/core/dom/document.js +224 -0
  256. data/public/javascripts/ckeditor/_source/core/dom/documentfragment.js +49 -0
  257. data/public/javascripts/ckeditor/_source/core/dom/domobject.js +255 -0
  258. data/public/javascripts/ckeditor/_source/core/dom/element.js +1564 -0
  259. data/public/javascripts/ckeditor/_source/core/dom/elementpath.js +119 -0
  260. data/public/javascripts/ckeditor/_source/core/dom/event.js +142 -0
  261. data/public/javascripts/ckeditor/_source/core/dom/node.js +683 -0
  262. data/public/javascripts/ckeditor/_source/core/dom/nodelist.js +26 -0
  263. data/public/javascripts/ckeditor/_source/core/dom/range.js +1883 -0
  264. data/public/javascripts/ckeditor/_source/core/dom/rangelist.js +214 -0
  265. data/public/javascripts/ckeditor/_source/core/dom/text.js +123 -0
  266. data/public/javascripts/ckeditor/_source/core/dom/walker.js +445 -0
  267. data/public/javascripts/ckeditor/_source/core/dom/window.js +96 -0
  268. data/public/javascripts/ckeditor/_source/core/dtd.js +238 -0
  269. data/public/javascripts/ckeditor/_source/core/editor.js +924 -0
  270. data/public/javascripts/ckeditor/_source/core/editor_basic.js +182 -0
  271. data/public/javascripts/ckeditor/_source/core/env.js +270 -0
  272. data/public/javascripts/ckeditor/_source/core/event.js +342 -0
  273. data/public/javascripts/ckeditor/_source/core/eventInfo.js +120 -0
  274. data/public/javascripts/ckeditor/_source/core/focusmanager.js +152 -0
  275. data/public/javascripts/ckeditor/_source/core/htmlparser.js +224 -0
  276. data/public/javascripts/ckeditor/_source/core/htmlparser/basicwriter.js +145 -0
  277. data/public/javascripts/ckeditor/_source/core/htmlparser/cdata.js +43 -0
  278. data/public/javascripts/ckeditor/_source/core/htmlparser/comment.js +60 -0
  279. data/public/javascripts/ckeditor/_source/core/htmlparser/element.js +240 -0
  280. data/public/javascripts/ckeditor/_source/core/htmlparser/filter.js +288 -0
  281. data/public/javascripts/ckeditor/_source/core/htmlparser/fragment.js +504 -0
  282. data/public/javascripts/ckeditor/_source/core/htmlparser/text.js +55 -0
  283. data/public/javascripts/ckeditor/_source/core/imagecacher.js +80 -0
  284. data/public/javascripts/ckeditor/_source/core/lang.js +156 -0
  285. data/public/javascripts/ckeditor/_source/core/loader.js +243 -0
  286. data/public/javascripts/ckeditor/_source/core/plugindefinition.js +66 -0
  287. data/public/javascripts/ckeditor/_source/core/plugins.js +85 -0
  288. data/public/javascripts/ckeditor/_source/core/resourcemanager.js +238 -0
  289. data/public/javascripts/ckeditor/_source/core/scriptloader.js +200 -0
  290. data/public/javascripts/ckeditor/_source/core/skins.js +212 -0
  291. data/public/javascripts/ckeditor/_source/core/themes.js +19 -0
  292. data/public/javascripts/ckeditor/_source/core/tools.js +734 -0
  293. data/public/javascripts/ckeditor/_source/core/ui.js +116 -0
  294. data/public/javascripts/ckeditor/_source/core/xml.js +165 -0
  295. data/public/javascripts/ckeditor/_source/lang/_languages.js +83 -0
  296. data/public/javascripts/ckeditor/_source/lang/_translationstatus.txt +60 -0
  297. data/public/javascripts/ckeditor/_source/lang/af.js +758 -0
  298. data/public/javascripts/ckeditor/_source/lang/ar.js +758 -0
  299. data/public/javascripts/ckeditor/_source/lang/bg.js +758 -0
  300. data/public/javascripts/ckeditor/_source/lang/bn.js +758 -0
  301. data/public/javascripts/ckeditor/_source/lang/bs.js +758 -0
  302. data/public/javascripts/ckeditor/_source/lang/ca.js +758 -0
  303. data/public/javascripts/ckeditor/_source/lang/cs.js +758 -0
  304. data/public/javascripts/ckeditor/_source/lang/cy.js +758 -0
  305. data/public/javascripts/ckeditor/_source/lang/da.js +758 -0
  306. data/public/javascripts/ckeditor/_source/lang/de.js +758 -0
  307. data/public/javascripts/ckeditor/_source/lang/el.js +758 -0
  308. data/public/javascripts/ckeditor/_source/lang/en-au.js +758 -0
  309. data/public/javascripts/ckeditor/_source/lang/en-ca.js +758 -0
  310. data/public/javascripts/ckeditor/_source/lang/en-gb.js +758 -0
  311. data/public/javascripts/ckeditor/_source/lang/en.js +758 -0
  312. data/public/javascripts/ckeditor/_source/lang/eo.js +758 -0
  313. data/public/javascripts/ckeditor/_source/lang/es.js +758 -0
  314. data/public/javascripts/ckeditor/_source/lang/et.js +758 -0
  315. data/public/javascripts/ckeditor/_source/lang/eu.js +758 -0
  316. data/public/javascripts/ckeditor/_source/lang/fa.js +758 -0
  317. data/public/javascripts/ckeditor/_source/lang/fi.js +758 -0
  318. data/public/javascripts/ckeditor/_source/lang/fo.js +758 -0
  319. data/public/javascripts/ckeditor/_source/lang/fr-ca.js +758 -0
  320. data/public/javascripts/ckeditor/_source/lang/fr.js +758 -0
  321. data/public/javascripts/ckeditor/_source/lang/gl.js +758 -0
  322. data/public/javascripts/ckeditor/_source/lang/gu.js +758 -0
  323. data/public/javascripts/ckeditor/_source/lang/he.js +758 -0
  324. data/public/javascripts/ckeditor/_source/lang/hi.js +758 -0
  325. data/public/javascripts/ckeditor/_source/lang/hr.js +758 -0
  326. data/public/javascripts/ckeditor/_source/lang/hu.js +758 -0
  327. data/public/javascripts/ckeditor/_source/lang/is.js +758 -0
  328. data/public/javascripts/ckeditor/_source/lang/it.js +758 -0
  329. data/public/javascripts/ckeditor/_source/lang/ja.js +758 -0
  330. data/public/javascripts/ckeditor/_source/lang/km.js +758 -0
  331. data/public/javascripts/ckeditor/_source/lang/ko.js +758 -0
  332. data/public/javascripts/ckeditor/_source/lang/lt.js +758 -0
  333. data/public/javascripts/ckeditor/_source/lang/lv.js +758 -0
  334. data/public/javascripts/ckeditor/_source/lang/mn.js +758 -0
  335. data/public/javascripts/ckeditor/_source/lang/ms.js +758 -0
  336. data/public/javascripts/ckeditor/_source/lang/nb.js +758 -0
  337. data/public/javascripts/ckeditor/_source/lang/nl.js +758 -0
  338. data/public/javascripts/ckeditor/_source/lang/no.js +758 -0
  339. data/public/javascripts/ckeditor/_source/lang/pl.js +758 -0
  340. data/public/javascripts/ckeditor/_source/lang/pt-br.js +757 -0
  341. data/public/javascripts/ckeditor/_source/lang/pt.js +758 -0
  342. data/public/javascripts/ckeditor/_source/lang/ro.js +758 -0
  343. data/public/javascripts/ckeditor/_source/lang/ru.js +758 -0
  344. data/public/javascripts/ckeditor/_source/lang/sk.js +758 -0
  345. data/public/javascripts/ckeditor/_source/lang/sl.js +758 -0
  346. data/public/javascripts/ckeditor/_source/lang/sr-latn.js +758 -0
  347. data/public/javascripts/ckeditor/_source/lang/sr.js +758 -0
  348. data/public/javascripts/ckeditor/_source/lang/sv.js +758 -0
  349. data/public/javascripts/ckeditor/_source/lang/th.js +758 -0
  350. data/public/javascripts/ckeditor/_source/lang/tr.js +757 -0
  351. data/public/javascripts/ckeditor/_source/lang/uk.js +758 -0
  352. data/public/javascripts/ckeditor/_source/lang/vi.js +758 -0
  353. data/public/javascripts/ckeditor/_source/lang/zh-cn.js +758 -0
  354. data/public/javascripts/ckeditor/_source/lang/zh.js +758 -0
  355. data/public/javascripts/ckeditor/_source/plugins/a11yhelp/dialogs/a11yhelp.js +211 -0
  356. data/public/javascripts/ckeditor/_source/plugins/a11yhelp/lang/en.js +108 -0
  357. data/public/javascripts/ckeditor/_source/plugins/a11yhelp/lang/he.js +216 -0
  358. data/public/javascripts/ckeditor/_source/plugins/a11yhelp/plugin.js +46 -0
  359. data/public/javascripts/ckeditor/_source/plugins/about/dialogs/about.js +73 -0
  360. data/public/javascripts/ckeditor/_source/plugins/about/dialogs/logo_ckeditor.png +0 -0
  361. data/public/javascripts/ckeditor/_source/plugins/about/plugin.js +23 -0
  362. data/public/javascripts/ckeditor/_source/plugins/ajax_save/plugin.js +44 -0
  363. data/public/javascripts/ckeditor/_source/plugins/attachment/dialogs/attachment.js +384 -0
  364. data/public/javascripts/ckeditor/_source/plugins/attachment/images/attachment.png +0 -0
  365. data/public/javascripts/ckeditor/_source/plugins/attachment/lang/en.js +10 -0
  366. data/public/javascripts/ckeditor/_source/plugins/attachment/lang/ru.js +10 -0
  367. data/public/javascripts/ckeditor/_source/plugins/attachment/lang/uk.js +10 -0
  368. data/public/javascripts/ckeditor/_source/plugins/attachment/plugin.js +44 -0
  369. data/public/javascripts/ckeditor/_source/plugins/autogrow/plugin.js +86 -0
  370. data/public/javascripts/ckeditor/_source/plugins/basicstyles/plugin.js +101 -0
  371. data/public/javascripts/ckeditor/_source/plugins/bidi/plugin.js +259 -0
  372. data/public/javascripts/ckeditor/_source/plugins/blockquote/plugin.js +301 -0
  373. data/public/javascripts/ckeditor/_source/plugins/button/plugin.js +277 -0
  374. data/public/javascripts/ckeditor/_source/plugins/clipboard/dialogs/paste.js +205 -0
  375. data/public/javascripts/ckeditor/_source/plugins/clipboard/plugin.js +412 -0
  376. data/public/javascripts/ckeditor/_source/plugins/colorbutton/plugin.js +250 -0
  377. data/public/javascripts/ckeditor/_source/plugins/colordialog/dialogs/colordialog.js +336 -0
  378. data/public/javascripts/ckeditor/_source/plugins/colordialog/plugin.js +13 -0
  379. data/public/javascripts/ckeditor/_source/plugins/contextmenu/plugin.js +290 -0
  380. data/public/javascripts/ckeditor/_source/plugins/dialog/dialogDefinition.js +315 -0
  381. data/public/javascripts/ckeditor/_source/plugins/dialog/plugin.js +3015 -0
  382. data/public/javascripts/ckeditor/_source/plugins/dialogadvtab/plugin.js +213 -0
  383. data/public/javascripts/ckeditor/_source/plugins/dialogui/plugin.js +1523 -0
  384. data/public/javascripts/ckeditor/_source/plugins/div/dialogs/div.js +535 -0
  385. data/public/javascripts/ckeditor/_source/plugins/div/plugin.js +121 -0
  386. data/public/javascripts/ckeditor/_source/plugins/domiterator/plugin.js +356 -0
  387. data/public/javascripts/ckeditor/_source/plugins/editingblock/plugin.js +229 -0
  388. data/public/javascripts/ckeditor/_source/plugins/elementspath/plugin.js +206 -0
  389. data/public/javascripts/ckeditor/_source/plugins/embed/dialogs/embed.js +65 -0
  390. data/public/javascripts/ckeditor/_source/plugins/embed/images/embed.png +0 -0
  391. data/public/javascripts/ckeditor/_source/plugins/embed/lang/en.js +9 -0
  392. data/public/javascripts/ckeditor/_source/plugins/embed/lang/ru.js +9 -0
  393. data/public/javascripts/ckeditor/_source/plugins/embed/lang/uk.js +9 -0
  394. data/public/javascripts/ckeditor/_source/plugins/embed/plugin.js +44 -0
  395. data/public/javascripts/ckeditor/_source/plugins/enterkey/plugin.js +363 -0
  396. data/public/javascripts/ckeditor/_source/plugins/entities/plugin.js +226 -0
  397. data/public/javascripts/ckeditor/_source/plugins/fakeobjects/plugin.js +122 -0
  398. data/public/javascripts/ckeditor/_source/plugins/filebrowser/plugin.js +501 -0
  399. data/public/javascripts/ckeditor/_source/plugins/find/dialogs/find.js +890 -0
  400. data/public/javascripts/ckeditor/_source/plugins/find/plugin.js +46 -0
  401. data/public/javascripts/ckeditor/_source/plugins/flash/dialogs/flash.js +698 -0
  402. data/public/javascripts/ckeditor/_source/plugins/flash/images/placeholder.png +0 -0
  403. data/public/javascripts/ckeditor/_source/plugins/flash/plugin.js +168 -0
  404. data/public/javascripts/ckeditor/_source/plugins/floatpanel/plugin.js +402 -0
  405. data/public/javascripts/ckeditor/_source/plugins/font/plugin.js +234 -0
  406. data/public/javascripts/ckeditor/_source/plugins/format/plugin.js +194 -0
  407. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/button.js +135 -0
  408. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/checkbox.js +153 -0
  409. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/form.js +177 -0
  410. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/hiddenfield.js +98 -0
  411. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/radio.js +135 -0
  412. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/select.js +556 -0
  413. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/textarea.js +114 -0
  414. data/public/javascripts/ckeditor/_source/plugins/forms/dialogs/textfield.js +199 -0
  415. data/public/javascripts/ckeditor/_source/plugins/forms/images/hiddenfield.gif +0 -0
  416. data/public/javascripts/ckeditor/_source/plugins/forms/plugin.js +284 -0
  417. data/public/javascripts/ckeditor/_source/plugins/horizontalrule/plugin.js +36 -0
  418. data/public/javascripts/ckeditor/_source/plugins/htmldataprocessor/plugin.js +502 -0
  419. data/public/javascripts/ckeditor/_source/plugins/htmlwriter/plugin.js +319 -0
  420. data/public/javascripts/ckeditor/_source/plugins/iframedialog/plugin.js +136 -0
  421. data/public/javascripts/ckeditor/_source/plugins/image/dialogs/image.js +1396 -0
  422. data/public/javascripts/ckeditor/_source/plugins/image/plugin.js +81 -0
  423. data/public/javascripts/ckeditor/_source/plugins/indent/plugin.js +455 -0
  424. data/public/javascripts/ckeditor/_source/plugins/justify/plugin.js +221 -0
  425. data/public/javascripts/ckeditor/_source/plugins/keystrokes/plugin.js +225 -0
  426. data/public/javascripts/ckeditor/_source/plugins/link/dialogs/anchor.js +99 -0
  427. data/public/javascripts/ckeditor/_source/plugins/link/dialogs/link.js +1424 -0
  428. data/public/javascripts/ckeditor/_source/plugins/link/images/anchor.gif +0 -0
  429. data/public/javascripts/ckeditor/_source/plugins/link/plugin.js +238 -0
  430. data/public/javascripts/ckeditor/_source/plugins/list/plugin.js +710 -0
  431. data/public/javascripts/ckeditor/_source/plugins/listblock/plugin.js +257 -0
  432. data/public/javascripts/ckeditor/_source/plugins/liststyle/dialogs/liststyle.js +204 -0
  433. data/public/javascripts/ckeditor/_source/plugins/liststyle/plugin.js +66 -0
  434. data/public/javascripts/ckeditor/_source/plugins/maximize/plugin.js +350 -0
  435. data/public/javascripts/ckeditor/_source/plugins/menu/plugin.js +408 -0
  436. data/public/javascripts/ckeditor/_source/plugins/menubutton/plugin.js +94 -0
  437. data/public/javascripts/ckeditor/_source/plugins/newpage/plugin.js +53 -0
  438. data/public/javascripts/ckeditor/_source/plugins/pagebreak/images/pagebreak.gif +0 -0
  439. data/public/javascripts/ckeditor/_source/plugins/pagebreak/plugin.js +121 -0
  440. data/public/javascripts/ckeditor/_source/plugins/panel/plugin.js +399 -0
  441. data/public/javascripts/ckeditor/_source/plugins/panelbutton/plugin.js +147 -0
  442. data/public/javascripts/ckeditor/_source/plugins/pastefromword/filter/default.js +1170 -0
  443. data/public/javascripts/ckeditor/_source/plugins/pastefromword/plugin.js +122 -0
  444. data/public/javascripts/ckeditor/_source/plugins/pastetext/dialogs/pastetext.js +70 -0
  445. data/public/javascripts/ckeditor/_source/plugins/pastetext/plugin.js +145 -0
  446. data/public/javascripts/ckeditor/_source/plugins/popup/plugin.js +64 -0
  447. data/public/javascripts/ckeditor/_source/plugins/preview/plugin.js +108 -0
  448. data/public/javascripts/ckeditor/_source/plugins/print/plugin.js +41 -0
  449. data/public/javascripts/ckeditor/_source/plugins/removeformat/plugin.js +184 -0
  450. data/public/javascripts/ckeditor/_source/plugins/resize/plugin.js +157 -0
  451. data/public/javascripts/ckeditor/_source/plugins/richcombo/plugin.js +370 -0
  452. data/public/javascripts/ckeditor/_source/plugins/save/plugin.js +55 -0
  453. data/public/javascripts/ckeditor/_source/plugins/scayt/dialogs/options.js +534 -0
  454. data/public/javascripts/ckeditor/_source/plugins/scayt/dialogs/toolbar.css +71 -0
  455. data/public/javascripts/ckeditor/_source/plugins/scayt/plugin.js +945 -0
  456. data/public/javascripts/ckeditor/_source/plugins/selection/plugin.js +1375 -0
  457. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_address.png +0 -0
  458. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_blockquote.png +0 -0
  459. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_div.png +0 -0
  460. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h1.png +0 -0
  461. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h2.png +0 -0
  462. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h3.png +0 -0
  463. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h4.png +0 -0
  464. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h5.png +0 -0
  465. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_h6.png +0 -0
  466. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_p.png +0 -0
  467. data/public/javascripts/ckeditor/_source/plugins/showblocks/images/block_pre.png +0 -0
  468. data/public/javascripts/ckeditor/_source/plugins/showblocks/plugin.js +155 -0
  469. data/public/javascripts/ckeditor/_source/plugins/showborders/plugin.js +201 -0
  470. data/public/javascripts/ckeditor/_source/plugins/smiley/dialogs/smiley.js +218 -0
  471. data/public/javascripts/ckeditor/_source/plugins/smiley/images/angel_smile.gif +0 -0
  472. data/public/javascripts/ckeditor/_source/plugins/smiley/images/angry_smile.gif +0 -0
  473. data/public/javascripts/ckeditor/_source/plugins/smiley/images/broken_heart.gif +0 -0
  474. data/public/javascripts/ckeditor/_source/plugins/smiley/images/confused_smile.gif +0 -0
  475. data/public/javascripts/ckeditor/_source/plugins/smiley/images/cry_smile.gif +0 -0
  476. data/public/javascripts/ckeditor/_source/plugins/smiley/images/devil_smile.gif +0 -0
  477. data/public/javascripts/ckeditor/_source/plugins/smiley/images/embaressed_smile.gif +0 -0
  478. data/public/javascripts/ckeditor/_source/plugins/smiley/images/envelope.gif +0 -0
  479. data/public/javascripts/ckeditor/_source/plugins/smiley/images/heart.gif +0 -0
  480. data/public/javascripts/ckeditor/_source/plugins/smiley/images/kiss.gif +0 -0
  481. data/public/javascripts/ckeditor/_source/plugins/smiley/images/lightbulb.gif +0 -0
  482. data/public/javascripts/ckeditor/_source/plugins/smiley/images/omg_smile.gif +0 -0
  483. data/public/javascripts/ckeditor/_source/plugins/smiley/images/regular_smile.gif +0 -0
  484. data/public/javascripts/ckeditor/_source/plugins/smiley/images/sad_smile.gif +0 -0
  485. data/public/javascripts/ckeditor/_source/plugins/smiley/images/shades_smile.gif +0 -0
  486. data/public/javascripts/ckeditor/_source/plugins/smiley/images/teeth_smile.gif +0 -0
  487. data/public/javascripts/ckeditor/_source/plugins/smiley/images/thumbs_down.gif +0 -0
  488. data/public/javascripts/ckeditor/_source/plugins/smiley/images/thumbs_up.gif +0 -0
  489. data/public/javascripts/ckeditor/_source/plugins/smiley/images/tounge_smile.gif +0 -0
  490. data/public/javascripts/ckeditor/_source/plugins/smiley/images/whatchutalkingabout_smile.gif +0 -0
  491. data/public/javascripts/ckeditor/_source/plugins/smiley/images/wink_smile.gif +0 -0
  492. data/public/javascripts/ckeditor/_source/plugins/smiley/plugin.js +94 -0
  493. data/public/javascripts/ckeditor/_source/plugins/sourcearea/plugin.js +207 -0
  494. data/public/javascripts/ckeditor/_source/plugins/specialchar/dialogs/specialchar.js +409 -0
  495. data/public/javascripts/ckeditor/_source/plugins/specialchar/plugin.js +29 -0
  496. data/public/javascripts/ckeditor/_source/plugins/styles/plugin.js +1479 -0
  497. data/public/javascripts/ckeditor/_source/plugins/styles/styles/default.js +88 -0
  498. data/public/javascripts/ckeditor/_source/plugins/stylescombo/plugin.js +206 -0
  499. data/public/javascripts/ckeditor/_source/plugins/tab/plugin.js +367 -0
  500. data/public/javascripts/ckeditor/_source/plugins/table/dialogs/table.js +672 -0
  501. data/public/javascripts/ckeditor/_source/plugins/table/plugin.js +78 -0
  502. data/public/javascripts/ckeditor/_source/plugins/tableresize/plugin.js +450 -0
  503. data/public/javascripts/ckeditor/_source/plugins/tabletools/dialogs/tableCell.js +533 -0
  504. data/public/javascripts/ckeditor/_source/plugins/tabletools/plugin.js +1120 -0
  505. data/public/javascripts/ckeditor/_source/plugins/templates/dialogs/templates.js +233 -0
  506. data/public/javascripts/ckeditor/_source/plugins/templates/plugin.js +99 -0
  507. data/public/javascripts/ckeditor/_source/plugins/templates/templates/default.js +94 -0
  508. data/public/javascripts/ckeditor/_source/plugins/templates/templates/images/template1.gif +0 -0
  509. data/public/javascripts/ckeditor/_source/plugins/templates/templates/images/template2.gif +0 -0
  510. data/public/javascripts/ckeditor/_source/plugins/templates/templates/images/template3.gif +0 -0
  511. data/public/javascripts/ckeditor/_source/plugins/toolbar/plugin.js +481 -0
  512. data/public/javascripts/ckeditor/_source/plugins/uicolor/dialogs/uicolor.js +205 -0
  513. data/public/javascripts/ckeditor/_source/plugins/uicolor/lang/en.js +15 -0
  514. data/public/javascripts/ckeditor/_source/plugins/uicolor/lang/he.js +15 -0
  515. data/public/javascripts/ckeditor/_source/plugins/uicolor/plugin.js +37 -0
  516. data/public/javascripts/ckeditor/_source/plugins/uicolor/uicolor.gif +0 -0
  517. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/assets/hue_bg.png +0 -0
  518. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/assets/hue_thumb.png +0 -0
  519. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/assets/picker_mask.png +0 -0
  520. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/assets/picker_thumb.png +0 -0
  521. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/assets/yui.css +15 -0
  522. data/public/javascripts/ckeditor/_source/plugins/uicolor/yui/yui.js +71 -0
  523. data/public/javascripts/ckeditor/_source/plugins/undo/plugin.js +554 -0
  524. data/public/javascripts/ckeditor/_source/plugins/wsc/dialogs/ciframe.html +49 -0
  525. data/public/javascripts/ckeditor/_source/plugins/wsc/dialogs/tmpFrameset.html +52 -0
  526. data/public/javascripts/ckeditor/_source/plugins/wsc/dialogs/wsc.css +82 -0
  527. data/public/javascripts/ckeditor/_source/plugins/wsc/dialogs/wsc.js +176 -0
  528. data/public/javascripts/ckeditor/_source/plugins/wsc/plugin.js +33 -0
  529. data/public/javascripts/ckeditor/_source/plugins/wysiwygarea/plugin.js +1146 -0
  530. data/public/javascripts/ckeditor/_source/skins/kama/dialog.css +882 -0
  531. data/public/javascripts/ckeditor/_source/skins/kama/editor.css +25 -0
  532. data/public/javascripts/ckeditor/_source/skins/kama/elementspath.css +73 -0
  533. data/public/javascripts/ckeditor/_source/skins/kama/icons.css +357 -0
  534. data/public/javascripts/ckeditor/_source/skins/kama/icons.png +0 -0
  535. data/public/javascripts/ckeditor/_source/skins/kama/icons_rtl.png +0 -0
  536. data/public/javascripts/ckeditor/_source/skins/kama/images/dialog_sides.gif +0 -0
  537. data/public/javascripts/ckeditor/_source/skins/kama/images/dialog_sides.png +0 -0
  538. data/public/javascripts/ckeditor/_source/skins/kama/images/dialog_sides_rtl.png +0 -0
  539. data/public/javascripts/ckeditor/_source/skins/kama/images/mini.gif +0 -0
  540. data/public/javascripts/ckeditor/_source/skins/kama/images/noimage.png +0 -0
  541. data/public/javascripts/ckeditor/_source/skins/kama/images/sprites.png +0 -0
  542. data/public/javascripts/ckeditor/_source/skins/kama/images/sprites_ie6.png +0 -0
  543. data/public/javascripts/ckeditor/_source/skins/kama/images/toolbar_start.gif +0 -0
  544. data/public/javascripts/ckeditor/_source/skins/kama/mainui.css +195 -0
  545. data/public/javascripts/ckeditor/_source/skins/kama/menu.css +216 -0
  546. data/public/javascripts/ckeditor/_source/skins/kama/panel.css +217 -0
  547. data/public/javascripts/ckeditor/_source/skins/kama/presets.css +49 -0
  548. data/public/javascripts/ckeditor/_source/skins/kama/reset.css +84 -0
  549. data/public/javascripts/ckeditor/_source/skins/kama/richcombo.css +277 -0
  550. data/public/javascripts/ckeditor/_source/skins/kama/skin.js +268 -0
  551. data/public/javascripts/ckeditor/_source/skins/kama/templates.css +88 -0
  552. data/public/javascripts/ckeditor/_source/skins/kama/toolbar.css +409 -0
  553. data/public/javascripts/ckeditor/_source/skins/office2003/dialog.css +785 -0
  554. data/public/javascripts/ckeditor/_source/skins/office2003/editor.css +25 -0
  555. data/public/javascripts/ckeditor/_source/skins/office2003/elementspath.css +74 -0
  556. data/public/javascripts/ckeditor/_source/skins/office2003/icons.css +354 -0
  557. data/public/javascripts/ckeditor/_source/skins/office2003/icons.png +0 -0
  558. data/public/javascripts/ckeditor/_source/skins/office2003/icons_rtl.png +0 -0
  559. data/public/javascripts/ckeditor/_source/skins/office2003/images/dialog_sides.gif +0 -0
  560. data/public/javascripts/ckeditor/_source/skins/office2003/images/dialog_sides.png +0 -0
  561. data/public/javascripts/ckeditor/_source/skins/office2003/images/dialog_sides_rtl.png +0 -0
  562. data/public/javascripts/ckeditor/_source/skins/office2003/images/mini.gif +0 -0
  563. data/public/javascripts/ckeditor/_source/skins/office2003/images/noimage.png +0 -0
  564. data/public/javascripts/ckeditor/_source/skins/office2003/images/sprites.png +0 -0
  565. data/public/javascripts/ckeditor/_source/skins/office2003/images/sprites_ie6.png +0 -0
  566. data/public/javascripts/ckeditor/_source/skins/office2003/mainui.css +145 -0
  567. data/public/javascripts/ckeditor/_source/skins/office2003/menu.css +213 -0
  568. data/public/javascripts/ckeditor/_source/skins/office2003/panel.css +212 -0
  569. data/public/javascripts/ckeditor/_source/skins/office2003/presets.css +49 -0
  570. data/public/javascripts/ckeditor/_source/skins/office2003/reset.css +84 -0
  571. data/public/javascripts/ckeditor/_source/skins/office2003/richcombo.css +297 -0
  572. data/public/javascripts/ckeditor/_source/skins/office2003/skin.js +81 -0
  573. data/public/javascripts/ckeditor/_source/skins/office2003/templates.css +87 -0
  574. data/public/javascripts/ckeditor/_source/skins/office2003/toolbar.css +470 -0
  575. data/public/javascripts/ckeditor/_source/skins/v2/dialog.css +800 -0
  576. data/public/javascripts/ckeditor/_source/skins/v2/editor.css +25 -0
  577. data/public/javascripts/ckeditor/_source/skins/v2/elementspath.css +74 -0
  578. data/public/javascripts/ckeditor/_source/skins/v2/icons.css +354 -0
  579. data/public/javascripts/ckeditor/_source/skins/v2/icons.png +0 -0
  580. data/public/javascripts/ckeditor/_source/skins/v2/icons_rtl.png +0 -0
  581. data/public/javascripts/ckeditor/_source/skins/v2/images/dialog_sides.gif +0 -0
  582. data/public/javascripts/ckeditor/_source/skins/v2/images/dialog_sides.png +0 -0
  583. data/public/javascripts/ckeditor/_source/skins/v2/images/dialog_sides_rtl.png +0 -0
  584. data/public/javascripts/ckeditor/_source/skins/v2/images/mini.gif +0 -0
  585. data/public/javascripts/ckeditor/_source/skins/v2/images/noimage.png +0 -0
  586. data/public/javascripts/ckeditor/_source/skins/v2/images/sprites.png +0 -0
  587. data/public/javascripts/ckeditor/_source/skins/v2/images/sprites_ie6.png +0 -0
  588. data/public/javascripts/ckeditor/_source/skins/v2/images/toolbar_start.gif +0 -0
  589. data/public/javascripts/ckeditor/_source/skins/v2/mainui.css +154 -0
  590. data/public/javascripts/ckeditor/_source/skins/v2/menu.css +215 -0
  591. data/public/javascripts/ckeditor/_source/skins/v2/panel.css +212 -0
  592. data/public/javascripts/ckeditor/_source/skins/v2/presets.css +50 -0
  593. data/public/javascripts/ckeditor/_source/skins/v2/reset.css +84 -0
  594. data/public/javascripts/ckeditor/_source/skins/v2/richcombo.css +297 -0
  595. data/public/javascripts/ckeditor/_source/skins/v2/skin.js +77 -0
  596. data/public/javascripts/ckeditor/_source/skins/v2/templates.css +87 -0
  597. data/public/javascripts/ckeditor/_source/skins/v2/toolbar.css +423 -0
  598. data/public/javascripts/ckeditor/_source/themes/default/theme.js +361 -0
  599. data/public/javascripts/ckeditor/adapters/jquery.js +6 -0
  600. data/public/javascripts/ckeditor/ckeditor.js +137 -0
  601. data/public/javascripts/ckeditor/ckeditor.pack +211 -0
  602. data/public/javascripts/ckeditor/ckeditor_basic.js +8 -0
  603. data/public/javascripts/ckeditor/ckeditor_basic_source.js +20 -0
  604. data/public/javascripts/ckeditor/ckeditor_source.js +25 -0
  605. data/public/javascripts/ckeditor/config.js +43 -0
  606. data/public/javascripts/ckeditor/contents.css +39 -0
  607. data/public/javascripts/ckeditor/css/ckfinder.css +299 -0
  608. data/public/javascripts/ckeditor/css/fck_dialog.css +119 -0
  609. data/public/javascripts/ckeditor/css/fck_editor.css +448 -0
  610. data/public/javascripts/ckeditor/css/swfupload.css +94 -0
  611. data/public/javascripts/ckeditor/images/add.gif +0 -0
  612. data/public/javascripts/ckeditor/images/cancelbutton.gif +0 -0
  613. data/public/javascripts/ckeditor/images/ckfnothumb.gif +0 -0
  614. data/public/javascripts/ckeditor/images/doc.gif +0 -0
  615. data/public/javascripts/ckeditor/images/mp3.gif +0 -0
  616. data/public/javascripts/ckeditor/images/pdf.gif +0 -0
  617. data/public/javascripts/ckeditor/images/rar.gif +0 -0
  618. data/public/javascripts/ckeditor/images/refresh.gif +0 -0
  619. data/public/javascripts/ckeditor/images/select_files.png +0 -0
  620. data/public/javascripts/ckeditor/images/spacer.gif +0 -0
  621. data/public/javascripts/ckeditor/images/swf.gif +0 -0
  622. data/public/javascripts/ckeditor/images/toolbar.start.gif +0 -0
  623. data/public/javascripts/ckeditor/images/xls.gif +0 -0
  624. data/public/javascripts/ckeditor/lang/_languages.js +6 -0
  625. data/public/javascripts/ckeditor/lang/_translationstatus.txt +60 -0
  626. data/public/javascripts/ckeditor/lang/af.js +6 -0
  627. data/public/javascripts/ckeditor/lang/ar.js +6 -0
  628. data/public/javascripts/ckeditor/lang/bg.js +6 -0
  629. data/public/javascripts/ckeditor/lang/bn.js +6 -0
  630. data/public/javascripts/ckeditor/lang/bs.js +6 -0
  631. data/public/javascripts/ckeditor/lang/ca.js +6 -0
  632. data/public/javascripts/ckeditor/lang/cs.js +6 -0
  633. data/public/javascripts/ckeditor/lang/cy.js +6 -0
  634. data/public/javascripts/ckeditor/lang/da.js +6 -0
  635. data/public/javascripts/ckeditor/lang/de.js +6 -0
  636. data/public/javascripts/ckeditor/lang/el.js +6 -0
  637. data/public/javascripts/ckeditor/lang/en-au.js +6 -0
  638. data/public/javascripts/ckeditor/lang/en-ca.js +6 -0
  639. data/public/javascripts/ckeditor/lang/en-gb.js +6 -0
  640. data/public/javascripts/ckeditor/lang/en.js +6 -0
  641. data/public/javascripts/ckeditor/lang/eo.js +6 -0
  642. data/public/javascripts/ckeditor/lang/es.js +6 -0
  643. data/public/javascripts/ckeditor/lang/et.js +6 -0
  644. data/public/javascripts/ckeditor/lang/eu.js +6 -0
  645. data/public/javascripts/ckeditor/lang/fa.js +6 -0
  646. data/public/javascripts/ckeditor/lang/fi.js +6 -0
  647. data/public/javascripts/ckeditor/lang/fo.js +6 -0
  648. data/public/javascripts/ckeditor/lang/fr-ca.js +6 -0
  649. data/public/javascripts/ckeditor/lang/fr.js +6 -0
  650. data/public/javascripts/ckeditor/lang/gl.js +6 -0
  651. data/public/javascripts/ckeditor/lang/gu.js +6 -0
  652. data/public/javascripts/ckeditor/lang/he.js +6 -0
  653. data/public/javascripts/ckeditor/lang/hi.js +6 -0
  654. data/public/javascripts/ckeditor/lang/hr.js +6 -0
  655. data/public/javascripts/ckeditor/lang/hu.js +6 -0
  656. data/public/javascripts/ckeditor/lang/is.js +6 -0
  657. data/public/javascripts/ckeditor/lang/it.js +6 -0
  658. data/public/javascripts/ckeditor/lang/ja.js +6 -0
  659. data/public/javascripts/ckeditor/lang/km.js +6 -0
  660. data/public/javascripts/ckeditor/lang/ko.js +6 -0
  661. data/public/javascripts/ckeditor/lang/lt.js +6 -0
  662. data/public/javascripts/ckeditor/lang/lv.js +6 -0
  663. data/public/javascripts/ckeditor/lang/mn.js +6 -0
  664. data/public/javascripts/ckeditor/lang/ms.js +6 -0
  665. data/public/javascripts/ckeditor/lang/nb.js +6 -0
  666. data/public/javascripts/ckeditor/lang/nl.js +6 -0
  667. data/public/javascripts/ckeditor/lang/no.js +6 -0
  668. data/public/javascripts/ckeditor/lang/pl.js +6 -0
  669. data/public/javascripts/ckeditor/lang/pt-br.js +6 -0
  670. data/public/javascripts/ckeditor/lang/pt.js +6 -0
  671. data/public/javascripts/ckeditor/lang/ro.js +6 -0
  672. data/public/javascripts/ckeditor/lang/ru.js +6 -0
  673. data/public/javascripts/ckeditor/lang/sk.js +6 -0
  674. data/public/javascripts/ckeditor/lang/sl.js +6 -0
  675. data/public/javascripts/ckeditor/lang/sr-latn.js +6 -0
  676. data/public/javascripts/ckeditor/lang/sr.js +6 -0
  677. data/public/javascripts/ckeditor/lang/sv.js +6 -0
  678. data/public/javascripts/ckeditor/lang/th.js +6 -0
  679. data/public/javascripts/ckeditor/lang/tr.js +6 -0
  680. data/public/javascripts/ckeditor/lang/uk.js +6 -0
  681. data/public/javascripts/ckeditor/lang/vi.js +6 -0
  682. data/public/javascripts/ckeditor/lang/zh-cn.js +6 -0
  683. data/public/javascripts/ckeditor/lang/zh.js +6 -0
  684. data/public/javascripts/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +7 -0
  685. data/public/javascripts/ckeditor/plugins/a11yhelp/lang/en.js +6 -0
  686. data/public/javascripts/ckeditor/plugins/a11yhelp/lang/he.js +6 -0
  687. data/public/javascripts/ckeditor/plugins/about/dialogs/about.js +6 -0
  688. data/public/javascripts/ckeditor/plugins/about/dialogs/logo_ckeditor.png +0 -0
  689. data/public/javascripts/ckeditor/plugins/ajax_save/plugin.js +1 -0
  690. data/public/javascripts/ckeditor/plugins/attachment/dialogs/attachment.js +1 -0
  691. data/public/javascripts/ckeditor/plugins/attachment/images/attachment.png +0 -0
  692. data/public/javascripts/ckeditor/plugins/attachment/lang/en.js +10 -0
  693. data/public/javascripts/ckeditor/plugins/attachment/lang/ru.js +10 -0
  694. data/public/javascripts/ckeditor/plugins/attachment/lang/uk.js +10 -0
  695. data/public/javascripts/ckeditor/plugins/attachment/plugin.js +1 -0
  696. data/public/javascripts/ckeditor/plugins/autogrow/plugin.js +6 -0
  697. data/public/javascripts/ckeditor/plugins/clipboard/dialogs/paste.js +7 -0
  698. data/public/javascripts/ckeditor/plugins/colordialog/dialogs/colordialog.js +7 -0
  699. data/public/javascripts/ckeditor/plugins/dialog/dialogDefinition.js +4 -0
  700. data/public/javascripts/ckeditor/plugins/div/dialogs/div.js +8 -0
  701. data/public/javascripts/ckeditor/plugins/embed/dialogs/embed.js +1 -0
  702. data/public/javascripts/ckeditor/plugins/embed/images/embed.png +0 -0
  703. data/public/javascripts/ckeditor/plugins/embed/lang/en.js +9 -0
  704. data/public/javascripts/ckeditor/plugins/embed/lang/ru.js +9 -0
  705. data/public/javascripts/ckeditor/plugins/embed/lang/uk.js +9 -0
  706. data/public/javascripts/ckeditor/plugins/embed/plugin.js +1 -0
  707. data/public/javascripts/ckeditor/plugins/find/dialogs/find.js +9 -0
  708. data/public/javascripts/ckeditor/plugins/flash/dialogs/flash.js +9 -0
  709. data/public/javascripts/ckeditor/plugins/flash/images/placeholder.png +0 -0
  710. data/public/javascripts/ckeditor/plugins/forms/dialogs/button.js +6 -0
  711. data/public/javascripts/ckeditor/plugins/forms/dialogs/checkbox.js +6 -0
  712. data/public/javascripts/ckeditor/plugins/forms/dialogs/form.js +6 -0
  713. data/public/javascripts/ckeditor/plugins/forms/dialogs/hiddenfield.js +6 -0
  714. data/public/javascripts/ckeditor/plugins/forms/dialogs/radio.js +6 -0
  715. data/public/javascripts/ckeditor/plugins/forms/dialogs/select.js +9 -0
  716. data/public/javascripts/ckeditor/plugins/forms/dialogs/textarea.js +6 -0
  717. data/public/javascripts/ckeditor/plugins/forms/dialogs/textfield.js +7 -0
  718. data/public/javascripts/ckeditor/plugins/forms/images/hiddenfield.gif +0 -0
  719. data/public/javascripts/ckeditor/plugins/iframedialog/plugin.js +6 -0
  720. data/public/javascripts/ckeditor/plugins/image/dialogs/image.js +13 -0
  721. data/public/javascripts/ckeditor/plugins/link/dialogs/anchor.js +6 -0
  722. data/public/javascripts/ckeditor/plugins/link/dialogs/link.js +11 -0
  723. data/public/javascripts/ckeditor/plugins/link/images/anchor.gif +0 -0
  724. data/public/javascripts/ckeditor/plugins/liststyle/dialogs/liststyle.js +6 -0
  725. data/public/javascripts/ckeditor/plugins/pagebreak/images/pagebreak.gif +0 -0
  726. data/public/javascripts/ckeditor/plugins/pastefromword/filter/default.js +10 -0
  727. data/public/javascripts/ckeditor/plugins/pastetext/dialogs/pastetext.js +6 -0
  728. data/public/javascripts/ckeditor/plugins/scayt/dialogs/options.js +8 -0
  729. data/public/javascripts/ckeditor/plugins/scayt/dialogs/toolbar.css +6 -0
  730. data/public/javascripts/ckeditor/plugins/showblocks/images/block_address.png +0 -0
  731. data/public/javascripts/ckeditor/plugins/showblocks/images/block_blockquote.png +0 -0
  732. data/public/javascripts/ckeditor/plugins/showblocks/images/block_div.png +0 -0
  733. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h1.png +0 -0
  734. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h2.png +0 -0
  735. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h3.png +0 -0
  736. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h4.png +0 -0
  737. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h5.png +0 -0
  738. data/public/javascripts/ckeditor/plugins/showblocks/images/block_h6.png +0 -0
  739. data/public/javascripts/ckeditor/plugins/showblocks/images/block_p.png +0 -0
  740. data/public/javascripts/ckeditor/plugins/showblocks/images/block_pre.png +0 -0
  741. data/public/javascripts/ckeditor/plugins/smiley/dialogs/smiley.js +7 -0
  742. data/public/javascripts/ckeditor/plugins/smiley/images/angel_smile.gif +0 -0
  743. data/public/javascripts/ckeditor/plugins/smiley/images/angry_smile.gif +0 -0
  744. data/public/javascripts/ckeditor/plugins/smiley/images/broken_heart.gif +0 -0
  745. data/public/javascripts/ckeditor/plugins/smiley/images/confused_smile.gif +0 -0
  746. data/public/javascripts/ckeditor/plugins/smiley/images/cry_smile.gif +0 -0
  747. data/public/javascripts/ckeditor/plugins/smiley/images/devil_smile.gif +0 -0
  748. data/public/javascripts/ckeditor/plugins/smiley/images/embaressed_smile.gif +0 -0
  749. data/public/javascripts/ckeditor/plugins/smiley/images/envelope.gif +0 -0
  750. data/public/javascripts/ckeditor/plugins/smiley/images/heart.gif +0 -0
  751. data/public/javascripts/ckeditor/plugins/smiley/images/kiss.gif +0 -0
  752. data/public/javascripts/ckeditor/plugins/smiley/images/lightbulb.gif +0 -0
  753. data/public/javascripts/ckeditor/plugins/smiley/images/omg_smile.gif +0 -0
  754. data/public/javascripts/ckeditor/plugins/smiley/images/regular_smile.gif +0 -0
  755. data/public/javascripts/ckeditor/plugins/smiley/images/sad_smile.gif +0 -0
  756. data/public/javascripts/ckeditor/plugins/smiley/images/shades_smile.gif +0 -0
  757. data/public/javascripts/ckeditor/plugins/smiley/images/teeth_smile.gif +0 -0
  758. data/public/javascripts/ckeditor/plugins/smiley/images/thumbs_down.gif +0 -0
  759. data/public/javascripts/ckeditor/plugins/smiley/images/thumbs_up.gif +0 -0
  760. data/public/javascripts/ckeditor/plugins/smiley/images/tounge_smile.gif +0 -0
  761. data/public/javascripts/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif +0 -0
  762. data/public/javascripts/ckeditor/plugins/smiley/images/wink_smile.gif +0 -0
  763. data/public/javascripts/ckeditor/plugins/specialchar/dialogs/specialchar.js +7 -0
  764. data/public/javascripts/ckeditor/plugins/styles/styles/default.js +6 -0
  765. data/public/javascripts/ckeditor/plugins/table/dialogs/table.js +9 -0
  766. data/public/javascripts/ckeditor/plugins/tableresize/plugin.js +7 -0
  767. data/public/javascripts/ckeditor/plugins/tabletools/dialogs/tableCell.js +8 -0
  768. data/public/javascripts/ckeditor/plugins/templates/dialogs/templates.js +7 -0
  769. data/public/javascripts/ckeditor/plugins/templates/templates/default.js +6 -0
  770. data/public/javascripts/ckeditor/plugins/templates/templates/images/template1.gif +0 -0
  771. data/public/javascripts/ckeditor/plugins/templates/templates/images/template2.gif +0 -0
  772. data/public/javascripts/ckeditor/plugins/templates/templates/images/template3.gif +0 -0
  773. data/public/javascripts/ckeditor/plugins/uicolor/dialogs/uicolor.js +7 -0
  774. data/public/javascripts/ckeditor/plugins/uicolor/lang/en.js +6 -0
  775. data/public/javascripts/ckeditor/plugins/uicolor/lang/he.js +6 -0
  776. data/public/javascripts/ckeditor/plugins/uicolor/plugin.js +6 -0
  777. data/public/javascripts/ckeditor/plugins/uicolor/uicolor.gif +0 -0
  778. data/public/javascripts/ckeditor/plugins/uicolor/yui/assets/hue_bg.png +0 -0
  779. data/public/javascripts/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png +0 -0
  780. data/public/javascripts/ckeditor/plugins/uicolor/yui/assets/picker_mask.png +0 -0
  781. data/public/javascripts/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png +0 -0
  782. data/public/javascripts/ckeditor/plugins/uicolor/yui/assets/yui.css +6 -0
  783. data/public/javascripts/ckeditor/plugins/uicolor/yui/yui.js +76 -0
  784. data/public/javascripts/ckeditor/plugins/wsc/dialogs/ciframe.html +49 -0
  785. data/public/javascripts/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +52 -0
  786. data/public/javascripts/ckeditor/plugins/wsc/dialogs/wsc.css +6 -0
  787. data/public/javascripts/ckeditor/plugins/wsc/dialogs/wsc.js +7 -0
  788. data/public/javascripts/ckeditor/skins/kama/dialog.css +9 -0
  789. data/public/javascripts/ckeditor/skins/kama/editor.css +12 -0
  790. data/public/javascripts/ckeditor/skins/kama/icons.png +0 -0
  791. data/public/javascripts/ckeditor/skins/kama/icons_rtl.png +0 -0
  792. data/public/javascripts/ckeditor/skins/kama/images/dialog_sides.gif +0 -0
  793. data/public/javascripts/ckeditor/skins/kama/images/dialog_sides.png +0 -0
  794. data/public/javascripts/ckeditor/skins/kama/images/dialog_sides_rtl.png +0 -0
  795. data/public/javascripts/ckeditor/skins/kama/images/mini.gif +0 -0
  796. data/public/javascripts/ckeditor/skins/kama/images/noimage.png +0 -0
  797. data/public/javascripts/ckeditor/skins/kama/images/sprites.png +0 -0
  798. data/public/javascripts/ckeditor/skins/kama/images/sprites_ie6.png +0 -0
  799. data/public/javascripts/ckeditor/skins/kama/images/toolbar_start.gif +0 -0
  800. data/public/javascripts/ckeditor/skins/kama/skin.js +7 -0
  801. data/public/javascripts/ckeditor/skins/kama/templates.css +6 -0
  802. data/public/javascripts/ckeditor/skins/office2003/dialog.css +9 -0
  803. data/public/javascripts/ckeditor/skins/office2003/editor.css +13 -0
  804. data/public/javascripts/ckeditor/skins/office2003/icons.png +0 -0
  805. data/public/javascripts/ckeditor/skins/office2003/icons_rtl.png +0 -0
  806. data/public/javascripts/ckeditor/skins/office2003/images/dialog_sides.gif +0 -0
  807. data/public/javascripts/ckeditor/skins/office2003/images/dialog_sides.png +0 -0
  808. data/public/javascripts/ckeditor/skins/office2003/images/dialog_sides_rtl.png +0 -0
  809. data/public/javascripts/ckeditor/skins/office2003/images/mini.gif +0 -0
  810. data/public/javascripts/ckeditor/skins/office2003/images/noimage.png +0 -0
  811. data/public/javascripts/ckeditor/skins/office2003/images/sprites.png +0 -0
  812. data/public/javascripts/ckeditor/skins/office2003/images/sprites_ie6.png +0 -0
  813. data/public/javascripts/ckeditor/skins/office2003/skin.js +6 -0
  814. data/public/javascripts/ckeditor/skins/office2003/templates.css +6 -0
  815. data/public/javascripts/ckeditor/skins/v2/dialog.css +9 -0
  816. data/public/javascripts/ckeditor/skins/v2/editor.css +12 -0
  817. data/public/javascripts/ckeditor/skins/v2/icons.png +0 -0
  818. data/public/javascripts/ckeditor/skins/v2/icons_rtl.png +0 -0
  819. data/public/javascripts/ckeditor/skins/v2/images/dialog_sides.gif +0 -0
  820. data/public/javascripts/ckeditor/skins/v2/images/dialog_sides.png +0 -0
  821. data/public/javascripts/ckeditor/skins/v2/images/dialog_sides_rtl.png +0 -0
  822. data/public/javascripts/ckeditor/skins/v2/images/mini.gif +0 -0
  823. data/public/javascripts/ckeditor/skins/v2/images/noimage.png +0 -0
  824. data/public/javascripts/ckeditor/skins/v2/images/sprites.png +0 -0
  825. data/public/javascripts/ckeditor/skins/v2/images/sprites_ie6.png +0 -0
  826. data/public/javascripts/ckeditor/skins/v2/images/toolbar_start.gif +0 -0
  827. data/public/javascripts/ckeditor/skins/v2/skin.js +6 -0
  828. data/public/javascripts/ckeditor/skins/v2/templates.css +6 -0
  829. data/public/javascripts/ckeditor/swfupload/fileprogress.js +275 -0
  830. data/public/javascripts/ckeditor/swfupload/handlers.js +170 -0
  831. data/public/javascripts/ckeditor/swfupload/mootools-1.2.3-core-yc.js +356 -0
  832. data/public/javascripts/ckeditor/swfupload/querystring.js +40 -0
  833. data/public/javascripts/ckeditor/swfupload/swfupload.js +1 -0
  834. data/public/javascripts/ckeditor/swfupload/swfupload.queue.js +1 -0
  835. data/public/javascripts/ckeditor/swfupload/swfupload.swf +0 -0
  836. data/public/javascripts/ckeditor/swfupload/swfupload.swfobject.js +111 -0
  837. data/public/javascripts/ckeditor/themes/default/theme.js +8 -0
  838. data/public/javascripts/controls.js +965 -0
  839. data/public/javascripts/dragdrop.js +974 -0
  840. data/public/javascripts/effects.js +1123 -0
  841. data/public/javascripts/link_obfuscator.js +31 -0
  842. data/public/javascripts/prototype.js +6001 -0
  843. data/public/javascripts/rails.js +175 -0
  844. data/public/robots.txt +5 -0
  845. data/public/stylesheets/.gitkeep +0 -0
  846. data/public/stylesheets/application.css +882 -0
  847. data/public/stylesheets/core.css +1147 -0
  848. data/public/stylesheets/core_ie.css +52 -0
  849. data/public/stylesheets/csshover3.htc +14 -0
  850. data/public/stylesheets/ppc_logic.css +98 -0
  851. data/script/rails +6 -0
  852. data/spec/blueprints.rb +25 -0
  853. data/spec/controllers/ads_controller_spec.rb +60 -0
  854. data/spec/controllers/branches_controller_spec.rb +60 -0
  855. data/spec/controllers/campaigns_controller_spec.rb +60 -0
  856. data/spec/controllers/landing_pages_controller_spec.rb +60 -0
  857. data/spec/controllers/local_offers_controller_spec.rb +60 -0
  858. data/spec/lib/madmen/google/ad_spec.rb +115 -0
  859. data/spec/lib/madmen/google/adgroup_spec.rb +106 -0
  860. data/spec/lib/madmen/google/campaign_spec.rb +171 -0
  861. data/spec/lib/madmen/google/keyword_spec.rb +105 -0
  862. data/spec/models/ad_spec.rb +26 -0
  863. data/spec/models/branch_spec.rb +4 -0
  864. data/spec/models/campaign_spec.rb +8 -0
  865. data/spec/models/landing_page_spec.rb +103 -0
  866. data/spec/models/local_offer_spec.rb +7 -0
  867. data/spec/spec_helper.rb +10 -0
  868. data/tasks/ppc_logic.rake +27 -0
  869. data/vendor/plugins/.gitkeep +0 -0
  870. metadata +1120 -0
@@ -0,0 +1,29 @@
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
+ /**
7
+ * @file Special Character plugin
8
+ */
9
+
10
+ CKEDITOR.plugins.add( 'specialchar',
11
+ {
12
+ init : function( editor )
13
+ {
14
+ var pluginName = 'specialchar';
15
+
16
+ // Register the dialog.
17
+ CKEDITOR.dialog.add( pluginName, this.path + 'dialogs/specialchar.js' );
18
+
19
+ // Register the command.
20
+ editor.addCommand( pluginName, new CKEDITOR.dialogCommand( pluginName ) );
21
+
22
+ // Register the toolbar button.
23
+ editor.ui.addButton( 'SpecialChar',
24
+ {
25
+ label : editor.lang.specialChar.toolbar,
26
+ command : pluginName
27
+ });
28
+ }
29
+ } );
@@ -0,0 +1,1479 @@
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
+ CKEDITOR.plugins.add( 'styles',
7
+ {
8
+ requires : [ 'selection' ]
9
+ });
10
+
11
+ /**
12
+ * Registers a function to be called whenever a style changes its state in the
13
+ * editing area. The current state is passed to the function. The possible
14
+ * states are {@link CKEDITOR.TRISTATE_ON} and {@link CKEDITOR.TRISTATE_OFF}.
15
+ * @param {CKEDITOR.style} The style to be watched.
16
+ * @param {Function} The function to be called when the style state changes.
17
+ * @example
18
+ * // Create a style object for the <b> element.
19
+ * var style = new CKEDITOR.style( { element : 'b' } );
20
+ * var editor = CKEDITOR.instances.editor1;
21
+ * editor.attachStyleStateChange( style, function( state )
22
+ * {
23
+ * if ( state == CKEDITOR.TRISTATE_ON )
24
+ * alert( 'The current state for the B element is ON' );
25
+ * else
26
+ * alert( 'The current state for the B element is OFF' );
27
+ * });
28
+ */
29
+ CKEDITOR.editor.prototype.attachStyleStateChange = function( style, callback )
30
+ {
31
+ // Try to get the list of attached callbacks.
32
+ var styleStateChangeCallbacks = this._.styleStateChangeCallbacks;
33
+
34
+ // If it doesn't exist, it means this is the first call. So, let's create
35
+ // all the structure to manage the style checks and the callback calls.
36
+ if ( !styleStateChangeCallbacks )
37
+ {
38
+ // Create the callbacks array.
39
+ styleStateChangeCallbacks = this._.styleStateChangeCallbacks = [];
40
+
41
+ // Attach to the selectionChange event, so we can check the styles at
42
+ // that point.
43
+ this.on( 'selectionChange', function( ev )
44
+ {
45
+ // Loop throw all registered callbacks.
46
+ for ( var i = 0 ; i < styleStateChangeCallbacks.length ; i++ )
47
+ {
48
+ var callback = styleStateChangeCallbacks[ i ];
49
+
50
+ // Check the current state for the style defined for that
51
+ // callback.
52
+ var currentState = callback.style.checkActive( ev.data.path ) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF;
53
+
54
+ // If the state changed since the last check.
55
+ if ( callback.state !== currentState )
56
+ {
57
+ // Call the callback function, passing the current
58
+ // state to it.
59
+ callback.fn.call( this, currentState );
60
+
61
+ // Save the current state, so it can be compared next
62
+ // time.
63
+ callback.state = currentState;
64
+ }
65
+ }
66
+ });
67
+ }
68
+
69
+ // Save the callback info, so it can be checked on the next occurrence of
70
+ // selectionChange.
71
+ styleStateChangeCallbacks.push( { style : style, fn : callback } );
72
+ };
73
+
74
+ CKEDITOR.STYLE_BLOCK = 1;
75
+ CKEDITOR.STYLE_INLINE = 2;
76
+ CKEDITOR.STYLE_OBJECT = 3;
77
+
78
+ (function()
79
+ {
80
+ var blockElements = { address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1 };
81
+ var objectElements = { a:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1};
82
+
83
+ var semicolonFixRegex = /\s*(?:;\s*|$)/;
84
+
85
+ CKEDITOR.style = function( styleDefinition, variablesValues )
86
+ {
87
+ if ( variablesValues )
88
+ {
89
+ styleDefinition = CKEDITOR.tools.clone( styleDefinition );
90
+
91
+ replaceVariables( styleDefinition.attributes, variablesValues );
92
+ replaceVariables( styleDefinition.styles, variablesValues );
93
+ }
94
+
95
+ var element = this.element = ( styleDefinition.element || '*' ).toLowerCase();
96
+
97
+ this.type =
98
+ ( element == '#' || blockElements[ element ] ) ?
99
+ CKEDITOR.STYLE_BLOCK
100
+ : objectElements[ element ] ?
101
+ CKEDITOR.STYLE_OBJECT
102
+ :
103
+ CKEDITOR.STYLE_INLINE;
104
+
105
+ this._ =
106
+ {
107
+ definition : styleDefinition
108
+ };
109
+ };
110
+
111
+ CKEDITOR.style.prototype =
112
+ {
113
+ apply : function( document )
114
+ {
115
+ applyStyle.call( this, document, false );
116
+ },
117
+
118
+ remove : function( document )
119
+ {
120
+ applyStyle.call( this, document, true );
121
+ },
122
+
123
+ applyToRange : function( range )
124
+ {
125
+ return ( this.applyToRange =
126
+ this.type == CKEDITOR.STYLE_INLINE ?
127
+ applyInlineStyle
128
+ : this.type == CKEDITOR.STYLE_BLOCK ?
129
+ applyBlockStyle
130
+ : this.type == CKEDITOR.STYLE_OBJECT ?
131
+ applyObjectStyle
132
+ : null ).call( this, range );
133
+ },
134
+
135
+ removeFromRange : function( range )
136
+ {
137
+ return ( this.removeFromRange =
138
+ this.type == CKEDITOR.STYLE_INLINE ?
139
+ removeInlineStyle
140
+ : this.type == CKEDITOR.STYLE_OBJECT ?
141
+ removeObjectStyle
142
+ : null ).call( this, range );
143
+ },
144
+
145
+ applyToObject : function( element )
146
+ {
147
+ setupElement( element, this );
148
+ },
149
+
150
+ /**
151
+ * Get the style state inside an element path. Returns "true" if the
152
+ * element is active in the path.
153
+ */
154
+ checkActive : function( elementPath )
155
+ {
156
+ switch ( this.type )
157
+ {
158
+ case CKEDITOR.STYLE_BLOCK :
159
+ return this.checkElementRemovable( elementPath.block || elementPath.blockLimit, true );
160
+
161
+ case CKEDITOR.STYLE_OBJECT :
162
+ case CKEDITOR.STYLE_INLINE :
163
+
164
+ var elements = elementPath.elements;
165
+
166
+ for ( var i = 0, element ; i < elements.length ; i++ )
167
+ {
168
+ element = elements[ i ];
169
+
170
+ if ( this.type == CKEDITOR.STYLE_INLINE
171
+ && ( element == elementPath.block || element == elementPath.blockLimit ) )
172
+ continue;
173
+
174
+ if( this.type == CKEDITOR.STYLE_OBJECT
175
+ && !( element.getName() in objectElements ) )
176
+ continue;
177
+
178
+ if ( this.checkElementRemovable( element, true ) )
179
+ return true;
180
+ }
181
+ }
182
+ return false;
183
+ },
184
+
185
+ /**
186
+ * Whether this style can be applied at the element path.
187
+ * @param elementPath
188
+ */
189
+ checkApplicable : function( elementPath )
190
+ {
191
+ switch ( this.type )
192
+ {
193
+ case CKEDITOR.STYLE_INLINE :
194
+ case CKEDITOR.STYLE_BLOCK :
195
+ break;
196
+
197
+ case CKEDITOR.STYLE_OBJECT :
198
+ return elementPath.lastElement.getAscendant( this.element, true );
199
+ }
200
+
201
+ return true;
202
+ },
203
+
204
+ // Checks if an element, or any of its attributes, is removable by the
205
+ // current style definition.
206
+ checkElementRemovable : function( element, fullMatch )
207
+ {
208
+ if ( !element )
209
+ return false;
210
+
211
+ var def = this._.definition,
212
+ attribs;
213
+
214
+ // If the element name is the same as the style name.
215
+ if ( element.getName() == this.element )
216
+ {
217
+ // If no attributes are defined in the element.
218
+ if ( !fullMatch && !element.hasAttributes() )
219
+ return true;
220
+
221
+ attribs = getAttributesForComparison( def );
222
+
223
+ if ( attribs._length )
224
+ {
225
+ for ( var attName in attribs )
226
+ {
227
+ if ( attName == '_length' )
228
+ continue;
229
+
230
+ var elementAttr = element.getAttribute( attName ) || '';
231
+
232
+ // Special treatment for 'style' attribute is required.
233
+ if ( attName == 'style' ?
234
+ compareCssText( attribs[ attName ], normalizeCssText( elementAttr, false ) )
235
+ : attribs[ attName ] == elementAttr )
236
+ {
237
+ if ( !fullMatch )
238
+ return true;
239
+ }
240
+ else if ( fullMatch )
241
+ return false;
242
+ }
243
+ if ( fullMatch )
244
+ return true;
245
+ }
246
+ else
247
+ return true;
248
+ }
249
+
250
+ // Check if the element can be somehow overriden.
251
+ var override = getOverrides( this )[ element.getName() ] ;
252
+ if ( override )
253
+ {
254
+ // If no attributes have been defined, remove the element.
255
+ if ( !( attribs = override.attributes ) )
256
+ return true;
257
+
258
+ for ( var i = 0 ; i < attribs.length ; i++ )
259
+ {
260
+ attName = attribs[i][0];
261
+ var actualAttrValue = element.getAttribute( attName );
262
+ if ( actualAttrValue )
263
+ {
264
+ var attValue = attribs[i][1];
265
+
266
+ // Remove the attribute if:
267
+ // - The override definition value is null;
268
+ // - The override definition value is a string that
269
+ // matches the attribute value exactly.
270
+ // - The override definition value is a regex that
271
+ // has matches in the attribute value.
272
+ if ( attValue === null ||
273
+ ( typeof attValue == 'string' && actualAttrValue == attValue ) ||
274
+ attValue.test( actualAttrValue ) )
275
+ return true;
276
+ }
277
+ }
278
+ }
279
+ return false;
280
+ },
281
+
282
+ // Builds the preview HTML based on the styles definition.
283
+ buildPreview : function()
284
+ {
285
+ var styleDefinition = this._.definition,
286
+ html = [],
287
+ elementName = styleDefinition.element;
288
+
289
+ // Avoid <bdo> in the preview.
290
+ if ( elementName == 'bdo' )
291
+ elementName = 'span';
292
+
293
+ html = [ '<', elementName ];
294
+
295
+ // Assign all defined attributes.
296
+ var attribs = styleDefinition.attributes;
297
+ if ( attribs )
298
+ {
299
+ for ( var att in attribs )
300
+ {
301
+ html.push( ' ', att, '="', attribs[ att ], '"' );
302
+ }
303
+ }
304
+
305
+ // Assign the style attribute.
306
+ var cssStyle = CKEDITOR.style.getStyleText( styleDefinition );
307
+ if ( cssStyle )
308
+ html.push( ' style="', cssStyle, '"' );
309
+
310
+ html.push( '>', styleDefinition.name, '</', elementName, '>' );
311
+
312
+ return html.join( '' );
313
+ }
314
+ };
315
+
316
+ // Build the cssText based on the styles definition.
317
+ CKEDITOR.style.getStyleText = function( styleDefinition )
318
+ {
319
+ // If we have already computed it, just return it.
320
+ var stylesDef = styleDefinition._ST;
321
+ if ( stylesDef )
322
+ return stylesDef;
323
+
324
+ stylesDef = styleDefinition.styles;
325
+
326
+ // Builds the StyleText.
327
+ var stylesText = ( styleDefinition.attributes && styleDefinition.attributes[ 'style' ] ) || '',
328
+ specialStylesText = '';
329
+
330
+ if ( stylesText.length )
331
+ stylesText = stylesText.replace( semicolonFixRegex, ';' );
332
+
333
+ for ( var style in stylesDef )
334
+ {
335
+ var styleVal = stylesDef[ style ],
336
+ text = ( style + ':' + styleVal ).replace( semicolonFixRegex, ';' );
337
+
338
+ // Some browsers don't support 'inherit' property value, leave them intact. (#5242)
339
+ if ( styleVal == 'inherit' )
340
+ specialStylesText += text;
341
+ else
342
+ stylesText += text;
343
+ }
344
+
345
+ // Browsers make some changes to the style when applying them. So, here
346
+ // we normalize it to the browser format.
347
+ if ( stylesText.length )
348
+ stylesText = normalizeCssText( stylesText );
349
+
350
+ stylesText += specialStylesText;
351
+
352
+ // Return it, saving it to the next request.
353
+ return ( styleDefinition._ST = stylesText );
354
+ };
355
+
356
+ function applyInlineStyle( range )
357
+ {
358
+ var document = range.document;
359
+
360
+ if ( range.collapsed )
361
+ {
362
+ // Create the element to be inserted in the DOM.
363
+ var collapsedElement = getElement( this, document );
364
+
365
+ // Insert the empty element into the DOM at the range position.
366
+ range.insertNode( collapsedElement );
367
+
368
+ // Place the selection right inside the empty element.
369
+ range.moveToPosition( collapsedElement, CKEDITOR.POSITION_BEFORE_END );
370
+
371
+ return;
372
+ }
373
+
374
+ var elementName = this.element;
375
+ var def = this._.definition;
376
+ var isUnknownElement;
377
+
378
+ // Get the DTD definition for the element. Defaults to "span".
379
+ var dtd = CKEDITOR.dtd[ elementName ] || ( isUnknownElement = true, CKEDITOR.dtd.span );
380
+
381
+ // Expand the range.
382
+ range.enlarge( CKEDITOR.ENLARGE_ELEMENT );
383
+ range.trim();
384
+
385
+ // Get the first node to be processed and the last, which concludes the
386
+ // processing.
387
+ var boundaryNodes = range.createBookmark(),
388
+ firstNode = boundaryNodes.startNode,
389
+ lastNode = boundaryNodes.endNode;
390
+
391
+ var currentNode = firstNode;
392
+
393
+ var styleRange;
394
+
395
+ while ( currentNode )
396
+ {
397
+ var applyStyle = false;
398
+
399
+ if ( currentNode.equals( lastNode ) )
400
+ {
401
+ currentNode = null;
402
+ applyStyle = true;
403
+ }
404
+ else
405
+ {
406
+ var nodeType = currentNode.type;
407
+ var nodeName = nodeType == CKEDITOR.NODE_ELEMENT ? currentNode.getName() : null;
408
+
409
+ if ( nodeName && currentNode.getAttribute( '_cke_bookmark' ) )
410
+ {
411
+ currentNode = currentNode.getNextSourceNode( true );
412
+ continue;
413
+ }
414
+
415
+ // Check if the current node can be a child of the style element.
416
+ if ( !nodeName || ( dtd[ nodeName ]
417
+ && ( currentNode.getPosition( lastNode ) | CKEDITOR.POSITION_PRECEDING | CKEDITOR.POSITION_IDENTICAL | CKEDITOR.POSITION_IS_CONTAINED ) == ( CKEDITOR.POSITION_PRECEDING + CKEDITOR.POSITION_IDENTICAL + CKEDITOR.POSITION_IS_CONTAINED )
418
+ && ( !def.childRule || def.childRule( currentNode ) ) ) )
419
+ {
420
+ var currentParent = currentNode.getParent();
421
+
422
+ // Check if the style element can be a child of the current
423
+ // node parent or if the element is not defined in the DTD.
424
+ if ( currentParent
425
+ && ( ( currentParent.getDtd() || CKEDITOR.dtd.span )[ elementName ] || isUnknownElement )
426
+ && ( !def.parentRule || def.parentRule( currentParent ) ) )
427
+ {
428
+ // This node will be part of our range, so if it has not
429
+ // been started, place its start right before the node.
430
+ // In the case of an element node, it will be included
431
+ // only if it is entirely inside the range.
432
+ if ( !styleRange && ( !nodeName || !CKEDITOR.dtd.$removeEmpty[ nodeName ] || ( currentNode.getPosition( lastNode ) | CKEDITOR.POSITION_PRECEDING | CKEDITOR.POSITION_IDENTICAL | CKEDITOR.POSITION_IS_CONTAINED ) == ( CKEDITOR.POSITION_PRECEDING + CKEDITOR.POSITION_IDENTICAL + CKEDITOR.POSITION_IS_CONTAINED ) ) )
433
+ {
434
+ styleRange = new CKEDITOR.dom.range( document );
435
+ styleRange.setStartBefore( currentNode );
436
+ }
437
+
438
+ // Non element nodes, or empty elements can be added
439
+ // completely to the range.
440
+ if ( nodeType == CKEDITOR.NODE_TEXT || ( nodeType == CKEDITOR.NODE_ELEMENT && !currentNode.getChildCount() ) )
441
+ {
442
+ var includedNode = currentNode;
443
+ var parentNode;
444
+
445
+ // This node is about to be included completelly, but,
446
+ // if this is the last node in its parent, we must also
447
+ // check if the parent itself can be added completelly
448
+ // to the range.
449
+ while ( !includedNode.$.nextSibling
450
+ && ( parentNode = includedNode.getParent(), dtd[ parentNode.getName() ] )
451
+ && ( parentNode.getPosition( firstNode ) | CKEDITOR.POSITION_FOLLOWING | CKEDITOR.POSITION_IDENTICAL | CKEDITOR.POSITION_IS_CONTAINED ) == ( CKEDITOR.POSITION_FOLLOWING + CKEDITOR.POSITION_IDENTICAL + CKEDITOR.POSITION_IS_CONTAINED )
452
+ && ( !def.childRule || def.childRule( parentNode ) ) )
453
+ {
454
+ includedNode = parentNode;
455
+ }
456
+
457
+ styleRange.setEndAfter( includedNode );
458
+
459
+ // If the included node still is the last node in its
460
+ // parent, it means that the parent can't be included
461
+ // in this style DTD, so apply the style immediately.
462
+ if ( !includedNode.$.nextSibling )
463
+ applyStyle = true;
464
+
465
+ }
466
+ }
467
+ else
468
+ applyStyle = true;
469
+ }
470
+ else
471
+ applyStyle = true;
472
+
473
+ // Get the next node to be processed.
474
+ currentNode = currentNode.getNextSourceNode();
475
+ }
476
+
477
+ // Apply the style if we have something to which apply it.
478
+ if ( applyStyle && styleRange && !styleRange.collapsed )
479
+ {
480
+ // Build the style element, based on the style object definition.
481
+ var styleNode = getElement( this, document ),
482
+ styleHasAttrs = styleNode.hasAttributes();
483
+
484
+ // Get the element that holds the entire range.
485
+ var parent = styleRange.getCommonAncestor();
486
+
487
+ var removeList = {
488
+ styles : {},
489
+ attrs : {},
490
+ // Styles cannot be removed.
491
+ blockedStyles : {},
492
+ // Attrs cannot be removed.
493
+ blockedAttrs : {}
494
+ };
495
+
496
+ var attName, styleName, value;
497
+
498
+ // Loop through the parents, removing the redundant attributes
499
+ // from the element to be applied.
500
+ while ( styleNode && parent )
501
+ {
502
+ if ( parent.getName() == elementName )
503
+ {
504
+ for ( attName in def.attributes )
505
+ {
506
+ if ( removeList.blockedAttrs[ attName ] || !( value = parent.getAttribute( styleName ) ) )
507
+ continue;
508
+
509
+ if ( styleNode.getAttribute( attName ) == value )
510
+ removeList.attrs[ attName ] = 1;
511
+ else
512
+ removeList.blockedAttrs[ attName ] = 1;
513
+ }
514
+
515
+ for ( styleName in def.styles )
516
+ {
517
+ if ( removeList.blockedStyles[ styleName ] || !( value = parent.getStyle( styleName ) ) )
518
+ continue;
519
+
520
+ if ( styleNode.getStyle( styleName ) == value )
521
+ removeList.styles[ styleName ] = 1;
522
+ else
523
+ removeList.blockedStyles[ styleName ] = 1;
524
+ }
525
+ }
526
+
527
+ parent = parent.getParent();
528
+ }
529
+
530
+ for ( attName in removeList.attrs )
531
+ styleNode.removeAttribute( attName );
532
+
533
+ for ( styleName in removeList.styles )
534
+ styleNode.removeStyle( styleName );
535
+
536
+ if ( styleHasAttrs && !styleNode.hasAttributes() )
537
+ styleNode = null;
538
+
539
+ if ( styleNode )
540
+ {
541
+ // Move the contents of the range to the style element.
542
+ styleRange.extractContents().appendTo( styleNode );
543
+
544
+ // Here we do some cleanup, removing all duplicated
545
+ // elements from the style element.
546
+ removeFromInsideElement( this, styleNode );
547
+
548
+ // Insert it into the range position (it is collapsed after
549
+ // extractContents.
550
+ styleRange.insertNode( styleNode );
551
+
552
+ // Let's merge our new style with its neighbors, if possible.
553
+ styleNode.mergeSiblings();
554
+
555
+ // As the style system breaks text nodes constantly, let's normalize
556
+ // things for performance.
557
+ // With IE, some paragraphs get broken when calling normalize()
558
+ // repeatedly. Also, for IE, we must normalize body, not documentElement.
559
+ // IE is also known for having a "crash effect" with normalize().
560
+ // We should try to normalize with IE too in some way, somewhere.
561
+ if ( !CKEDITOR.env.ie )
562
+ styleNode.$.normalize();
563
+ }
564
+ // Style already inherit from parents, left just to clear up any internal overrides. (#5931)
565
+ else
566
+ {
567
+ styleNode = new CKEDITOR.dom.element( 'span' );
568
+ styleRange.extractContents().appendTo( styleNode );
569
+ styleRange.insertNode( styleNode );
570
+ removeFromInsideElement( this, styleNode );
571
+ styleNode.remove( true );
572
+ }
573
+
574
+ // Style applied, let's release the range, so it gets
575
+ // re-initialization in the next loop.
576
+ styleRange = null;
577
+ }
578
+ }
579
+
580
+ // Remove the bookmark nodes.
581
+ range.moveToBookmark( boundaryNodes );
582
+
583
+ // Minimize the result range to exclude empty text nodes. (#5374)
584
+ range.shrink( CKEDITOR.SHRINK_TEXT );
585
+ }
586
+
587
+ function removeInlineStyle( range )
588
+ {
589
+ /*
590
+ * Make sure our range has included all "collpased" parent inline nodes so
591
+ * that our operation logic can be simpler.
592
+ */
593
+ range.enlarge( CKEDITOR.ENLARGE_ELEMENT );
594
+
595
+ var bookmark = range.createBookmark(),
596
+ startNode = bookmark.startNode;
597
+
598
+ if ( range.collapsed )
599
+ {
600
+
601
+ var startPath = new CKEDITOR.dom.elementPath( startNode.getParent() ),
602
+ // The topmost element in elementspatch which we should jump out of.
603
+ boundaryElement;
604
+
605
+
606
+ for ( var i = 0, element ; i < startPath.elements.length
607
+ && ( element = startPath.elements[i] ) ; i++ )
608
+ {
609
+ /*
610
+ * 1. If it's collaped inside text nodes, try to remove the style from the whole element.
611
+ *
612
+ * 2. Otherwise if it's collapsed on element boundaries, moving the selection
613
+ * outside the styles instead of removing the whole tag,
614
+ * also make sure other inner styles were well preserverd.(#3309)
615
+ */
616
+ if ( element == startPath.block || element == startPath.blockLimit )
617
+ break;
618
+
619
+ if ( this.checkElementRemovable( element ) )
620
+ {
621
+ var isStart;
622
+
623
+ if ( range.collapsed && (
624
+ range.checkBoundaryOfElement( element, CKEDITOR.END ) ||
625
+ ( isStart = range.checkBoundaryOfElement( element, CKEDITOR.START ) ) ) )
626
+ {
627
+ boundaryElement = element;
628
+ boundaryElement.match = isStart ? 'start' : 'end';
629
+ }
630
+ else
631
+ {
632
+ /*
633
+ * Before removing the style node, there may be a sibling to the style node
634
+ * that's exactly the same to the one to be removed. To the user, it makes
635
+ * no difference that they're separate entities in the DOM tree. So, merge
636
+ * them before removal.
637
+ */
638
+ element.mergeSiblings();
639
+ removeFromElement( this, element );
640
+
641
+ }
642
+ }
643
+ }
644
+
645
+ // Re-create the style tree after/before the boundary element,
646
+ // the replication start from bookmark start node to define the
647
+ // new range.
648
+ if ( boundaryElement )
649
+ {
650
+ var clonedElement = startNode;
651
+ for ( i = 0 ;; i++ )
652
+ {
653
+ var newElement = startPath.elements[ i ];
654
+ if ( newElement.equals( boundaryElement ) )
655
+ break;
656
+ // Avoid copying any matched element.
657
+ else if ( newElement.match )
658
+ continue;
659
+ else
660
+ newElement = newElement.clone();
661
+ newElement.append( clonedElement );
662
+ clonedElement = newElement;
663
+ }
664
+ clonedElement[ boundaryElement.match == 'start' ?
665
+ 'insertBefore' : 'insertAfter' ]( boundaryElement );
666
+ }
667
+ }
668
+ else
669
+ {
670
+ /*
671
+ * Now our range isn't collapsed. Lets walk from the start node to the end
672
+ * node via DFS and remove the styles one-by-one.
673
+ */
674
+ var endNode = bookmark.endNode,
675
+ me = this;
676
+
677
+ /*
678
+ * Find out the style ancestor that needs to be broken down at startNode
679
+ * and endNode.
680
+ */
681
+ function breakNodes()
682
+ {
683
+ var startPath = new CKEDITOR.dom.elementPath( startNode.getParent() ),
684
+ endPath = new CKEDITOR.dom.elementPath( endNode.getParent() ),
685
+ breakStart = null,
686
+ breakEnd = null;
687
+ for ( var i = 0 ; i < startPath.elements.length ; i++ )
688
+ {
689
+ var element = startPath.elements[ i ];
690
+
691
+ if ( element == startPath.block || element == startPath.blockLimit )
692
+ break;
693
+
694
+ if ( me.checkElementRemovable( element ) )
695
+ breakStart = element;
696
+ }
697
+ for ( i = 0 ; i < endPath.elements.length ; i++ )
698
+ {
699
+ element = endPath.elements[ i ];
700
+
701
+ if ( element == endPath.block || element == endPath.blockLimit )
702
+ break;
703
+
704
+ if ( me.checkElementRemovable( element ) )
705
+ breakEnd = element;
706
+ }
707
+
708
+ if ( breakEnd )
709
+ endNode.breakParent( breakEnd );
710
+ if ( breakStart )
711
+ startNode.breakParent( breakStart );
712
+ }
713
+ breakNodes();
714
+
715
+ // Now, do the DFS walk.
716
+ var currentNode = startNode.getNext();
717
+ while ( !currentNode.equals( endNode ) )
718
+ {
719
+ /*
720
+ * Need to get the next node first because removeFromElement() can remove
721
+ * the current node from DOM tree.
722
+ */
723
+ var nextNode = currentNode.getNextSourceNode();
724
+ if ( currentNode.type == CKEDITOR.NODE_ELEMENT && this.checkElementRemovable( currentNode ) )
725
+ {
726
+ // Remove style from element or overriding element.
727
+ if ( currentNode.getName() == this.element )
728
+ removeFromElement( this, currentNode );
729
+ else
730
+ removeOverrides( currentNode, getOverrides( this )[ currentNode.getName() ] );
731
+
732
+ /*
733
+ * removeFromElement() may have merged the next node with something before
734
+ * the startNode via mergeSiblings(). In that case, the nextNode would
735
+ * contain startNode and we'll have to call breakNodes() again and also
736
+ * reassign the nextNode to something after startNode.
737
+ */
738
+ if ( nextNode.type == CKEDITOR.NODE_ELEMENT && nextNode.contains( startNode ) )
739
+ {
740
+ breakNodes();
741
+ nextNode = startNode.getNext();
742
+ }
743
+ }
744
+ currentNode = nextNode;
745
+ }
746
+ }
747
+
748
+ range.moveToBookmark( bookmark );
749
+ }
750
+
751
+ function applyObjectStyle( range )
752
+ {
753
+ var root = range.getCommonAncestor( true, true ),
754
+ element = root.getAscendant( this.element, true );
755
+ element && setupElement( element, this );
756
+ }
757
+
758
+ function removeObjectStyle( range )
759
+ {
760
+ var root = range.getCommonAncestor( true, true ),
761
+ element = root.getAscendant( this.element, true );
762
+
763
+ if ( !element )
764
+ return;
765
+
766
+ var style = this;
767
+ var def = style._.definition;
768
+ var attributes = def.attributes;
769
+ var styles = CKEDITOR.style.getStyleText( def );
770
+
771
+ // Remove all defined attributes.
772
+ if ( attributes )
773
+ {
774
+ for ( var att in attributes )
775
+ {
776
+ element.removeAttribute( att, attributes[ att ] );
777
+ }
778
+ }
779
+
780
+ // Assign all defined styles.
781
+ if ( def.styles )
782
+ {
783
+ for ( var i in def.styles )
784
+ {
785
+ if ( !def.styles.hasOwnProperty( i ) )
786
+ continue;
787
+
788
+ element.removeStyle( i );
789
+ }
790
+ }
791
+ }
792
+
793
+ function applyBlockStyle( range )
794
+ {
795
+ // Serializible bookmarks is needed here since
796
+ // elements may be merged.
797
+ var bookmark = range.createBookmark( true );
798
+
799
+ var iterator = range.createIterator();
800
+ iterator.enforceRealBlocks = true;
801
+
802
+ // make recognize <br /> tag as a separator in ENTER_BR mode (#5121)
803
+ if ( this._.enterMode )
804
+ iterator.enlargeBr = ( this._.enterMode != CKEDITOR.ENTER_BR );
805
+
806
+ var block;
807
+ var doc = range.document;
808
+ var previousPreBlock;
809
+
810
+ while ( ( block = iterator.getNextParagraph() ) ) // Only one =
811
+ {
812
+ var newBlock = getElement( this, doc, block );
813
+ replaceBlock( block, newBlock );
814
+ }
815
+
816
+ range.moveToBookmark( bookmark );
817
+ }
818
+
819
+ // Replace the original block with new one, with special treatment
820
+ // for <pre> blocks to make sure content format is well preserved, and merging/splitting adjacent
821
+ // when necessary.(#3188)
822
+ function replaceBlock( block, newBlock )
823
+ {
824
+ var newBlockIsPre = newBlock.is( 'pre' );
825
+ var blockIsPre = block.is( 'pre' );
826
+
827
+ var isToPre = newBlockIsPre && !blockIsPre;
828
+ var isFromPre = !newBlockIsPre && blockIsPre;
829
+
830
+ if ( isToPre )
831
+ newBlock = toPre( block, newBlock );
832
+ else if ( isFromPre )
833
+ // Split big <pre> into pieces before start to convert.
834
+ newBlock = fromPres( splitIntoPres( block ), newBlock );
835
+ else
836
+ block.moveChildren( newBlock );
837
+
838
+ newBlock.replace( block );
839
+
840
+ if ( newBlockIsPre )
841
+ {
842
+ // Merge previous <pre> blocks.
843
+ mergePre( newBlock );
844
+ }
845
+ }
846
+
847
+ var nonWhitespaces = CKEDITOR.dom.walker.whitespaces( true );
848
+ /**
849
+ * Merge a <pre> block with a previous sibling if available.
850
+ */
851
+ function mergePre( preBlock )
852
+ {
853
+ var previousBlock;
854
+ if ( !( ( previousBlock = preBlock.getPrevious( nonWhitespaces ) )
855
+ && previousBlock.is
856
+ && previousBlock.is( 'pre') ) )
857
+ return;
858
+
859
+ // Merge the previous <pre> block contents into the current <pre>
860
+ // block.
861
+ //
862
+ // Another thing to be careful here is that currentBlock might contain
863
+ // a '\n' at the beginning, and previousBlock might contain a '\n'
864
+ // towards the end. These new lines are not normally displayed but they
865
+ // become visible after merging.
866
+ var mergedHtml = replace( previousBlock.getHtml(), /\n$/, '' ) + '\n\n' +
867
+ replace( preBlock.getHtml(), /^\n/, '' ) ;
868
+
869
+ // Krugle: IE normalizes innerHTML from <pre>, breaking whitespaces.
870
+ if ( CKEDITOR.env.ie )
871
+ preBlock.$.outerHTML = '<pre>' + mergedHtml + '</pre>';
872
+ else
873
+ preBlock.setHtml( mergedHtml );
874
+
875
+ previousBlock.remove();
876
+ }
877
+
878
+ /**
879
+ * Split into multiple <pre> blocks separated by double line-break.
880
+ * @param preBlock
881
+ */
882
+ function splitIntoPres( preBlock )
883
+ {
884
+ // Exclude the ones at header OR at tail,
885
+ // and ignore bookmark content between them.
886
+ var duoBrRegex = /(\S\s*)\n(?:\s|(<span[^>]+_cke_bookmark.*?\/span>))*\n(?!$)/gi,
887
+ blockName = preBlock.getName(),
888
+ splitedHtml = replace( preBlock.getOuterHtml(),
889
+ duoBrRegex,
890
+ function( match, charBefore, bookmark )
891
+ {
892
+ return charBefore + '</pre>' + bookmark + '<pre>';
893
+ } );
894
+
895
+ var pres = [];
896
+ splitedHtml.replace( /<pre\b.*?>([\s\S]*?)<\/pre>/gi, function( match, preContent ){
897
+ pres.push( preContent );
898
+ } );
899
+ return pres;
900
+ }
901
+
902
+ // Wrapper function of String::replace without considering of head/tail bookmarks nodes.
903
+ function replace( str, regexp, replacement )
904
+ {
905
+ var headBookmark = '',
906
+ tailBookmark = '';
907
+
908
+ str = str.replace( /(^<span[^>]+_cke_bookmark.*?\/span>)|(<span[^>]+_cke_bookmark.*?\/span>$)/gi,
909
+ function( str, m1, m2 ){
910
+ m1 && ( headBookmark = m1 );
911
+ m2 && ( tailBookmark = m2 );
912
+ return '';
913
+ } );
914
+ return headBookmark + str.replace( regexp, replacement ) + tailBookmark;
915
+ }
916
+ /**
917
+ * Converting a list of <pre> into blocks with format well preserved.
918
+ */
919
+ function fromPres( preHtmls, newBlock )
920
+ {
921
+ var docFrag = new CKEDITOR.dom.documentFragment( newBlock.getDocument() );
922
+ for ( var i = 0 ; i < preHtmls.length ; i++ )
923
+ {
924
+ var blockHtml = preHtmls[ i ];
925
+
926
+ // 1. Trim the first and last line-breaks immediately after and before <pre>,
927
+ // they're not visible.
928
+ blockHtml = blockHtml.replace( /(\r\n|\r)/g, '\n' ) ;
929
+ blockHtml = replace( blockHtml, /^[ \t]*\n/, '' ) ;
930
+ blockHtml = replace( blockHtml, /\n$/, '' ) ;
931
+ // 2. Convert spaces or tabs at the beginning or at the end to &nbsp;
932
+ blockHtml = replace( blockHtml, /^[ \t]+|[ \t]+$/g, function( match, offset, s )
933
+ {
934
+ if ( match.length == 1 ) // one space, preserve it
935
+ return '&nbsp;' ;
936
+ else if ( !offset ) // beginning of block
937
+ return CKEDITOR.tools.repeat( '&nbsp;', match.length - 1 ) + ' ';
938
+ else // end of block
939
+ return ' ' + CKEDITOR.tools.repeat( '&nbsp;', match.length - 1 );
940
+ } ) ;
941
+
942
+ // 3. Convert \n to <BR>.
943
+ // 4. Convert contiguous (i.e. non-singular) spaces or tabs to &nbsp;
944
+ blockHtml = blockHtml.replace( /\n/g, '<br>' ) ;
945
+ blockHtml = blockHtml.replace( /[ \t]{2,}/g,
946
+ function ( match )
947
+ {
948
+ return CKEDITOR.tools.repeat( '&nbsp;', match.length - 1 ) + ' ' ;
949
+ } ) ;
950
+
951
+ var newBlockClone = newBlock.clone();
952
+ newBlockClone.setHtml( blockHtml );
953
+ docFrag.append( newBlockClone );
954
+ }
955
+ return docFrag;
956
+ }
957
+
958
+ /**
959
+ * Converting from a non-PRE block to a PRE block in formatting operations.
960
+ */
961
+ function toPre( block, newBlock )
962
+ {
963
+ // First trim the block content.
964
+ var preHtml = block.getHtml();
965
+
966
+ // 1. Trim head/tail spaces, they're not visible.
967
+ preHtml = replace( preHtml, /(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g, '' );
968
+ // 2. Delete ANSI whitespaces immediately before and after <BR> because
969
+ // they are not visible.
970
+ preHtml = preHtml.replace( /[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi, '$1' );
971
+ // 3. Compress other ANSI whitespaces since they're only visible as one
972
+ // single space previously.
973
+ // 4. Convert &nbsp; to spaces since &nbsp; is no longer needed in <PRE>.
974
+ preHtml = preHtml.replace( /([ \t\n\r]+|&nbsp;)/g, ' ' );
975
+ // 5. Convert any <BR /> to \n. This must not be done earlier because
976
+ // the \n would then get compressed.
977
+ preHtml = preHtml.replace( /<br\b[^>]*>/gi, '\n' );
978
+
979
+ // Krugle: IE normalizes innerHTML to <pre>, breaking whitespaces.
980
+ if ( CKEDITOR.env.ie )
981
+ {
982
+ var temp = block.getDocument().createElement( 'div' );
983
+ temp.append( newBlock );
984
+ newBlock.$.outerHTML = '<pre>' + preHtml + '</pre>';
985
+ newBlock = temp.getFirst().remove();
986
+ }
987
+ else
988
+ newBlock.setHtml( preHtml );
989
+
990
+ return newBlock;
991
+ }
992
+
993
+ // Removes a style from an element itself, don't care about its subtree.
994
+ function removeFromElement( style, element )
995
+ {
996
+ var def = style._.definition,
997
+ attributes = CKEDITOR.tools.extend( {}, def.attributes, getOverrides( style )[ element.getName() ] ),
998
+ styles = def.styles,
999
+ // If the style is only about the element itself, we have to remove the element.
1000
+ removeEmpty = CKEDITOR.tools.isEmpty( attributes ) && CKEDITOR.tools.isEmpty( styles );
1001
+
1002
+ // Remove definition attributes/style from the elemnt.
1003
+ for ( var attName in attributes )
1004
+ {
1005
+ // The 'class' element value must match (#1318).
1006
+ if ( ( attName == 'class' || style._.definition.fullMatch )
1007
+ && element.getAttribute( attName ) != normalizeProperty( attName, attributes[ attName ] ) )
1008
+ continue;
1009
+ removeEmpty = element.hasAttribute( attName );
1010
+ element.removeAttribute( attName );
1011
+ }
1012
+
1013
+ for ( var styleName in styles )
1014
+ {
1015
+ // Full match style insist on having fully equivalence. (#5018)
1016
+ if ( style._.definition.fullMatch
1017
+ && element.getStyle( styleName ) != normalizeProperty( styleName, styles[ styleName ], true ) )
1018
+ continue;
1019
+
1020
+ removeEmpty = removeEmpty || !!element.getStyle( styleName );
1021
+ element.removeStyle( styleName );
1022
+ }
1023
+
1024
+ removeEmpty && removeNoAttribsElement( element );
1025
+ }
1026
+
1027
+ // Removes a style from inside an element.
1028
+ function removeFromInsideElement( style, element )
1029
+ {
1030
+ var def = style._.definition,
1031
+ attribs = def.attributes,
1032
+ styles = def.styles,
1033
+ overrides = getOverrides( style );
1034
+
1035
+ var innerElements = element.getElementsByTag( style.element );
1036
+
1037
+ for ( var i = innerElements.count(); --i >= 0 ; )
1038
+ removeFromElement( style, innerElements.getItem( i ) );
1039
+
1040
+ // Now remove any other element with different name that is
1041
+ // defined to be overriden.
1042
+ for ( var overrideElement in overrides )
1043
+ {
1044
+ if ( overrideElement != style.element )
1045
+ {
1046
+ innerElements = element.getElementsByTag( overrideElement ) ;
1047
+ for ( i = innerElements.count() - 1 ; i >= 0 ; i-- )
1048
+ {
1049
+ var innerElement = innerElements.getItem( i );
1050
+ removeOverrides( innerElement, overrides[ overrideElement ] ) ;
1051
+ }
1052
+ }
1053
+ }
1054
+
1055
+ }
1056
+
1057
+ /**
1058
+ * Remove overriding styles/attributes from the specific element.
1059
+ * Note: Remove the element if no attributes remain.
1060
+ * @param {Object} element
1061
+ * @param {Object} overrides
1062
+ */
1063
+ function removeOverrides( element, overrides )
1064
+ {
1065
+ var attributes = overrides && overrides.attributes ;
1066
+
1067
+ if ( attributes )
1068
+ {
1069
+ for ( var i = 0 ; i < attributes.length ; i++ )
1070
+ {
1071
+ var attName = attributes[i][0], actualAttrValue ;
1072
+
1073
+ if ( ( actualAttrValue = element.getAttribute( attName ) ) )
1074
+ {
1075
+ var attValue = attributes[i][1] ;
1076
+
1077
+ // Remove the attribute if:
1078
+ // - The override definition value is null ;
1079
+ // - The override definition valie is a string that
1080
+ // matches the attribute value exactly.
1081
+ // - The override definition value is a regex that
1082
+ // has matches in the attribute value.
1083
+ if ( attValue === null ||
1084
+ ( attValue.test && attValue.test( actualAttrValue ) ) ||
1085
+ ( typeof attValue == 'string' && actualAttrValue == attValue ) )
1086
+ element.removeAttribute( attName ) ;
1087
+ }
1088
+ }
1089
+ }
1090
+
1091
+ removeNoAttribsElement( element );
1092
+ }
1093
+
1094
+ // If the element has no more attributes, remove it.
1095
+ function removeNoAttribsElement( element )
1096
+ {
1097
+ // If no more attributes remained in the element, remove it,
1098
+ // leaving its children.
1099
+ if ( !element.hasAttributes() )
1100
+ {
1101
+ // Removing elements may open points where merging is possible,
1102
+ // so let's cache the first and last nodes for later checking.
1103
+ var firstChild = element.getFirst();
1104
+ var lastChild = element.getLast();
1105
+
1106
+ element.remove( true );
1107
+
1108
+ if ( firstChild )
1109
+ {
1110
+ // Check the cached nodes for merging.
1111
+ firstChild.type == CKEDITOR.NODE_ELEMENT && firstChild.mergeSiblings();
1112
+
1113
+ if ( lastChild && !firstChild.equals( lastChild )
1114
+ && lastChild.type == CKEDITOR.NODE_ELEMENT )
1115
+ lastChild.mergeSiblings();
1116
+ }
1117
+ }
1118
+ }
1119
+
1120
+ function getElement( style, targetDocument, element )
1121
+ {
1122
+ var el;
1123
+
1124
+ var def = style._.definition;
1125
+
1126
+ var elementName = style.element;
1127
+
1128
+ // The "*" element name will always be a span for this function.
1129
+ if ( elementName == '*' )
1130
+ elementName = 'span';
1131
+
1132
+ // Create the element.
1133
+ el = new CKEDITOR.dom.element( elementName, targetDocument );
1134
+
1135
+ // #6226: attributes should be copied before the new ones are applied
1136
+ if ( element )
1137
+ element.copyAttributes( el );
1138
+
1139
+ return setupElement( el, style );
1140
+ }
1141
+
1142
+ function setupElement( el, style )
1143
+ {
1144
+ var def = style._.definition;
1145
+ var attributes = def.attributes;
1146
+ var styles = CKEDITOR.style.getStyleText( def );
1147
+
1148
+ // Assign all defined attributes.
1149
+ if ( attributes )
1150
+ {
1151
+ for ( var att in attributes )
1152
+ {
1153
+ el.setAttribute( att, attributes[ att ] );
1154
+ }
1155
+ }
1156
+
1157
+ // Assign all defined styles.
1158
+ if( styles )
1159
+ el.setAttribute( 'style', styles );
1160
+
1161
+ return el;
1162
+ }
1163
+
1164
+ var varRegex = /#\((.+?)\)/g;
1165
+ function replaceVariables( list, variablesValues )
1166
+ {
1167
+ for ( var item in list )
1168
+ {
1169
+ list[ item ] = list[ item ].replace( varRegex, function( match, varName )
1170
+ {
1171
+ return variablesValues[ varName ];
1172
+ });
1173
+ }
1174
+ }
1175
+
1176
+
1177
+ // Returns an object that can be used for style matching comparison.
1178
+ // Attributes names and values are all lowercased, and the styles get
1179
+ // merged with the style attribute.
1180
+ function getAttributesForComparison( styleDefinition )
1181
+ {
1182
+ // If we have already computed it, just return it.
1183
+ var attribs = styleDefinition._AC;
1184
+ if ( attribs )
1185
+ return attribs;
1186
+
1187
+ attribs = {};
1188
+
1189
+ var length = 0;
1190
+
1191
+ // Loop through all defined attributes.
1192
+ var styleAttribs = styleDefinition.attributes;
1193
+ if ( styleAttribs )
1194
+ {
1195
+ for ( var styleAtt in styleAttribs )
1196
+ {
1197
+ length++;
1198
+ attribs[ styleAtt ] = styleAttribs[ styleAtt ];
1199
+ }
1200
+ }
1201
+
1202
+ // Includes the style definitions.
1203
+ var styleText = CKEDITOR.style.getStyleText( styleDefinition );
1204
+ if ( styleText )
1205
+ {
1206
+ if ( !attribs[ 'style' ] )
1207
+ length++;
1208
+ attribs[ 'style' ] = styleText;
1209
+ }
1210
+
1211
+ // Appends the "length" information to the object.
1212
+ attribs._length = length;
1213
+
1214
+ // Return it, saving it to the next request.
1215
+ return ( styleDefinition._AC = attribs );
1216
+ }
1217
+
1218
+ /**
1219
+ * Get the the collection used to compare the elements and attributes,
1220
+ * defined in this style overrides, with other element. All information in
1221
+ * it is lowercased.
1222
+ * @param {CKEDITOR.style} style
1223
+ */
1224
+ function getOverrides( style )
1225
+ {
1226
+ if ( style._.overrides )
1227
+ return style._.overrides;
1228
+
1229
+ var overrides = ( style._.overrides = {} ),
1230
+ definition = style._.definition.overrides;
1231
+
1232
+ if ( definition )
1233
+ {
1234
+ // The override description can be a string, object or array.
1235
+ // Internally, well handle arrays only, so transform it if needed.
1236
+ if ( !CKEDITOR.tools.isArray( definition ) )
1237
+ definition = [ definition ];
1238
+
1239
+ // Loop through all override definitions.
1240
+ for ( var i = 0 ; i < definition.length ; i++ )
1241
+ {
1242
+ var override = definition[i];
1243
+ var elementName;
1244
+ var overrideEl;
1245
+ var attrs;
1246
+
1247
+ // If can be a string with the element name.
1248
+ if ( typeof override == 'string' )
1249
+ elementName = override.toLowerCase();
1250
+ // Or an object.
1251
+ else
1252
+ {
1253
+ elementName = override.element ? override.element.toLowerCase() : style.element;
1254
+ attrs = override.attributes;
1255
+ }
1256
+
1257
+ // We can have more than one override definition for the same
1258
+ // element name, so we attempt to simply append information to
1259
+ // it if it already exists.
1260
+ overrideEl = overrides[ elementName ] || ( overrides[ elementName ] = {} );
1261
+
1262
+ if ( attrs )
1263
+ {
1264
+ // The returning attributes list is an array, because we
1265
+ // could have different override definitions for the same
1266
+ // attribute name.
1267
+ var overrideAttrs = ( overrideEl.attributes = overrideEl.attributes || new Array() );
1268
+ for ( var attName in attrs )
1269
+ {
1270
+ // Each item in the attributes array is also an array,
1271
+ // where [0] is the attribute name and [1] is the
1272
+ // override value.
1273
+ overrideAttrs.push( [ attName.toLowerCase(), attrs[ attName ] ] );
1274
+ }
1275
+ }
1276
+ }
1277
+ }
1278
+
1279
+ return overrides;
1280
+ }
1281
+
1282
+ // Make the comparison of attribute value easier by standardizing it.
1283
+ function normalizeProperty( name, value, isStyle )
1284
+ {
1285
+ var temp = new CKEDITOR.dom.element( 'span' );
1286
+ temp [ isStyle ? 'setStyle' : 'setAttribute' ]( name, value );
1287
+ return temp[ isStyle ? 'getStyle' : 'getAttribute' ]( name );
1288
+ }
1289
+
1290
+ // Make the comparison of style text easier by standardizing it.
1291
+ function normalizeCssText( unparsedCssText, nativeNormalize )
1292
+ {
1293
+ var styleText;
1294
+ if ( nativeNormalize !== false )
1295
+ {
1296
+ // Injects the style in a temporary span object, so the browser parses it,
1297
+ // retrieving its final format.
1298
+ var temp = new CKEDITOR.dom.element( 'span' );
1299
+ temp.setAttribute( 'style', unparsedCssText );
1300
+ styleText = temp.getAttribute( 'style' ) || '';
1301
+ }
1302
+ else
1303
+ styleText = unparsedCssText;
1304
+
1305
+ // Shrinking white-spaces around colon and semi-colon (#4147).
1306
+ // Compensate tail semi-colon.
1307
+ return styleText.replace( /\s*([;:])\s*/, '$1' )
1308
+ .replace( /([^\s;])$/, '$1;')
1309
+ // Trimming spaces after comma(#4107),
1310
+ // remove quotations(#6403),
1311
+ // mostly for differences on "font-family".
1312
+ .replace( /,\s+/g, ',' )
1313
+ .replace( /\"/g,'' )
1314
+ .toLowerCase();
1315
+ }
1316
+
1317
+ // Turn inline style text properties into one hash.
1318
+ function parseStyleText( styleText )
1319
+ {
1320
+ var retval = {};
1321
+ styleText
1322
+ .replace( /&quot;/g, '"' )
1323
+ .replace( /\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g, function( match, name, value )
1324
+ {
1325
+ retval[ name ] = value;
1326
+ } );
1327
+ return retval;
1328
+ }
1329
+
1330
+ /**
1331
+ * Compare two bunch of styles, with the speciality that value 'inherit'
1332
+ * is treated as a wildcard which will match any value.
1333
+ * @param {Object|String} source
1334
+ * @param {Object|String} target
1335
+ */
1336
+ function compareCssText( source, target )
1337
+ {
1338
+ typeof source == 'string' && ( source = parseStyleText( source ) );
1339
+ typeof target == 'string' && ( target = parseStyleText( target ) );
1340
+ for( var name in source )
1341
+ {
1342
+ if ( !( name in target &&
1343
+ ( target[ name ] == source[ name ]
1344
+ || source[ name ] == 'inherit'
1345
+ || target[ name ] == 'inherit' ) ) )
1346
+ {
1347
+ return false;
1348
+ }
1349
+ }
1350
+ return true;
1351
+ }
1352
+
1353
+ function applyStyle( document, remove )
1354
+ {
1355
+ var selection = document.getSelection(),
1356
+ // Bookmark the range so we can re-select it after processing.
1357
+ bookmarks = selection.createBookmarks( 1 ),
1358
+ ranges = selection.getRanges( 1 ),
1359
+ func = remove ? this.removeFromRange : this.applyToRange,
1360
+ range;
1361
+
1362
+ var iterator = ranges.createIterator();
1363
+ while ( ( range = iterator.getNextRange() ) )
1364
+ func.call( this, range );
1365
+
1366
+ if ( bookmarks.length == 1 && bookmarks[0].collapsed )
1367
+ {
1368
+ selection.selectRanges( ranges );
1369
+ document.getById( bookmarks[ 0 ].startNode ).remove();
1370
+ }
1371
+ else
1372
+ selection.selectBookmarks( bookmarks );
1373
+ }
1374
+ })();
1375
+
1376
+ CKEDITOR.styleCommand = function( style )
1377
+ {
1378
+ this.style = style;
1379
+ };
1380
+
1381
+ CKEDITOR.styleCommand.prototype.exec = function( editor )
1382
+ {
1383
+ editor.focus();
1384
+
1385
+ var doc = editor.document;
1386
+
1387
+ if ( doc )
1388
+ {
1389
+ if ( this.state == CKEDITOR.TRISTATE_OFF )
1390
+ this.style.apply( doc );
1391
+ else if ( this.state == CKEDITOR.TRISTATE_ON )
1392
+ this.style.remove( doc );
1393
+ }
1394
+
1395
+ return !!doc;
1396
+ };
1397
+
1398
+ CKEDITOR.stylesSet = new CKEDITOR.resourceManager( '', 'stylesSet' );
1399
+
1400
+ // Backward compatibility (#5025).
1401
+ CKEDITOR.addStylesSet = CKEDITOR.tools.bind( CKEDITOR.stylesSet.add, CKEDITOR.stylesSet );
1402
+ CKEDITOR.loadStylesSet = function( name, url, callback )
1403
+ {
1404
+ CKEDITOR.stylesSet.addExternal( name, url, '' );
1405
+ CKEDITOR.stylesSet.load( name, callback );
1406
+ };
1407
+
1408
+
1409
+ /**
1410
+ * Gets the current styleSet for this instance
1411
+ * @param {Function} The function to be called with the styles data.
1412
+ * @example
1413
+ * editor.getStylesSet( function( stylesDefinitions ) {} );
1414
+ */
1415
+ CKEDITOR.editor.prototype.getStylesSet = function( callback )
1416
+ {
1417
+ if ( !this._.stylesDefinitions )
1418
+ {
1419
+ var editor = this,
1420
+ // Respect the backwards compatible definition entry
1421
+ configStyleSet = editor.config.stylesCombo_stylesSet || editor.config.stylesSet || 'default';
1422
+
1423
+ // #5352 Allow to define the styles directly in the config object
1424
+ if ( configStyleSet instanceof Array )
1425
+ {
1426
+ editor._.stylesDefinitions = configStyleSet;
1427
+ callback( configStyleSet );
1428
+ return;
1429
+ }
1430
+
1431
+ var partsStylesSet = configStyleSet.split( ':' ),
1432
+ styleSetName = partsStylesSet[ 0 ],
1433
+ externalPath = partsStylesSet[ 1 ],
1434
+ pluginPath = CKEDITOR.plugins.registered.styles.path;
1435
+
1436
+ CKEDITOR.stylesSet.addExternal( styleSetName,
1437
+ externalPath ?
1438
+ partsStylesSet.slice( 1 ).join( ':' ) :
1439
+ pluginPath + 'styles/' + styleSetName + '.js', '' );
1440
+
1441
+ CKEDITOR.stylesSet.load( styleSetName, function( stylesSet )
1442
+ {
1443
+ editor._.stylesDefinitions = stylesSet[ styleSetName ];
1444
+ callback( editor._.stylesDefinitions );
1445
+ } ) ;
1446
+ }
1447
+ else
1448
+ callback( this._.stylesDefinitions );
1449
+ };
1450
+
1451
+ /**
1452
+ * The "styles definition set" to use in the editor. They will be used in the
1453
+ * styles combo and the Style selector of the div container. <br>
1454
+ * The styles may be defined in the page containing the editor, or can be
1455
+ * loaded on demand from an external file. In the second case, if this setting
1456
+ * contains only a name, the styles definition file will be loaded from the
1457
+ * "styles" folder inside the styles plugin folder.
1458
+ * Otherwise, this setting has the "name:url" syntax, making it
1459
+ * possible to set the URL from which loading the styles file.<br>
1460
+ * Previously this setting was available as config.stylesCombo_stylesSet<br>
1461
+ * @name CKEDITOR.config.stylesSet
1462
+ * @type String|Array
1463
+ * @default 'default'
1464
+ * @since 3.3
1465
+ * @example
1466
+ * // Load from the styles' styles folder (mystyles.js file).
1467
+ * config.stylesSet = 'mystyles';
1468
+ * @example
1469
+ * // Load from a relative URL.
1470
+ * config.stylesSet = 'mystyles:/editorstyles/styles.js';
1471
+ * @example
1472
+ * // Load from a full URL.
1473
+ * config.stylesSet = 'mystyles:http://www.example.com/editorstyles/styles.js';
1474
+ * @example
1475
+ * // Load from a list of definitions.
1476
+ * config.stylesSet = [
1477
+ * { name : 'Strong Emphasis', element : 'strong' },
1478
+ * { name : 'Emphasis', element : 'em' }, ... ];
1479
+ */