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,1424 @@
1
+ /*
2
+ Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
3
+ For licensing, see LICENSE.html or http://ckeditor.com/license
4
+ */
5
+
6
+ CKEDITOR.dialog.add( 'link', function( editor )
7
+ {
8
+ var plugin = CKEDITOR.plugins.link;
9
+ // Handles the event when the "Target" selection box is changed.
10
+ var targetChanged = function()
11
+ {
12
+ var dialog = this.getDialog(),
13
+ popupFeatures = dialog.getContentElement( 'target', 'popupFeatures' ),
14
+ targetName = dialog.getContentElement( 'target', 'linkTargetName' ),
15
+ value = this.getValue();
16
+
17
+ if ( !popupFeatures || !targetName )
18
+ return;
19
+
20
+ popupFeatures = popupFeatures.getElement();
21
+ popupFeatures.hide();
22
+ targetName.setValue( '' );
23
+
24
+ switch ( value )
25
+ {
26
+ case 'frame' :
27
+ targetName.setLabel( editor.lang.link.targetFrameName );
28
+ targetName.getElement().show();
29
+ break;
30
+ case 'popup' :
31
+ popupFeatures.show();
32
+ targetName.setLabel( editor.lang.link.targetPopupName );
33
+ targetName.getElement().show();
34
+ break;
35
+ default :
36
+ targetName.setValue( value );
37
+ targetName.getElement().hide();
38
+ break;
39
+ }
40
+
41
+ };
42
+
43
+ // Handles the event when the "Type" selection box is changed.
44
+ var linkTypeChanged = function()
45
+ {
46
+ var dialog = this.getDialog(),
47
+ partIds = [ 'urlOptions', 'anchorOptions', 'emailOptions' ],
48
+ typeValue = this.getValue(),
49
+ uploadTab = dialog.definition.getContents( 'upload' ),
50
+ uploadInitiallyHidden = uploadTab && uploadTab.hidden;
51
+
52
+ if ( typeValue == 'url' )
53
+ {
54
+ if ( editor.config.linkShowTargetTab )
55
+ dialog.showPage( 'target' );
56
+ if ( !uploadInitiallyHidden )
57
+ dialog.showPage( 'upload' );
58
+ }
59
+ else
60
+ {
61
+ dialog.hidePage( 'target' );
62
+ if ( !uploadInitiallyHidden )
63
+ dialog.hidePage( 'upload' );
64
+ }
65
+
66
+ for ( var i = 0 ; i < partIds.length ; i++ )
67
+ {
68
+ var element = dialog.getContentElement( 'info', partIds[i] );
69
+ if ( !element )
70
+ continue;
71
+
72
+ element = element.getElement().getParent().getParent();
73
+ if ( partIds[i] == typeValue + 'Options' )
74
+ element.show();
75
+ else
76
+ element.hide();
77
+ }
78
+ };
79
+
80
+ // Loads the parameters in a selected link to the link dialog fields.
81
+ var javascriptProtocolRegex = /^javascript:/,
82
+ emailRegex = /^mailto:([^?]+)(?:\?(.+))?$/,
83
+ emailSubjectRegex = /subject=([^;?:@&=$,\/]*)/,
84
+ emailBodyRegex = /body=([^;?:@&=$,\/]*)/,
85
+ anchorRegex = /^#(.*)$/,
86
+ urlRegex = /^((?:http|https|ftp|news):\/\/)?(.*)$/,
87
+ selectableTargets = /^(_(?:self|top|parent|blank))$/,
88
+ encodedEmailLinkRegex = /^javascript:void\(location\.href='mailto:'\+String\.fromCharCode\(([^)]+)\)(?:\+'(.*)')?\)$/,
89
+ functionCallProtectedEmailLinkRegex = /^javascript:([^(]+)\(([^)]+)\)$/;
90
+
91
+ var popupRegex =
92
+ /\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*/;
93
+ var popupFeaturesRegex = /(?:^|,)([^=]+)=(\d+|yes|no)/gi;
94
+
95
+ var parseLink = function( editor, element )
96
+ {
97
+ var href = ( element && ( element.getAttribute( '_cke_saved_href' ) || element.getAttribute( 'href' ) ) ) || '',
98
+ javascriptMatch,
99
+ emailMatch,
100
+ anchorMatch,
101
+ urlMatch,
102
+ retval = {};
103
+
104
+ if ( ( javascriptMatch = href.match( javascriptProtocolRegex ) ) )
105
+ {
106
+ if ( emailProtection == 'encode' )
107
+ {
108
+ href = href.replace( encodedEmailLinkRegex,
109
+ function ( match, protectedAddress, rest )
110
+ {
111
+ return 'mailto:' +
112
+ String.fromCharCode.apply( String, protectedAddress.split( ',' ) ) +
113
+ ( rest && unescapeSingleQuote( rest ) );
114
+ });
115
+ }
116
+ // Protected email link as function call.
117
+ else if ( emailProtection )
118
+ {
119
+ href.replace( functionCallProtectedEmailLinkRegex, function( match, funcName, funcArgs )
120
+ {
121
+ if ( funcName == compiledProtectionFunction.name )
122
+ {
123
+ retval.type = 'email';
124
+ var email = retval.email = {};
125
+
126
+ var paramRegex = /[^,\s]+/g,
127
+ paramQuoteRegex = /(^')|('$)/g,
128
+ paramsMatch = funcArgs.match( paramRegex ),
129
+ paramsMatchLength = paramsMatch.length,
130
+ paramName,
131
+ paramVal;
132
+
133
+ for ( var i = 0; i < paramsMatchLength; i++ )
134
+ {
135
+ paramVal = decodeURIComponent( unescapeSingleQuote( paramsMatch[ i ].replace( paramQuoteRegex, '' ) ) );
136
+ paramName = compiledProtectionFunction.params[ i ].toLowerCase();
137
+ email[ paramName ] = paramVal;
138
+ }
139
+ email.address = [ email.name, email.domain ].join( '@' );
140
+ }
141
+ } );
142
+ }
143
+ }
144
+
145
+ if ( !retval.type )
146
+ {
147
+ if ( ( anchorMatch = href.match( anchorRegex ) ) )
148
+ {
149
+ retval.type = 'anchor';
150
+ retval.anchor = {};
151
+ retval.anchor.name = retval.anchor.id = anchorMatch[1];
152
+ }
153
+ // Protected email link as encoded string.
154
+ else if ( ( emailMatch = href.match( emailRegex ) ) )
155
+ {
156
+ var subjectMatch = href.match( emailSubjectRegex ),
157
+ bodyMatch = href.match( emailBodyRegex );
158
+
159
+ retval.type = 'email';
160
+ var email = ( retval.email = {} );
161
+ email.address = emailMatch[ 1 ];
162
+ subjectMatch && ( email.subject = decodeURIComponent( subjectMatch[ 1 ] ) );
163
+ bodyMatch && ( email.body = decodeURIComponent( bodyMatch[ 1 ] ) );
164
+ }
165
+ // urlRegex matches empty strings, so need to check for href as well.
166
+ else if ( href && ( urlMatch = href.match( urlRegex ) ) )
167
+ {
168
+ retval.type = 'url';
169
+ retval.url = {};
170
+ retval.url.protocol = urlMatch[1];
171
+ retval.url.url = urlMatch[2];
172
+ }
173
+ else
174
+ retval.type = 'url';
175
+ }
176
+
177
+ // Load target and popup settings.
178
+ if ( element )
179
+ {
180
+ var target = element.getAttribute( 'target' );
181
+ retval.target = {};
182
+ retval.adv = {};
183
+
184
+ // IE BUG: target attribute is an empty string instead of null in IE if it's not set.
185
+ if ( !target )
186
+ {
187
+ var onclick = element.getAttribute( '_cke_pa_onclick' ) || element.getAttribute( 'onclick' ),
188
+ onclickMatch = onclick && onclick.match( popupRegex );
189
+ if ( onclickMatch )
190
+ {
191
+ retval.target.type = 'popup';
192
+ retval.target.name = onclickMatch[1];
193
+
194
+ var featureMatch;
195
+ while ( ( featureMatch = popupFeaturesRegex.exec( onclickMatch[2] ) ) )
196
+ {
197
+ if ( featureMatch[2] == 'yes' || featureMatch[2] == '1' )
198
+ retval.target[ featureMatch[1] ] = true;
199
+ else if ( isFinite( featureMatch[2] ) )
200
+ retval.target[ featureMatch[1] ] = featureMatch[2];
201
+ }
202
+ }
203
+ }
204
+ else
205
+ {
206
+ var targetMatch = target.match( selectableTargets );
207
+ if ( targetMatch )
208
+ retval.target.type = retval.target.name = target;
209
+ else
210
+ {
211
+ retval.target.type = 'frame';
212
+ retval.target.name = target;
213
+ }
214
+ }
215
+
216
+ var me = this;
217
+ var advAttr = function( inputName, attrName )
218
+ {
219
+ var value = element.getAttribute( attrName );
220
+ if ( value !== null )
221
+ retval.adv[ inputName ] = value || '';
222
+ };
223
+ advAttr( 'advId', 'id' );
224
+ advAttr( 'advLangDir', 'dir' );
225
+ advAttr( 'advAccessKey', 'accessKey' );
226
+ advAttr( 'advName', 'name' );
227
+ advAttr( 'advLangCode', 'lang' );
228
+ advAttr( 'advTabIndex', 'tabindex' );
229
+ advAttr( 'advTitle', 'title' );
230
+ advAttr( 'advContentType', 'type' );
231
+ advAttr( 'advCSSClasses', 'class' );
232
+ advAttr( 'advCharset', 'charset' );
233
+ advAttr( 'advStyles', 'style' );
234
+ }
235
+
236
+ // Find out whether we have any anchors in the editor.
237
+ // Get all IMG elements in CK document.
238
+ var elements = editor.document.getElementsByTag( 'img' ),
239
+ realAnchors = new CKEDITOR.dom.nodeList( editor.document.$.anchors ),
240
+ anchors = retval.anchors = [];
241
+
242
+ for ( var i = 0; i < elements.count() ; i++ )
243
+ {
244
+ var item = elements.getItem( i );
245
+ if ( item.getAttribute( '_cke_realelement' ) && item.getAttribute( '_cke_real_element_type' ) == 'anchor' )
246
+ anchors.push( editor.restoreRealElement( item ) );
247
+ }
248
+
249
+ for ( i = 0 ; i < realAnchors.count() ; i++ )
250
+ anchors.push( realAnchors.getItem( i ) );
251
+
252
+ for ( i = 0 ; i < anchors.length ; i++ )
253
+ {
254
+ item = anchors[ i ];
255
+ anchors[ i ] = { name : item.getAttribute( 'name' ), id : item.getAttribute( 'id' ) };
256
+ }
257
+
258
+ // Record down the selected element in the dialog.
259
+ this._.selectedElement = element;
260
+
261
+ return retval;
262
+ };
263
+
264
+ var setupParams = function( page, data )
265
+ {
266
+ if ( data[page] )
267
+ this.setValue( data[page][this.id] || '' );
268
+ };
269
+
270
+ var setupPopupParams = function( data )
271
+ {
272
+ return setupParams.call( this, 'target', data );
273
+ };
274
+
275
+ var setupAdvParams = function( data )
276
+ {
277
+ return setupParams.call( this, 'adv', data );
278
+ };
279
+
280
+ var commitParams = function( page, data )
281
+ {
282
+ if ( !data[page] )
283
+ data[page] = {};
284
+
285
+ data[page][this.id] = this.getValue() || '';
286
+ };
287
+
288
+ var commitPopupParams = function( data )
289
+ {
290
+ return commitParams.call( this, 'target', data );
291
+ };
292
+
293
+ var commitAdvParams = function( data )
294
+ {
295
+ return commitParams.call( this, 'adv', data );
296
+ };
297
+
298
+ function unescapeSingleQuote( str )
299
+ {
300
+ return str.replace( /\\'/g, '\'' );
301
+ }
302
+
303
+ function escapeSingleQuote( str )
304
+ {
305
+ return str.replace( /'/g, '\\$&' );
306
+ }
307
+
308
+ var emailProtection = editor.config.emailProtection || '';
309
+
310
+ // Compile the protection function pattern.
311
+ if ( emailProtection && emailProtection != 'encode' )
312
+ {
313
+ var compiledProtectionFunction = {};
314
+
315
+ emailProtection.replace( /^([^(]+)\(([^)]+)\)$/, function( match, funcName, params )
316
+ {
317
+ compiledProtectionFunction.name = funcName;
318
+ compiledProtectionFunction.params = [];
319
+ params.replace( /[^,\s]+/g, function( param )
320
+ {
321
+ compiledProtectionFunction.params.push( param );
322
+ } );
323
+ } );
324
+ }
325
+
326
+ function protectEmailLinkAsFunction( email )
327
+ {
328
+ var retval,
329
+ name = compiledProtectionFunction.name,
330
+ params = compiledProtectionFunction.params,
331
+ paramName,
332
+ paramValue;
333
+
334
+ retval = [ name, '(' ];
335
+ for ( var i = 0; i < params.length; i++ )
336
+ {
337
+ paramName = params[ i ].toLowerCase();
338
+ paramValue = email[ paramName ];
339
+
340
+ i > 0 && retval.push( ',' );
341
+ retval.push( '\'',
342
+ paramValue ?
343
+ escapeSingleQuote( encodeURIComponent( email[ paramName ] ) )
344
+ : '',
345
+ '\'');
346
+ }
347
+ retval.push( ')' );
348
+ return retval.join( '' );
349
+ }
350
+
351
+ function protectEmailAddressAsEncodedString( address )
352
+ {
353
+ var charCode,
354
+ length = address.length,
355
+ encodedChars = [];
356
+ for ( var i = 0; i < length; i++ )
357
+ {
358
+ charCode = address.charCodeAt( i );
359
+ encodedChars.push( charCode );
360
+ }
361
+ return 'String.fromCharCode(' + encodedChars.join( ',' ) + ')';
362
+ }
363
+
364
+ var commonLang = editor.lang.common,
365
+ linkLang = editor.lang.link;
366
+
367
+ return {
368
+ title : linkLang.title,
369
+ minWidth : 350,
370
+ minHeight : 230,
371
+ contents : [
372
+ {
373
+ id : 'info',
374
+ label : linkLang.info,
375
+ title : linkLang.info,
376
+ elements :
377
+ [
378
+ {
379
+ id : 'linkType',
380
+ type : 'select',
381
+ label : linkLang.type,
382
+ 'default' : 'url',
383
+ items :
384
+ [
385
+ [ linkLang.toUrl, 'url' ],
386
+ [ linkLang.toAnchor, 'anchor' ],
387
+ [ linkLang.toEmail, 'email' ]
388
+ ],
389
+ onChange : linkTypeChanged,
390
+ setup : function( data )
391
+ {
392
+ if ( data.type )
393
+ this.setValue( data.type );
394
+ },
395
+ commit : function( data )
396
+ {
397
+ data.type = this.getValue();
398
+ }
399
+ },
400
+ {
401
+ type : 'vbox',
402
+ id : 'urlOptions',
403
+ children :
404
+ [
405
+ {
406
+ type : 'hbox',
407
+ widths : [ '25%', '75%' ],
408
+ children :
409
+ [
410
+ {
411
+ id : 'protocol',
412
+ type : 'select',
413
+ label : commonLang.protocol,
414
+ 'default' : 'http://',
415
+ items :
416
+ [
417
+ // Force 'ltr' for protocol names in BIDI. (#5433)
418
+ [ 'http://\u200E', 'http://' ],
419
+ [ 'https://\u200E', 'https://' ],
420
+ [ 'ftp://\u200E', 'ftp://' ],
421
+ [ 'news://\u200E', 'news://' ],
422
+ [ linkLang.other , '' ]
423
+ ],
424
+ setup : function( data )
425
+ {
426
+ if ( data.url )
427
+ this.setValue( data.url.protocol || '' );
428
+ },
429
+ commit : function( data )
430
+ {
431
+ if ( !data.url )
432
+ data.url = {};
433
+
434
+ data.url.protocol = this.getValue();
435
+ }
436
+ },
437
+ {
438
+ type : 'text',
439
+ id : 'url',
440
+ label : commonLang.url,
441
+ required: true,
442
+ onLoad : function ()
443
+ {
444
+ this.allowOnChange = true;
445
+ },
446
+ onKeyUp : function()
447
+ {
448
+ this.allowOnChange = false;
449
+ var protocolCmb = this.getDialog().getContentElement( 'info', 'protocol' ),
450
+ url = this.getValue(),
451
+ urlOnChangeProtocol = /^(http|https|ftp|news):\/\/(?=.)/gi,
452
+ urlOnChangeTestOther = /^((javascript:)|[#\/\.\?])/gi;
453
+
454
+ var protocol = urlOnChangeProtocol.exec( url );
455
+ if ( protocol )
456
+ {
457
+ this.setValue( url.substr( protocol[ 0 ].length ) );
458
+ protocolCmb.setValue( protocol[ 0 ].toLowerCase() );
459
+ }
460
+ else if ( urlOnChangeTestOther.test( url ) )
461
+ protocolCmb.setValue( '' );
462
+
463
+ this.allowOnChange = true;
464
+ },
465
+ onChange : function()
466
+ {
467
+ if ( this.allowOnChange ) // Dont't call on dialog load.
468
+ this.onKeyUp();
469
+ },
470
+ validate : function()
471
+ {
472
+ var dialog = this.getDialog();
473
+
474
+ if ( dialog.getContentElement( 'info', 'linkType' ) &&
475
+ dialog.getValueOf( 'info', 'linkType' ) != 'url' )
476
+ return true;
477
+
478
+ if ( this.getDialog().fakeObj ) // Edit Anchor.
479
+ return true;
480
+
481
+ var func = CKEDITOR.dialog.validate.notEmpty( linkLang.noUrl );
482
+ return func.apply( this );
483
+ },
484
+ setup : function( data )
485
+ {
486
+ this.allowOnChange = false;
487
+ if ( data.url )
488
+ this.setValue( data.url.url );
489
+ this.allowOnChange = true;
490
+
491
+ },
492
+ commit : function( data )
493
+ {
494
+ // IE will not trigger the onChange event if the mouse has been used
495
+ // to carry all the operations #4724
496
+ this.onChange();
497
+
498
+ if ( !data.url )
499
+ data.url = {};
500
+
501
+ data.url.url = this.getValue();
502
+ this.allowOnChange = false;
503
+ }
504
+ }
505
+ ],
506
+ setup : function( data )
507
+ {
508
+ if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
509
+ this.getElement().show();
510
+ }
511
+ },
512
+ {
513
+ type : 'button',
514
+ id : 'browse',
515
+ hidden : 'true',
516
+ filebrowser : 'info:url',
517
+ label : commonLang.browseServer
518
+ }
519
+ ]
520
+ },
521
+ {
522
+ type : 'vbox',
523
+ id : 'anchorOptions',
524
+ width : 260,
525
+ align : 'center',
526
+ padding : 0,
527
+ children :
528
+ [
529
+ {
530
+ type : 'fieldset',
531
+ id : 'selectAnchorText',
532
+ label : linkLang.selectAnchor,
533
+ setup : function( data )
534
+ {
535
+ if ( data.anchors.length > 0 )
536
+ this.getElement().show();
537
+ else
538
+ this.getElement().hide();
539
+ },
540
+ children :
541
+ [
542
+ {
543
+ type : 'hbox',
544
+ id : 'selectAnchor',
545
+ children :
546
+ [
547
+ {
548
+ type : 'select',
549
+ id : 'anchorName',
550
+ 'default' : '',
551
+ label : linkLang.anchorName,
552
+ style : 'width: 100%;',
553
+ items :
554
+ [
555
+ [ '' ]
556
+ ],
557
+ setup : function( data )
558
+ {
559
+ this.clear();
560
+ this.add( '' );
561
+ for ( var i = 0 ; i < data.anchors.length ; i++ )
562
+ {
563
+ if ( data.anchors[i].name )
564
+ this.add( data.anchors[i].name );
565
+ }
566
+
567
+ if ( data.anchor )
568
+ this.setValue( data.anchor.name );
569
+
570
+ var linkType = this.getDialog().getContentElement( 'info', 'linkType' );
571
+ if ( linkType && linkType.getValue() == 'email' )
572
+ this.focus();
573
+ },
574
+ commit : function( data )
575
+ {
576
+ if ( !data.anchor )
577
+ data.anchor = {};
578
+
579
+ data.anchor.name = this.getValue();
580
+ }
581
+ },
582
+ {
583
+ type : 'select',
584
+ id : 'anchorId',
585
+ 'default' : '',
586
+ label : linkLang.anchorId,
587
+ style : 'width: 100%;',
588
+ items :
589
+ [
590
+ [ '' ]
591
+ ],
592
+ setup : function( data )
593
+ {
594
+ this.clear();
595
+ this.add( '' );
596
+ for ( var i = 0 ; i < data.anchors.length ; i++ )
597
+ {
598
+ if ( data.anchors[i].id )
599
+ this.add( data.anchors[i].id );
600
+ }
601
+
602
+ if ( data.anchor )
603
+ this.setValue( data.anchor.id );
604
+ },
605
+ commit : function( data )
606
+ {
607
+ if ( !data.anchor )
608
+ data.anchor = {};
609
+
610
+ data.anchor.id = this.getValue();
611
+ }
612
+ }
613
+ ],
614
+ setup : function( data )
615
+ {
616
+ if ( data.anchors.length > 0 )
617
+ this.getElement().show();
618
+ else
619
+ this.getElement().hide();
620
+ }
621
+ }
622
+ ]
623
+ },
624
+ {
625
+ type : 'html',
626
+ id : 'noAnchors',
627
+ style : 'text-align: center;',
628
+ html : '<div role="label" tabIndex="-1">' + CKEDITOR.tools.htmlEncode( linkLang.noAnchors ) + '</div>',
629
+ // Focus the first element defined in above html.
630
+ focus : true,
631
+ setup : function( data )
632
+ {
633
+ if ( data.anchors.length < 1 )
634
+ this.getElement().show();
635
+ else
636
+ this.getElement().hide();
637
+ }
638
+ }
639
+ ],
640
+ setup : function( data )
641
+ {
642
+ if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
643
+ this.getElement().hide();
644
+ }
645
+ },
646
+ {
647
+ type : 'vbox',
648
+ id : 'emailOptions',
649
+ padding : 1,
650
+ children :
651
+ [
652
+ {
653
+ type : 'text',
654
+ id : 'emailAddress',
655
+ label : linkLang.emailAddress,
656
+ required : true,
657
+ validate : function()
658
+ {
659
+ var dialog = this.getDialog();
660
+
661
+ if ( !dialog.getContentElement( 'info', 'linkType' ) ||
662
+ dialog.getValueOf( 'info', 'linkType' ) != 'email' )
663
+ return true;
664
+
665
+ var func = CKEDITOR.dialog.validate.notEmpty( linkLang.noEmail );
666
+ return func.apply( this );
667
+ },
668
+ setup : function( data )
669
+ {
670
+ if ( data.email )
671
+ this.setValue( data.email.address );
672
+
673
+ var linkType = this.getDialog().getContentElement( 'info', 'linkType' );
674
+ if ( linkType && linkType.getValue() == 'email' )
675
+ this.select();
676
+ },
677
+ commit : function( data )
678
+ {
679
+ if ( !data.email )
680
+ data.email = {};
681
+
682
+ data.email.address = this.getValue();
683
+ }
684
+ },
685
+ {
686
+ type : 'text',
687
+ id : 'emailSubject',
688
+ label : linkLang.emailSubject,
689
+ setup : function( data )
690
+ {
691
+ if ( data.email )
692
+ this.setValue( data.email.subject );
693
+ },
694
+ commit : function( data )
695
+ {
696
+ if ( !data.email )
697
+ data.email = {};
698
+
699
+ data.email.subject = this.getValue();
700
+ }
701
+ },
702
+ {
703
+ type : 'textarea',
704
+ id : 'emailBody',
705
+ label : linkLang.emailBody,
706
+ rows : 3,
707
+ 'default' : '',
708
+ setup : function( data )
709
+ {
710
+ if ( data.email )
711
+ this.setValue( data.email.body );
712
+ },
713
+ commit : function( data )
714
+ {
715
+ if ( !data.email )
716
+ data.email = {};
717
+
718
+ data.email.body = this.getValue();
719
+ }
720
+ }
721
+ ],
722
+ setup : function( data )
723
+ {
724
+ if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
725
+ this.getElement().hide();
726
+ }
727
+ }
728
+ ]
729
+ },
730
+ {
731
+ id : 'target',
732
+ label : linkLang.target,
733
+ title : linkLang.target,
734
+ elements :
735
+ [
736
+ {
737
+ type : 'hbox',
738
+ widths : [ '50%', '50%' ],
739
+ children :
740
+ [
741
+ {
742
+ type : 'select',
743
+ id : 'linkTargetType',
744
+ label : commonLang.target,
745
+ 'default' : 'notSet',
746
+ style : 'width : 100%;',
747
+ 'items' :
748
+ [
749
+ [ commonLang.notSet, 'notSet' ],
750
+ [ linkLang.targetFrame, 'frame' ],
751
+ [ linkLang.targetPopup, 'popup' ],
752
+ [ commonLang.targetNew, '_blank' ],
753
+ [ commonLang.targetTop, '_top' ],
754
+ [ commonLang.targetSelf, '_self' ],
755
+ [ commonLang.targetParent, '_parent' ]
756
+ ],
757
+ onChange : targetChanged,
758
+ setup : function( data )
759
+ {
760
+ if ( data.target )
761
+ this.setValue( data.target.type );
762
+ targetChanged.call( this );
763
+ },
764
+ commit : function( data )
765
+ {
766
+ if ( !data.target )
767
+ data.target = {};
768
+
769
+ data.target.type = this.getValue();
770
+ }
771
+ },
772
+ {
773
+ type : 'text',
774
+ id : 'linkTargetName',
775
+ label : linkLang.targetFrameName,
776
+ 'default' : '',
777
+ setup : function( data )
778
+ {
779
+ if ( data.target )
780
+ this.setValue( data.target.name );
781
+ },
782
+ commit : function( data )
783
+ {
784
+ if ( !data.target )
785
+ data.target = {};
786
+
787
+ data.target.name = this.getValue().replace(/\W/gi, '');
788
+ }
789
+ }
790
+ ]
791
+ },
792
+ {
793
+ type : 'vbox',
794
+ width : 260,
795
+ align : 'center',
796
+ padding : 2,
797
+ id : 'popupFeatures',
798
+ children :
799
+ [
800
+ {
801
+ type : 'fieldset',
802
+ label : linkLang.popupFeatures,
803
+ children :
804
+ [
805
+ {
806
+ type : 'hbox',
807
+ children :
808
+ [
809
+ {
810
+ type : 'checkbox',
811
+ id : 'resizable',
812
+ label : linkLang.popupResizable,
813
+ setup : setupPopupParams,
814
+ commit : commitPopupParams
815
+ },
816
+ {
817
+ type : 'checkbox',
818
+ id : 'status',
819
+ label : linkLang.popupStatusBar,
820
+ setup : setupPopupParams,
821
+ commit : commitPopupParams
822
+
823
+ }
824
+ ]
825
+ },
826
+ {
827
+ type : 'hbox',
828
+ children :
829
+ [
830
+ {
831
+ type : 'checkbox',
832
+ id : 'location',
833
+ label : linkLang.popupLocationBar,
834
+ setup : setupPopupParams,
835
+ commit : commitPopupParams
836
+
837
+ },
838
+ {
839
+ type : 'checkbox',
840
+ id : 'toolbar',
841
+ label : linkLang.popupToolbar,
842
+ setup : setupPopupParams,
843
+ commit : commitPopupParams
844
+
845
+ }
846
+ ]
847
+ },
848
+ {
849
+ type : 'hbox',
850
+ children :
851
+ [
852
+ {
853
+ type : 'checkbox',
854
+ id : 'menubar',
855
+ label : linkLang.popupMenuBar,
856
+ setup : setupPopupParams,
857
+ commit : commitPopupParams
858
+
859
+ },
860
+ {
861
+ type : 'checkbox',
862
+ id : 'fullscreen',
863
+ label : linkLang.popupFullScreen,
864
+ setup : setupPopupParams,
865
+ commit : commitPopupParams
866
+
867
+ }
868
+ ]
869
+ },
870
+ {
871
+ type : 'hbox',
872
+ children :
873
+ [
874
+ {
875
+ type : 'checkbox',
876
+ id : 'scrollbars',
877
+ label : linkLang.popupScrollBars,
878
+ setup : setupPopupParams,
879
+ commit : commitPopupParams
880
+
881
+ },
882
+ {
883
+ type : 'checkbox',
884
+ id : 'dependent',
885
+ label : linkLang.popupDependent,
886
+ setup : setupPopupParams,
887
+ commit : commitPopupParams
888
+
889
+ }
890
+ ]
891
+ },
892
+ {
893
+ type : 'hbox',
894
+ children :
895
+ [
896
+ {
897
+ type : 'text',
898
+ widths : [ '30%', '70%' ],
899
+ labelLayout : 'horizontal',
900
+ label : linkLang.popupWidth,
901
+ id : 'width',
902
+ setup : setupPopupParams,
903
+ commit : commitPopupParams
904
+
905
+ },
906
+ {
907
+ type : 'text',
908
+ labelLayout : 'horizontal',
909
+ widths : [ '55%', '45%' ],
910
+ label : linkLang.popupLeft,
911
+ id : 'left',
912
+ setup : setupPopupParams,
913
+ commit : commitPopupParams
914
+
915
+ }
916
+ ]
917
+ },
918
+ {
919
+ type : 'hbox',
920
+ children :
921
+ [
922
+ {
923
+ type : 'text',
924
+ labelLayout : 'horizontal',
925
+ widths : [ '30%', '70%' ],
926
+ label : linkLang.popupHeight,
927
+ id : 'height',
928
+ setup : setupPopupParams,
929
+ commit : commitPopupParams
930
+
931
+ },
932
+ {
933
+ type : 'text',
934
+ labelLayout : 'horizontal',
935
+ label : linkLang.popupTop,
936
+ widths : [ '55%', '45%' ],
937
+ id : 'top',
938
+ setup : setupPopupParams,
939
+ commit : commitPopupParams
940
+
941
+ }
942
+ ]
943
+ }
944
+ ]
945
+ }
946
+ ]
947
+ }
948
+ ]
949
+ },
950
+ {
951
+ id : 'upload',
952
+ label : linkLang.upload,
953
+ title : linkLang.upload,
954
+ hidden : true,
955
+ filebrowser : 'uploadButton',
956
+ elements :
957
+ [
958
+ {
959
+ type : 'file',
960
+ id : 'upload',
961
+ label : commonLang.upload,
962
+ style: 'height:40px',
963
+ size : 29
964
+ },
965
+ {
966
+ type : 'fileButton',
967
+ id : 'uploadButton',
968
+ label : commonLang.uploadSubmit,
969
+ filebrowser : 'info:url',
970
+ 'for' : [ 'upload', 'upload' ]
971
+ }
972
+ ]
973
+ },
974
+ {
975
+ id : 'advanced',
976
+ label : linkLang.advanced,
977
+ title : linkLang.advanced,
978
+ elements :
979
+ [
980
+ {
981
+ type : 'vbox',
982
+ padding : 1,
983
+ children :
984
+ [
985
+ {
986
+ type : 'hbox',
987
+ widths : [ '45%', '35%', '20%' ],
988
+ children :
989
+ [
990
+ {
991
+ type : 'text',
992
+ id : 'advId',
993
+ label : linkLang.id,
994
+ setup : setupAdvParams,
995
+ commit : commitAdvParams
996
+ },
997
+ {
998
+ type : 'select',
999
+ id : 'advLangDir',
1000
+ label : linkLang.langDir,
1001
+ 'default' : '',
1002
+ style : 'width:110px',
1003
+ items :
1004
+ [
1005
+ [ commonLang.notSet, '' ],
1006
+ [ linkLang.langDirLTR, 'ltr' ],
1007
+ [ linkLang.langDirRTL, 'rtl' ]
1008
+ ],
1009
+ setup : setupAdvParams,
1010
+ commit : commitAdvParams
1011
+ },
1012
+ {
1013
+ type : 'text',
1014
+ id : 'advAccessKey',
1015
+ width : '80px',
1016
+ label : linkLang.acccessKey,
1017
+ maxLength : 1,
1018
+ setup : setupAdvParams,
1019
+ commit : commitAdvParams
1020
+
1021
+ }
1022
+ ]
1023
+ },
1024
+ {
1025
+ type : 'hbox',
1026
+ widths : [ '45%', '35%', '20%' ],
1027
+ children :
1028
+ [
1029
+ {
1030
+ type : 'text',
1031
+ label : linkLang.name,
1032
+ id : 'advName',
1033
+ setup : setupAdvParams,
1034
+ commit : commitAdvParams
1035
+
1036
+ },
1037
+ {
1038
+ type : 'text',
1039
+ label : linkLang.langCode,
1040
+ id : 'advLangCode',
1041
+ width : '110px',
1042
+ 'default' : '',
1043
+ setup : setupAdvParams,
1044
+ commit : commitAdvParams
1045
+
1046
+ },
1047
+ {
1048
+ type : 'text',
1049
+ label : linkLang.tabIndex,
1050
+ id : 'advTabIndex',
1051
+ width : '80px',
1052
+ maxLength : 5,
1053
+ setup : setupAdvParams,
1054
+ commit : commitAdvParams
1055
+
1056
+ }
1057
+ ]
1058
+ }
1059
+ ]
1060
+ },
1061
+ {
1062
+ type : 'vbox',
1063
+ padding : 1,
1064
+ children :
1065
+ [
1066
+ {
1067
+ type : 'hbox',
1068
+ widths : [ '45%', '55%' ],
1069
+ children :
1070
+ [
1071
+ {
1072
+ type : 'text',
1073
+ label : linkLang.advisoryTitle,
1074
+ 'default' : '',
1075
+ id : 'advTitle',
1076
+ setup : setupAdvParams,
1077
+ commit : commitAdvParams
1078
+
1079
+ },
1080
+ {
1081
+ type : 'text',
1082
+ label : linkLang.advisoryContentType,
1083
+ 'default' : '',
1084
+ id : 'advContentType',
1085
+ setup : setupAdvParams,
1086
+ commit : commitAdvParams
1087
+
1088
+ }
1089
+ ]
1090
+ },
1091
+ {
1092
+ type : 'hbox',
1093
+ widths : [ '45%', '55%' ],
1094
+ children :
1095
+ [
1096
+ {
1097
+ type : 'text',
1098
+ label : linkLang.cssClasses,
1099
+ 'default' : '',
1100
+ id : 'advCSSClasses',
1101
+ setup : setupAdvParams,
1102
+ commit : commitAdvParams
1103
+
1104
+ },
1105
+ {
1106
+ type : 'text',
1107
+ label : linkLang.charset,
1108
+ 'default' : '',
1109
+ id : 'advCharset',
1110
+ setup : setupAdvParams,
1111
+ commit : commitAdvParams
1112
+
1113
+ }
1114
+ ]
1115
+ },
1116
+ {
1117
+ type : 'hbox',
1118
+ children :
1119
+ [
1120
+ {
1121
+ type : 'text',
1122
+ label : linkLang.styles,
1123
+ 'default' : '',
1124
+ id : 'advStyles',
1125
+ setup : setupAdvParams,
1126
+ commit : commitAdvParams
1127
+
1128
+ }
1129
+ ]
1130
+ }
1131
+ ]
1132
+ }
1133
+ ]
1134
+ }
1135
+ ],
1136
+ onShow : function()
1137
+ {
1138
+ this.fakeObj = false;
1139
+
1140
+ var editor = this.getParentEditor(),
1141
+ selection = editor.getSelection(),
1142
+ element = null;
1143
+
1144
+ // Fill in all the relevant fields if there's already one link selected.
1145
+ if ( ( element = plugin.getSelectedLink( editor ) ) && element.hasAttribute( 'href' ) )
1146
+ selection.selectElement( element );
1147
+ else if ( ( element = selection.getSelectedElement() ) && element.is( 'img' )
1148
+ && element.getAttribute( '_cke_real_element_type' )
1149
+ && element.getAttribute( '_cke_real_element_type' ) == 'anchor' )
1150
+ {
1151
+ this.fakeObj = element;
1152
+ element = editor.restoreRealElement( this.fakeObj );
1153
+ selection.selectElement( this.fakeObj );
1154
+ }
1155
+ else
1156
+ element = null;
1157
+
1158
+ this.setupContent( parseLink.apply( this, [ editor, element ] ) );
1159
+ },
1160
+ onOk : function()
1161
+ {
1162
+ var attributes = { href : 'javascript:void(0)/*' + CKEDITOR.tools.getNextNumber() + '*/' },
1163
+ removeAttributes = [],
1164
+ data = { href : attributes.href },
1165
+ me = this,
1166
+ editor = this.getParentEditor();
1167
+
1168
+ this.commitContent( data );
1169
+
1170
+ // Compose the URL.
1171
+ switch ( data.type || 'url' )
1172
+ {
1173
+ case 'url':
1174
+ var protocol = ( data.url && data.url.protocol != undefined ) ? data.url.protocol : 'http://',
1175
+ url = ( data.url && data.url.url ) || '';
1176
+ attributes._cke_saved_href = ( url.indexOf( '/' ) === 0 ) ? url : protocol + url;
1177
+ break;
1178
+ case 'anchor':
1179
+ var name = ( data.anchor && data.anchor.name ),
1180
+ id = ( data.anchor && data.anchor.id );
1181
+ attributes._cke_saved_href = '#' + ( name || id || '' );
1182
+ break;
1183
+ case 'email':
1184
+
1185
+ var linkHref,
1186
+ email = data.email,
1187
+ address = email.address;
1188
+
1189
+ switch( emailProtection )
1190
+ {
1191
+ case '' :
1192
+ case 'encode' :
1193
+ {
1194
+ var subject = encodeURIComponent( email.subject || '' ),
1195
+ body = encodeURIComponent( email.body || '' );
1196
+
1197
+ // Build the e-mail parameters first.
1198
+ var argList = [];
1199
+ subject && argList.push( 'subject=' + subject );
1200
+ body && argList.push( 'body=' + body );
1201
+ argList = argList.length ? '?' + argList.join( '&' ) : '';
1202
+
1203
+ if ( emailProtection == 'encode' )
1204
+ {
1205
+ linkHref = [ 'javascript:void(location.href=\'mailto:\'+',
1206
+ protectEmailAddressAsEncodedString( address ) ];
1207
+ // parameters are optional.
1208
+ argList && linkHref.push( '+\'', escapeSingleQuote( argList ), '\'' );
1209
+
1210
+ linkHref.push( ')' );
1211
+ }
1212
+ else
1213
+ linkHref = [ 'mailto:', address, argList ];
1214
+
1215
+ break;
1216
+ }
1217
+ default :
1218
+ {
1219
+ // Separating name and domain.
1220
+ var nameAndDomain = address.split( '@', 2 );
1221
+ email.name = nameAndDomain[ 0 ];
1222
+ email.domain = nameAndDomain[ 1 ];
1223
+
1224
+ linkHref = [ 'javascript:', protectEmailLinkAsFunction( email ) ];
1225
+ }
1226
+ }
1227
+
1228
+ attributes._cke_saved_href = linkHref.join( '' );
1229
+ break;
1230
+ }
1231
+
1232
+ // Popups and target.
1233
+ if ( data.target )
1234
+ {
1235
+ if ( data.target.type == 'popup' )
1236
+ {
1237
+ var onclickList = [ 'window.open(this.href, \'',
1238
+ data.target.name || '', '\', \'' ];
1239
+ var featureList = [ 'resizable', 'status', 'location', 'toolbar', 'menubar', 'fullscreen',
1240
+ 'scrollbars', 'dependent' ];
1241
+ var featureLength = featureList.length;
1242
+ var addFeature = function( featureName )
1243
+ {
1244
+ if ( data.target[ featureName ] )
1245
+ featureList.push( featureName + '=' + data.target[ featureName ] );
1246
+ };
1247
+
1248
+ for ( var i = 0 ; i < featureLength ; i++ )
1249
+ featureList[i] = featureList[i] + ( data.target[ featureList[i] ] ? '=yes' : '=no' ) ;
1250
+ addFeature( 'width' );
1251
+ addFeature( 'left' );
1252
+ addFeature( 'height' );
1253
+ addFeature( 'top' );
1254
+
1255
+ onclickList.push( featureList.join( ',' ), '\'); return false;' );
1256
+ attributes[ '_cke_pa_onclick' ] = onclickList.join( '' );
1257
+
1258
+ // Add the "target" attribute. (#5074)
1259
+ removeAttributes.push( 'target' );
1260
+ }
1261
+ else
1262
+ {
1263
+ if ( data.target.type != 'notSet' && data.target.name )
1264
+ attributes.target = data.target.name;
1265
+ else
1266
+ removeAttributes.push( 'target' );
1267
+
1268
+ removeAttributes.push( '_cke_pa_onclick', 'onclick' );
1269
+ }
1270
+ }
1271
+
1272
+ // Advanced attributes.
1273
+ if ( data.adv )
1274
+ {
1275
+ var advAttr = function( inputName, attrName )
1276
+ {
1277
+ var value = data.adv[ inputName ];
1278
+ if ( value )
1279
+ attributes[attrName] = value;
1280
+ else
1281
+ removeAttributes.push( attrName );
1282
+ };
1283
+
1284
+ if ( this._.selectedElement )
1285
+ advAttr( 'advId', 'id' );
1286
+ advAttr( 'advLangDir', 'dir' );
1287
+ advAttr( 'advAccessKey', 'accessKey' );
1288
+ advAttr( 'advName', 'name' );
1289
+ advAttr( 'advLangCode', 'lang' );
1290
+ advAttr( 'advTabIndex', 'tabindex' );
1291
+ advAttr( 'advTitle', 'title' );
1292
+ advAttr( 'advContentType', 'type' );
1293
+ advAttr( 'advCSSClasses', 'class' );
1294
+ advAttr( 'advCharset', 'charset' );
1295
+ advAttr( 'advStyles', 'style' );
1296
+ }
1297
+
1298
+ if ( !this._.selectedElement )
1299
+ {
1300
+ // Create element if current selection is collapsed.
1301
+ var selection = editor.getSelection(),
1302
+ ranges = selection.getRanges( true );
1303
+ if ( ranges.length == 1 && ranges[0].collapsed )
1304
+ {
1305
+ // Short mailto link text view (#5736).
1306
+ var text = new CKEDITOR.dom.text( data.type == 'email' ?
1307
+ data.email.address : attributes._cke_saved_href, editor.document );
1308
+ ranges[0].insertNode( text );
1309
+ ranges[0].selectNodeContents( text );
1310
+ selection.selectRanges( ranges );
1311
+ }
1312
+
1313
+ // Apply style.
1314
+ var style = new CKEDITOR.style( { element : 'a', attributes : attributes } );
1315
+ style.type = CKEDITOR.STYLE_INLINE; // need to override... dunno why.
1316
+ style.apply( editor.document );
1317
+
1318
+ // Id. Apply only to the first link.
1319
+ if ( data.adv && data.adv.advId )
1320
+ {
1321
+ var links = this.getParentEditor().document.$.getElementsByTagName( 'a' );
1322
+ for ( i = 0 ; i < links.length ; i++ )
1323
+ {
1324
+ if ( links[i].href == attributes.href )
1325
+ {
1326
+ links[i].id = data.adv.advId;
1327
+ break;
1328
+ }
1329
+ }
1330
+ }
1331
+ }
1332
+ else
1333
+ {
1334
+ // We're only editing an existing link, so just overwrite the attributes.
1335
+ var element = this._.selectedElement,
1336
+ href = element.getAttribute( '_cke_saved_href' ),
1337
+ textView = element.getHtml();
1338
+
1339
+ // IE BUG: Setting the name attribute to an existing link doesn't work.
1340
+ // Must re-create the link from weired syntax to workaround.
1341
+ if ( CKEDITOR.env.ie && attributes.name != element.getAttribute( 'name' ) )
1342
+ {
1343
+ var newElement = new CKEDITOR.dom.element( '<a name="' + CKEDITOR.tools.htmlEncode( attributes.name ) + '">',
1344
+ editor.document );
1345
+
1346
+ selection = editor.getSelection();
1347
+
1348
+ element.moveChildren( newElement );
1349
+ element.copyAttributes( newElement, { name : 1 } );
1350
+ newElement.replace( element );
1351
+ element = newElement;
1352
+
1353
+ selection.selectElement( element );
1354
+ }
1355
+
1356
+ element.setAttributes( attributes );
1357
+ element.removeAttributes( removeAttributes );
1358
+ // Update text view when user changes protocol (#4612).
1359
+ if ( href == textView || data.type == 'email' && textView.indexOf( '@' ) != -1 )
1360
+ {
1361
+ // Short mailto link text view (#5736).
1362
+ element.setHtml( data.type == 'email' ?
1363
+ data.email.address : attributes._cke_saved_href );
1364
+ }
1365
+ // Make the element display as an anchor if a name has been set.
1366
+ if ( element.getAttribute( 'name' ) )
1367
+ element.addClass( 'cke_anchor' );
1368
+ else
1369
+ element.removeClass( 'cke_anchor' );
1370
+
1371
+ if ( this.fakeObj )
1372
+ editor.createFakeElement( element, 'cke_anchor', 'anchor' ).replace( this.fakeObj );
1373
+
1374
+ delete this._.selectedElement;
1375
+ }
1376
+ },
1377
+ onLoad : function()
1378
+ {
1379
+ if ( !editor.config.linkShowAdvancedTab )
1380
+ this.hidePage( 'advanced' ); //Hide Advanded tab.
1381
+
1382
+ if ( !editor.config.linkShowTargetTab )
1383
+ this.hidePage( 'target' ); //Hide Target tab.
1384
+
1385
+ },
1386
+ // Inital focus on 'url' field if link is of type URL.
1387
+ onFocus : function()
1388
+ {
1389
+ var linkType = this.getContentElement( 'info', 'linkType' ),
1390
+ urlField;
1391
+ if ( linkType && linkType.getValue() == 'url' )
1392
+ {
1393
+ urlField = this.getContentElement( 'info', 'url' );
1394
+ urlField.select();
1395
+ }
1396
+ }
1397
+ };
1398
+ });
1399
+
1400
+ /**
1401
+ * The e-mail address anti-spam protection option. The protection will be
1402
+ * applied when creating or modifying e-mail links through the editor interface.<br>
1403
+ * Two methods of protection can be choosed:
1404
+ * <ol> <li>The e-mail parts (name, domain and any other query string) are
1405
+ * assembled into a function call pattern. Such function must be
1406
+ * provided by the developer in the pages that will use the contents.
1407
+ * <li>Only the e-mail address is obfuscated into a special string that
1408
+ * has no meaning for humans or spam bots, but which is properly
1409
+ * rendered and accepted by the browser.</li></ol>
1410
+ * Both approaches require JavaScript to be enabled.
1411
+ * @name CKEDITOR.config.emailProtection
1412
+ * @since 3.1
1413
+ * @type String
1414
+ * @default '' (empty string = disabled)
1415
+ * @example
1416
+ * // href="mailto:tester@ckeditor.com?subject=subject&body=body"
1417
+ * config.emailProtection = '';
1418
+ * @example
1419
+ * // href="<a href=\"javascript:void(location.href=\'mailto:\'+String.fromCharCode(116,101,115,116,101,114,64,99,107,101,100,105,116,111,114,46,99,111,109)+\'?subject=subject&body=body\')\">e-mail</a>"
1420
+ * config.emailProtection = 'encode';
1421
+ * @example
1422
+ * // href="javascript:mt('tester','ckeditor.com','subject','body')"
1423
+ * config.emailProtection = 'mt(NAME,DOMAIN,SUBJECT,BODY)';
1424
+ */