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,1120 @@
1
+ /*
2
+ Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
3
+ For licensing, see LICENSE.html or http://ckeditor.com/license
4
+ */
5
+
6
+ (function()
7
+ {
8
+ function removeRawAttribute( $node, attr )
9
+ {
10
+ if ( CKEDITOR.env.ie )
11
+ $node.removeAttribute( attr );
12
+ else
13
+ delete $node[ attr ];
14
+ }
15
+
16
+ var cellNodeRegex = /^(?:td|th)$/;
17
+
18
+ function getSelectedCells( selection )
19
+ {
20
+ // Walker will try to split text nodes, which will make the current selection
21
+ // invalid. So save bookmarks before doing anything.
22
+ var bookmarks = selection.createBookmarks();
23
+
24
+ var ranges = selection.getRanges();
25
+ var retval = [];
26
+ var database = {};
27
+
28
+ function moveOutOfCellGuard( node )
29
+ {
30
+ // Apply to the first cell only.
31
+ if ( retval.length > 0 )
32
+ return;
33
+
34
+ // If we are exiting from the first </td>, then the td should definitely be
35
+ // included.
36
+ if ( node.type == CKEDITOR.NODE_ELEMENT && cellNodeRegex.test( node.getName() )
37
+ && !node.getCustomData( 'selected_cell' ) )
38
+ {
39
+ CKEDITOR.dom.element.setMarker( database, node, 'selected_cell', true );
40
+ retval.push( node );
41
+ }
42
+ }
43
+
44
+ for ( var i = 0 ; i < ranges.length ; i++ )
45
+ {
46
+ var range = ranges[ i ];
47
+
48
+ if ( range.collapsed )
49
+ {
50
+ // Walker does not handle collapsed ranges yet - fall back to old API.
51
+ var startNode = range.getCommonAncestor();
52
+ var nearestCell = startNode.getAscendant( 'td', true ) || startNode.getAscendant( 'th', true );
53
+ if ( nearestCell )
54
+ retval.push( nearestCell );
55
+ }
56
+ else
57
+ {
58
+ var walker = new CKEDITOR.dom.walker( range );
59
+ var node;
60
+ walker.guard = moveOutOfCellGuard;
61
+
62
+ while ( ( node = walker.next() ) )
63
+ {
64
+ // If may be possible for us to have a range like this:
65
+ // <td>^1</td><td>^2</td>
66
+ // The 2nd td shouldn't be included.
67
+ //
68
+ // So we have to take care to include a td we've entered only when we've
69
+ // walked into its children.
70
+
71
+ var parent = node.getParent();
72
+ if ( parent && cellNodeRegex.test( parent.getName() ) && !parent.getCustomData( 'selected_cell' ) )
73
+ {
74
+ CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
75
+ retval.push( parent );
76
+ }
77
+ }
78
+ }
79
+ }
80
+
81
+ CKEDITOR.dom.element.clearAllMarkers( database );
82
+
83
+ // Restore selection position.
84
+ selection.selectBookmarks( bookmarks );
85
+
86
+ return retval;
87
+ }
88
+
89
+ function getFocusElementAfterDelCells( cellsToDelete ) {
90
+ var i = 0,
91
+ last = cellsToDelete.length - 1,
92
+ database = {},
93
+ cell,focusedCell,
94
+ tr;
95
+
96
+ while ( ( cell = cellsToDelete[ i++ ] ) )
97
+ CKEDITOR.dom.element.setMarker( database, cell, 'delete_cell', true );
98
+
99
+ // 1.first we check left or right side focusable cell row by row;
100
+ i = 0;
101
+ while ( ( cell = cellsToDelete[ i++ ] ) )
102
+ {
103
+ if ( ( focusedCell = cell.getPrevious() ) && !focusedCell.getCustomData( 'delete_cell' )
104
+ || ( focusedCell = cell.getNext() ) && !focusedCell.getCustomData( 'delete_cell' ) )
105
+ {
106
+ CKEDITOR.dom.element.clearAllMarkers( database );
107
+ return focusedCell;
108
+ }
109
+ }
110
+
111
+ CKEDITOR.dom.element.clearAllMarkers( database );
112
+
113
+ // 2. then we check the toppest row (outside the selection area square) focusable cell
114
+ tr = cellsToDelete[ 0 ].getParent();
115
+ if ( ( tr = tr.getPrevious() ) )
116
+ return tr.getLast();
117
+
118
+ // 3. last we check the lowerest row focusable cell
119
+ tr = cellsToDelete[ last ].getParent();
120
+ if ( ( tr = tr.getNext() ) )
121
+ return tr.getChild( 0 );
122
+
123
+ return null;
124
+ }
125
+
126
+ function clearRow( $tr )
127
+ {
128
+ // Get the array of row's cells.
129
+ var $cells = $tr.cells;
130
+
131
+ // Empty all cells.
132
+ for ( var i = 0 ; i < $cells.length ; i++ )
133
+ {
134
+ $cells[ i ].innerHTML = '';
135
+
136
+ if ( !CKEDITOR.env.ie )
137
+ ( new CKEDITOR.dom.element( $cells[ i ] ) ).appendBogus();
138
+ }
139
+ }
140
+
141
+ function insertRow( selection, insertBefore )
142
+ {
143
+ // Get the row where the selection is placed in.
144
+ var row = selection.getStartElement().getAscendant( 'tr' );
145
+ if ( !row )
146
+ return;
147
+
148
+ // Create a clone of the row.
149
+ var newRow = row.clone( 1 );
150
+
151
+ insertBefore ?
152
+ newRow.insertBefore( row ) :
153
+ newRow.insertAfter( row );
154
+
155
+ // Clean the new row.
156
+ clearRow( newRow.$ );
157
+ }
158
+
159
+ function deleteRows( selectionOrRow )
160
+ {
161
+ if ( selectionOrRow instanceof CKEDITOR.dom.selection )
162
+ {
163
+ var cells = getSelectedCells( selectionOrRow ),
164
+ cellsCount = cells.length,
165
+ rowsToDelete = [],
166
+ cursorPosition,
167
+ previousRowIndex,
168
+ nextRowIndex;
169
+
170
+ // Queue up the rows - it's possible and likely that we have duplicates.
171
+ for ( var i = 0 ; i < cellsCount ; i++ )
172
+ {
173
+ var row = cells[ i ].getParent(),
174
+ rowIndex = row.$.rowIndex;
175
+
176
+ !i && ( previousRowIndex = rowIndex - 1 );
177
+ rowsToDelete[ rowIndex ] = row;
178
+ i == cellsCount - 1 && ( nextRowIndex = rowIndex + 1 );
179
+ }
180
+
181
+ var table = row.getAscendant( 'table' ),
182
+ rows = table.$.rows,
183
+ rowCount = rows.length;
184
+
185
+ // Where to put the cursor after rows been deleted?
186
+ // 1. Into next sibling row if any;
187
+ // 2. Into previous sibling row if any;
188
+ // 3. Into table's parent element if it's the very last row.
189
+ cursorPosition = new CKEDITOR.dom.element(
190
+ nextRowIndex < rowCount && table.$.rows[ nextRowIndex ] ||
191
+ previousRowIndex > 0 && table.$.rows[ previousRowIndex ] ||
192
+ table.$.parentNode );
193
+
194
+ for ( i = rowsToDelete.length ; i >= 0 ; i-- )
195
+ {
196
+ if ( rowsToDelete[ i ] )
197
+ deleteRows( rowsToDelete[ i ] );
198
+ }
199
+
200
+ return cursorPosition;
201
+ }
202
+ else if ( selectionOrRow instanceof CKEDITOR.dom.element )
203
+ {
204
+ table = selectionOrRow.getAscendant( 'table' );
205
+
206
+ if ( table.$.rows.length == 1 )
207
+ table.remove();
208
+ else
209
+ selectionOrRow.remove();
210
+ }
211
+
212
+ return 0;
213
+ }
214
+
215
+ function insertColumn( selection, insertBefore )
216
+ {
217
+ // Get the cell where the selection is placed in.
218
+ var startElement = selection.getStartElement();
219
+ var cell = startElement.getAscendant( 'td', 1 ) || startElement.getAscendant( 'th', 1 );
220
+
221
+ if ( !cell )
222
+ return;
223
+
224
+ // Get the cell's table.
225
+ var table = cell.getAscendant( 'table' );
226
+ var cellIndex = cell.$.cellIndex;
227
+
228
+ // Loop through all rows available in the table.
229
+ for ( var i = 0 ; i < table.$.rows.length ; i++ )
230
+ {
231
+ var $row = table.$.rows[ i ];
232
+
233
+ // If the row doesn't have enough cells, ignore it.
234
+ if ( $row.cells.length < ( cellIndex + 1 ) )
235
+ continue;
236
+
237
+ cell = ( new CKEDITOR.dom.element( $row.cells[ cellIndex ] ) ).clone( 0 );
238
+
239
+ if ( !CKEDITOR.env.ie )
240
+ cell.appendBogus();
241
+
242
+ // Get back the currently selected cell.
243
+ var baseCell = new CKEDITOR.dom.element( $row.cells[ cellIndex ] );
244
+ if ( insertBefore )
245
+ cell.insertBefore( baseCell );
246
+ else
247
+ cell.insertAfter( baseCell );
248
+ }
249
+ }
250
+
251
+ function getFocusElementAfterDelCols( cells )
252
+ {
253
+ var cellIndexList = [],
254
+ table = cells[ 0 ] && cells[ 0 ].getAscendant( 'table' ),
255
+ i, length,
256
+ targetIndex, targetCell;
257
+
258
+ // get the cellIndex list of delete cells
259
+ for ( i = 0, length = cells.length; i < length; i++ )
260
+ cellIndexList.push( cells[i].$.cellIndex );
261
+
262
+ // get the focusable column index
263
+ cellIndexList.sort();
264
+ for ( i = 1, length = cellIndexList.length; i < length; i++ )
265
+ {
266
+ if ( cellIndexList[ i ] - cellIndexList[ i - 1 ] > 1 )
267
+ {
268
+ targetIndex = cellIndexList[ i - 1 ] + 1;
269
+ break;
270
+ }
271
+ }
272
+
273
+ if ( !targetIndex )
274
+ targetIndex = cellIndexList[ 0 ] > 0 ? ( cellIndexList[ 0 ] - 1 )
275
+ : ( cellIndexList[ cellIndexList.length - 1 ] + 1 );
276
+
277
+ // scan row by row to get the target cell
278
+ var rows = table.$.rows;
279
+ for ( i = 0, length = rows.length; i < length ; i++ )
280
+ {
281
+ targetCell = rows[ i ].cells[ targetIndex ];
282
+ if ( targetCell )
283
+ break;
284
+ }
285
+
286
+ return targetCell ? new CKEDITOR.dom.element( targetCell ) : table.getPrevious();
287
+ }
288
+
289
+ function deleteColumns( selectionOrCell )
290
+ {
291
+ if ( selectionOrCell instanceof CKEDITOR.dom.selection )
292
+ {
293
+ var colsToDelete = getSelectedCells( selectionOrCell ),
294
+ elementToFocus = getFocusElementAfterDelCols( colsToDelete );
295
+
296
+ for ( var i = colsToDelete.length - 1 ; i >= 0 ; i-- )
297
+ {
298
+ if ( colsToDelete[ i ] )
299
+ deleteColumns( colsToDelete[ i ] );
300
+ }
301
+
302
+ return elementToFocus;
303
+ }
304
+ else if ( selectionOrCell instanceof CKEDITOR.dom.element )
305
+ {
306
+ // Get the cell's table.
307
+ var table = selectionOrCell.getAscendant( 'table' );
308
+ if ( !table )
309
+ return null;
310
+
311
+ // Get the cell index.
312
+ var cellIndex = selectionOrCell.$.cellIndex;
313
+
314
+ /*
315
+ * Loop through all rows from down to up, coz it's possible that some rows
316
+ * will be deleted.
317
+ */
318
+ for ( i = table.$.rows.length - 1 ; i >= 0 ; i-- )
319
+ {
320
+ // Get the row.
321
+ var row = new CKEDITOR.dom.element( table.$.rows[ i ] );
322
+
323
+ // If the cell to be removed is the first one and the row has just one cell.
324
+ if ( !cellIndex && row.$.cells.length == 1 )
325
+ {
326
+ deleteRows( row );
327
+ continue;
328
+ }
329
+
330
+ // Else, just delete the cell.
331
+ if ( row.$.cells[ cellIndex ] )
332
+ row.$.removeChild( row.$.cells[ cellIndex ] );
333
+ }
334
+ }
335
+
336
+ return null;
337
+ }
338
+
339
+ function insertCell( selection, insertBefore )
340
+ {
341
+ var startElement = selection.getStartElement();
342
+ var cell = startElement.getAscendant( 'td', 1 ) || startElement.getAscendant( 'th', 1 );
343
+
344
+ if ( !cell )
345
+ return;
346
+
347
+ // Create the new cell element to be added.
348
+ var newCell = cell.clone();
349
+ if ( !CKEDITOR.env.ie )
350
+ newCell.appendBogus();
351
+
352
+ if ( insertBefore )
353
+ newCell.insertBefore( cell );
354
+ else
355
+ newCell.insertAfter( cell );
356
+ }
357
+
358
+ function deleteCells( selectionOrCell )
359
+ {
360
+ if ( selectionOrCell instanceof CKEDITOR.dom.selection )
361
+ {
362
+ var cellsToDelete = getSelectedCells( selectionOrCell );
363
+ var table = cellsToDelete[ 0 ] && cellsToDelete[ 0 ].getAscendant( 'table' );
364
+ var cellToFocus = getFocusElementAfterDelCells( cellsToDelete );
365
+
366
+ for ( var i = cellsToDelete.length - 1 ; i >= 0 ; i-- )
367
+ deleteCells( cellsToDelete[ i ] );
368
+
369
+ if ( cellToFocus )
370
+ placeCursorInCell( cellToFocus, true );
371
+ else if ( table )
372
+ table.remove();
373
+ }
374
+ else if ( selectionOrCell instanceof CKEDITOR.dom.element )
375
+ {
376
+ var tr = selectionOrCell.getParent();
377
+ if ( tr.getChildCount() == 1 )
378
+ tr.remove();
379
+ else
380
+ selectionOrCell.remove();
381
+ }
382
+ }
383
+
384
+ // Remove filler at end and empty spaces around the cell content.
385
+ function trimCell( cell )
386
+ {
387
+ var bogus = cell.getBogus();
388
+ bogus && bogus.remove();
389
+ cell.trim();
390
+ }
391
+
392
+ function placeCursorInCell( cell, placeAtEnd )
393
+ {
394
+ var range = new CKEDITOR.dom.range( cell.getDocument() );
395
+ if ( !range[ 'moveToElementEdit' + ( placeAtEnd ? 'End' : 'Start' ) ]( cell ) )
396
+ {
397
+ range.selectNodeContents( cell );
398
+ range.collapse( placeAtEnd ? false : true );
399
+ }
400
+ range.select( true );
401
+ }
402
+
403
+ function cellInRow( tableMap, rowIndex, cell )
404
+ {
405
+ var oRow = tableMap[ rowIndex ];
406
+ if ( typeof cell == 'undefined' )
407
+ return oRow;
408
+
409
+ for ( var c = 0 ; oRow && c < oRow.length ; c++ )
410
+ {
411
+ if ( cell.is && oRow[c] == cell.$ )
412
+ return c;
413
+ else if ( c == cell )
414
+ return new CKEDITOR.dom.element( oRow[ c ] );
415
+ }
416
+ return cell.is ? -1 : null;
417
+ }
418
+
419
+ function cellInCol( tableMap, colIndex, cell )
420
+ {
421
+ var oCol = [];
422
+ for ( var r = 0; r < tableMap.length; r++ )
423
+ {
424
+ var row = tableMap[ r ];
425
+ if ( typeof cell == 'undefined' )
426
+ oCol.push( row[ colIndex ] );
427
+ else if ( cell.is && row[ colIndex ] == cell.$ )
428
+ return r;
429
+ else if ( r == cell )
430
+ return new CKEDITOR.dom.element( row[ colIndex ] );
431
+ }
432
+
433
+ return ( typeof cell == 'undefined' )? oCol : cell.is ? -1 : null;
434
+ }
435
+
436
+ function mergeCells( selection, mergeDirection, isDetect )
437
+ {
438
+ var cells = getSelectedCells( selection );
439
+
440
+ // Invalid merge request if:
441
+ // 1. In batch mode despite that less than two selected.
442
+ // 2. In solo mode while not exactly only one selected.
443
+ // 3. Cells distributed in different table groups (e.g. from both thead and tbody).
444
+ var commonAncestor;
445
+ if ( ( mergeDirection ? cells.length != 1 : cells.length < 2 )
446
+ || ( commonAncestor = selection.getCommonAncestor() )
447
+ && commonAncestor.type == CKEDITOR.NODE_ELEMENT
448
+ && commonAncestor.is( 'table' ) )
449
+ {
450
+ return false;
451
+ }
452
+
453
+ var cell,
454
+ firstCell = cells[ 0 ],
455
+ table = firstCell.getAscendant( 'table' ),
456
+ map = CKEDITOR.tools.buildTableMap( table ),
457
+ mapHeight = map.length,
458
+ mapWidth = map[ 0 ].length,
459
+ startRow = firstCell.getParent().$.rowIndex,
460
+ startColumn = cellInRow( map, startRow, firstCell );
461
+
462
+ if ( mergeDirection )
463
+ {
464
+ var targetCell;
465
+ try
466
+ {
467
+ targetCell =
468
+ map[ mergeDirection == 'up' ?
469
+ ( startRow - 1 ):
470
+ mergeDirection == 'down' ? ( startRow + 1 ) : startRow ] [
471
+ mergeDirection == 'left' ?
472
+ ( startColumn - 1 ):
473
+ mergeDirection == 'right' ? ( startColumn + 1 ) : startColumn ];
474
+
475
+ }
476
+ catch( er )
477
+ {
478
+ return false;
479
+ }
480
+
481
+ // 1. No cell could be merged.
482
+ // 2. Same cell actually.
483
+ if ( !targetCell || firstCell.$ == targetCell )
484
+ return false;
485
+
486
+ // Sort in map order regardless of the DOM sequence.
487
+ cells[ ( mergeDirection == 'up' || mergeDirection == 'left' ) ?
488
+ 'unshift' : 'push' ]( new CKEDITOR.dom.element( targetCell ) );
489
+ }
490
+
491
+ // Start from here are merging way ignorance (merge up/right, batch merge).
492
+ var doc = firstCell.getDocument(),
493
+ lastRowIndex = startRow,
494
+ totalRowSpan = 0,
495
+ totalColSpan = 0,
496
+ // Use a documentFragment as buffer when appending cell contents.
497
+ frag = !isDetect && new CKEDITOR.dom.documentFragment( doc ),
498
+ dimension = 0;
499
+
500
+ for ( var i = 0; i < cells.length; i++ )
501
+ {
502
+ cell = cells[ i ];
503
+
504
+ var tr = cell.getParent(),
505
+ cellFirstChild = cell.getFirst(),
506
+ colSpan = cell.$.colSpan,
507
+ rowSpan = cell.$.rowSpan,
508
+ rowIndex = tr.$.rowIndex,
509
+ colIndex = cellInRow( map, rowIndex, cell );
510
+
511
+ // Accumulated the actual places taken by all selected cells.
512
+ dimension += colSpan * rowSpan;
513
+ // Accumulated the maximum virtual spans from column and row.
514
+ totalColSpan = Math.max( totalColSpan, colIndex - startColumn + colSpan ) ;
515
+ totalRowSpan = Math.max( totalRowSpan, rowIndex - startRow + rowSpan );
516
+
517
+ if ( !isDetect )
518
+ {
519
+ // Trim all cell fillers and check to remove empty cells.
520
+ if ( trimCell( cell ), cell.getChildren().count() )
521
+ {
522
+ // Merge vertically cells as two separated paragraphs.
523
+ if ( rowIndex != lastRowIndex
524
+ && cellFirstChild
525
+ && !( cellFirstChild.isBlockBoundary
526
+ && cellFirstChild.isBlockBoundary( { br : 1 } ) ) )
527
+ {
528
+ var last = frag.getLast( CKEDITOR.dom.walker.whitespaces( true ) );
529
+ if ( last && !( last.is && last.is( 'br' ) ) )
530
+ frag.append( new CKEDITOR.dom.element( 'br' ) );
531
+ }
532
+
533
+ cell.moveChildren( frag );
534
+ }
535
+ i ? cell.remove() : cell.setHtml( '' );
536
+ }
537
+ lastRowIndex = rowIndex;
538
+ }
539
+
540
+ if ( !isDetect )
541
+ {
542
+ frag.moveChildren( firstCell );
543
+
544
+ if ( !CKEDITOR.env.ie )
545
+ firstCell.appendBogus();
546
+
547
+ if ( totalColSpan >= mapWidth )
548
+ firstCell.removeAttribute( 'rowSpan' );
549
+ else
550
+ firstCell.$.rowSpan = totalRowSpan;
551
+
552
+ if ( totalRowSpan >= mapHeight )
553
+ firstCell.removeAttribute( 'colSpan' );
554
+ else
555
+ firstCell.$.colSpan = totalColSpan;
556
+
557
+ // Swip empty <tr> left at the end of table due to the merging.
558
+ var trs = new CKEDITOR.dom.nodeList( table.$.rows ),
559
+ count = trs.count();
560
+
561
+ for ( i = count - 1; i >= 0; i-- )
562
+ {
563
+ var tailTr = trs.getItem( i );
564
+ if ( !tailTr.$.cells.length )
565
+ {
566
+ tailTr.remove();
567
+ count++;
568
+ continue;
569
+ }
570
+ }
571
+
572
+ return firstCell;
573
+ }
574
+ // Be able to merge cells only if actual dimension of selected
575
+ // cells equals to the caculated rectangle.
576
+ else
577
+ return ( totalRowSpan * totalColSpan ) == dimension;
578
+ }
579
+
580
+ function verticalSplitCell ( selection, isDetect )
581
+ {
582
+ var cells = getSelectedCells( selection );
583
+ if ( cells.length > 1 )
584
+ return false;
585
+ else if ( isDetect )
586
+ return true;
587
+
588
+ var cell = cells[ 0 ],
589
+ tr = cell.getParent(),
590
+ table = tr.getAscendant( 'table' ),
591
+ map = CKEDITOR.tools.buildTableMap( table ),
592
+ rowIndex = tr.$.rowIndex,
593
+ colIndex = cellInRow( map, rowIndex, cell ),
594
+ rowSpan = cell.$.rowSpan,
595
+ newCell,
596
+ newRowSpan,
597
+ newCellRowSpan,
598
+ newRowIndex;
599
+
600
+ if ( rowSpan > 1 )
601
+ {
602
+ newRowSpan = Math.ceil( rowSpan / 2 );
603
+ newCellRowSpan = Math.floor( rowSpan / 2 );
604
+ newRowIndex = rowIndex + newRowSpan;
605
+ var newCellTr = new CKEDITOR.dom.element( table.$.rows[ newRowIndex ] ),
606
+ newCellRow = cellInRow( map, newRowIndex ),
607
+ candidateCell;
608
+
609
+ newCell = cell.clone();
610
+
611
+ // Figure out where to insert the new cell by checking the vitual row.
612
+ for ( var c = 0; c < newCellRow.length; c++ )
613
+ {
614
+ candidateCell = newCellRow[ c ];
615
+ // Catch first cell actually following the column.
616
+ if ( candidateCell.parentNode == newCellTr.$
617
+ && c > colIndex )
618
+ {
619
+ newCell.insertBefore( new CKEDITOR.dom.element( candidateCell ) );
620
+ break;
621
+ }
622
+ else
623
+ candidateCell = null;
624
+ }
625
+
626
+ // The destination row is empty, append at will.
627
+ if ( !candidateCell )
628
+ newCellTr.append( newCell, true );
629
+ }
630
+ else
631
+ {
632
+ newCellRowSpan = newRowSpan = 1;
633
+
634
+ newCellTr = tr.clone();
635
+ newCellTr.insertAfter( tr );
636
+ newCellTr.append( newCell = cell.clone() );
637
+
638
+ var cellsInSameRow = cellInRow( map, rowIndex );
639
+ for ( var i = 0; i < cellsInSameRow.length; i++ )
640
+ cellsInSameRow[ i ].rowSpan++;
641
+ }
642
+
643
+ if ( !CKEDITOR.env.ie )
644
+ newCell.appendBogus();
645
+
646
+ cell.$.rowSpan = newRowSpan;
647
+ newCell.$.rowSpan = newCellRowSpan;
648
+ if ( newRowSpan == 1 )
649
+ cell.removeAttribute( 'rowSpan' );
650
+ if ( newCellRowSpan == 1 )
651
+ newCell.removeAttribute( 'rowSpan' );
652
+
653
+ return newCell;
654
+ }
655
+
656
+ function horizontalSplitCell( selection, isDetect )
657
+ {
658
+ var cells = getSelectedCells( selection );
659
+ if ( cells.length > 1 )
660
+ return false;
661
+ else if ( isDetect )
662
+ return true;
663
+
664
+ var cell = cells[ 0 ],
665
+ tr = cell.getParent(),
666
+ table = tr.getAscendant( 'table' ),
667
+ map = CKEDITOR.tools.buildTableMap( table ),
668
+ rowIndex = tr.$.rowIndex,
669
+ colIndex = cellInRow( map, rowIndex, cell ),
670
+ colSpan = cell.$.colSpan,
671
+ newCell,
672
+ newColSpan,
673
+ newCellColSpan;
674
+
675
+ if ( colSpan > 1 )
676
+ {
677
+ newColSpan = Math.ceil( colSpan / 2 );
678
+ newCellColSpan = Math.floor( colSpan / 2 );
679
+ }
680
+ else
681
+ {
682
+ newCellColSpan = newColSpan = 1;
683
+ var cellsInSameCol = cellInCol( map, colIndex );
684
+ for ( var i = 0; i < cellsInSameCol.length; i++ )
685
+ cellsInSameCol[ i ].colSpan++;
686
+ }
687
+ newCell = cell.clone();
688
+ newCell.insertAfter( cell );
689
+ if ( !CKEDITOR.env.ie )
690
+ newCell.appendBogus();
691
+
692
+ cell.$.colSpan = newColSpan;
693
+ newCell.$.colSpan = newCellColSpan;
694
+ if ( newColSpan == 1 )
695
+ cell.removeAttribute( 'colSpan' );
696
+ if ( newCellColSpan == 1 )
697
+ newCell.removeAttribute( 'colSpan' );
698
+
699
+ return newCell;
700
+ }
701
+ // Context menu on table caption incorrect (#3834)
702
+ var contextMenuTags = { thead : 1, tbody : 1, tfoot : 1, td : 1, tr : 1, th : 1 };
703
+
704
+ CKEDITOR.plugins.tabletools =
705
+ {
706
+ init : function( editor )
707
+ {
708
+ var lang = editor.lang.table;
709
+
710
+ editor.addCommand( 'cellProperties', new CKEDITOR.dialogCommand( 'cellProperties' ) );
711
+ CKEDITOR.dialog.add( 'cellProperties', this.path + 'dialogs/tableCell.js' );
712
+
713
+ editor.addCommand( 'tableDelete',
714
+ {
715
+ exec : function( editor )
716
+ {
717
+ var selection = editor.getSelection(),
718
+ startElement = selection && selection.getStartElement(),
719
+ table = startElement && startElement.getAscendant( 'table', 1 );
720
+
721
+ if ( !table )
722
+ return;
723
+
724
+ // Maintain the selection point at where the table was deleted.
725
+ selection.selectElement( table );
726
+ var range = selection.getRanges()[0];
727
+ range.collapse();
728
+ selection.selectRanges( [ range ] );
729
+
730
+ // If the table's parent has only one child remove it as well (unless it's the body or a table cell) (#5416, #6289)
731
+ var parent = table.getParent();
732
+ if ( parent.getChildCount() == 1 && !parent.is( 'body', 'td', 'th' ) )
733
+ parent.remove();
734
+ else
735
+ table.remove();
736
+ }
737
+ } );
738
+
739
+ editor.addCommand( 'rowDelete',
740
+ {
741
+ exec : function( editor )
742
+ {
743
+ var selection = editor.getSelection();
744
+ placeCursorInCell( deleteRows( selection ) );
745
+ }
746
+ } );
747
+
748
+ editor.addCommand( 'rowInsertBefore',
749
+ {
750
+ exec : function( editor )
751
+ {
752
+ var selection = editor.getSelection();
753
+ insertRow( selection, true );
754
+ }
755
+ } );
756
+
757
+ editor.addCommand( 'rowInsertAfter',
758
+ {
759
+ exec : function( editor )
760
+ {
761
+ var selection = editor.getSelection();
762
+ insertRow( selection );
763
+ }
764
+ } );
765
+
766
+ editor.addCommand( 'columnDelete',
767
+ {
768
+ exec : function( editor )
769
+ {
770
+ var selection = editor.getSelection();
771
+ var element = deleteColumns( selection );
772
+ element && placeCursorInCell( element, true );
773
+ }
774
+ } );
775
+
776
+ editor.addCommand( 'columnInsertBefore',
777
+ {
778
+ exec : function( editor )
779
+ {
780
+ var selection = editor.getSelection();
781
+ insertColumn( selection, true );
782
+ }
783
+ } );
784
+
785
+ editor.addCommand( 'columnInsertAfter',
786
+ {
787
+ exec : function( editor )
788
+ {
789
+ var selection = editor.getSelection();
790
+ insertColumn( selection );
791
+ }
792
+ } );
793
+
794
+ editor.addCommand( 'cellDelete',
795
+ {
796
+ exec : function( editor )
797
+ {
798
+ var selection = editor.getSelection();
799
+ deleteCells( selection );
800
+ }
801
+ } );
802
+
803
+ editor.addCommand( 'cellMerge',
804
+ {
805
+ exec : function( editor )
806
+ {
807
+ placeCursorInCell( mergeCells( editor.getSelection() ), true );
808
+ }
809
+ } );
810
+
811
+ editor.addCommand( 'cellMergeRight',
812
+ {
813
+ exec : function( editor )
814
+ {
815
+ placeCursorInCell( mergeCells( editor.getSelection(), 'right' ), true );
816
+ }
817
+ } );
818
+
819
+ editor.addCommand( 'cellMergeDown',
820
+ {
821
+ exec : function( editor )
822
+ {
823
+ placeCursorInCell( mergeCells( editor.getSelection(), 'down' ), true );
824
+ }
825
+ } );
826
+
827
+ editor.addCommand( 'cellVerticalSplit',
828
+ {
829
+ exec : function( editor )
830
+ {
831
+ placeCursorInCell( verticalSplitCell( editor.getSelection() ) );
832
+ }
833
+ } );
834
+
835
+ editor.addCommand( 'cellHorizontalSplit',
836
+ {
837
+ exec : function( editor )
838
+ {
839
+ placeCursorInCell( horizontalSplitCell( editor.getSelection() ) );
840
+ }
841
+ } );
842
+
843
+ editor.addCommand( 'cellInsertBefore',
844
+ {
845
+ exec : function( editor )
846
+ {
847
+ var selection = editor.getSelection();
848
+ insertCell( selection, true );
849
+ }
850
+ } );
851
+
852
+ editor.addCommand( 'cellInsertAfter',
853
+ {
854
+ exec : function( editor )
855
+ {
856
+ var selection = editor.getSelection();
857
+ insertCell( selection );
858
+ }
859
+ } );
860
+
861
+ // If the "menu" plugin is loaded, register the menu items.
862
+ if ( editor.addMenuItems )
863
+ {
864
+ editor.addMenuItems(
865
+ {
866
+ tablecell :
867
+ {
868
+ label : lang.cell.menu,
869
+ group : 'tablecell',
870
+ order : 1,
871
+ getItems : function()
872
+ {
873
+ var selection = editor.getSelection(),
874
+ cells = getSelectedCells( selection );
875
+ return {
876
+ tablecell_insertBefore : CKEDITOR.TRISTATE_OFF,
877
+ tablecell_insertAfter : CKEDITOR.TRISTATE_OFF,
878
+ tablecell_delete : CKEDITOR.TRISTATE_OFF,
879
+ tablecell_merge : mergeCells( selection, null, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
880
+ tablecell_merge_right : mergeCells( selection, 'right', true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
881
+ tablecell_merge_down : mergeCells( selection, 'down', true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
882
+ tablecell_split_vertical : verticalSplitCell( selection, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
883
+ tablecell_split_horizontal : horizontalSplitCell( selection, true ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
884
+ tablecell_properties : cells.length > 0 ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
885
+ };
886
+ }
887
+ },
888
+
889
+ tablecell_insertBefore :
890
+ {
891
+ label : lang.cell.insertBefore,
892
+ group : 'tablecell',
893
+ command : 'cellInsertBefore',
894
+ order : 5
895
+ },
896
+
897
+ tablecell_insertAfter :
898
+ {
899
+ label : lang.cell.insertAfter,
900
+ group : 'tablecell',
901
+ command : 'cellInsertAfter',
902
+ order : 10
903
+ },
904
+
905
+ tablecell_delete :
906
+ {
907
+ label : lang.cell.deleteCell,
908
+ group : 'tablecell',
909
+ command : 'cellDelete',
910
+ order : 15
911
+ },
912
+
913
+ tablecell_merge :
914
+ {
915
+ label : lang.cell.merge,
916
+ group : 'tablecell',
917
+ command : 'cellMerge',
918
+ order : 16
919
+ },
920
+
921
+ tablecell_merge_right :
922
+ {
923
+ label : lang.cell.mergeRight,
924
+ group : 'tablecell',
925
+ command : 'cellMergeRight',
926
+ order : 17
927
+ },
928
+
929
+ tablecell_merge_down :
930
+ {
931
+ label : lang.cell.mergeDown,
932
+ group : 'tablecell',
933
+ command : 'cellMergeDown',
934
+ order : 18
935
+ },
936
+
937
+ tablecell_split_horizontal :
938
+ {
939
+ label : lang.cell.splitHorizontal,
940
+ group : 'tablecell',
941
+ command : 'cellHorizontalSplit',
942
+ order : 19
943
+ },
944
+
945
+ tablecell_split_vertical :
946
+ {
947
+ label : lang.cell.splitVertical,
948
+ group : 'tablecell',
949
+ command : 'cellVerticalSplit',
950
+ order : 20
951
+ },
952
+
953
+ tablecell_properties :
954
+ {
955
+ label : lang.cell.title,
956
+ group : 'tablecellproperties',
957
+ command : 'cellProperties',
958
+ order : 21
959
+ },
960
+
961
+ tablerow :
962
+ {
963
+ label : lang.row.menu,
964
+ group : 'tablerow',
965
+ order : 1,
966
+ getItems : function()
967
+ {
968
+ return {
969
+ tablerow_insertBefore : CKEDITOR.TRISTATE_OFF,
970
+ tablerow_insertAfter : CKEDITOR.TRISTATE_OFF,
971
+ tablerow_delete : CKEDITOR.TRISTATE_OFF
972
+ };
973
+ }
974
+ },
975
+
976
+ tablerow_insertBefore :
977
+ {
978
+ label : lang.row.insertBefore,
979
+ group : 'tablerow',
980
+ command : 'rowInsertBefore',
981
+ order : 5
982
+ },
983
+
984
+ tablerow_insertAfter :
985
+ {
986
+ label : lang.row.insertAfter,
987
+ group : 'tablerow',
988
+ command : 'rowInsertAfter',
989
+ order : 10
990
+ },
991
+
992
+ tablerow_delete :
993
+ {
994
+ label : lang.row.deleteRow,
995
+ group : 'tablerow',
996
+ command : 'rowDelete',
997
+ order : 15
998
+ },
999
+
1000
+ tablecolumn :
1001
+ {
1002
+ label : lang.column.menu,
1003
+ group : 'tablecolumn',
1004
+ order : 1,
1005
+ getItems : function()
1006
+ {
1007
+ return {
1008
+ tablecolumn_insertBefore : CKEDITOR.TRISTATE_OFF,
1009
+ tablecolumn_insertAfter : CKEDITOR.TRISTATE_OFF,
1010
+ tablecolumn_delete : CKEDITOR.TRISTATE_OFF
1011
+ };
1012
+ }
1013
+ },
1014
+
1015
+ tablecolumn_insertBefore :
1016
+ {
1017
+ label : lang.column.insertBefore,
1018
+ group : 'tablecolumn',
1019
+ command : 'columnInsertBefore',
1020
+ order : 5
1021
+ },
1022
+
1023
+ tablecolumn_insertAfter :
1024
+ {
1025
+ label : lang.column.insertAfter,
1026
+ group : 'tablecolumn',
1027
+ command : 'columnInsertAfter',
1028
+ order : 10
1029
+ },
1030
+
1031
+ tablecolumn_delete :
1032
+ {
1033
+ label : lang.column.deleteColumn,
1034
+ group : 'tablecolumn',
1035
+ command : 'columnDelete',
1036
+ order : 15
1037
+ }
1038
+ });
1039
+ }
1040
+
1041
+ // If the "contextmenu" plugin is laoded, register the listeners.
1042
+ if ( editor.contextMenu )
1043
+ {
1044
+ editor.contextMenu.addListener( function( element, selection )
1045
+ {
1046
+ if ( !element || element.isReadOnly() )
1047
+ return null;
1048
+
1049
+ while ( element )
1050
+ {
1051
+ if ( element.getName() in contextMenuTags )
1052
+ {
1053
+ return {
1054
+ tablecell : CKEDITOR.TRISTATE_OFF,
1055
+ tablerow : CKEDITOR.TRISTATE_OFF,
1056
+ tablecolumn : CKEDITOR.TRISTATE_OFF
1057
+ };
1058
+ }
1059
+ element = element.getParent();
1060
+ }
1061
+
1062
+ return null;
1063
+ } );
1064
+ }
1065
+ },
1066
+
1067
+ getSelectedCells : getSelectedCells
1068
+
1069
+ };
1070
+ CKEDITOR.plugins.add( 'tabletools', CKEDITOR.plugins.tabletools );
1071
+ })();
1072
+
1073
+ /**
1074
+ * Create a two-dimension array that reflects the actual layout of table cells,
1075
+ * with cell spans, with mappings to the original td elements.
1076
+ * @param table {CKEDITOR.dom.element}
1077
+ */
1078
+ CKEDITOR.tools.buildTableMap = function ( table )
1079
+ {
1080
+ var aRows = table.$.rows ;
1081
+
1082
+ // Row and Column counters.
1083
+ var r = -1 ;
1084
+
1085
+ var aMap = [];
1086
+
1087
+ for ( var i = 0 ; i < aRows.length ; i++ )
1088
+ {
1089
+ r++ ;
1090
+ !aMap[r] && ( aMap[r] = [] );
1091
+
1092
+ var c = -1 ;
1093
+
1094
+ for ( var j = 0 ; j < aRows[i].cells.length ; j++ )
1095
+ {
1096
+ var oCell = aRows[i].cells[j] ;
1097
+
1098
+ c++ ;
1099
+ while ( aMap[r][c] )
1100
+ c++ ;
1101
+
1102
+ var iColSpan = isNaN( oCell.colSpan ) ? 1 : oCell.colSpan ;
1103
+ var iRowSpan = isNaN( oCell.rowSpan ) ? 1 : oCell.rowSpan ;
1104
+
1105
+ for ( var rs = 0 ; rs < iRowSpan ; rs++ )
1106
+ {
1107
+ if ( !aMap[r + rs] )
1108
+ aMap[r + rs] = [];
1109
+
1110
+ for ( var cs = 0 ; cs < iColSpan ; cs++ )
1111
+ {
1112
+ aMap[r + rs][c + cs] = aRows[i].cells[j] ;
1113
+ }
1114
+ }
1115
+
1116
+ c += iColSpan - 1 ;
1117
+ }
1118
+ }
1119
+ return aMap ;
1120
+ };