From b943372f1739c2b66d50c4af76890e60dacd0176 Mon Sep 17 00:00:00 2001 From: C Robert Date: Thu, 25 Jun 2009 19:18:02 +0000 Subject: [PATCH] HTML composition, take 2 Monotone-Parent: dbd490c81ea6cac4c12b2e17661e2fef43219e68 Monotone-Revision: 0801dc9f1e4fdc49ea44fc0450fb025c2639ed26 Monotone-Author: crobert@inverse.ca Monotone-Date: 2009-06-25T19:18:02 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 7 + .../SOGoMailDutchForward.html | 26 +- .../SOGoMailDutchForward.wod | 5 + .../SOGoMailDutchReply.html | 32 +- .../SOGoMailDutchReply.wod | 5 + .../SOGoMailEnglishForward.html | 26 +- .../SOGoMailEnglishForward.wod | 5 + .../SOGoMailEnglishReply.html | 32 +- .../SOGoMailEnglishReply.wod | 5 + SoObjects/Mailer/SOGoMailForward.h | 1 + SoObjects/Mailer/SOGoMailForward.m | 85 +- .../SOGoMailFrenchForward.html | 26 +- .../SOGoMailFrenchForward.wod | 5 + .../SOGoMailFrenchReply.html | 32 +- .../SOGoMailFrenchReply.wod | 5 + .../SOGoMailGermanForward.html | 26 +- .../SOGoMailGermanForward.wod | 5 + .../SOGoMailGermanReply.html | 32 +- .../SOGoMailGermanReply.wod | 5 + .../SOGoMailItalianForward.html | 26 +- .../SOGoMailItalianForward.wod | 5 + .../SOGoMailItalianReply.html | 32 +- .../SOGoMailItalianReply.wod | 5 + SoObjects/Mailer/SOGoMailReply.m | 15 +- .../SOGoMailRussianForward.html | 26 +- .../SOGoMailRussianForward.wod | 5 + .../SOGoMailRussianReply.html | 32 +- .../SOGoMailRussianReply.wod | 5 + .../SOGoMailSpanishForward.html | 26 +- .../SOGoMailSpanishForward.wod | 5 + .../SOGoMailSpanishReply.html | 34 +- .../SOGoMailSpanishReply.wod | 5 + .../SOGoMailWelshForward.html | 26 +- .../SOGoMailWelshForward.wod | 5 + .../SOGoMailWelshReply.html | 32 +- .../SOGoMailWelshReply.wod | 5 + UI/Templates/MailerUI/UIxMailEditor.wox | 2 +- UI/Templates/PreferencesUI/UIxPreferences.wox | 2 +- UI/WebServerResources/GNUmakefile | 2 +- UI/WebServerResources/UIxMailEditor.js | 41 +- UI/WebServerResources/UIxPreferences.js | 31 +- UI/WebServerResources/ckeditor/.htaccess | 24 + UI/WebServerResources/ckeditor/CHANGES.html | 52 + UI/WebServerResources/ckeditor/LICENSE.html | 1334 +++++ .../ckeditor/_docs/api/files.html | 2555 +++++++++ .../ckeditor/_docs/api/index.html | 1354 +++++ .../_docs/api/symbols/CKEDITOR.ajax.html | 999 ++++ .../symbols/CKEDITOR.commandDefinition.html | 1046 ++++ .../_docs/api/symbols/CKEDITOR.config.html | 2799 ++++++++++ .../CKEDITOR.dialog.buttonDefinition.html | 1101 ++++ .../CKEDITOR.dialog.contentDefinition.html | 1054 ++++ ...EDITOR.dialog.contentDefinitionObject.html | 1037 ++++ .../CKEDITOR.dialog.dialogDefinition.html | 1281 +++++ ...KEDITOR.dialog.dialogDefinitionObject.html | 1245 +++++ .../_docs/api/symbols/CKEDITOR.dialog.html | 2863 +++++++++++ .../CKEDITOR.dialog.uiElementDefinition.html | 1183 +++++ .../api/symbols/CKEDITOR.dialogCommand.html | 848 +++ .../api/symbols/CKEDITOR.dom.document.html | 1516 ++++++ .../api/symbols/CKEDITOR.dom.domObject.html | 1186 +++++ .../api/symbols/CKEDITOR.dom.element.html | 4551 +++++++++++++++++ .../_docs/api/symbols/CKEDITOR.dom.event.html | 1149 +++++ .../_docs/api/symbols/CKEDITOR.dom.html | 1126 ++++ .../_docs/api/symbols/CKEDITOR.dom.node.html | 2318 +++++++++ .../api/symbols/CKEDITOR.dom.selection.html | 1473 ++++++ .../_docs/api/symbols/CKEDITOR.dom.text.html | 1194 +++++ .../api/symbols/CKEDITOR.dom.window.html | 1025 ++++ .../_docs/api/symbols/CKEDITOR.dtd.html | 1163 +++++ .../_docs/api/symbols/CKEDITOR.editor.html | 2939 +++++++++++ .../_docs/api/symbols/CKEDITOR.env.html | 1273 +++++ .../_docs/api/symbols/CKEDITOR.event.html | 1324 +++++ .../_docs/api/symbols/CKEDITOR.eventInfo.html | 1214 +++++ .../api/symbols/CKEDITOR.focusManager.html | 1064 ++++ .../ckeditor/_docs/api/symbols/CKEDITOR.html | 2837 ++++++++++ .../symbols/CKEDITOR.htmlParser.cdata.html | 1009 ++++ .../symbols/CKEDITOR.htmlParser.comment.html | 1015 ++++ .../symbols/CKEDITOR.htmlParser.element.html | 1215 +++++ .../symbols/CKEDITOR.htmlParser.fragment.html | 1149 +++++ .../api/symbols/CKEDITOR.htmlParser.html | 1227 +++++ .../api/symbols/CKEDITOR.htmlParser.text.html | 1015 ++++ .../api/symbols/CKEDITOR.htmlWriter.html | 817 +++ .../api/symbols/CKEDITOR.imageCacher.html | 893 ++++ .../symbols/CKEDITOR.keystrokeHandler.html | 1015 ++++ .../_docs/api/symbols/CKEDITOR.loader.html | 964 ++++ .../symbols/CKEDITOR.pluginDefinition.html | 1042 ++++ .../_docs/api/symbols/CKEDITOR.plugins.html | 982 ++++ .../api/symbols/CKEDITOR.resourceManager.html | 1490 ++++++ .../api/symbols/CKEDITOR.scriptLoader.html | 994 ++++ .../_docs/api/symbols/CKEDITOR.skins.html | 965 ++++ .../_docs/api/symbols/CKEDITOR.test.html | 1034 ++++ .../_docs/api/symbols/CKEDITOR.themes.html | 834 +++ .../_docs/api/symbols/CKEDITOR.tools.html | 2080 ++++++++ .../_docs/api/symbols/CKEDITOR.ui.button.html | 1029 ++++ .../symbols/CKEDITOR.ui.dialog.button.html | 1252 +++++ .../symbols/CKEDITOR.ui.dialog.checkbox.html | 1141 +++++ .../api/symbols/CKEDITOR.ui.dialog.file.html | 1189 +++++ .../CKEDITOR.ui.dialog.fileButton.html | 862 ++++ .../api/symbols/CKEDITOR.ui.dialog.hbox.html | 963 ++++ .../api/symbols/CKEDITOR.ui.dialog.html.html | 860 ++++ .../CKEDITOR.ui.dialog.labeledElement.html | 1063 ++++ .../api/symbols/CKEDITOR.ui.dialog.radio.html | 1094 ++++ .../symbols/CKEDITOR.ui.dialog.select.html | 1125 ++++ .../symbols/CKEDITOR.ui.dialog.textInput.html | 1131 ++++ .../symbols/CKEDITOR.ui.dialog.textarea.html | 864 ++++ .../symbols/CKEDITOR.ui.dialog.uiElement.html | 1891 +++++++ .../api/symbols/CKEDITOR.ui.dialog.vbox.html | 880 ++++ .../CKEDITOR.ui.handlerDefinition.html | 811 +++ .../_docs/api/symbols/CKEDITOR.ui.html | 1302 +++++ .../_docs/api/symbols/CKEDITOR.xml.html | 1146 +++++ .../ckeditor/_docs/api/symbols/_global_.html | 1717 +++++++ .../api/symbols/src/core__bootstrap.js.html | 72 + .../_docs/api/symbols/src/core_ajax.js.html | 151 + .../api/symbols/src/core_ckeditor.js.html | 104 + .../symbols/src/core_ckeditor_base.js.html | 198 + .../symbols/src/core_ckeditor_basic.js.html | 249 + .../api/symbols/src/core_command.js.html | 78 + .../src/core_commanddefinition.js.html | 80 + .../_docs/api/symbols/src/core_config.js.html | 243 + .../_docs/api/symbols/src/core_dom.js.html | 29 + .../api/symbols/src/core_dom_document.js.html | 218 + .../src/core_dom_documentfragment.js.html | 55 + .../symbols/src/core_dom_domwalker.js.html | 250 + .../api/symbols/src/core_dom_element.js.html | 1393 +++++ .../symbols/src/core_dom_elementpath.js.html | 112 + .../api/symbols/src/core_dom_event.js.html | 145 + .../api/symbols/src/core_dom_node.js.html | 654 +++ .../api/symbols/src/core_dom_nodelist.js.html | 31 + .../api/symbols/src/core_dom_range.js.html | 1651 ++++++ .../api/symbols/src/core_dom_text.js.html | 131 + .../api/symbols/src/core_dom_walker.js.html | 400 ++ .../api/symbols/src/core_dom_window.js.html | 101 + .../_docs/api/symbols/src/core_dtd.js.html | 208 + .../_docs/api/symbols/src/core_editor.js.html | 647 +++ .../api/symbols/src/core_editor_basic.js.html | 186 + .../_docs/api/symbols/src/core_env.js.html | 227 + .../_docs/api/symbols/src/core_event.js.html | 343 ++ .../api/symbols/src/core_eventInfo.js.html | 128 + .../api/symbols/src/core_focusmanager.js.html | 131 + .../api/symbols/src/core_htmlparser.js.html | 220 + .../src/core_htmlparser_basicwriter.js.html | 148 + .../symbols/src/core_htmlparser_cdata.js.html | 52 + .../src/core_htmlparser_comment.js.html | 67 + .../src/core_htmlparser_element.js.html | 204 + .../src/core_htmlparser_filter.js.html | 241 + .../src/core_htmlparser_fragment.js.html | 425 ++ .../symbols/src/core_htmlparser_text.js.html | 63 + .../api/symbols/src/core_imagecacher.js.html | 66 + .../_docs/api/symbols/src/core_lang.js.html | 155 + .../_docs/api/symbols/src/core_loader.js.html | 193 + .../symbols/src/core_plugindefinition.js.html | 74 + .../api/symbols/src/core_plugins.js.html | 90 + .../symbols/src/core_resourcemanager.js.html | 241 + .../api/symbols/src/core_scriptloader.js.html | 202 + .../_docs/api/symbols/src/core_skins.js.html | 193 + .../_docs/api/symbols/src/core_test.js.html | 132 + .../_docs/api/symbols/src/core_themes.js.html | 26 + .../_docs/api/symbols/src/core_tools.js.html | 516 ++ .../_docs/api/symbols/src/core_ui.js.html | 114 + .../_docs/api/symbols/src/core_xml.js.html | 173 + .../_docs/api/symbols/src/lang_en.js.html | 681 +++ .../src/plugins_about_dialogs_about.js.html | 81 + .../symbols/src/plugins_about_plugin.js.html | 30 + .../src/plugins_basicstyles_plugin.js.html | 58 + .../src/plugins_blockquote_plugin.js.html | 309 ++ .../symbols/src/plugins_button_plugin.js.html | 266 + .../plugins_clipboard_dialogs_paste.js.html | 162 + .../src/plugins_clipboard_plugin.js.html | 216 + .../src/plugins_colorbutton_plugin.js.html | 169 + .../src/plugins_contextmenu_plugin.js.html | 186 + .../plugins_dialog_dialogDefinition.js.html | 323 ++ .../symbols/src/plugins_dialog_plugin.js.html | 2697 ++++++++++ .../src/plugins_dialogui_plugin.js.html | 1300 +++++ .../src/plugins_domiterator_plugin.js.html | 324 ++ .../src/plugins_editingblock_plugin.js.html | 233 + .../src/plugins_elementspath_plugin.js.html | 190 + .../src/plugins_enterkey_plugin.js.html | 331 ++ .../src/plugins_entities_plugin.js.html | 160 + .../src/plugins_filebrowser_plugin.js.html | 391 ++ .../src/plugins_find_dialogs_find.js.html | 851 +++ .../symbols/src/plugins_find_plugin.js.html | 43 + .../src/plugins_flash_dialogs_flash.js.html | 686 +++ .../symbols/src/plugins_flash_plugin.js.html | 173 + .../src/plugins_floatpanel_plugin.js.html | 330 ++ .../symbols/src/plugins_font_plugin.js.html | 160 + .../symbols/src/plugins_format_plugin.js.html | 109 + .../src/plugins_forms_dialogs_button.js.html | 143 + .../plugins_forms_dialogs_checkbox.js.html | 146 + .../src/plugins_forms_dialogs_form.js.html | 185 + .../plugins_forms_dialogs_hiddenfield.js.html | 99 + .../src/plugins_forms_dialogs_radio.js.html | 143 + .../src/plugins_forms_dialogs_select.js.html | 549 ++ .../plugins_forms_dialogs_textarea.js.html | 122 + .../plugins_forms_dialogs_textfield.js.html | 201 + .../symbols/src/plugins_forms_plugin.js.html | 201 + .../src/plugins_horizontalrule_plugin.js.html | 43 + .../plugins_htmldataprocessor_plugin.js.html | 342 ++ .../src/plugins_htmlwriter_plugin.js.html | 297 ++ .../src/plugins_iframedialog_plugin.js.html | 144 + .../src/plugins_image_dialogs_image.js.html | 1217 +++++ .../symbols/src/plugins_image_plugin.js.html | 65 + .../symbols/src/plugins_indent_plugin.js.html | 289 ++ .../src/plugins_justify_plugin.js.html | 172 + .../src/plugins_keystrokes_plugin.js.html | 196 + .../src/plugins_link_dialogs_anchor.js.html | 106 + .../src/plugins_link_dialogs_link.js.html | 1221 +++++ .../symbols/src/plugins_link_plugin.js.html | 196 + .../symbols/src/plugins_list_plugin.js.html | 544 ++ .../src/plugins_listblock_plugin.js.html | 239 + .../src/plugins_maximize_plugin.js.html | 275 + .../symbols/src/plugins_menu_plugin.js.html | 359 ++ .../src/plugins_menubutton_plugin.js.html | 101 + .../src/plugins_newpage_plugin.js.html | 67 + .../src/plugins_pagebreak_plugin.js.html | 104 + .../symbols/src/plugins_panel_plugin.js.html | 338 ++ .../src/plugins_panelbutton_plugin.js.html | 148 + ...astefromword_dialogs_pastefromword.js.html | 303 ++ .../src/plugins_pastefromword_plugin.js.html | 35 + ...lugins_pastetext_dialogs_pastetext.js.html | 73 + .../src/plugins_pastetext_plugin.js.html | 138 + .../symbols/src/plugins_popup_plugin.js.html | 70 + .../src/plugins_preview_plugin.js.html | 105 + .../symbols/src/plugins_print_plugin.js.html | 49 + .../src/plugins_removeformat_plugin.js.html | 127 + .../symbols/src/plugins_resize_plugin.js.html | 84 + .../src/plugins_richcombo_plugin.js.html | 365 ++ .../symbols/src/plugins_save_plugin.js.html | 63 + .../src/plugins_scayt_dialogs_options.js.html | 476 ++ .../symbols/src/plugins_scayt_plugin.js.html | 493 ++ .../src/plugins_selection_plugin.js.html | 1069 ++++ .../src/plugins_showblocks_plugin.js.html | 153 + .../src/plugins_smiley_dialogs_smiley.js.html | 227 + .../symbols/src/plugins_smiley_plugin.js.html | 39 + .../src/plugins_sourcearea_plugin.js.html | 189 + ...ns_specialchar_dialogs_specialchar.js.html | 370 ++ .../src/plugins_specialchar_plugin.js.html | 37 + .../symbols/src/plugins_styles_plugin.js.html | 1088 ++++ .../src/plugins_stylescombo_plugin.js.html | 283 + ...plugins_stylescombo_styles_default.js.html | 93 + .../symbols/src/plugins_tab_plugin.js.html | 274 + .../src/plugins_table_dialogs_table.js.html | 558 ++ .../symbols/src/plugins_table_plugin.js.html | 78 + ...ugins_tabletools_dialogs_tableCell.js.html | 338 ++ .../src/plugins_tabletools_plugin.js.html | 701 +++ ...lugins_templates_dialogs_templates.js.html | 178 + .../src/plugins_templates_plugin.js.html | 96 + ...lugins_templates_templates_default.js.html | 102 + .../src/plugins_toolbar_plugin.js.html | 361 ++ .../plugins_uicolor_dialogs_uicolor.js.html | 207 + .../src/plugins_uicolor_lang_en.js.html | 23 + .../src/plugins_uicolor_plugin.js.html | 43 + .../src/plugins_uicolor_yui_yui.js.html | 79 + .../symbols/src/plugins_undo_plugin.js.html | 492 ++ .../src/plugins_wsc_dialogs_wsc.js.html | 177 + .../symbols/src/plugins_wsc_plugin.js.html | 40 + .../src/plugins_wysiwygarea_plugin.js.html | 620 +++ .../ckeditor/_samples/ajax.html | 95 + .../ckeditor/_samples/api_dialog.html | 178 + .../ckeditor/_samples/api_dialog/my_dialog.js | 28 + .../ckeditor/_samples/divreplace.html | 136 + .../ckeditor/_samples/enterkey.html | 90 + .../ckeditor/_samples/index.html | 49 + .../ckeditor/_samples/replacebyclass.html | 50 + .../ckeditor/_samples/replacebycode.html | 81 + .../ckeditor/_samples/sample.css | 81 + .../ckeditor/_samples/sample.js | 71 + .../ckeditor/_samples/sample_posteddata.php | 59 + .../ckeditor/_samples/skins.html | 84 + .../ckeditor/_samples/ui_color.html | 87 + .../ckeditor/_samples/ui_languages.html | 114 + .../ckeditor/_source/core/_bootstrap.js | 64 + .../ckeditor/_source/core/ajax.js | 143 + .../ckeditor/_source/core/ckeditor.js | 96 + .../ckeditor/_source/core/ckeditor_base.js | 190 + .../ckeditor/_source/core/ckeditor_basic.js | 241 + .../ckeditor/_source/core/command.js | 70 + .../_source/core/commanddefinition.js | 72 + .../ckeditor/_source/core/config.js | 235 + .../ckeditor/_source/core/dom.js | 21 + .../ckeditor/_source/core/dom/document.js | 210 + .../_source/core/dom/documentfragment.js | 47 + .../ckeditor/_source/core/dom/domwalker.js | 242 + .../ckeditor/_source/core/dom/element.js | 1385 +++++ .../ckeditor/_source/core/dom/elementpath.js | 104 + .../ckeditor/_source/core/dom/event.js | 137 + .../ckeditor/_source/core/dom/node.js | 646 +++ .../ckeditor/_source/core/dom/nodelist.js | 23 + .../ckeditor/_source/core/dom/range.js | 1643 ++++++ .../ckeditor/_source/core/dom/text.js | 123 + .../ckeditor/_source/core/dom/walker.js | 392 ++ .../ckeditor/_source/core/dom/window.js | 93 + .../ckeditor/_source/core/dtd.js | 200 + .../ckeditor/_source/core/editor.js | 639 +++ .../ckeditor/_source/core/editor_basic.js | 178 + .../ckeditor/_source/core/env.js | 219 + .../ckeditor/_source/core/event.js | 335 ++ .../ckeditor/_source/core/eventInfo.js | 120 + .../ckeditor/_source/core/focusmanager.js | 123 + .../ckeditor/_source/core/htmlparser.js | 212 + .../_source/core/htmlparser/basicwriter.js | 140 + .../ckeditor/_source/core/htmlparser/cdata.js | 44 + .../_source/core/htmlparser/comment.js | 59 + .../_source/core/htmlparser/element.js | 196 + .../_source/core/htmlparser/filter.js | 233 + .../_source/core/htmlparser/fragment.js | 417 ++ .../ckeditor/_source/core/htmlparser/text.js | 55 + .../ckeditor/_source/core/imagecacher.js | 58 + .../ckeditor/_source/core/lang.js | 147 + .../ckeditor/_source/core/loader.js | 185 + .../ckeditor/_source/core/plugindefinition.js | 66 + .../ckeditor/_source/core/plugins.js | 82 + .../ckeditor/_source/core/resourcemanager.js | 233 + .../ckeditor/_source/core/scriptloader.js | 194 + .../ckeditor/_source/core/skins.js | 185 + .../ckeditor/_source/core/test.js | 124 + .../ckeditor/_source/core/themes.js | 18 + .../ckeditor/_source/core/tools.js | 508 ++ .../ckeditor/_source/core/ui.js | 106 + .../ckeditor/_source/core/xml.js | 165 + .../ckeditor/_source/lang/_languages.js | 82 + .../_source/lang/_translationstatus.txt | 59 + .../ckeditor/_source/lang/af.js | 673 +++ .../ckeditor/_source/lang/ar.js | 673 +++ .../ckeditor/_source/lang/bg.js | 673 +++ .../ckeditor/_source/lang/bn.js | 673 +++ .../ckeditor/_source/lang/bs.js | 673 +++ .../ckeditor/_source/lang/ca.js | 673 +++ .../ckeditor/_source/lang/cs.js | 673 +++ .../ckeditor/_source/lang/da.js | 673 +++ .../ckeditor/_source/lang/de.js | 673 +++ .../ckeditor/_source/lang/el.js | 673 +++ .../ckeditor/_source/lang/en-au.js | 673 +++ .../ckeditor/_source/lang/en-ca.js | 673 +++ .../ckeditor/_source/lang/en-uk.js | 673 +++ .../ckeditor/_source/lang/en.js | 673 +++ .../ckeditor/_source/lang/eo.js | 673 +++ .../ckeditor/_source/lang/es.js | 673 +++ .../ckeditor/_source/lang/et.js | 673 +++ .../ckeditor/_source/lang/eu.js | 673 +++ .../ckeditor/_source/lang/fa.js | 673 +++ .../ckeditor/_source/lang/fi.js | 673 +++ .../ckeditor/_source/lang/fo.js | 673 +++ .../ckeditor/_source/lang/fr-ca.js | 673 +++ .../ckeditor/_source/lang/fr.js | 673 +++ .../ckeditor/_source/lang/gl.js | 673 +++ .../ckeditor/_source/lang/gu.js | 673 +++ .../ckeditor/_source/lang/he.js | 673 +++ .../ckeditor/_source/lang/hi.js | 673 +++ .../ckeditor/_source/lang/hr.js | 673 +++ .../ckeditor/_source/lang/hu.js | 673 +++ .../ckeditor/_source/lang/is.js | 673 +++ .../ckeditor/_source/lang/it.js | 673 +++ .../ckeditor/_source/lang/ja.js | 673 +++ .../ckeditor/_source/lang/km.js | 673 +++ .../ckeditor/_source/lang/ko.js | 673 +++ .../ckeditor/_source/lang/lt.js | 673 +++ .../ckeditor/_source/lang/lv.js | 673 +++ .../ckeditor/_source/lang/mn.js | 673 +++ .../ckeditor/_source/lang/ms.js | 673 +++ .../ckeditor/_source/lang/nb.js | 673 +++ .../ckeditor/_source/lang/nl.js | 673 +++ .../ckeditor/_source/lang/no.js | 673 +++ .../ckeditor/_source/lang/pl.js | 673 +++ .../ckeditor/_source/lang/pt-br.js | 673 +++ .../ckeditor/_source/lang/pt.js | 673 +++ .../ckeditor/_source/lang/ro.js | 673 +++ .../ckeditor/_source/lang/ru.js | 673 +++ .../ckeditor/_source/lang/sk.js | 673 +++ .../ckeditor/_source/lang/sl.js | 673 +++ .../ckeditor/_source/lang/sr-latn.js | 673 +++ .../ckeditor/_source/lang/sr.js | 673 +++ .../ckeditor/_source/lang/sv.js | 673 +++ .../ckeditor/_source/lang/th.js | 673 +++ .../ckeditor/_source/lang/tr.js | 673 +++ .../ckeditor/_source/lang/uk.js | 673 +++ .../ckeditor/_source/lang/vi.js | 673 +++ .../ckeditor/_source/lang/zh-cn.js | 673 +++ .../ckeditor/_source/lang/zh.js | 673 +++ .../_source/plugins/about/dialogs/about.js | 73 + .../plugins/about/dialogs/logo_ckeditor.png | Bin 0 -> 2759 bytes .../ckeditor/_source/plugins/about/plugin.js | 22 + .../_source/plugins/basicstyles/plugin.js | 50 + .../_source/plugins/blockquote/plugin.js | 301 ++ .../ckeditor/_source/plugins/button/plugin.js | 258 + .../plugins/clipboard/dialogs/paste.js | 154 + .../_source/plugins/clipboard/plugin.js | 208 + .../_source/plugins/colorbutton/plugin.js | 161 + .../_source/plugins/contextmenu/plugin.js | 178 + .../plugins/dialog/dialogDefinition.js | 315 ++ .../ckeditor/_source/plugins/dialog/plugin.js | 2689 ++++++++++ .../_source/plugins/dialogui/plugin.js | 1292 +++++ .../_source/plugins/domiterator/plugin.js | 316 ++ .../_source/plugins/editingblock/plugin.js | 225 + .../_source/plugins/elementspath/plugin.js | 182 + .../_source/plugins/enterkey/plugin.js | 323 ++ .../_source/plugins/entities/plugin.js | 152 + .../_source/plugins/filebrowser/plugin.js | 383 ++ .../_source/plugins/find/dialogs/find.js | 843 +++ .../ckeditor/_source/plugins/find/plugin.js | 35 + .../_source/plugins/flash/dialogs/flash.js | 678 +++ .../plugins/flash/images/placeholder.png | Bin 0 -> 256 bytes .../ckeditor/_source/plugins/flash/plugin.js | 165 + .../_source/plugins/floatpanel/plugin.js | 322 ++ .../ckeditor/_source/plugins/font/plugin.js | 152 + .../ckeditor/_source/plugins/format/plugin.js | 101 + .../_source/plugins/forms/dialogs/button.js | 135 + .../_source/plugins/forms/dialogs/checkbox.js | 138 + .../_source/plugins/forms/dialogs/form.js | 177 + .../plugins/forms/dialogs/hiddenfield.js | 91 + .../_source/plugins/forms/dialogs/radio.js | 135 + .../_source/plugins/forms/dialogs/select.js | 541 ++ .../_source/plugins/forms/dialogs/textarea.js | 114 + .../plugins/forms/dialogs/textfield.js | 193 + .../ckeditor/_source/plugins/forms/plugin.js | 193 + .../_source/plugins/horizontalrule/plugin.js | 35 + .../plugins/htmldataprocessor/plugin.js | 334 ++ .../_source/plugins/htmlwriter/plugin.js | 289 ++ .../_source/plugins/iframedialog/plugin.js | 136 + .../_source/plugins/image/dialogs/image.js | 1209 +++++ .../ckeditor/_source/plugins/image/plugin.js | 57 + .../ckeditor/_source/plugins/indent/plugin.js | 281 + .../_source/plugins/justify/plugin.js | 164 + .../_source/plugins/keystrokes/plugin.js | 188 + .../_source/plugins/link/dialogs/anchor.js | 98 + .../_source/plugins/link/dialogs/link.js | 1213 +++++ .../_source/plugins/link}/images/anchor.gif | Bin .../ckeditor/_source/plugins/link/plugin.js | 188 + .../ckeditor/_source/plugins/list/plugin.js | 536 ++ .../_source/plugins/listblock/plugin.js | 231 + .../_source/plugins/maximize/plugin.js | 267 + .../ckeditor/_source/plugins/menu/plugin.js | 351 ++ .../_source/plugins/menubutton/plugin.js | 93 + .../_source/plugins/newpage/plugin.js | 59 + .../plugins/pagebreak/images/pagebreak.gif} | Bin .../_source/plugins/pagebreak/plugin.js | 96 + .../ckeditor/_source/plugins/panel/plugin.js | 330 ++ .../_source/plugins/panelbutton/plugin.js | 140 + .../pastefromword/dialogs/pastefromword.js | 295 ++ .../_source/plugins/pastefromword/plugin.js | 27 + .../plugins/pastetext/dialogs/pastetext.js | 65 + .../_source/plugins/pastetext/plugin.js | 130 + .../ckeditor/_source/plugins/popup/plugin.js | 62 + .../_source/plugins/preview/plugin.js | 97 + .../ckeditor/_source/plugins/print/plugin.js | 41 + .../_source/plugins/removeformat/plugin.js | 119 + .../ckeditor/_source/plugins/resize/plugin.js | 76 + .../_source/plugins/richcombo/plugin.js | 357 ++ .../ckeditor/_source/plugins/save/plugin.js | 55 + .../_source/plugins/scayt/dialogs/options.js | 468 ++ .../_source/plugins/scayt/dialogs/toolbar.css | 71 + .../ckeditor/_source/plugins/scayt/plugin.js | 485 ++ .../_source/plugins/selection/plugin.js | 1061 ++++ .../showblocks}/images/block_address.png | Bin .../showblocks}/images/block_blockquote.png | Bin .../plugins/showblocks}/images/block_div.png | Bin .../plugins/showblocks}/images/block_h1.png | Bin .../plugins/showblocks}/images/block_h2.png | Bin .../plugins/showblocks}/images/block_h3.png | Bin .../plugins/showblocks}/images/block_h4.png | Bin .../plugins/showblocks}/images/block_h5.png | Bin .../plugins/showblocks}/images/block_h6.png | Bin .../plugins/showblocks}/images/block_p.png | Bin .../plugins/showblocks}/images/block_pre.png | Bin .../_source/plugins/showblocks/plugin.js | 145 + .../_source/plugins/smiley/dialogs/smiley.js | 219 + .../plugins/smiley/images/angel_smile.gif | Bin 0 -> 465 bytes .../plugins/smiley/images/angry_smile.gif | Bin 0 -> 443 bytes .../plugins/smiley/images/broken_heart.gif | Bin 0 -> 192 bytes .../plugins/smiley/images/confused_smile.gif | Bin 0 -> 464 bytes .../plugins/smiley/images/cry_smile.gif | Bin 0 -> 468 bytes .../plugins/smiley/images/devil_smile.gif | Bin 0 -> 436 bytes .../smiley/images/embaressed_smile.gif | Bin 0 -> 442 bytes .../plugins/smiley/images/envelope.gif | Bin 0 -> 426 bytes .../_source/plugins/smiley/images/heart.gif | Bin 0 -> 183 bytes .../_source/plugins/smiley/images/kiss.gif | Bin 0 -> 241 bytes .../plugins/smiley/images/lightbulb.gif | Bin 0 -> 368 bytes .../plugins/smiley/images/omg_smile.gif | Bin 0 -> 451 bytes .../plugins/smiley/images/regular_smile.gif | Bin 0 -> 450 bytes .../plugins/smiley/images/sad_smile.gif | Bin 0 -> 460 bytes .../plugins/smiley/images/shades_smile.gif | Bin 0 -> 449 bytes .../plugins/smiley/images/teeth_smile.gif | Bin 0 -> 442 bytes .../plugins/smiley/images/thumbs_down.gif | Bin 0 -> 408 bytes .../plugins/smiley/images/thumbs_up.gif | Bin 0 -> 396 bytes .../plugins/smiley/images/tounge_smile.gif | Bin 0 -> 446 bytes .../images/whatchutalkingabout_smile.gif | Bin 0 -> 452 bytes .../plugins/smiley/images/wink_smile.gif | Bin 0 -> 458 bytes .../ckeditor/_source/plugins/smiley/plugin.js | 31 + .../_source/plugins/sourcearea/plugin.js | 181 + .../specialchar/dialogs/specialchar.js | 362 ++ .../_source/plugins/specialchar/plugin.js | 29 + .../ckeditor/_source/plugins/styles/plugin.js | 1080 ++++ .../_source/plugins/stylescombo/plugin.js | 275 + .../plugins/stylescombo/styles/default.js | 85 + .../ckeditor/_source/plugins/tab/plugin.js | 266 + .../_source/plugins/table/dialogs/table.js | 550 ++ .../ckeditor/_source/plugins/table/plugin.js | 70 + .../plugins/tabletools/dialogs/tableCell.js | 330 ++ .../_source/plugins/tabletools/plugin.js | 693 +++ .../plugins/templates/dialogs/templates.js | 170 + .../_source/plugins/templates/plugin.js | 88 + .../plugins/templates/templates/default.js | 94 + .../templates/templates}/images/template1.gif | Bin .../templates/templates}/images/template2.gif | Bin .../templates/templates}/images/template3.gif | Bin .../_source/plugins/toolbar/plugin.js | 353 ++ .../plugins/uicolor/dialogs/uicolor.js | 199 + .../_source/plugins/uicolor/lang/en.js | 15 + .../_source/plugins/uicolor/plugin.js | 35 + .../_source/plugins/uicolor/uicolor.gif | Bin 0 -> 1108 bytes .../plugins/uicolor/yui/assets/hue_bg.png | Bin 0 -> 1120 bytes .../plugins/uicolor/yui/assets/hue_thumb.png | Bin 0 -> 195 bytes .../uicolor/yui/assets/picker_mask.png | Bin 0 -> 12174 bytes .../uicolor/yui/assets/picker_thumb.png | Bin 0 -> 192 bytes .../plugins/uicolor/yui/assets/yui.css | 15 + .../_source/plugins/uicolor/yui/yui.js | 71 + .../ckeditor/_source/plugins/undo/plugin.js | 484 ++ .../_source/plugins/wsc/dialogs/ciframe.html | 49 + .../plugins/wsc/dialogs/tmpFrameset.html | 51 + .../_source/plugins/wsc/dialogs/wsc.css | 83 + .../_source/plugins/wsc/dialogs/wsc.js | 169 + .../ckeditor/_source/plugins/wsc/plugin.js | 32 + .../_source/plugins/wysiwygarea/plugin.js | 612 +++ .../ckeditor/_source/skins/kama/dialog.css | 654 +++ .../ckeditor/_source/skins/kama/editor.css | 21 + .../_source/skins/kama/elementspath.css | 68 + .../ckeditor/_source/skins/kama/icons.css | 309 ++ .../ckeditor/_source/skins/kama/icons.png | Bin 0 -> 4365 bytes .../_source/skins/kama/images/arrowdown.gif} | Bin .../_source/skins/kama/images/arrowleft.gif | Bin 0 -> 47 bytes .../_source/skins/kama/images/arrowright.gif | Bin 0 -> 46 bytes .../_source/skins/kama/images/arrowtop.gif | Bin 0 -> 46 bytes .../skins/kama/images/dialog_sides.gif} | Bin .../skins/kama/images/dialog_sides.png} | Bin .../skins/kama/images/dialog_sides_rtl.png} | Bin .../_source/skins/kama/images/mini.gif | Bin 0 -> 183 bytes .../_source/skins/kama/images/noimage.png | Bin 0 -> 2115 bytes .../_source/skins/kama/images/resizer.gif | Bin 0 -> 65 bytes .../_source/skins/kama/images/resizer_rtl.gif | Bin 0 -> 66 bytes .../_source/skins/kama/images/sprites.png | Bin 0 -> 2121 bytes .../_source/skins/kama/images/sprites_ie6.png | Bin 0 -> 1511 bytes .../skins/kama/images/toolbar_start.gif} | Bin .../ckeditor/_source/skins/kama/mainui.css | 122 + .../ckeditor/_source/skins/kama/menu.css | 165 + .../ckeditor/_source/skins/kama/panel.css | 203 + .../ckeditor/_source/skins/kama/presets.css | 49 + .../ckeditor/_source/skins/kama/reset.css | 78 + .../ckeditor/_source/skins/kama/richcombo.css | 263 + .../ckeditor/_source/skins/kama/skin.js | 265 + .../ckeditor/_source/skins/kama/sprites.png | Bin 0 -> 6335 bytes .../ckeditor/_source/skins/kama/templates.css | 71 + .../ckeditor/_source/skins/kama/toolbar.css | 371 ++ .../_source/skins/office2003/dialog.css | 638 +++ .../_source/skins/office2003/editor.css | 21 + .../_source/skins/office2003/elementspath.css | 68 + .../_source/skins/office2003/icons.css | 309 ++ .../_source/skins/office2003/icons.png | Bin 0 -> 4365 bytes .../skins/office2003/images/arrowdown.gif} | Bin .../skins/office2003/images/arrowleft.gif | Bin 0 -> 47 bytes .../skins/office2003/images/arrowright.gif | Bin 0 -> 46 bytes .../skins/office2003/images/arrowtop.gif | Bin 0 -> 46 bytes .../skins/office2003/images/dialog_sides.gif | Bin 0 -> 48 bytes .../skins/office2003/images/dialog_sides.png | Bin 0 -> 178 bytes .../office2003/images/dialog_sides_rtl.png | Bin 0 -> 181 bytes .../_source/skins/office2003/images/mini.gif | Bin 0 -> 183 bytes .../skins/office2003/images/noimage.png | Bin 0 -> 2115 bytes .../skins/office2003/images/resizer.gif | Bin 0 -> 65 bytes .../skins/office2003/images/resizer_rtl.gif | Bin 0 -> 66 bytes .../skins/office2003/images/sprites.png | Bin 0 -> 4724 bytes .../skins/office2003/images/sprites_ie6.png | Bin 0 -> 2319 bytes .../_source/skins/office2003/mainui.css | 91 + .../_source/skins/office2003/menu.css | 166 + .../_source/skins/office2003/panel.css | 198 + .../_source/skins/office2003/presets.css | 49 + .../_source/skins/office2003/reset.css | 78 + .../_source/skins/office2003/richcombo.css | 265 + .../ckeditor/_source/skins/office2003/skin.js | 73 + .../_source/skins/office2003/templates.css | 71 + .../_source/skins/office2003/toolbar.css | 379 ++ .../ckeditor/_source/skins/v2/dialog.css | 650 +++ .../ckeditor/_source/skins/v2/editor.css | 21 + .../_source/skins/v2/elementspath.css | 68 + .../ckeditor/_source/skins/v2/icons.css | 309 ++ .../ckeditor/_source/skins/v2/icons.png | Bin 0 -> 4365 bytes .../_source/skins/v2/images/arrowdown.gif} | Bin .../_source/skins/v2/images/arrowleft.gif | Bin 0 -> 47 bytes .../_source/skins/v2/images/arrowright.gif | Bin 0 -> 46 bytes .../_source/skins/v2/images/arrowtop.gif | Bin 0 -> 46 bytes .../_source/skins/v2/images/dialog_sides.gif | Bin 0 -> 48 bytes .../_source/skins/v2/images/dialog_sides.png | Bin 0 -> 178 bytes .../skins/v2/images/dialog_sides_rtl.png | Bin 0 -> 181 bytes .../ckeditor/_source/skins/v2/images/mini.gif | Bin 0 -> 183 bytes .../_source/skins/v2/images/noimage.png | Bin 0 -> 2115 bytes .../_source/skins/v2/images/resizer.gif | Bin 0 -> 65 bytes .../_source/skins/v2/images/resizer_rtl.gif | Bin 0 -> 66 bytes .../_source/skins/v2/images/sprites.png | Bin 0 -> 2121 bytes .../_source/skins/v2/images/sprites_ie6.png | Bin 0 -> 299 bytes .../skins/v2/images/toolbar_start.gif} | Bin .../ckeditor/_source/skins/v2/mainui.css | 106 + .../ckeditor/_source/skins/v2/menu.css | 168 + .../ckeditor/_source/skins/v2/panel.css | 198 + .../ckeditor/_source/skins/v2/presets.css | 49 + .../ckeditor/_source/skins/v2/reset.css | 78 + .../ckeditor/_source/skins/v2/richcombo.css | 262 + .../ckeditor/_source/skins/v2/skin.js | 73 + .../ckeditor/_source/skins/v2/templates.css | 71 + .../ckeditor/_source/skins/v2/toolbar.css | 334 ++ .../ckeditor/_source/tests/_assets/sample.css | 4 + .../ckeditor/_source/tests/_assets/sample.js | 1 + .../ckeditor/_source/tests/_assets/sample.txt | 1 + .../ckeditor/_source/tests/_assets/sample.xml | 5 + .../_source/tests/_assets/sample_xml.txt | 5 + .../tests/core/_editor/custom_config_1.js | 10 + .../tests/core/_editor/custom_config_2.js | 9 + .../ckeditor/_source/tests/core/ajax.html | 163 + .../ckeditor/_source/tests/core/ckeditor.html | 146 + .../_source/tests/core/ckeditor2.html | 54 + .../_source/tests/core/dom/document.html | 125 + .../tests/core/dom/documentfragment.html | 292 ++ .../_source/tests/core/dom/element.html | 606 +++ .../ckeditor/_source/tests/core/dom/node.html | 137 + .../_source/tests/core/dom/range.html | 2396 +++++++++ .../ckeditor/_source/tests/core/dom/text.html | 128 + .../_source/tests/core/dom/walker.html | 340 ++ .../_source/tests/core/dom/window.html | 53 + .../ckeditor/_source/tests/core/editor.html | 103 + .../ckeditor/_source/tests/core/env.html | 52 + .../ckeditor/_source/tests/core/event.html | 487 ++ .../tests/core/htmlparser/fragment.html | 188 + .../tests/core/htmlparser/htmlparser.html | 91 + .../ckeditor/_source/tests/core/plugins.html | 44 + .../plugins/myplugins/sample/my_plugin.js | 3 + .../_source/tests/core/scriptloader.html | 52 + .../ckeditor/_source/tests/core/tools.html | 160 + .../ckeditor/_source/tests/core/xml.html | 150 + .../plugins/domiterator/domiterator.html | 236 + .../htmldataprocessor/htmldataprocessor.html | 260 + .../_source/tests/plugins/list/list.html | 284 + .../tests/plugins/selection/selection.html | 49 + .../_source/tests/plugins/styles/styles.html | 550 ++ .../ckeditor/_source/tests/test.css | 81 + .../ckeditor/_source/tests/test.js | 92 + .../ckeditor/_source/tests/testall.html | 100 + .../ckeditor/_source/tests/yuitest.js | 75 + .../ckeditor/_source/themes/default/theme.js | 198 + .../ckeditor/_tests/_assets/sample.css | 4 + .../ckeditor/_tests/_assets/sample.js | 1 + .../ckeditor/_tests/_assets/sample.txt | 1 + .../ckeditor/_tests/_assets/sample.xml | 5 + .../ckeditor/_tests/_assets/sample_xml.txt | 5 + .../_tests/core/_editor/custom_config_1.js | 10 + .../_tests/core/_editor/custom_config_2.js | 9 + .../ckeditor/_tests/core/ajax.html | 163 + .../ckeditor/_tests/core/ckeditor.html | 146 + .../ckeditor/_tests/core/ckeditor2.html | 54 + .../ckeditor/_tests/core/dom/document.html | 125 + .../_tests/core/dom/documentfragment.html | 292 ++ .../ckeditor/_tests/core/dom/element.html | 606 +++ .../ckeditor/_tests/core/dom/node.html | 137 + .../ckeditor/_tests/core/dom/range.html | 2396 +++++++++ .../ckeditor/_tests/core/dom/text.html | 128 + .../ckeditor/_tests/core/dom/walker.html | 340 ++ .../ckeditor/_tests/core/dom/window.html | 53 + .../ckeditor/_tests/core/editor.html | 103 + .../ckeditor/_tests/core/env.html | 52 + .../ckeditor/_tests/core/event.html | 487 ++ .../_tests/core/htmlparser/fragment.html | 188 + .../_tests/core/htmlparser/htmlparser.html | 91 + .../ckeditor/_tests/core/plugins.html | 44 + .../plugins/myplugins/sample/my_plugin.js | 3 + .../ckeditor/_tests/core/scriptloader.html | 52 + .../ckeditor/_tests/core/tools.html | 160 + .../ckeditor/_tests/core/xml.html | 150 + .../plugins/domiterator/domiterator.html | 236 + .../htmldataprocessor/htmldataprocessor.html | 260 + .../ckeditor/_tests/plugins/list/list.html | 284 + .../_tests/plugins/selection/selection.html | 49 + .../_tests/plugins/styles/styles.html | 550 ++ .../ckeditor/_tests/test.css | 81 + UI/WebServerResources/ckeditor/_tests/test.js | 92 + .../ckeditor/_tests/testall.html | 100 + .../ckeditor/_tests/yuitest.js | 75 + UI/WebServerResources/ckeditor/ckeditor.js | 107 + UI/WebServerResources/ckeditor/ckeditor.pack | 200 + .../ckeditor/ckeditor_basic.js | 8 + .../ckeditor/ckeditor_basic_source.js | 20 + .../ckeditor/ckeditor_source.js | 25 + UI/WebServerResources/ckeditor/config.js | 11 + UI/WebServerResources/ckeditor/contents.css | 27 + .../editor => ckeditor}/images/spacer.gif | Bin .../ckeditor/lang/_languages.js | 6 + .../ckeditor/lang/_translationstatus.txt | 59 + UI/WebServerResources/ckeditor/lang/af.js | 6 + UI/WebServerResources/ckeditor/lang/ar.js | 6 + UI/WebServerResources/ckeditor/lang/bg.js | 6 + UI/WebServerResources/ckeditor/lang/bn.js | 6 + UI/WebServerResources/ckeditor/lang/bs.js | 6 + UI/WebServerResources/ckeditor/lang/ca.js | 6 + UI/WebServerResources/ckeditor/lang/cs.js | 6 + UI/WebServerResources/ckeditor/lang/da.js | 6 + UI/WebServerResources/ckeditor/lang/de.js | 6 + UI/WebServerResources/ckeditor/lang/el.js | 6 + UI/WebServerResources/ckeditor/lang/en-au.js | 6 + UI/WebServerResources/ckeditor/lang/en-ca.js | 6 + UI/WebServerResources/ckeditor/lang/en-uk.js | 6 + UI/WebServerResources/ckeditor/lang/en.js | 6 + UI/WebServerResources/ckeditor/lang/eo.js | 6 + UI/WebServerResources/ckeditor/lang/es.js | 6 + UI/WebServerResources/ckeditor/lang/et.js | 6 + UI/WebServerResources/ckeditor/lang/eu.js | 6 + UI/WebServerResources/ckeditor/lang/fa.js | 6 + UI/WebServerResources/ckeditor/lang/fi.js | 6 + UI/WebServerResources/ckeditor/lang/fo.js | 6 + UI/WebServerResources/ckeditor/lang/fr-ca.js | 6 + UI/WebServerResources/ckeditor/lang/fr.js | 6 + UI/WebServerResources/ckeditor/lang/gl.js | 6 + UI/WebServerResources/ckeditor/lang/gu.js | 6 + UI/WebServerResources/ckeditor/lang/he.js | 6 + UI/WebServerResources/ckeditor/lang/hi.js | 6 + UI/WebServerResources/ckeditor/lang/hr.js | 6 + UI/WebServerResources/ckeditor/lang/hu.js | 6 + UI/WebServerResources/ckeditor/lang/is.js | 6 + UI/WebServerResources/ckeditor/lang/it.js | 6 + UI/WebServerResources/ckeditor/lang/ja.js | 6 + UI/WebServerResources/ckeditor/lang/km.js | 6 + UI/WebServerResources/ckeditor/lang/ko.js | 6 + UI/WebServerResources/ckeditor/lang/lt.js | 6 + UI/WebServerResources/ckeditor/lang/lv.js | 6 + UI/WebServerResources/ckeditor/lang/mn.js | 6 + UI/WebServerResources/ckeditor/lang/ms.js | 6 + UI/WebServerResources/ckeditor/lang/nb.js | 6 + UI/WebServerResources/ckeditor/lang/nl.js | 6 + UI/WebServerResources/ckeditor/lang/no.js | 6 + UI/WebServerResources/ckeditor/lang/pl.js | 6 + UI/WebServerResources/ckeditor/lang/pt-br.js | 6 + UI/WebServerResources/ckeditor/lang/pt.js | 6 + UI/WebServerResources/ckeditor/lang/ro.js | 6 + UI/WebServerResources/ckeditor/lang/ru.js | 6 + UI/WebServerResources/ckeditor/lang/sk.js | 6 + UI/WebServerResources/ckeditor/lang/sl.js | 6 + .../ckeditor/lang/sr-latn.js | 6 + UI/WebServerResources/ckeditor/lang/sr.js | 6 + UI/WebServerResources/ckeditor/lang/sv.js | 6 + UI/WebServerResources/ckeditor/lang/th.js | 6 + UI/WebServerResources/ckeditor/lang/tr.js | 6 + UI/WebServerResources/ckeditor/lang/uk.js | 6 + UI/WebServerResources/ckeditor/lang/vi.js | 6 + UI/WebServerResources/ckeditor/lang/zh-cn.js | 6 + UI/WebServerResources/ckeditor/lang/zh.js | 6 + .../ckeditor/plugins/about/dialogs/about.js | 6 + .../plugins/about/dialogs/logo_ckeditor.png | Bin 0 -> 2759 bytes .../ckeditor/plugins/about/plugin.js | 6 + .../ckeditor/plugins/basicstyles/plugin.js | 6 + .../ckeditor/plugins/blockquote/plugin.js | 7 + .../ckeditor/plugins/button/plugin.js | 7 + .../plugins/clipboard/dialogs/paste.js | 7 + .../ckeditor/plugins/clipboard/plugin.js | 6 + .../ckeditor/plugins/colorbutton/plugin.js | 7 + .../ckeditor/plugins/contextmenu/plugin.js | 6 + .../plugins/dialog/dialogDefinition.js | 4 + .../ckeditor/plugins/dialog/plugin.js | 16 + .../ckeditor/plugins/dialogui/plugin.js | 11 + .../ckeditor/plugins/domiterator/plugin.js | 7 + .../ckeditor/plugins/editingblock/plugin.js | 6 + .../ckeditor/plugins/elementspath/plugin.js | 6 + .../ckeditor/plugins/enterkey/plugin.js | 7 + .../ckeditor/plugins/entities/plugin.js | 6 + .../ckeditor/plugins/filebrowser/plugin.js | 7 + .../ckeditor/plugins/find/dialogs/find.js | 9 + .../ckeditor/plugins/find/plugin.js | 6 + .../ckeditor/plugins/flash/dialogs/flash.js | 9 + .../plugins/flash/images/placeholder.png | Bin 0 -> 256 bytes .../ckeditor/plugins/flash/plugin.js | 6 + .../ckeditor/plugins/floatpanel/plugin.js | 7 + .../ckeditor/plugins/font/plugin.js | 6 + .../ckeditor/plugins/format/plugin.js | 6 + .../ckeditor/plugins/forms/dialogs/button.js | 6 + .../plugins/forms/dialogs/checkbox.js | 6 + .../ckeditor/plugins/forms/dialogs/form.js | 6 + .../plugins/forms/dialogs/hiddenfield.js | 6 + .../ckeditor/plugins/forms/dialogs/radio.js | 6 + .../ckeditor/plugins/forms/dialogs/select.js | 9 + .../plugins/forms/dialogs/textarea.js | 6 + .../plugins/forms/dialogs/textfield.js | 6 + .../ckeditor/plugins/forms/plugin.js | 7 + .../ckeditor/plugins/horizontalrule/plugin.js | 6 + .../plugins/htmldataprocessor/plugin.js | 7 + .../ckeditor/plugins/htmlwriter/plugin.js | 6 + .../ckeditor/plugins/iframedialog/plugin.js | 6 + .../ckeditor/plugins/image/dialogs/image.js | 12 + .../ckeditor/plugins/image/plugin.js | 6 + .../ckeditor/plugins/indent/plugin.js | 7 + .../ckeditor/plugins/justify/plugin.js | 6 + .../ckeditor/plugins/keystrokes/plugin.js | 6 + .../ckeditor/plugins/link/dialogs/anchor.js | 6 + .../ckeditor/plugins/link/dialogs/link.js | 11 + .../plugins/link/images/anchor.gif} | Bin .../ckeditor/plugins/link/plugin.js | 6 + .../ckeditor/plugins/list/plugin.js | 8 + .../ckeditor/plugins/listblock/plugin.js | 7 + .../ckeditor/plugins/maximize/plugin.js | 7 + .../ckeditor/plugins/menu/plugin.js | 7 + .../ckeditor/plugins/menubutton/plugin.js | 6 + .../ckeditor/plugins/newpage/plugin.js | 6 + .../plugins/pagebreak/images/pagebreak.gif | Bin 0 -> 54 bytes .../ckeditor/plugins/pagebreak/plugin.js | 6 + .../ckeditor/plugins/panel/plugin.js | 7 + .../ckeditor/plugins/panelbutton/plugin.js | 6 + .../pastefromword/dialogs/pastefromword.js | 8 + .../ckeditor/plugins/pastefromword/plugin.js | 6 + .../plugins/pastetext/dialogs/pastetext.js | 6 + .../ckeditor/plugins/pastetext/plugin.js | 6 + .../ckeditor/plugins/popup/plugin.js | 6 + .../ckeditor/plugins/preview/plugin.js | 6 + .../ckeditor/plugins/print/plugin.js | 6 + .../ckeditor/plugins/removeformat/plugin.js | 6 + .../ckeditor/plugins/resize/plugin.js | 6 + .../ckeditor/plugins/richcombo/plugin.js | 7 + .../ckeditor/plugins/save/plugin.js | 6 + .../ckeditor/plugins/scayt/dialogs/options.js | 8 + .../plugins/scayt/dialogs/toolbar.css | 6 + .../ckeditor/plugins/scayt/plugin.js | 8 + .../ckeditor/plugins/selection/plugin.js | 9 + .../showblocks/images/block_address.png | Bin 0 -> 288 bytes .../showblocks/images/block_blockquote.png | Bin 0 -> 293 bytes .../plugins/showblocks/images/block_div.png | Bin 0 -> 229 bytes .../plugins/showblocks/images/block_h1.png | Bin 0 -> 218 bytes .../plugins/showblocks/images/block_h2.png | Bin 0 -> 220 bytes .../plugins/showblocks/images/block_h3.png | Bin 0 -> 219 bytes .../plugins/showblocks/images/block_h4.png | Bin 0 -> 229 bytes .../plugins/showblocks/images/block_h5.png | Bin 0 -> 236 bytes .../plugins/showblocks/images/block_h6.png | Bin 0 -> 216 bytes .../plugins/showblocks/images/block_p.png | Bin 0 -> 205 bytes .../plugins/showblocks/images/block_pre.png | Bin 0 -> 223 bytes .../ckeditor/plugins/showblocks/plugin.js | 6 + .../ckeditor/plugins/smiley/dialogs/smiley.js | 7 + .../plugins/smiley/images/angel_smile.gif | Bin 0 -> 465 bytes .../plugins/smiley/images/angry_smile.gif | Bin 0 -> 443 bytes .../plugins/smiley/images/broken_heart.gif | Bin 0 -> 192 bytes .../plugins/smiley/images/confused_smile.gif | Bin 0 -> 464 bytes .../plugins/smiley/images/cry_smile.gif | Bin 0 -> 468 bytes .../plugins/smiley/images/devil_smile.gif | Bin 0 -> 436 bytes .../smiley/images/embaressed_smile.gif | Bin 0 -> 442 bytes .../plugins/smiley/images/envelope.gif | Bin 0 -> 426 bytes .../ckeditor/plugins/smiley/images/heart.gif | Bin 0 -> 183 bytes .../ckeditor/plugins/smiley/images/kiss.gif | Bin 0 -> 241 bytes .../plugins/smiley/images/lightbulb.gif | Bin 0 -> 368 bytes .../plugins/smiley/images/omg_smile.gif | Bin 0 -> 451 bytes .../plugins/smiley/images/regular_smile.gif | Bin 0 -> 450 bytes .../plugins/smiley/images/sad_smile.gif | Bin 0 -> 460 bytes .../plugins/smiley/images/shades_smile.gif | Bin 0 -> 449 bytes .../plugins/smiley/images/teeth_smile.gif | Bin 0 -> 442 bytes .../plugins/smiley/images/thumbs_down.gif | Bin 0 -> 408 bytes .../plugins/smiley/images/thumbs_up.gif | Bin 0 -> 396 bytes .../plugins/smiley/images/tounge_smile.gif | Bin 0 -> 446 bytes .../images/whatchutalkingabout_smile.gif | Bin 0 -> 452 bytes .../plugins/smiley/images/wink_smile.gif | Bin 0 -> 458 bytes .../ckeditor/plugins/smiley/plugin.js | 6 + .../ckeditor/plugins/sourcearea/plugin.js | 6 + .../specialchar/dialogs/specialchar.js | 7 + .../ckeditor/plugins/specialchar/plugin.js | 6 + .../ckeditor/plugins/styles/plugin.js | 9 + .../ckeditor/plugins/stylescombo/plugin.js | 7 + .../plugins/stylescombo/styles/default.js | 6 + .../ckeditor/plugins/tab/plugin.js | 6 + .../ckeditor/plugins/table/dialogs/table.js | 8 + .../ckeditor/plugins/table/plugin.js | 6 + .../plugins/tabletools/dialogs/tableCell.js | 7 + .../ckeditor/plugins/tabletools/plugin.js | 8 + .../plugins/templates/dialogs/templates.js | 6 + .../ckeditor/plugins/templates/plugin.js | 6 + .../plugins/templates/templates/default.js | 6 + .../templates/templates/images/template1.gif | Bin 0 -> 375 bytes .../templates/templates/images/template2.gif | Bin 0 -> 333 bytes .../templates/templates/images/template3.gif | Bin 0 -> 422 bytes .../ckeditor/plugins/toolbar/plugin.js | 7 + .../plugins/uicolor/dialogs/uicolor.js | 7 + .../ckeditor/plugins/uicolor/lang/en.js | 6 + .../ckeditor/plugins/uicolor/plugin.js | 6 + .../ckeditor/plugins/uicolor/uicolor.gif | Bin 0 -> 1108 bytes .../plugins/uicolor/yui/assets/hue_bg.png | Bin 0 -> 1120 bytes .../plugins/uicolor/yui/assets/hue_thumb.png | Bin 0 -> 195 bytes .../uicolor/yui/assets/picker_mask.png | Bin 0 -> 12174 bytes .../uicolor/yui/assets/picker_thumb.png | Bin 0 -> 192 bytes .../plugins/uicolor/yui/assets/yui.css | 6 + .../ckeditor/plugins/uicolor/yui/yui.js | 76 + .../ckeditor/plugins/undo/plugin.js | 7 + .../ckeditor/plugins/wsc/dialogs/ciframe.html | 49 + .../plugins/wsc/dialogs/tmpFrameset.html | 51 + .../ckeditor/plugins/wsc/dialogs/wsc.css | 6 + .../ckeditor/plugins/wsc/dialogs/wsc.js | 7 + .../ckeditor/plugins/wsc/plugin.js | 6 + .../ckeditor/plugins/wysiwygarea/plugin.js | 8 + .../ckeditor/skins/kama/dialog.css | 8 + .../ckeditor/skins/kama/editor.css | 11 + .../ckeditor/skins/kama/icons.png | Bin 0 -> 4365 bytes .../ckeditor/skins/kama/images/arrowdown.gif | Bin 0 -> 46 bytes .../ckeditor/skins/kama/images/arrowleft.gif | Bin 0 -> 47 bytes .../ckeditor/skins/kama/images/arrowright.gif | Bin 0 -> 46 bytes .../ckeditor/skins/kama/images/arrowtop.gif | Bin 0 -> 46 bytes .../skins/kama/images/dialog_sides.gif | Bin 0 -> 48 bytes .../skins/kama/images/dialog_sides.png | Bin 0 -> 178 bytes .../skins/kama/images/dialog_sides_rtl.png | Bin 0 -> 181 bytes .../ckeditor/skins/kama/images/mini.gif | Bin 0 -> 183 bytes .../ckeditor/skins/kama/images/noimage.png | Bin 0 -> 2115 bytes .../ckeditor/skins/kama/images/resizer.gif | Bin 0 -> 65 bytes .../skins/kama/images/resizer_rtl.gif | Bin 0 -> 66 bytes .../ckeditor/skins/kama/images/sprites.png | Bin 0 -> 2121 bytes .../skins/kama/images/sprites_ie6.png | Bin 0 -> 1511 bytes .../skins/kama/images/toolbar_start.gif | Bin 0 -> 105 bytes .../ckeditor/skins/kama/skin.js | 7 + .../ckeditor/skins/kama/sprites.png | Bin 0 -> 6335 bytes .../ckeditor/skins/kama/templates.css | 6 + .../ckeditor/skins/office2003/dialog.css | 8 + .../ckeditor/skins/office2003/editor.css | 12 + .../ckeditor/skins/office2003/icons.png | Bin 0 -> 4365 bytes .../skins/office2003/images/arrowdown.gif | Bin 0 -> 46 bytes .../skins/office2003/images/arrowleft.gif | Bin 0 -> 47 bytes .../skins/office2003/images/arrowright.gif | Bin 0 -> 46 bytes .../skins/office2003/images/arrowtop.gif | Bin 0 -> 46 bytes .../skins/office2003/images/dialog_sides.gif | Bin 0 -> 48 bytes .../skins/office2003/images/dialog_sides.png | Bin 0 -> 178 bytes .../office2003/images/dialog_sides_rtl.png | Bin 0 -> 181 bytes .../ckeditor/skins/office2003/images/mini.gif | Bin 0 -> 183 bytes .../skins/office2003/images/noimage.png | Bin 0 -> 2115 bytes .../skins/office2003/images/resizer.gif | Bin 0 -> 65 bytes .../skins/office2003/images/resizer_rtl.gif | Bin 0 -> 66 bytes .../skins/office2003/images/sprites.png | Bin 0 -> 4724 bytes .../skins/office2003/images/sprites_ie6.png | Bin 0 -> 2319 bytes .../ckeditor/skins/office2003/skin.js | 6 + .../ckeditor/skins/office2003/templates.css | 6 + .../ckeditor/skins/v2/dialog.css | 8 + .../ckeditor/skins/v2/editor.css | 11 + .../ckeditor/skins/v2/icons.png | Bin 0 -> 4365 bytes .../ckeditor/skins/v2/images/arrowdown.gif | Bin 0 -> 46 bytes .../ckeditor/skins/v2/images/arrowleft.gif | Bin 0 -> 47 bytes .../ckeditor/skins/v2/images/arrowright.gif | Bin 0 -> 46 bytes .../ckeditor/skins/v2/images/arrowtop.gif | Bin 0 -> 46 bytes .../ckeditor/skins/v2/images/dialog_sides.gif | Bin 0 -> 48 bytes .../ckeditor/skins/v2/images/dialog_sides.png | Bin 0 -> 178 bytes .../skins/v2/images/dialog_sides_rtl.png | Bin 0 -> 181 bytes .../ckeditor/skins/v2/images/mini.gif | Bin 0 -> 183 bytes .../ckeditor/skins/v2/images/noimage.png | Bin 0 -> 2115 bytes .../ckeditor/skins/v2/images/resizer.gif | Bin 0 -> 65 bytes .../ckeditor/skins/v2/images/resizer_rtl.gif | Bin 0 -> 66 bytes .../ckeditor/skins/v2/images/sprites.png | Bin 0 -> 2121 bytes .../ckeditor/skins/v2/images/sprites_ie6.png | Bin 0 -> 299 bytes .../skins/v2/images/toolbar_start.gif | Bin 0 -> 105 bytes .../ckeditor/skins/v2/skin.js | 6 + .../ckeditor/skins/v2/templates.css | 6 + .../ckeditor/themes/default/theme.js | 7 + .../editor/_source/classes/fckcontextmenu.js | 223 - .../_source/classes/fckdataprocessor.js | 119 - .../classes/fckdocumentfragment_gecko.js | 53 - .../_source/classes/fckdocumentfragment_ie.js | 58 - .../editor/_source/classes/fckdomrange.js | 935 ---- .../_source/classes/fckdomrange_gecko.js | 104 - .../editor/_source/classes/fckdomrange_ie.js | 199 - .../_source/classes/fckdomrangeiterator.js | 327 -- .../editor/_source/classes/fckeditingarea.js | 368 -- .../editor/_source/classes/fckelementpath.js | 89 - .../editor/_source/classes/fckenterkey.js | 708 --- .../editor/_source/classes/fckevents.js | 71 - .../editor/_source/classes/fckhtmliterator.js | 142 - .../editor/_source/classes/fckicon.js | 103 - .../editor/_source/classes/fckiecleanup.js | 68 - .../_source/classes/fckimagepreloader.js | 64 - .../_source/classes/fckkeystrokehandler.js | 141 - .../editor/_source/classes/fckmenublock.js | 153 - .../_source/classes/fckmenublockpanel.js | 54 - .../editor/_source/classes/fckmenuitem.js | 161 - .../editor/_source/classes/fckpanel.js | 463 -- .../editor/_source/classes/fckplugin.js | 56 - .../editor/_source/classes/fckspecialcombo.js | 376 -- .../editor/_source/classes/fckstyle.js | 1500 ------ .../editor/_source/classes/fcktoolbar.js | 103 - .../_source/classes/fcktoolbarbreak_gecko.js | 36 - .../_source/classes/fcktoolbarbreak_ie.js | 38 - .../_source/classes/fcktoolbarbutton.js | 81 - .../_source/classes/fcktoolbarbuttonui.js | 198 - .../classes/fcktoolbarfontformatcombo.js | 139 - .../_source/classes/fcktoolbarfontscombo.js | 98 - .../classes/fcktoolbarfontsizecombo.js | 76 - .../_source/classes/fcktoolbarpanelbutton.js | 103 - .../_source/classes/fcktoolbarspecialcombo.js | 146 - .../_source/classes/fcktoolbarstylecombo.js | 200 - .../editor/_source/classes/fckw3crange.js | 451 -- .../editor/_source/classes/fckxml.js | 108 - .../editor/_source/classes/fckxml_gecko.js | 106 - .../editor/_source/classes/fckxml_ie.js | 93 - .../commandclasses/fck_othercommands.js | 634 --- .../commandclasses/fckblockquotecommand.js | 281 - .../commandclasses/fckcorestylecommand.js | 61 - .../_source/commandclasses/fckfitwindow.js | 213 - .../commandclasses/fckindentcommands.js | 282 - .../commandclasses/fckjustifycommands.js | 173 - .../_source/commandclasses/fcklistcommands.js | 382 -- .../_source/commandclasses/fcknamedcommand.js | 39 - .../fckpasteplaintextcommand.js | 40 - .../commandclasses/fckpastewordcommand.js | 40 - .../commandclasses/fckremoveformatcommand.js | 45 - .../_source/commandclasses/fckshowblocks.js | 94 - .../fckspellcheckcommand_gecko.js | 49 - .../commandclasses/fckspellcheckcommand_ie.js | 72 - .../_source/commandclasses/fckstylecommand.js | 60 - .../_source/commandclasses/fcktablecommand.js | 106 - .../commandclasses/fcktextcolorcommand.js | 201 - .../fckeditor/editor/_source/fckconstants.js | 56 - .../fckeditor/editor/_source/fckeditorapi.js | 179 - .../editor/_source/fckjscoreextensions.js | 159 - .../editor/_source/fckscriptloader.js | 122 - .../fckeditor/editor/_source/internals/fck.js | 1256 ----- .../_source/internals/fck_contextmenu.js | 345 -- .../editor/_source/internals/fck_gecko.js | 497 -- .../editor/_source/internals/fck_ie.js | 456 -- .../_source/internals/fckbrowserinfo.js | 61 - .../_source/internals/fckcodeformatter.js | 100 - .../editor/_source/internals/fckcommands.js | 172 - .../editor/_source/internals/fckconfig.js | 237 - .../editor/_source/internals/fckdebug.js | 59 - .../_source/internals/fckdebug_empty.js | 31 - .../editor/_source/internals/fckdialog.js | 239 - .../_source/internals/fckdocumentprocessor.js | 270 - .../editor/_source/internals/fckdomtools.js | 1057 ---- .../_source/internals/fcklanguagemanager.js | 165 - .../_source/internals/fcklisthandler.js | 152 - .../editor/_source/internals/fcklistslib.js | 63 - .../editor/_source/internals/fckplugins.js | 46 - .../editor/_source/internals/fckregexlib.js | 100 - .../editor/_source/internals/fckselection.js | 42 - .../_source/internals/fckselection_gecko.js | 228 - .../_source/internals/fckselection_ie.js | 287 -- .../editor/_source/internals/fckstyles.js | 381 -- .../_source/internals/fcktablehandler.js | 863 ---- .../internals/fcktablehandler_gecko.js | 56 - .../_source/internals/fcktablehandler_ie.js | 64 - .../_source/internals/fcktoolbaritems.js | 124 - .../editor/_source/internals/fcktoolbarset.js | 399 -- .../editor/_source/internals/fcktools.js | 749 --- .../_source/internals/fcktools_gecko.js | 282 - .../editor/_source/internals/fcktools_ie.js | 234 - .../editor/_source/internals/fckundo.js | 223 - .../editor/_source/internals/fckurlparams.js | 39 - .../editor/_source/internals/fckxhtml.js | 534 -- .../_source/internals/fckxhtml_gecko.js | 114 - .../editor/_source/internals/fckxhtml_ie.js | 213 - .../_source/internals/fckxhtmlentities.js | 357 -- .../editor/css/behaviors/disablehandles.htc | 15 - .../editor/css/behaviors/showtableborders.htc | 36 - .../fckeditor/editor/css/fck_editorarea.css | 114 - .../fckeditor/editor/css/fck_internal.css | 199 - .../editor/css/fck_showtableborders_gecko.css | 49 - .../editor/css/images/fck_flashlogo.gif | Bin 599 -> 0 bytes .../editor/css/images/fck_hiddenfield.gif | Bin 105 -> 0 bytes .../editor/css/images/fck_plugin.gif | Bin 1709 -> 0 bytes .../dialog/common/fck_dialog_common.css | 85 - .../editor/dialog/common/fck_dialog_common.js | 347 -- .../editor/dialog/common/images/locked.gif | Bin 74 -> 0 bytes .../editor/dialog/common/images/reset.gif | Bin 104 -> 0 bytes .../editor/dialog/common/images/unlocked.gif | Bin 75 -> 0 bytes .../fckeditor/editor/dialog/fck_about.html | 161 - .../dialog/fck_about/logo_fckeditor.gif | Bin 2044 -> 0 bytes .../editor/dialog/fck_about/logo_fredck.gif | Bin 920 -> 0 bytes .../fck_about/sponsors/spellchecker_net.gif | Bin 1447 -> 0 bytes .../fckeditor/editor/dialog/fck_anchor.html | 220 - .../fckeditor/editor/dialog/fck_button.html | 104 - .../fckeditor/editor/dialog/fck_checkbox.html | 104 - .../editor/dialog/fck_colorselector.html | 172 - .../fckeditor/editor/dialog/fck_div.html | 396 -- .../fckeditor/editor/dialog/fck_docprops.html | 600 --- .../fck_docprops/fck_document_preview.html | 113 - .../fckeditor/editor/dialog/fck_flash.html | 152 - .../editor/dialog/fck_flash/fck_flash.js | 300 -- .../dialog/fck_flash/fck_flash_preview.html | 50 - .../fckeditor/editor/dialog/fck_form.html | 109 - .../editor/dialog/fck_hiddenfield.html | 115 - .../fckeditor/editor/dialog/fck_image.html | 258 - .../editor/dialog/fck_image/fck_image.js | 512 -- .../dialog/fck_image/fck_image_preview.html | 72 - .../fckeditor/editor/dialog/fck_link.html | 295 -- .../editor/dialog/fck_link/fck_link.js | 893 ---- .../fckeditor/editor/dialog/fck_listprop.html | 120 - .../fckeditor/editor/dialog/fck_paste.html | 347 -- .../editor/dialog/fck_radiobutton.html | 104 - .../fckeditor/editor/dialog/fck_replace.html | 650 --- .../fckeditor/editor/dialog/fck_select.html | 180 - .../editor/dialog/fck_select/fck_select.js | 194 - .../fckeditor/editor/dialog/fck_smiley.html | 111 - .../fckeditor/editor/dialog/fck_source.html | 68 - .../editor/dialog/fck_specialchar.html | 121 - .../editor/dialog/fck_spellerpages.html | 70 - .../fck_spellerpages/spellerpages/blank.html | 0 .../spellerpages/controlWindow.js | 87 - .../spellerpages/controls.html | 153 - .../server-scripts/spellchecker.cfm | 148 - .../server-scripts/spellchecker.php | 199 - .../server-scripts/spellchecker.pl | 181 - .../spellerpages/spellChecker.js | 461 -- .../spellerpages/spellchecker.html | 71 - .../spellerpages/spellerStyle.css | 49 - .../spellerpages/wordWindow.js | 272 - .../fckeditor/editor/dialog/fck_table.html | 439 -- .../editor/dialog/fck_tablecell.html | 293 -- .../fckeditor/editor/dialog/fck_template.html | 242 - .../fckeditor/editor/dialog/fck_textarea.html | 94 - .../editor/dialog/fck_textfield.html | 136 - .../fckeditor/editor/dtd/fck_dtd_test.html | 41 - .../fckeditor/editor/dtd/fck_xhtml10strict.js | 116 - .../editor/dtd/fck_xhtml10transitional.js | 140 - .../fckeditor/editor/fckdebug.html | 153 - .../fckeditor/editor/fckdialog.html | 819 --- .../fckeditor/editor/fckeditor.html | 317 -- .../fckeditor/editor/fckeditor.original.html | 424 -- .../filemanager/browser/default/browser.css | 87 - .../filemanager/browser/default/browser.html | 200 - .../browser/default/frmactualfolder.html | 95 - .../browser/default/frmcreatefolder.html | 114 - .../browser/default/frmfolders.html | 198 - .../browser/default/frmresourceslist.html | 169 - .../browser/default/frmresourcetype.html | 69 - .../browser/default/frmupload.html | 115 - .../browser/default/images/ButtonArrow.gif | Bin 138 -> 0 bytes .../browser/default/images/Folder.gif | Bin 128 -> 0 bytes .../browser/default/images/Folder32.gif | Bin 281 -> 0 bytes .../browser/default/images/FolderOpened.gif | Bin 132 -> 0 bytes .../browser/default/images/FolderOpened32.gif | Bin 264 -> 0 bytes .../browser/default/images/FolderUp.gif | Bin 132 -> 0 bytes .../browser/default/images/icons/32/ai.gif | Bin 1140 -> 0 bytes .../browser/default/images/icons/32/avi.gif | Bin 454 -> 0 bytes .../browser/default/images/icons/32/bmp.gif | Bin 709 -> 0 bytes .../browser/default/images/icons/32/cs.gif | Bin 224 -> 0 bytes .../default/images/icons/32/default.icon.gif | Bin 177 -> 0 bytes .../browser/default/images/icons/32/dll.gif | Bin 258 -> 0 bytes .../browser/default/images/icons/32/doc.gif | Bin 260 -> 0 bytes .../browser/default/images/icons/32/exe.gif | Bin 170 -> 0 bytes .../browser/default/images/icons/32/fla.gif | Bin 946 -> 0 bytes .../browser/default/images/icons/32/gif.gif | Bin 704 -> 0 bytes .../browser/default/images/icons/32/htm.gif | Bin 1527 -> 0 bytes .../browser/default/images/icons/32/html.gif | Bin 1527 -> 0 bytes .../browser/default/images/icons/32/jpg.gif | Bin 463 -> 0 bytes .../browser/default/images/icons/32/js.gif | Bin 274 -> 0 bytes .../browser/default/images/icons/32/mdb.gif | Bin 274 -> 0 bytes .../browser/default/images/icons/32/mp3.gif | Bin 454 -> 0 bytes .../browser/default/images/icons/32/pdf.gif | Bin 567 -> 0 bytes .../browser/default/images/icons/32/png.gif | Bin 464 -> 0 bytes .../browser/default/images/icons/32/ppt.gif | Bin 254 -> 0 bytes .../browser/default/images/icons/32/rdp.gif | Bin 1493 -> 0 bytes .../browser/default/images/icons/32/swf.gif | Bin 725 -> 0 bytes .../browser/default/images/icons/32/swt.gif | Bin 724 -> 0 bytes .../browser/default/images/icons/32/txt.gif | Bin 213 -> 0 bytes .../browser/default/images/icons/32/vsd.gif | Bin 277 -> 0 bytes .../browser/default/images/icons/32/xls.gif | Bin 271 -> 0 bytes .../browser/default/images/icons/32/xml.gif | Bin 408 -> 0 bytes .../browser/default/images/icons/32/zip.gif | Bin 368 -> 0 bytes .../browser/default/images/icons/ai.gif | Bin 403 -> 0 bytes .../browser/default/images/icons/avi.gif | Bin 249 -> 0 bytes .../browser/default/images/icons/bmp.gif | Bin 126 -> 0 bytes .../browser/default/images/icons/cs.gif | Bin 128 -> 0 bytes .../default/images/icons/default.icon.gif | Bin 113 -> 0 bytes .../browser/default/images/icons/dll.gif | Bin 132 -> 0 bytes .../browser/default/images/icons/doc.gif | Bin 140 -> 0 bytes .../browser/default/images/icons/exe.gif | Bin 109 -> 0 bytes .../browser/default/images/icons/fla.gif | Bin 382 -> 0 bytes .../browser/default/images/icons/gif.gif | Bin 125 -> 0 bytes .../browser/default/images/icons/htm.gif | Bin 621 -> 0 bytes .../browser/default/images/icons/html.gif | Bin 621 -> 0 bytes .../browser/default/images/icons/jpg.gif | Bin 125 -> 0 bytes .../browser/default/images/icons/js.gif | Bin 139 -> 0 bytes .../browser/default/images/icons/mdb.gif | Bin 146 -> 0 bytes .../browser/default/images/icons/mp3.gif | Bin 249 -> 0 bytes .../browser/default/images/icons/pdf.gif | Bin 230 -> 0 bytes .../browser/default/images/icons/png.gif | Bin 125 -> 0 bytes .../browser/default/images/icons/ppt.gif | Bin 139 -> 0 bytes .../browser/default/images/icons/rdp.gif | Bin 606 -> 0 bytes .../browser/default/images/icons/swf.gif | Bin 388 -> 0 bytes .../browser/default/images/icons/swt.gif | Bin 388 -> 0 bytes .../browser/default/images/icons/txt.gif | Bin 122 -> 0 bytes .../browser/default/images/icons/vsd.gif | Bin 136 -> 0 bytes .../browser/default/images/icons/xls.gif | Bin 138 -> 0 bytes .../browser/default/images/icons/xml.gif | Bin 231 -> 0 bytes .../browser/default/images/icons/zip.gif | Bin 235 -> 0 bytes .../browser/default/images/spacer.gif | Bin 43 -> 0 bytes .../filemanager/browser/default/js/common.js | 88 - .../filemanager/browser/default/js/fckxml.js | 147 - .../filemanager/connectors/asp/basexml.asp | 63 - .../connectors/asp/class_upload.asp | 353 -- .../filemanager/connectors/asp/commands.asp | 198 - .../filemanager/connectors/asp/config.asp | 128 - .../filemanager/connectors/asp/connector.asp | 88 - .../editor/filemanager/connectors/asp/io.asp | 237 - .../filemanager/connectors/asp/upload.asp | 65 - .../filemanager/connectors/asp/util.asp | 55 - .../filemanager/connectors/aspx/config.ascx | 98 - .../connectors/aspx/connector.aspx | 32 - .../filemanager/connectors/aspx/upload.aspx | 32 - .../connectors/cfm/ImageObject.cfc | 273 - .../connectors/cfm/cf5_connector.cfm | 315 -- .../filemanager/connectors/cfm/cf5_upload.cfm | 299 -- .../filemanager/connectors/cfm/cf_basexml.cfm | 68 - .../connectors/cfm/cf_commands.cfm | 230 - .../connectors/cfm/cf_connector.cfm | 89 - .../filemanager/connectors/cfm/cf_io.cfm | 291 -- .../filemanager/connectors/cfm/cf_upload.cfm | 72 - .../filemanager/connectors/cfm/cf_util.cfm | 131 - .../filemanager/connectors/cfm/config.cfm | 189 - .../filemanager/connectors/cfm/connector.cfm | 32 - .../filemanager/connectors/cfm/image.cfc | 1324 ----- .../filemanager/connectors/cfm/upload.cfm | 31 - .../filemanager/connectors/lasso/config.lasso | 65 - .../connectors/lasso/connector.lasso | 322 -- .../filemanager/connectors/lasso/upload.lasso | 168 - .../filemanager/connectors/perl/basexml.pl | 63 - .../filemanager/connectors/perl/commands.pl | 187 - .../filemanager/connectors/perl/connector.cgi | 136 - .../editor/filemanager/connectors/perl/io.pl | 141 - .../filemanager/connectors/perl/upload.cgi | 117 - .../filemanager/connectors/perl/upload_fck.pl | 686 --- .../filemanager/connectors/perl/util.pl | 68 - .../filemanager/connectors/php/basexml.php | 93 - .../filemanager/connectors/php/commands.php | 273 - .../filemanager/connectors/php/config.php | 151 - .../filemanager/connectors/php/connector.php | 87 - .../editor/filemanager/connectors/php/io.php | 295 -- .../filemanager/connectors/php/phpcompat.php | 17 - .../filemanager/connectors/php/upload.php | 59 - .../filemanager/connectors/php/util.php | 220 - .../filemanager/connectors/py/config.py | 146 - .../filemanager/connectors/py/connector.py | 118 - .../filemanager/connectors/py/fckcommands.py | 198 - .../filemanager/connectors/py/fckconnector.py | 90 - .../filemanager/connectors/py/fckoutput.py | 116 - .../filemanager/connectors/py/fckutil.py | 126 - .../filemanager/connectors/py/htaccess.txt | 23 - .../filemanager/connectors/py/upload.py | 88 - .../editor/filemanager/connectors/py/wsgi.py | 58 - .../editor/filemanager/connectors/py/zope.py | 188 - .../editor/filemanager/connectors/test.html | 210 - .../filemanager/connectors/uploadtest.html | 192 - .../fckeditor/editor/images/arrow_ltr.gif | Bin 49 -> 0 bytes .../fckeditor/editor/images/arrow_rtl.gif | Bin 49 -> 0 bytes .../editor/images/smiley/msn/angel_smile.gif | Bin 445 -> 0 bytes .../editor/images/smiley/msn/angry_smile.gif | Bin 453 -> 0 bytes .../editor/images/smiley/msn/broken_heart.gif | Bin 423 -> 0 bytes .../editor/images/smiley/msn/cake.gif | Bin 453 -> 0 bytes .../images/smiley/msn/confused_smile.gif | Bin 322 -> 0 bytes .../editor/images/smiley/msn/cry_smile.gif | Bin 473 -> 0 bytes .../editor/images/smiley/msn/devil_smile.gif | Bin 444 -> 0 bytes .../images/smiley/msn/embaressed_smile.gif | Bin 1077 -> 0 bytes .../editor/images/smiley/msn/envelope.gif | Bin 1030 -> 0 bytes .../editor/images/smiley/msn/heart.gif | Bin 1012 -> 0 bytes .../editor/images/smiley/msn/kiss.gif | Bin 978 -> 0 bytes .../editor/images/smiley/msn/lightbulb.gif | Bin 303 -> 0 bytes .../editor/images/smiley/msn/omg_smile.gif | Bin 342 -> 0 bytes .../images/smiley/msn/regular_smile.gif | Bin 1036 -> 0 bytes .../editor/images/smiley/msn/sad_smile.gif | Bin 1039 -> 0 bytes .../editor/images/smiley/msn/shades_smile.gif | Bin 1059 -> 0 bytes .../editor/images/smiley/msn/teeth_smile.gif | Bin 1064 -> 0 bytes .../editor/images/smiley/msn/thumbs_down.gif | Bin 992 -> 0 bytes .../editor/images/smiley/msn/thumbs_up.gif | Bin 989 -> 0 bytes .../editor/images/smiley/msn/tounge_smile.gif | Bin 1055 -> 0 bytes .../smiley/msn/whatchutalkingabout_smile.gif | Bin 1034 -> 0 bytes .../editor/images/smiley/msn/wink_smile.gif | Bin 1041 -> 0 bytes .../fckeditor/editor/js/fckadobeair.js | 176 - .../editor/js/fckeditorcode_gecko.js | 108 - .../fckeditor/editor/js/fckeditorcode_ie.js | 109 - .../editor/lang/_translationstatus.txt | 79 - .../fckeditor/editor/lang/af.js | 534 -- .../fckeditor/editor/lang/ar.js | 534 -- .../fckeditor/editor/lang/bg.js | 534 -- .../fckeditor/editor/lang/bn.js | 534 -- .../fckeditor/editor/lang/bs.js | 534 -- .../fckeditor/editor/lang/ca.js | 534 -- .../fckeditor/editor/lang/cs.js | 534 -- .../fckeditor/editor/lang/da.js | 534 -- .../fckeditor/editor/lang/de.js | 534 -- .../fckeditor/editor/lang/el.js | 534 -- .../fckeditor/editor/lang/en-au.js | 534 -- .../fckeditor/editor/lang/en-ca.js | 534 -- .../fckeditor/editor/lang/en-uk.js | 534 -- .../fckeditor/editor/lang/en.js | 534 -- .../fckeditor/editor/lang/eo.js | 534 -- .../fckeditor/editor/lang/es.js | 534 -- .../fckeditor/editor/lang/et.js | 534 -- .../fckeditor/editor/lang/eu.js | 535 -- .../fckeditor/editor/lang/fa.js | 534 -- .../fckeditor/editor/lang/fi.js | 534 -- .../fckeditor/editor/lang/fo.js | 534 -- .../fckeditor/editor/lang/fr-ca.js | 534 -- .../fckeditor/editor/lang/fr.js | 534 -- .../fckeditor/editor/lang/gl.js | 534 -- .../fckeditor/editor/lang/gu.js | 534 -- .../fckeditor/editor/lang/he.js | 534 -- .../fckeditor/editor/lang/hi.js | 534 -- .../fckeditor/editor/lang/hr.js | 534 -- .../fckeditor/editor/lang/hu.js | 534 -- .../fckeditor/editor/lang/is.js | 534 -- .../fckeditor/editor/lang/it.js | 534 -- .../fckeditor/editor/lang/ja.js | 534 -- .../fckeditor/editor/lang/km.js | 534 -- .../fckeditor/editor/lang/ko.js | 534 -- .../fckeditor/editor/lang/lt.js | 534 -- .../fckeditor/editor/lang/lv.js | 534 -- .../fckeditor/editor/lang/mn.js | 534 -- .../fckeditor/editor/lang/ms.js | 534 -- .../fckeditor/editor/lang/nb.js | 534 -- .../fckeditor/editor/lang/nl.js | 534 -- .../fckeditor/editor/lang/no.js | 534 -- .../fckeditor/editor/lang/pl.js | 534 -- .../fckeditor/editor/lang/pt-br.js | 534 -- .../fckeditor/editor/lang/pt.js | 534 -- .../fckeditor/editor/lang/ro.js | 534 -- .../fckeditor/editor/lang/ru.js | 534 -- .../fckeditor/editor/lang/sk.js | 534 -- .../fckeditor/editor/lang/sl.js | 534 -- .../fckeditor/editor/lang/sr-latn.js | 534 -- .../fckeditor/editor/lang/sr.js | 534 -- .../fckeditor/editor/lang/sv.js | 534 -- .../fckeditor/editor/lang/th.js | 534 -- .../fckeditor/editor/lang/tr.js | 534 -- .../fckeditor/editor/lang/uk.js | 534 -- .../fckeditor/editor/lang/vi.js | 534 -- .../fckeditor/editor/lang/zh-cn.js | 534 -- .../fckeditor/editor/lang/zh.js | 534 -- .../editor/plugins/autogrow/fckplugin.js | 111 - .../plugins/bbcode/_sample/sample.config.js | 26 - .../editor/plugins/bbcode/_sample/sample.html | 67 - .../editor/plugins/bbcode/fckplugin.js | 123 - .../plugins/dragresizetable/fckplugin.js | 529 -- .../plugins/placeholder/fck_placeholder.html | 105 - .../editor/plugins/placeholder/fckplugin.js | 187 - .../editor/plugins/placeholder/lang/de.js | 27 - .../editor/plugins/placeholder/lang/en.js | 27 - .../editor/plugins/placeholder/lang/es.js | 27 - .../editor/plugins/placeholder/lang/fr.js | 27 - .../editor/plugins/placeholder/lang/it.js | 27 - .../editor/plugins/placeholder/lang/pl.js | 27 - .../plugins/placeholder/placeholder.gif | Bin 96 -> 0 bytes .../plugins/simplecommands/fckplugin.js | 29 - .../editor/plugins/tablecommands/fckplugin.js | 33 - .../editor/skins/_fckviewstrips.html | 121 - .../editor/skins/default/fck_dialog.css | 402 -- .../editor/skins/default/fck_dialog_ie6.js | 110 - .../editor/skins/default/fck_editor.css | 464 -- .../editor/skins/default/fck_strip.gif | Bin 5175 -> 0 bytes .../editor/skins/default/images/sprites.gif | Bin 959 -> 0 bytes .../editor/skins/default/images/sprites.png | Bin 3250 -> 0 bytes .../default/images/toolbar.arrowright.gif | Bin 53 -> 0 bytes .../skins/default/images/toolbar.collapse.gif | Bin 152 -> 0 bytes .../skins/default/images/toolbar.end.gif | Bin 43 -> 0 bytes .../skins/default/images/toolbar.expand.gif | Bin 152 -> 0 bytes .../default/images/toolbar.separator.gif | Bin 58 -> 0 bytes .../editor/skins/office2003/fck_dialog.css | 402 -- .../editor/skins/office2003/fck_dialog_ie6.js | 110 - .../editor/skins/office2003/fck_editor.css | 476 -- .../editor/skins/office2003/fck_strip.gif | Bin 9668 -> 0 bytes .../skins/office2003/images/dialog.sides.gif | Bin 48 -> 0 bytes .../skins/office2003/images/dialog.sides.png | Bin 203 -> 0 bytes .../office2003/images/dialog.sides.rtl.png | Bin 205 -> 0 bytes .../skins/office2003/images/sprites.gif | Bin 959 -> 0 bytes .../skins/office2003/images/sprites.png | Bin 3305 -> 0 bytes .../office2003/images/toolbar.arrowright.gif | Bin 53 -> 0 bytes .../skins/office2003/images/toolbar.bg.gif | Bin 73 -> 0 bytes .../office2003/images/toolbar.collapse.gif | Bin 152 -> 0 bytes .../skins/office2003/images/toolbar.end.gif | Bin 124 -> 0 bytes .../office2003/images/toolbar.expand.gif | Bin 152 -> 0 bytes .../office2003/images/toolbar.separator.gif | Bin 67 -> 0 bytes .../skins/office2003/images/toolbar.start.gif | Bin 99 -> 0 bytes .../editor/skins/silver/fck_dialog.css | 402 -- .../editor/skins/silver/fck_dialog_ie6.js | 110 - .../editor/skins/silver/fck_editor.css | 473 -- .../editor/skins/silver/fck_strip.gif | Bin 5175 -> 0 bytes .../skins/silver/images/dialog.sides.gif | Bin 48 -> 0 bytes .../skins/silver/images/dialog.sides.png | Bin 198 -> 0 bytes .../skins/silver/images/dialog.sides.rtl.png | Bin 200 -> 0 bytes .../editor/skins/silver/images/sprites.gif | Bin 959 -> 0 bytes .../editor/skins/silver/images/sprites.png | Bin 3278 -> 0 bytes .../silver/images/toolbar.arrowright.gif | Bin 53 -> 0 bytes .../skins/silver/images/toolbar.buttonbg.gif | Bin 829 -> 0 bytes .../skins/silver/images/toolbar.collapse.gif | Bin 152 -> 0 bytes .../skins/silver/images/toolbar.end.gif | Bin 43 -> 0 bytes .../skins/silver/images/toolbar.expand.gif | Bin 152 -> 0 bytes .../skins/silver/images/toolbar.separator.gif | Bin 58 -> 0 bytes .../fckeditor/editor/wsc/ciframe.html | 65 - .../fckeditor/editor/wsc/tmpFrameset.html | 67 - .../fckeditor/editor/wsc/w.html | 227 - UI/WebServerResources/fckeditor/fckconfig.js | 326 -- UI/WebServerResources/fckeditor/fckeditor.js | 330 -- .../fckeditor/fckpackager.xml | 262 - UI/WebServerResources/fckeditor/fckstyles.xml | 111 - .../fckeditor/fcktemplates.xml | 103 - UI/WebServerResources/fckeditor/fckutils.cfm | 78 - UI/WebServerResources/fckeditor/license.txt | 1246 ----- 1389 files changed, 232850 insertions(+), 83689 deletions(-) create mode 100644 UI/WebServerResources/ckeditor/.htaccess create mode 100644 UI/WebServerResources/ckeditor/CHANGES.html create mode 100644 UI/WebServerResources/ckeditor/LICENSE.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/files.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/index.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ajax.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.commandDefinition.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.config.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.buttonDefinition.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.contentDefinition.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.contentDefinitionObject.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.dialogDefinition.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.dialogDefinitionObject.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.uiElementDefinition.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialogCommand.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.document.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.domObject.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.element.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.event.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.node.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.selection.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.text.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.window.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dtd.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.editor.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.env.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.event.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.eventInfo.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.focusManager.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.cdata.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.comment.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.element.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.fragment.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.text.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlWriter.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.imageCacher.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.keystrokeHandler.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.loader.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.pluginDefinition.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.plugins.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.resourceManager.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.scriptLoader.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.skins.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.test.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.themes.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.tools.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.button.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.button.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.checkbox.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.file.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.fileButton.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.hbox.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.html.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.labeledElement.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.radio.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.select.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.textInput.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.textarea.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.uiElement.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.vbox.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.handlerDefinition.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.xml.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/_global_.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core__bootstrap.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ajax.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor_base.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor_basic.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_command.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_commanddefinition.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_config.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_document.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_documentfragment.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_domwalker.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_element.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_elementpath.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_event.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_node.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_nodelist.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_range.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_text.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_walker.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_window.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dtd.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_editor.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_editor_basic.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_env.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_event.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_eventInfo.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_focusmanager.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_basicwriter.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_cdata.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_comment.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_element.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_filter.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_fragment.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_text.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_imagecacher.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_lang.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_loader.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_plugindefinition.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_plugins.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_resourcemanager.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_scriptloader.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_skins.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_test.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_themes.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_tools.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ui.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_xml.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/lang_en.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_about_dialogs_about.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_about_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_basicstyles_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_blockquote_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_button_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_clipboard_dialogs_paste.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_clipboard_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_colorbutton_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_contextmenu_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialog_dialogDefinition.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialog_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialogui_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_domiterator_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_editingblock_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_elementspath_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_enterkey_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_entities_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_filebrowser_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_find_dialogs_find.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_find_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_flash_dialogs_flash.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_flash_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_floatpanel_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_font_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_format_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_button.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_checkbox.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_form.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_hiddenfield.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_radio.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_select.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_textarea.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_textfield.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_horizontalrule_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_htmldataprocessor_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_htmlwriter_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_iframedialog_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_image_dialogs_image.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_image_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_indent_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_justify_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_keystrokes_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_dialogs_anchor.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_dialogs_link.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_list_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_listblock_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_maximize_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_menu_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_menubutton_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_newpage_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pagebreak_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_panel_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_panelbutton_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastefromword_dialogs_pastefromword.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastefromword_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastetext_dialogs_pastetext.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastetext_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_popup_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_preview_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_print_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_removeformat_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_resize_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_richcombo_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_save_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_scayt_dialogs_options.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_scayt_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_selection_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_showblocks_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_smiley_dialogs_smiley.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_smiley_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_sourcearea_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_specialchar_dialogs_specialchar.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_specialchar_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_styles_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_stylescombo_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_stylescombo_styles_default.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tab_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_table_dialogs_table.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_table_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tabletools_dialogs_tableCell.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tabletools_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_dialogs_templates.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_templates_default.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_toolbar_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_dialogs_uicolor.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_lang_en.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_yui_yui.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_undo_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wsc_dialogs_wsc.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wsc_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wysiwygarea_plugin.js.html create mode 100644 UI/WebServerResources/ckeditor/_samples/ajax.html create mode 100644 UI/WebServerResources/ckeditor/_samples/api_dialog.html create mode 100644 UI/WebServerResources/ckeditor/_samples/api_dialog/my_dialog.js create mode 100644 UI/WebServerResources/ckeditor/_samples/divreplace.html create mode 100644 UI/WebServerResources/ckeditor/_samples/enterkey.html create mode 100644 UI/WebServerResources/ckeditor/_samples/index.html create mode 100644 UI/WebServerResources/ckeditor/_samples/replacebyclass.html create mode 100644 UI/WebServerResources/ckeditor/_samples/replacebycode.html create mode 100644 UI/WebServerResources/ckeditor/_samples/sample.css create mode 100644 UI/WebServerResources/ckeditor/_samples/sample.js create mode 100644 UI/WebServerResources/ckeditor/_samples/sample_posteddata.php create mode 100644 UI/WebServerResources/ckeditor/_samples/skins.html create mode 100644 UI/WebServerResources/ckeditor/_samples/ui_color.html create mode 100644 UI/WebServerResources/ckeditor/_samples/ui_languages.html create mode 100644 UI/WebServerResources/ckeditor/_source/core/_bootstrap.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/ajax.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/ckeditor.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/ckeditor_base.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/ckeditor_basic.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/command.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/commanddefinition.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/config.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/document.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/documentfragment.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/domwalker.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/element.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/elementpath.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/event.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/node.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/nodelist.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/range.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/text.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/walker.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dom/window.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/dtd.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/editor.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/editor_basic.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/env.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/event.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/eventInfo.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/focusmanager.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/htmlparser.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/htmlparser/basicwriter.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/htmlparser/cdata.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/htmlparser/comment.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/htmlparser/element.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/htmlparser/filter.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/htmlparser/fragment.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/htmlparser/text.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/imagecacher.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/lang.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/loader.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/plugindefinition.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/plugins.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/resourcemanager.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/scriptloader.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/skins.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/test.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/themes.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/tools.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/ui.js create mode 100644 UI/WebServerResources/ckeditor/_source/core/xml.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/_languages.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/_translationstatus.txt create mode 100644 UI/WebServerResources/ckeditor/_source/lang/af.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/ar.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/bg.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/bn.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/bs.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/ca.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/cs.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/da.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/de.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/el.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/en-au.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/en-ca.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/en-uk.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/en.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/eo.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/es.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/et.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/eu.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/fa.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/fi.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/fo.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/fr-ca.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/fr.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/gl.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/gu.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/he.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/hi.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/hr.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/hu.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/is.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/it.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/ja.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/km.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/ko.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/lt.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/lv.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/mn.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/ms.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/nb.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/nl.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/no.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/pl.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/pt-br.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/pt.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/ro.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/ru.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/sk.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/sl.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/sr-latn.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/sr.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/sv.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/th.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/tr.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/uk.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/vi.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/zh-cn.js create mode 100644 UI/WebServerResources/ckeditor/_source/lang/zh.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/about/dialogs/about.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/about/dialogs/logo_ckeditor.png create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/about/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/basicstyles/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/blockquote/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/button/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/clipboard/dialogs/paste.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/clipboard/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/colorbutton/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/contextmenu/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/dialog/dialogDefinition.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/dialog/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/dialogui/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/domiterator/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/editingblock/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/elementspath/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/enterkey/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/entities/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/filebrowser/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/find/dialogs/find.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/find/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/flash/dialogs/flash.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/flash/images/placeholder.png create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/flash/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/floatpanel/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/font/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/format/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/forms/dialogs/button.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/forms/dialogs/checkbox.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/forms/dialogs/form.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/forms/dialogs/hiddenfield.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/forms/dialogs/radio.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/forms/dialogs/select.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/forms/dialogs/textarea.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/forms/dialogs/textfield.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/forms/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/horizontalrule/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/htmldataprocessor/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/htmlwriter/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/iframedialog/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/image/dialogs/image.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/image/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/indent/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/justify/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/keystrokes/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/link/dialogs/anchor.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/link/dialogs/link.js rename UI/WebServerResources/{fckeditor/editor => ckeditor/_source/plugins/link}/images/anchor.gif (100%) create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/link/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/list/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/listblock/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/maximize/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/menu/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/menubutton/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/newpage/plugin.js rename UI/WebServerResources/{fckeditor/editor/css/images/fck_pagebreak.gif => ckeditor/_source/plugins/pagebreak/images/pagebreak.gif} (100%) create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/pagebreak/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/panel/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/panelbutton/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/pastefromword/dialogs/pastefromword.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/pastefromword/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/pastetext/dialogs/pastetext.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/pastetext/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/popup/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/preview/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/print/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/removeformat/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/resize/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/richcombo/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/save/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/scayt/dialogs/options.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/scayt/dialogs/toolbar.css create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/scayt/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/selection/plugin.js rename UI/WebServerResources/{fckeditor/editor/css => ckeditor/_source/plugins/showblocks}/images/block_address.png (100%) rename UI/WebServerResources/{fckeditor/editor/css => ckeditor/_source/plugins/showblocks}/images/block_blockquote.png (100%) rename UI/WebServerResources/{fckeditor/editor/css => ckeditor/_source/plugins/showblocks}/images/block_div.png (100%) rename UI/WebServerResources/{fckeditor/editor/css => ckeditor/_source/plugins/showblocks}/images/block_h1.png (100%) rename UI/WebServerResources/{fckeditor/editor/css => ckeditor/_source/plugins/showblocks}/images/block_h2.png (100%) rename UI/WebServerResources/{fckeditor/editor/css => ckeditor/_source/plugins/showblocks}/images/block_h3.png (100%) rename UI/WebServerResources/{fckeditor/editor/css => ckeditor/_source/plugins/showblocks}/images/block_h4.png (100%) rename UI/WebServerResources/{fckeditor/editor/css => ckeditor/_source/plugins/showblocks}/images/block_h5.png (100%) rename UI/WebServerResources/{fckeditor/editor/css => ckeditor/_source/plugins/showblocks}/images/block_h6.png (100%) rename UI/WebServerResources/{fckeditor/editor/css => ckeditor/_source/plugins/showblocks}/images/block_p.png (100%) rename UI/WebServerResources/{fckeditor/editor/css => ckeditor/_source/plugins/showblocks}/images/block_pre.png (100%) create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/showblocks/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/dialogs/smiley.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/angel_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/angry_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/broken_heart.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/confused_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/cry_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/devil_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/embaressed_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/envelope.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/heart.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/kiss.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/lightbulb.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/omg_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/regular_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/sad_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/shades_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/teeth_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/thumbs_down.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/thumbs_up.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/tounge_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/whatchutalkingabout_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/images/wink_smile.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/smiley/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/sourcearea/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/specialchar/dialogs/specialchar.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/specialchar/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/styles/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/stylescombo/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/stylescombo/styles/default.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/tab/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/table/dialogs/table.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/table/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/tabletools/dialogs/tableCell.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/tabletools/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/templates/dialogs/templates.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/templates/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/templates/templates/default.js rename UI/WebServerResources/{fckeditor/editor/dialog/fck_template => ckeditor/_source/plugins/templates/templates}/images/template1.gif (100%) rename UI/WebServerResources/{fckeditor/editor/dialog/fck_template => ckeditor/_source/plugins/templates/templates}/images/template2.gif (100%) rename UI/WebServerResources/{fckeditor/editor/dialog/fck_template => ckeditor/_source/plugins/templates/templates}/images/template3.gif (100%) create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/toolbar/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/uicolor/dialogs/uicolor.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/uicolor/lang/en.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/uicolor/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/uicolor/uicolor.gif create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/uicolor/yui/assets/hue_bg.png create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/uicolor/yui/assets/hue_thumb.png create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/uicolor/yui/assets/picker_mask.png create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/uicolor/yui/assets/picker_thumb.png create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/uicolor/yui/assets/yui.css create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/uicolor/yui/yui.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/undo/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/wsc/dialogs/ciframe.html create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/wsc/dialogs/tmpFrameset.html create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/wsc/dialogs/wsc.css create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/wsc/dialogs/wsc.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/wsc/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/plugins/wysiwygarea/plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/dialog.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/editor.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/elementspath.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/icons.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/icons.png rename UI/WebServerResources/{fckeditor/editor/skins/default/images/toolbar.buttonarrow.gif => ckeditor/_source/skins/kama/images/arrowdown.gif} (100%) create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/images/arrowleft.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/images/arrowright.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/images/arrowtop.gif rename UI/WebServerResources/{fckeditor/editor/skins/default/images/dialog.sides.gif => ckeditor/_source/skins/kama/images/dialog_sides.gif} (100%) rename UI/WebServerResources/{fckeditor/editor/skins/default/images/dialog.sides.png => ckeditor/_source/skins/kama/images/dialog_sides.png} (100%) rename UI/WebServerResources/{fckeditor/editor/skins/default/images/dialog.sides.rtl.png => ckeditor/_source/skins/kama/images/dialog_sides_rtl.png} (100%) create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/images/mini.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/images/noimage.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/images/resizer.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/images/resizer_rtl.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/images/sprites.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/images/sprites_ie6.png rename UI/WebServerResources/{fckeditor/editor/skins/default/images/toolbar.start.gif => ckeditor/_source/skins/kama/images/toolbar_start.gif} (100%) create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/mainui.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/menu.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/panel.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/presets.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/reset.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/richcombo.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/skin.js create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/sprites.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/templates.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/kama/toolbar.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/dialog.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/editor.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/elementspath.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/icons.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/icons.png rename UI/WebServerResources/{fckeditor/editor/skins/office2003/images/toolbar.buttonarrow.gif => ckeditor/_source/skins/office2003/images/arrowdown.gif} (100%) create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/arrowleft.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/arrowright.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/arrowtop.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/dialog_sides.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/dialog_sides.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/dialog_sides_rtl.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/mini.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/noimage.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/resizer.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/resizer_rtl.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/sprites.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/images/sprites_ie6.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/mainui.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/menu.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/panel.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/presets.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/reset.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/richcombo.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/skin.js create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/templates.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/office2003/toolbar.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/dialog.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/editor.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/elementspath.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/icons.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/icons.png rename UI/WebServerResources/{fckeditor/editor/skins/silver/images/toolbar.buttonarrow.gif => ckeditor/_source/skins/v2/images/arrowdown.gif} (100%) create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/arrowleft.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/arrowright.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/arrowtop.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/dialog_sides.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/dialog_sides.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/dialog_sides_rtl.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/mini.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/noimage.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/resizer.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/resizer_rtl.gif create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/sprites.png create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/images/sprites_ie6.png rename UI/WebServerResources/{fckeditor/editor/skins/silver/images/toolbar.start.gif => ckeditor/_source/skins/v2/images/toolbar_start.gif} (100%) create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/mainui.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/menu.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/panel.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/presets.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/reset.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/richcombo.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/skin.js create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/templates.css create mode 100644 UI/WebServerResources/ckeditor/_source/skins/v2/toolbar.css create mode 100644 UI/WebServerResources/ckeditor/_source/tests/_assets/sample.css create mode 100644 UI/WebServerResources/ckeditor/_source/tests/_assets/sample.js create mode 100644 UI/WebServerResources/ckeditor/_source/tests/_assets/sample.txt create mode 100644 UI/WebServerResources/ckeditor/_source/tests/_assets/sample.xml create mode 100644 UI/WebServerResources/ckeditor/_source/tests/_assets/sample_xml.txt create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/_editor/custom_config_1.js create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/_editor/custom_config_2.js create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/ajax.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/ckeditor.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/ckeditor2.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/dom/document.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/dom/documentfragment.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/dom/element.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/dom/node.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/dom/range.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/dom/text.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/dom/walker.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/dom/window.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/editor.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/env.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/event.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/htmlparser/fragment.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/htmlparser/htmlparser.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/plugins.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/plugins/myplugins/sample/my_plugin.js create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/scriptloader.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/tools.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/core/xml.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/plugins/domiterator/domiterator.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/plugins/htmldataprocessor/htmldataprocessor.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/plugins/list/list.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/plugins/selection/selection.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/plugins/styles/styles.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/test.css create mode 100644 UI/WebServerResources/ckeditor/_source/tests/test.js create mode 100644 UI/WebServerResources/ckeditor/_source/tests/testall.html create mode 100644 UI/WebServerResources/ckeditor/_source/tests/yuitest.js create mode 100644 UI/WebServerResources/ckeditor/_source/themes/default/theme.js create mode 100644 UI/WebServerResources/ckeditor/_tests/_assets/sample.css create mode 100644 UI/WebServerResources/ckeditor/_tests/_assets/sample.js create mode 100644 UI/WebServerResources/ckeditor/_tests/_assets/sample.txt create mode 100644 UI/WebServerResources/ckeditor/_tests/_assets/sample.xml create mode 100644 UI/WebServerResources/ckeditor/_tests/_assets/sample_xml.txt create mode 100644 UI/WebServerResources/ckeditor/_tests/core/_editor/custom_config_1.js create mode 100644 UI/WebServerResources/ckeditor/_tests/core/_editor/custom_config_2.js create mode 100644 UI/WebServerResources/ckeditor/_tests/core/ajax.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/ckeditor.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/ckeditor2.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/dom/document.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/dom/documentfragment.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/dom/element.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/dom/node.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/dom/range.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/dom/text.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/dom/walker.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/dom/window.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/editor.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/env.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/event.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/htmlparser/fragment.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/htmlparser/htmlparser.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/plugins.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/plugins/myplugins/sample/my_plugin.js create mode 100644 UI/WebServerResources/ckeditor/_tests/core/scriptloader.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/tools.html create mode 100644 UI/WebServerResources/ckeditor/_tests/core/xml.html create mode 100644 UI/WebServerResources/ckeditor/_tests/plugins/domiterator/domiterator.html create mode 100644 UI/WebServerResources/ckeditor/_tests/plugins/htmldataprocessor/htmldataprocessor.html create mode 100644 UI/WebServerResources/ckeditor/_tests/plugins/list/list.html create mode 100644 UI/WebServerResources/ckeditor/_tests/plugins/selection/selection.html create mode 100644 UI/WebServerResources/ckeditor/_tests/plugins/styles/styles.html create mode 100644 UI/WebServerResources/ckeditor/_tests/test.css create mode 100644 UI/WebServerResources/ckeditor/_tests/test.js create mode 100644 UI/WebServerResources/ckeditor/_tests/testall.html create mode 100644 UI/WebServerResources/ckeditor/_tests/yuitest.js create mode 100644 UI/WebServerResources/ckeditor/ckeditor.js create mode 100644 UI/WebServerResources/ckeditor/ckeditor.pack create mode 100644 UI/WebServerResources/ckeditor/ckeditor_basic.js create mode 100644 UI/WebServerResources/ckeditor/ckeditor_basic_source.js create mode 100644 UI/WebServerResources/ckeditor/ckeditor_source.js create mode 100644 UI/WebServerResources/ckeditor/config.js create mode 100644 UI/WebServerResources/ckeditor/contents.css rename UI/WebServerResources/{fckeditor/editor => ckeditor}/images/spacer.gif (100%) create mode 100644 UI/WebServerResources/ckeditor/lang/_languages.js create mode 100644 UI/WebServerResources/ckeditor/lang/_translationstatus.txt create mode 100644 UI/WebServerResources/ckeditor/lang/af.js create mode 100644 UI/WebServerResources/ckeditor/lang/ar.js create mode 100644 UI/WebServerResources/ckeditor/lang/bg.js create mode 100644 UI/WebServerResources/ckeditor/lang/bn.js create mode 100644 UI/WebServerResources/ckeditor/lang/bs.js create mode 100644 UI/WebServerResources/ckeditor/lang/ca.js create mode 100644 UI/WebServerResources/ckeditor/lang/cs.js create mode 100644 UI/WebServerResources/ckeditor/lang/da.js create mode 100644 UI/WebServerResources/ckeditor/lang/de.js create mode 100644 UI/WebServerResources/ckeditor/lang/el.js create mode 100644 UI/WebServerResources/ckeditor/lang/en-au.js create mode 100644 UI/WebServerResources/ckeditor/lang/en-ca.js create mode 100644 UI/WebServerResources/ckeditor/lang/en-uk.js create mode 100644 UI/WebServerResources/ckeditor/lang/en.js create mode 100644 UI/WebServerResources/ckeditor/lang/eo.js create mode 100644 UI/WebServerResources/ckeditor/lang/es.js create mode 100644 UI/WebServerResources/ckeditor/lang/et.js create mode 100644 UI/WebServerResources/ckeditor/lang/eu.js create mode 100644 UI/WebServerResources/ckeditor/lang/fa.js create mode 100644 UI/WebServerResources/ckeditor/lang/fi.js create mode 100644 UI/WebServerResources/ckeditor/lang/fo.js create mode 100644 UI/WebServerResources/ckeditor/lang/fr-ca.js create mode 100644 UI/WebServerResources/ckeditor/lang/fr.js create mode 100644 UI/WebServerResources/ckeditor/lang/gl.js create mode 100644 UI/WebServerResources/ckeditor/lang/gu.js create mode 100644 UI/WebServerResources/ckeditor/lang/he.js create mode 100644 UI/WebServerResources/ckeditor/lang/hi.js create mode 100644 UI/WebServerResources/ckeditor/lang/hr.js create mode 100644 UI/WebServerResources/ckeditor/lang/hu.js create mode 100644 UI/WebServerResources/ckeditor/lang/is.js create mode 100644 UI/WebServerResources/ckeditor/lang/it.js create mode 100644 UI/WebServerResources/ckeditor/lang/ja.js create mode 100644 UI/WebServerResources/ckeditor/lang/km.js create mode 100644 UI/WebServerResources/ckeditor/lang/ko.js create mode 100644 UI/WebServerResources/ckeditor/lang/lt.js create mode 100644 UI/WebServerResources/ckeditor/lang/lv.js create mode 100644 UI/WebServerResources/ckeditor/lang/mn.js create mode 100644 UI/WebServerResources/ckeditor/lang/ms.js create mode 100644 UI/WebServerResources/ckeditor/lang/nb.js create mode 100644 UI/WebServerResources/ckeditor/lang/nl.js create mode 100644 UI/WebServerResources/ckeditor/lang/no.js create mode 100644 UI/WebServerResources/ckeditor/lang/pl.js create mode 100644 UI/WebServerResources/ckeditor/lang/pt-br.js create mode 100644 UI/WebServerResources/ckeditor/lang/pt.js create mode 100644 UI/WebServerResources/ckeditor/lang/ro.js create mode 100644 UI/WebServerResources/ckeditor/lang/ru.js create mode 100644 UI/WebServerResources/ckeditor/lang/sk.js create mode 100644 UI/WebServerResources/ckeditor/lang/sl.js create mode 100644 UI/WebServerResources/ckeditor/lang/sr-latn.js create mode 100644 UI/WebServerResources/ckeditor/lang/sr.js create mode 100644 UI/WebServerResources/ckeditor/lang/sv.js create mode 100644 UI/WebServerResources/ckeditor/lang/th.js create mode 100644 UI/WebServerResources/ckeditor/lang/tr.js create mode 100644 UI/WebServerResources/ckeditor/lang/uk.js create mode 100644 UI/WebServerResources/ckeditor/lang/vi.js create mode 100644 UI/WebServerResources/ckeditor/lang/zh-cn.js create mode 100644 UI/WebServerResources/ckeditor/lang/zh.js create mode 100644 UI/WebServerResources/ckeditor/plugins/about/dialogs/about.js create mode 100644 UI/WebServerResources/ckeditor/plugins/about/dialogs/logo_ckeditor.png create mode 100644 UI/WebServerResources/ckeditor/plugins/about/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/basicstyles/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/blockquote/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/button/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/clipboard/dialogs/paste.js create mode 100644 UI/WebServerResources/ckeditor/plugins/clipboard/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/colorbutton/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/contextmenu/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/dialog/dialogDefinition.js create mode 100644 UI/WebServerResources/ckeditor/plugins/dialog/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/dialogui/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/domiterator/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/editingblock/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/elementspath/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/enterkey/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/entities/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/filebrowser/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/find/dialogs/find.js create mode 100644 UI/WebServerResources/ckeditor/plugins/find/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/flash/dialogs/flash.js create mode 100644 UI/WebServerResources/ckeditor/plugins/flash/images/placeholder.png create mode 100644 UI/WebServerResources/ckeditor/plugins/flash/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/floatpanel/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/font/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/format/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/forms/dialogs/button.js create mode 100644 UI/WebServerResources/ckeditor/plugins/forms/dialogs/checkbox.js create mode 100644 UI/WebServerResources/ckeditor/plugins/forms/dialogs/form.js create mode 100644 UI/WebServerResources/ckeditor/plugins/forms/dialogs/hiddenfield.js create mode 100644 UI/WebServerResources/ckeditor/plugins/forms/dialogs/radio.js create mode 100644 UI/WebServerResources/ckeditor/plugins/forms/dialogs/select.js create mode 100644 UI/WebServerResources/ckeditor/plugins/forms/dialogs/textarea.js create mode 100644 UI/WebServerResources/ckeditor/plugins/forms/dialogs/textfield.js create mode 100644 UI/WebServerResources/ckeditor/plugins/forms/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/horizontalrule/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/htmldataprocessor/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/htmlwriter/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/iframedialog/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/image/dialogs/image.js create mode 100644 UI/WebServerResources/ckeditor/plugins/image/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/indent/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/justify/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/keystrokes/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/link/dialogs/anchor.js create mode 100644 UI/WebServerResources/ckeditor/plugins/link/dialogs/link.js rename UI/WebServerResources/{fckeditor/editor/css/images/fck_anchor.gif => ckeditor/plugins/link/images/anchor.gif} (100%) create mode 100644 UI/WebServerResources/ckeditor/plugins/link/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/list/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/listblock/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/maximize/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/menu/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/menubutton/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/newpage/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/pagebreak/images/pagebreak.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/pagebreak/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/panel/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/panelbutton/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/pastefromword/dialogs/pastefromword.js create mode 100644 UI/WebServerResources/ckeditor/plugins/pastefromword/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/pastetext/dialogs/pastetext.js create mode 100644 UI/WebServerResources/ckeditor/plugins/pastetext/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/popup/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/preview/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/print/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/removeformat/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/resize/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/richcombo/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/save/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/scayt/dialogs/options.js create mode 100644 UI/WebServerResources/ckeditor/plugins/scayt/dialogs/toolbar.css create mode 100644 UI/WebServerResources/ckeditor/plugins/scayt/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/selection/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/images/block_address.png create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/images/block_blockquote.png create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/images/block_div.png create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/images/block_h1.png create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/images/block_h2.png create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/images/block_h3.png create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/images/block_h4.png create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/images/block_h5.png create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/images/block_h6.png create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/images/block_p.png create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/images/block_pre.png create mode 100644 UI/WebServerResources/ckeditor/plugins/showblocks/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/dialogs/smiley.js create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/angel_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/angry_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/broken_heart.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/confused_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/cry_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/devil_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/embaressed_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/envelope.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/heart.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/kiss.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/lightbulb.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/omg_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/regular_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/sad_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/shades_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/teeth_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/thumbs_down.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/thumbs_up.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/tounge_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/images/wink_smile.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/smiley/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/sourcearea/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/specialchar/dialogs/specialchar.js create mode 100644 UI/WebServerResources/ckeditor/plugins/specialchar/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/styles/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/stylescombo/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/stylescombo/styles/default.js create mode 100644 UI/WebServerResources/ckeditor/plugins/tab/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/table/dialogs/table.js create mode 100644 UI/WebServerResources/ckeditor/plugins/table/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/tabletools/dialogs/tableCell.js create mode 100644 UI/WebServerResources/ckeditor/plugins/tabletools/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/templates/dialogs/templates.js create mode 100644 UI/WebServerResources/ckeditor/plugins/templates/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/templates/templates/default.js create mode 100644 UI/WebServerResources/ckeditor/plugins/templates/templates/images/template1.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/templates/templates/images/template2.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/templates/templates/images/template3.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/toolbar/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/uicolor/dialogs/uicolor.js create mode 100644 UI/WebServerResources/ckeditor/plugins/uicolor/lang/en.js create mode 100644 UI/WebServerResources/ckeditor/plugins/uicolor/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/uicolor/uicolor.gif create mode 100644 UI/WebServerResources/ckeditor/plugins/uicolor/yui/assets/hue_bg.png create mode 100644 UI/WebServerResources/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png create mode 100644 UI/WebServerResources/ckeditor/plugins/uicolor/yui/assets/picker_mask.png create mode 100644 UI/WebServerResources/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png create mode 100644 UI/WebServerResources/ckeditor/plugins/uicolor/yui/assets/yui.css create mode 100644 UI/WebServerResources/ckeditor/plugins/uicolor/yui/yui.js create mode 100644 UI/WebServerResources/ckeditor/plugins/undo/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/wsc/dialogs/ciframe.html create mode 100644 UI/WebServerResources/ckeditor/plugins/wsc/dialogs/tmpFrameset.html create mode 100644 UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc.css create mode 100644 UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc.js create mode 100644 UI/WebServerResources/ckeditor/plugins/wsc/plugin.js create mode 100644 UI/WebServerResources/ckeditor/plugins/wysiwygarea/plugin.js create mode 100644 UI/WebServerResources/ckeditor/skins/kama/dialog.css create mode 100644 UI/WebServerResources/ckeditor/skins/kama/editor.css create mode 100644 UI/WebServerResources/ckeditor/skins/kama/icons.png create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/arrowdown.gif create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/arrowleft.gif create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/arrowright.gif create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/arrowtop.gif create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/dialog_sides.gif create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/dialog_sides.png create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/dialog_sides_rtl.png create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/mini.gif create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/noimage.png create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/resizer.gif create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/resizer_rtl.gif create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/sprites.png create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/sprites_ie6.png create mode 100644 UI/WebServerResources/ckeditor/skins/kama/images/toolbar_start.gif create mode 100644 UI/WebServerResources/ckeditor/skins/kama/skin.js create mode 100644 UI/WebServerResources/ckeditor/skins/kama/sprites.png create mode 100644 UI/WebServerResources/ckeditor/skins/kama/templates.css create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/dialog.css create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/editor.css create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/icons.png create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/arrowdown.gif create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/arrowleft.gif create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/arrowright.gif create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/arrowtop.gif create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/dialog_sides.gif create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/dialog_sides.png create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/dialog_sides_rtl.png create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/mini.gif create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/noimage.png create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/resizer.gif create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/resizer_rtl.gif create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/sprites.png create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/images/sprites_ie6.png create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/skin.js create mode 100644 UI/WebServerResources/ckeditor/skins/office2003/templates.css create mode 100644 UI/WebServerResources/ckeditor/skins/v2/dialog.css create mode 100644 UI/WebServerResources/ckeditor/skins/v2/editor.css create mode 100644 UI/WebServerResources/ckeditor/skins/v2/icons.png create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/arrowdown.gif create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/arrowleft.gif create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/arrowright.gif create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/arrowtop.gif create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/dialog_sides.gif create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/dialog_sides.png create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/dialog_sides_rtl.png create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/mini.gif create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/noimage.png create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/resizer.gif create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/resizer_rtl.gif create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/sprites.png create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/sprites_ie6.png create mode 100644 UI/WebServerResources/ckeditor/skins/v2/images/toolbar_start.gif create mode 100644 UI/WebServerResources/ckeditor/skins/v2/skin.js create mode 100644 UI/WebServerResources/ckeditor/skins/v2/templates.css create mode 100644 UI/WebServerResources/ckeditor/themes/default/theme.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckcontextmenu.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckdataprocessor.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckdocumentfragment_gecko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckdocumentfragment_ie.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckdomrange.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckdomrange_gecko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckdomrange_ie.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckdomrangeiterator.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckeditingarea.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckelementpath.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckenterkey.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckevents.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckhtmliterator.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckicon.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckiecleanup.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckimagepreloader.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckkeystrokehandler.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckmenublock.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckmenublockpanel.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckmenuitem.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckpanel.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckplugin.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckspecialcombo.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckstyle.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fcktoolbar.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fcktoolbarbreak_gecko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fcktoolbarbreak_ie.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fcktoolbarbutton.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fcktoolbarbuttonui.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fcktoolbarfontformatcombo.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fcktoolbarfontscombo.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fcktoolbarfontsizecombo.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fcktoolbarpanelbutton.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fcktoolbarspecialcombo.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fcktoolbarstylecombo.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckw3crange.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckxml.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckxml_gecko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/classes/fckxml_ie.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fck_othercommands.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckblockquotecommand.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckcorestylecommand.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckfitwindow.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckindentcommands.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckjustifycommands.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fcklistcommands.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fcknamedcommand.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckpasteplaintextcommand.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckpastewordcommand.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckremoveformatcommand.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckshowblocks.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckspellcheckcommand_gecko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckspellcheckcommand_ie.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fckstylecommand.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fcktablecommand.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/commandclasses/fcktextcolorcommand.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/fckconstants.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/fckeditorapi.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/fckjscoreextensions.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/fckscriptloader.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fck.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fck_contextmenu.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fck_gecko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fck_ie.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckbrowserinfo.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckcodeformatter.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckcommands.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckconfig.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckdebug.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckdebug_empty.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckdialog.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckdocumentprocessor.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckdomtools.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fcklanguagemanager.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fcklisthandler.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fcklistslib.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckplugins.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckregexlib.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckselection.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckselection_gecko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckselection_ie.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckstyles.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fcktablehandler.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fcktablehandler_gecko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fcktablehandler_ie.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fcktoolbaritems.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fcktoolbarset.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fcktools.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fcktools_gecko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fcktools_ie.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckundo.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckurlparams.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckxhtml.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckxhtml_gecko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckxhtml_ie.js delete mode 100644 UI/WebServerResources/fckeditor/editor/_source/internals/fckxhtmlentities.js delete mode 100644 UI/WebServerResources/fckeditor/editor/css/behaviors/disablehandles.htc delete mode 100644 UI/WebServerResources/fckeditor/editor/css/behaviors/showtableborders.htc delete mode 100644 UI/WebServerResources/fckeditor/editor/css/fck_editorarea.css delete mode 100644 UI/WebServerResources/fckeditor/editor/css/fck_internal.css delete mode 100644 UI/WebServerResources/fckeditor/editor/css/fck_showtableborders_gecko.css delete mode 100644 UI/WebServerResources/fckeditor/editor/css/images/fck_flashlogo.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/css/images/fck_hiddenfield.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/css/images/fck_plugin.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/common/fck_dialog_common.css delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/common/fck_dialog_common.js delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/common/images/locked.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/common/images/reset.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/common/images/unlocked.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_about.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_about/logo_fckeditor.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_about/logo_fredck.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_about/sponsors/spellchecker_net.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_anchor.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_button.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_checkbox.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_colorselector.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_div.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_docprops.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_docprops/fck_document_preview.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_flash.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_flash/fck_flash.js delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_flash/fck_flash_preview.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_form.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_hiddenfield.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_image.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_image/fck_image.js delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_image/fck_image_preview.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_link.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_link/fck_link.js delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_listprop.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_paste.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_radiobutton.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_replace.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_select.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_select/fck_select.js delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_smiley.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_source.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_specialchar.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_spellerpages.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_spellerpages/spellerpages/blank.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controlWindow.js delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controls.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellChecker.js delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellchecker.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellerStyle.css delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_spellerpages/spellerpages/wordWindow.js delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_table.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_tablecell.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_template.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_textarea.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dialog/fck_textfield.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dtd/fck_dtd_test.html delete mode 100644 UI/WebServerResources/fckeditor/editor/dtd/fck_xhtml10strict.js delete mode 100644 UI/WebServerResources/fckeditor/editor/dtd/fck_xhtml10transitional.js delete mode 100644 UI/WebServerResources/fckeditor/editor/fckdebug.html delete mode 100644 UI/WebServerResources/fckeditor/editor/fckdialog.html delete mode 100644 UI/WebServerResources/fckeditor/editor/fckeditor.html delete mode 100644 UI/WebServerResources/fckeditor/editor/fckeditor.original.html delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/browser.css delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/browser.html delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/frmactualfolder.html delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/frmcreatefolder.html delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/frmfolders.html delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/frmresourceslist.html delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/frmresourcetype.html delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/frmupload.html delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/ButtonArrow.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/Folder.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/Folder32.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/FolderOpened.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/FolderOpened32.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/FolderUp.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/ai.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/avi.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/bmp.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/cs.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/default.icon.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/dll.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/doc.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/exe.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/fla.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/gif.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/htm.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/html.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/jpg.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/js.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/mdb.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/mp3.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/pdf.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/png.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/ppt.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/rdp.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/swf.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/swt.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/txt.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/vsd.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/xls.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/xml.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/32/zip.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/ai.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/avi.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/bmp.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/cs.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/default.icon.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/dll.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/doc.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/exe.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/fla.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/gif.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/htm.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/html.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/jpg.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/js.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/mdb.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/mp3.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/pdf.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/png.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/ppt.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/rdp.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/swf.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/swt.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/txt.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/vsd.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/xls.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/xml.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/icons/zip.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/images/spacer.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/js/common.js delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/browser/default/js/fckxml.js delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/asp/basexml.asp delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/asp/class_upload.asp delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/asp/commands.asp delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/asp/config.asp delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/asp/connector.asp delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/asp/io.asp delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/asp/upload.asp delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/asp/util.asp delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/aspx/config.ascx delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/aspx/connector.aspx delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/aspx/upload.aspx delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/ImageObject.cfc delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/cf5_connector.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/cf5_upload.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/cf_basexml.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/cf_commands.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/cf_connector.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/cf_io.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/cf_upload.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/cf_util.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/config.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/connector.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/image.cfc delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/cfm/upload.cfm delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/lasso/config.lasso delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/lasso/connector.lasso delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/lasso/upload.lasso delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/perl/basexml.pl delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/perl/commands.pl delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/perl/connector.cgi delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/perl/io.pl delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/perl/upload.cgi delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/perl/upload_fck.pl delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/perl/util.pl delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/php/basexml.php delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/php/commands.php delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/php/config.php delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/php/connector.php delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/php/io.php delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/php/phpcompat.php delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/php/upload.php delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/php/util.php delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/py/config.py delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/py/connector.py delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/py/fckcommands.py delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/py/fckconnector.py delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/py/fckoutput.py delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/py/fckutil.py delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/py/htaccess.txt delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/py/upload.py delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/py/wsgi.py delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/py/zope.py delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/test.html delete mode 100644 UI/WebServerResources/fckeditor/editor/filemanager/connectors/uploadtest.html delete mode 100644 UI/WebServerResources/fckeditor/editor/images/arrow_ltr.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/arrow_rtl.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/angel_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/angry_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/broken_heart.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/cake.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/confused_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/cry_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/devil_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/embaressed_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/envelope.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/heart.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/kiss.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/lightbulb.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/omg_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/regular_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/sad_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/shades_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/teeth_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/thumbs_down.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/thumbs_up.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/tounge_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/whatchutalkingabout_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/images/smiley/msn/wink_smile.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/js/fckadobeair.js delete mode 100644 UI/WebServerResources/fckeditor/editor/js/fckeditorcode_gecko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/js/fckeditorcode_ie.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/_translationstatus.txt delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/af.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/ar.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/bg.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/bn.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/bs.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/ca.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/cs.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/da.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/de.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/el.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/en-au.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/en-ca.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/en-uk.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/en.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/eo.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/es.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/et.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/eu.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/fa.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/fi.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/fo.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/fr-ca.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/fr.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/gl.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/gu.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/he.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/hi.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/hr.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/hu.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/is.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/it.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/ja.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/km.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/ko.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/lt.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/lv.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/mn.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/ms.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/nb.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/nl.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/no.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/pl.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/pt-br.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/pt.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/ro.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/ru.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/sk.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/sl.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/sr-latn.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/sr.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/sv.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/th.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/tr.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/uk.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/vi.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/zh-cn.js delete mode 100644 UI/WebServerResources/fckeditor/editor/lang/zh.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/autogrow/fckplugin.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/bbcode/_sample/sample.config.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/bbcode/_sample/sample.html delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/bbcode/fckplugin.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/dragresizetable/fckplugin.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/placeholder/fck_placeholder.html delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/placeholder/fckplugin.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/placeholder/lang/de.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/placeholder/lang/en.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/placeholder/lang/es.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/placeholder/lang/fr.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/placeholder/lang/it.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/placeholder/lang/pl.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/placeholder/placeholder.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/simplecommands/fckplugin.js delete mode 100644 UI/WebServerResources/fckeditor/editor/plugins/tablecommands/fckplugin.js delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/_fckviewstrips.html delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/default/fck_dialog.css delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/default/fck_dialog_ie6.js delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/default/fck_editor.css delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/default/fck_strip.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/default/images/sprites.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/default/images/sprites.png delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/default/images/toolbar.arrowright.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/default/images/toolbar.collapse.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/default/images/toolbar.end.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/default/images/toolbar.expand.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/default/images/toolbar.separator.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/fck_dialog.css delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/fck_dialog_ie6.js delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/fck_editor.css delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/fck_strip.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/dialog.sides.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/dialog.sides.png delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/dialog.sides.rtl.png delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/sprites.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/sprites.png delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/toolbar.arrowright.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/toolbar.bg.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/toolbar.collapse.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/toolbar.end.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/toolbar.expand.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/toolbar.separator.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/office2003/images/toolbar.start.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/fck_dialog.css delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/fck_dialog_ie6.js delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/fck_editor.css delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/fck_strip.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/images/dialog.sides.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/images/dialog.sides.png delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/images/dialog.sides.rtl.png delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/images/sprites.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/images/sprites.png delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/images/toolbar.arrowright.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/images/toolbar.buttonbg.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/images/toolbar.collapse.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/images/toolbar.end.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/images/toolbar.expand.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/skins/silver/images/toolbar.separator.gif delete mode 100644 UI/WebServerResources/fckeditor/editor/wsc/ciframe.html delete mode 100644 UI/WebServerResources/fckeditor/editor/wsc/tmpFrameset.html delete mode 100644 UI/WebServerResources/fckeditor/editor/wsc/w.html delete mode 100644 UI/WebServerResources/fckeditor/fckconfig.js delete mode 100644 UI/WebServerResources/fckeditor/fckeditor.js delete mode 100644 UI/WebServerResources/fckeditor/fckpackager.xml delete mode 100644 UI/WebServerResources/fckeditor/fckstyles.xml delete mode 100644 UI/WebServerResources/fckeditor/fcktemplates.xml delete mode 100644 UI/WebServerResources/fckeditor/fckutils.cfm delete mode 100644 UI/WebServerResources/fckeditor/license.txt diff --git a/ChangeLog b/ChangeLog index 3da14c8fe..d1b8b30dc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-06-25 Cyril Robert + + * SoObjects/Mailer/SOGoMailReply.m: Added proper blockquote + * UI/WebServerResources/UIxMailEditor.js: Use CKeditor + * SoObjects/Mailer/SOGoMailForward.m: Added htmlComposition property, + changed almost all methods to escape what needsto be escaped. + 2009-06-23 Wolfgang Sourdeau * SoObjects/SOGo/SOGoGCSFolder.m (-davSyncCollection:): certain diff --git a/SoObjects/Mailer/SOGoMailDutchForward.wo/SOGoMailDutchForward.html b/SoObjects/Mailer/SOGoMailDutchForward.wo/SOGoMailDutchForward.html index 58d63020c..f8b141ae2 100644 --- a/SoObjects/Mailer/SOGoMailDutchForward.wo/SOGoMailDutchForward.html +++ b/SoObjects/Mailer/SOGoMailDutchForward.wo/SOGoMailDutchForward.html @@ -1,13 +1,13 @@ - - - --------- Original Message -------- -Subject: <#subject/> -Date: <#date/> -From: <#from/> -<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/> - -<#messageBody/> - -<#signature/> +<#newLine/> +<#newLine/> +<#newLine/> +-------- Original Message --------<#newLine/> +Subject: <#subject/><#newLine/> +Date: <#date/><#newLine/> +From: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#newLine/> +<#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailDutchForward.wo/SOGoMailDutchForward.wod b/SoObjects/Mailer/SOGoMailDutchForward.wo/SOGoMailDutchForward.wod index df237286f..7787fa18e 100644 --- a/SoObjects/Mailer/SOGoMailDutchForward.wo/SOGoMailDutchForward.wod +++ b/SoObjects/Mailer/SOGoMailDutchForward.wo/SOGoMailDutchForward.wod @@ -13,6 +13,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailDutchReply.wo/SOGoMailDutchReply.html b/SoObjects/Mailer/SOGoMailDutchReply.wo/SOGoMailDutchReply.html index add97cbc1..3f77594ae 100644 --- a/SoObjects/Mailer/SOGoMailDutchReply.wo/SOGoMailDutchReply.html +++ b/SoObjects/Mailer/SOGoMailDutchReply.wo/SOGoMailDutchReply.html @@ -1,16 +1,16 @@ -<#replyPlacementOnTop> - -<#signaturePlacementOnTop> -<#signature/> -<#outlookMode>-------- Original Message -------- -Subject: <#subject/> -Date: <#date/> -From: <#from/> -<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/> -<#standardMode>On <#date/>, <#from/> wrote: - -<#messageBody/> -<#replyPlacementOnBottom> - -<#signaturePlacementOnBottom><#signature/> +<#replyPlacementOnTop><#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +<#outlookMode>-------- Original Message --------<#newLine/> +Subject: <#subject/><#newLine/> +Date: <#date/><#newLine/> +From: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/><#newLine/> +<#standardMode>On <#date/>, <#from/> wrote:<#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#replyPlacementOnBottom><#newLine/> +<#newLine/> +<#signaturePlacementOnBottom><#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailDutchReply.wo/SOGoMailDutchReply.wod b/SoObjects/Mailer/SOGoMailDutchReply.wo/SOGoMailDutchReply.wod index df3789cc3..3fbed6d61 100644 --- a/SoObjects/Mailer/SOGoMailDutchReply.wo/SOGoMailDutchReply.wod +++ b/SoObjects/Mailer/SOGoMailDutchReply.wo/SOGoMailDutchReply.wod @@ -22,6 +22,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.html b/SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.html index 58d63020c..f8b141ae2 100644 --- a/SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.html +++ b/SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.html @@ -1,13 +1,13 @@ - - - --------- Original Message -------- -Subject: <#subject/> -Date: <#date/> -From: <#from/> -<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/> - -<#messageBody/> - -<#signature/> +<#newLine/> +<#newLine/> +<#newLine/> +-------- Original Message --------<#newLine/> +Subject: <#subject/><#newLine/> +Date: <#date/><#newLine/> +From: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#newLine/> +<#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.wod b/SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.wod index df237286f..7787fa18e 100644 --- a/SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.wod +++ b/SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.wod @@ -13,6 +13,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.html b/SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.html index add97cbc1..3f77594ae 100644 --- a/SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.html +++ b/SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.html @@ -1,16 +1,16 @@ -<#replyPlacementOnTop> - -<#signaturePlacementOnTop> -<#signature/> -<#outlookMode>-------- Original Message -------- -Subject: <#subject/> -Date: <#date/> -From: <#from/> -<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/> -<#standardMode>On <#date/>, <#from/> wrote: - -<#messageBody/> -<#replyPlacementOnBottom> - -<#signaturePlacementOnBottom><#signature/> +<#replyPlacementOnTop><#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +<#outlookMode>-------- Original Message --------<#newLine/> +Subject: <#subject/><#newLine/> +Date: <#date/><#newLine/> +From: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/><#newLine/> +<#standardMode>On <#date/>, <#from/> wrote:<#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#replyPlacementOnBottom><#newLine/> +<#newLine/> +<#signaturePlacementOnBottom><#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.wod b/SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.wod index df3789cc3..3fbed6d61 100644 --- a/SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.wod +++ b/SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.wod @@ -22,6 +22,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailForward.h b/SoObjects/Mailer/SOGoMailForward.h index b1ef822d7..6c1b94f06 100644 --- a/SoObjects/Mailer/SOGoMailForward.h +++ b/SoObjects/Mailer/SOGoMailForward.h @@ -32,6 +32,7 @@ SOGoMailObject *sourceMail; NSString *field; NSString *currentValue; + BOOL htmlComposition; } - (void) setSourceMail: (SOGoMailObject *) newSourceMail; diff --git a/SoObjects/Mailer/SOGoMailForward.m b/SoObjects/Mailer/SOGoMailForward.m index b51b154c7..e2c07716e 100644 --- a/SoObjects/Mailer/SOGoMailForward.m +++ b/SoObjects/Mailer/SOGoMailForward.m @@ -21,6 +21,7 @@ */ #import +#import #import #import @@ -34,6 +35,10 @@ { if ((self = [super init])) { + NSUserDefaults *ud; + ud = [[context activeUser] userDefaults]; + htmlComposition = [[ud objectForKey: @"ComposeMessagesType"] isEqualToString: @"html"]; + sourceMail = nil; currentValue = nil; } @@ -53,6 +58,16 @@ ASSIGN (sourceMail, newSourceMail); } +- (NSString *) newLine +{ + NSString *rc = [NSString stringWithString: @" "]; + + if (htmlComposition) + rc = [NSString stringWithString: @"
"]; + + return rc; +} + - (NSString *) subject { return [sourceMail decodedSubject]; @@ -69,7 +84,14 @@ - (NSString *) from { - return [[sourceMail mailHeaders] objectForKey: @"from"]; + NSString *rc; + + if (htmlComposition) + rc = [[[sourceMail mailHeaders] objectForKey: @"from"] stringByEscapingHTMLString]; + else + rc = [[sourceMail mailHeaders] objectForKey: @"from"]; + + return rc; } - (NSString *) _headerField: (NSString *) fieldName @@ -91,8 +113,15 @@ - (NSString *) replyTo { - return ([NSString stringWithFormat: @"%@\n", - [self _headerField: @"reply-to"]]); + NSString *rc; + + if (htmlComposition) + rc = [NSString stringWithFormat: @"%@
", + [[self _headerField: @"reply-to"] stringByEscapingHTMLString]]; + else + rc = ([NSString stringWithFormat: @"%@\n", [self _headerField: @"reply-to"]]); + + return rc; } - (BOOL) hasOrganization @@ -102,13 +131,26 @@ - (NSString *) organization { - return ([NSString stringWithFormat: @"%@\n", - [self _headerField: @"organization"]]); + NSString *rc; + + if (htmlComposition) + rc = [NSString stringWithFormat: @"%@
", [self _headerField: @"organization"]]; + else + rc = [NSString stringWithFormat: @"%@\n", [self _headerField: @"organization"]]; + + return rc; } - (NSString *) to { - return [[sourceMail mailHeaders] objectForKey: @"to"]; + NSString *rc; + + if (htmlComposition) + rc = [[[sourceMail mailHeaders] objectForKey: @"to"] stringByEscapingHTMLString]; + else + rc = [[sourceMail mailHeaders] objectForKey: @"to"]; + + return rc; } - (BOOL) hasCc @@ -118,8 +160,15 @@ - (NSString *) cc { - return ([NSString stringWithFormat: @"%@\n", - [self _headerField: @"cc"]]); + NSString *rc; + + if (htmlComposition) + rc = [NSString stringWithFormat: @"%@
", + [[self _headerField: @"cc"] stringByEscapingHTMLString]]; + else + rc = ([NSString stringWithFormat: @"%@\n", [self _headerField: @"cc"]]); + + return rc; } - (BOOL) hasNewsGroups @@ -129,8 +178,14 @@ - (NSString *) newsgroups { - return ([NSString stringWithFormat: @"%@\n", - [self _headerField: @"newsgroups"]]); + NSString *rc; + + if (htmlComposition) + rc = [NSString stringWithFormat: @"%@
", [self _headerField: @"newsgroups"]]; + else + rc = [NSString stringWithFormat: @"%@\n", [self _headerField: @"newsgroups"]]; + + return rc; } - (BOOL) hasReferences @@ -140,8 +195,14 @@ - (NSString *) references { - return ([NSString stringWithFormat: @"%@\n", - [self _headerField: @"references"]]); + NSString *rc; + + if (htmlComposition) + rc = [NSString stringWithFormat: @"%@
", [self _headerField: @"references"]]; + else + rc = [NSString stringWithFormat: @"%@\n", [self _headerField: @"references"]]; + + return rc; } - (NSString *) messageBody diff --git a/SoObjects/Mailer/SOGoMailFrenchForward.wo/SOGoMailFrenchForward.html b/SoObjects/Mailer/SOGoMailFrenchForward.wo/SOGoMailFrenchForward.html index 9629fc846..b7e19d1ee 100644 --- a/SoObjects/Mailer/SOGoMailFrenchForward.wo/SOGoMailFrenchForward.html +++ b/SoObjects/Mailer/SOGoMailFrenchForward.wo/SOGoMailFrenchForward.html @@ -1,13 +1,13 @@ - - - --------- Message original -------- -Sujet: <#subject/> -Date: <#date/> -De: <#from/> -<#hasReplyTo>Répondre à: <#replyTo/><#hasOrganization>Organisation: <#organization/>Pour: <#to/> -<#hasCc>Copie: <#cc/><#hasNewsGroups>Forums de discussion: <#newsgroups/><#hasReferences>Références: <#references/> - -<#messageBody/> - -<#signature/> +<#newLine/> +<#newLine/> +<#newLine/> +-------- Message original --------<#newLine/> +Sujet: <#subject/><#newLine/> +Date: <#date/><#newLine/> +De: <#from/><#newLine/> +<#hasReplyTo>Répondre à: <#replyTo/><#hasOrganization>Organisation: <#organization/>Pour: <#to/><#newLine/> +<#hasCc>Copie: <#cc/><#hasNewsGroups>Forums de discussion: <#newsgroups/><#hasReferences>Références: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#newLine/> +<#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailFrenchForward.wo/SOGoMailFrenchForward.wod b/SoObjects/Mailer/SOGoMailFrenchForward.wo/SOGoMailFrenchForward.wod index df237286f..7787fa18e 100644 --- a/SoObjects/Mailer/SOGoMailFrenchForward.wo/SOGoMailFrenchForward.wod +++ b/SoObjects/Mailer/SOGoMailFrenchForward.wo/SOGoMailFrenchForward.wod @@ -13,6 +13,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailFrenchReply.wo/SOGoMailFrenchReply.html b/SoObjects/Mailer/SOGoMailFrenchReply.wo/SOGoMailFrenchReply.html index 768b51bc3..3874e585e 100644 --- a/SoObjects/Mailer/SOGoMailFrenchReply.wo/SOGoMailFrenchReply.html +++ b/SoObjects/Mailer/SOGoMailFrenchReply.wo/SOGoMailFrenchReply.html @@ -1,16 +1,16 @@ -<#replyPlacementOnTop> - -<#signaturePlacementOnTop> -<#signature/> -<#outlookMode>-------- Message original -------- -Sujet: <#subject/> -Date: <#date/> -De: <#from/> -<#hasReplyTo>Répondre à: <#replyTo/><#hasOrganization>Organisation: <#organization/>Pour: <#to/> -<#hasCc>Copie: <#cc/><#hasNewsGroups>Forums de discussion: <#newsgroups/><#hasReferences>Références: <#references/> -<#standardMode>Le <#date/>, <#from/> a écrit: - -<#messageBody/> -<#replyPlacementOnBottom> - -<#signaturePlacementOnBottom><#signature/> +<#replyPlacementOnTop><#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +<#outlookMode>-------- Message original --------<#newLine/> +Sujet: <#subject/><#newLine/> +Date: <#date/><#newLine/> +De: <#from/><#newLine/> +<#hasReplyTo>Répondre à: <#replyTo/><#hasOrganization>Organisation: <#organization/>Pour: <#to/><#newLine/> +<#hasCc>Copie: <#cc/><#hasNewsGroups>Forums de discussion: <#newsgroups/><#hasReferences>Références: <#references/><#newLine/> +<#standardMode>Le <#date/>, <#from/> a écrit:<#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#replyPlacementOnBottom><#newLine/> +<#newLine/> +<#signaturePlacementOnBottom><#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailFrenchReply.wo/SOGoMailFrenchReply.wod b/SoObjects/Mailer/SOGoMailFrenchReply.wo/SOGoMailFrenchReply.wod index df3789cc3..3fbed6d61 100644 --- a/SoObjects/Mailer/SOGoMailFrenchReply.wo/SOGoMailFrenchReply.wod +++ b/SoObjects/Mailer/SOGoMailFrenchReply.wo/SOGoMailFrenchReply.wod @@ -22,6 +22,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailGermanForward.wo/SOGoMailGermanForward.html b/SoObjects/Mailer/SOGoMailGermanForward.wo/SOGoMailGermanForward.html index 5c561becb..e85ff84e1 100644 --- a/SoObjects/Mailer/SOGoMailGermanForward.wo/SOGoMailGermanForward.html +++ b/SoObjects/Mailer/SOGoMailGermanForward.wo/SOGoMailGermanForward.html @@ -1,13 +1,13 @@ - - - --------- Original-Nachricht -------- -Betreff: <#subject/> -Datum: <#date/> -Von: <#from/> -<#hasReplyTo>Antwort an: <#replyTo/><#hasOrganization>Organisation: <#organization/>An: <#to/> -<#hasCc>Kopie: <#cc/><#hasNewsGroups>Newsgroup: <#newsgroups/><#hasReferences>Referenzen: <#references/> - -<#messageBody/> - -<#signature/> +<#newLine/> +<#newLine/> +<#newLine/> +-------- Original-Nachricht --------<#newLine/> +Betreff: <#subject/><#newLine/> +Datum: <#date/><#newLine/> +Von: <#from/><#newLine/> +<#hasReplyTo>Antwort an: <#replyTo/><#hasOrganization>Organisation: <#organization/>An: <#to/><#newLine/> +<#hasCc>Kopie: <#cc/><#hasNewsGroups>Newsgroup: <#newsgroups/><#hasReferences>Referenzen: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#newLine/> +<#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailGermanForward.wo/SOGoMailGermanForward.wod b/SoObjects/Mailer/SOGoMailGermanForward.wo/SOGoMailGermanForward.wod index df237286f..7787fa18e 100644 --- a/SoObjects/Mailer/SOGoMailGermanForward.wo/SOGoMailGermanForward.wod +++ b/SoObjects/Mailer/SOGoMailGermanForward.wo/SOGoMailGermanForward.wod @@ -13,6 +13,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailGermanReply.wo/SOGoMailGermanReply.html b/SoObjects/Mailer/SOGoMailGermanReply.wo/SOGoMailGermanReply.html index 791c93c0c..8d6df83db 100644 --- a/SoObjects/Mailer/SOGoMailGermanReply.wo/SOGoMailGermanReply.html +++ b/SoObjects/Mailer/SOGoMailGermanReply.wo/SOGoMailGermanReply.html @@ -1,16 +1,16 @@ -<#replyPlacementOnTop> - -<#signaturePlacementOnTop> -<#signature/> -<#outlookMode>-------- Original-Nachricht -------- -Betreff: <#subject/> -Datum: <#date/> -Von: <#from/> -<#hasReplyTo>Antwort an: <#replyTo/><#hasOrganization>Organisation: <#organization/>An: <#to/> -<#hasCc>Kopie: <#cc/><#hasNewsGroups>Newsgroup: <#newsgroups/><#hasReferences>Referenzen: <#references/> -<#standardMode>Am <#date/>, <#from/> schrieb: - -<#messageBody/> -<#replyPlacementOnBottom> - -<#signaturePlacementOnBottom><#signature/> +<#replyPlacementOnTop><#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +<#outlookMode>-------- Original-Nachricht --------<#newLine/> +Betreff: <#subject/><#newLine/> +Datum: <#date/><#newLine/> +Von: <#from/><#newLine/> +<#hasReplyTo>Antwort an: <#replyTo/><#hasOrganization>Organisation: <#organization/>An: <#to/><#newLine/> +<#hasCc>Kopie: <#cc/><#hasNewsGroups>Newsgroup: <#newsgroups/><#hasReferences>Referenzen: <#references/><#newLine/> +<#standardMode>Am <#date/>, <#from/> schrieb:<#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#replyPlacementOnBottom><#newLine/> +<#newLine/> +<#signaturePlacementOnBottom><#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailGermanReply.wo/SOGoMailGermanReply.wod b/SoObjects/Mailer/SOGoMailGermanReply.wo/SOGoMailGermanReply.wod index df3789cc3..3fbed6d61 100644 --- a/SoObjects/Mailer/SOGoMailGermanReply.wo/SOGoMailGermanReply.wod +++ b/SoObjects/Mailer/SOGoMailGermanReply.wo/SOGoMailGermanReply.wod @@ -22,6 +22,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailItalianForward.wo/SOGoMailItalianForward.html b/SoObjects/Mailer/SOGoMailItalianForward.wo/SOGoMailItalianForward.html index 706dcd931..8f7c009a3 100644 --- a/SoObjects/Mailer/SOGoMailItalianForward.wo/SOGoMailItalianForward.html +++ b/SoObjects/Mailer/SOGoMailItalianForward.wo/SOGoMailItalianForward.html @@ -1,13 +1,13 @@ - - - --------- Messaggio originale -------- -Oggetto: <#subject/> -Data: <#date/> -Da: <#from/> -<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organizzazione: <#organization/>A: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>Riferimento: <#references/> - -<#messageBody/> - -<#signature/> +<#newLine/> +<#newLine/> +<#newLine/> +-------- Messaggio originale --------<#newLine/> +Oggetto: <#subject/><#newLine/> +Data: <#date/><#newLine/> +Da: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organizzazione: <#organization/>A: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>Riferimento: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#newLine/> +<#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailItalianForward.wo/SOGoMailItalianForward.wod b/SoObjects/Mailer/SOGoMailItalianForward.wo/SOGoMailItalianForward.wod index 5def32746..add34bf51 100644 --- a/SoObjects/Mailer/SOGoMailItalianForward.wo/SOGoMailItalianForward.wod +++ b/SoObjects/Mailer/SOGoMailItalianForward.wo/SOGoMailItalianForward.wod @@ -13,6 +13,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailItalianReply.wo/SOGoMailItalianReply.html b/SoObjects/Mailer/SOGoMailItalianReply.wo/SOGoMailItalianReply.html index dca17cf6b..d63b98cf6 100644 --- a/SoObjects/Mailer/SOGoMailItalianReply.wo/SOGoMailItalianReply.html +++ b/SoObjects/Mailer/SOGoMailItalianReply.wo/SOGoMailItalianReply.html @@ -1,16 +1,16 @@ -<#replyPlacementOnTop> - -<#signaturePlacementOnTop> -<#signature/> -<#outlookMode>-------- Messaggio originale -------- -Oggetto: <#subject/> -Data: <#date/> -Da: <#from/> -<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organizzazione: <#organization/>A: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>Riferimento: <#references/> -<#standardMode>Il giorno <#date/>, <#from/> ha scritto: - -<#messageBody/> -<#replyPlacementOnBottom> - -<#signaturePlacementOnBottom><#signature/> +<#replyPlacementOnTop><#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +<#outlookMode>-------- Messaggio originale --------<#newLine/> +Oggetto: <#subject/><#newLine/> +Data: <#date/><#newLine/> +Da: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organizzazione: <#organization/>A: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>Riferimento: <#references/><#newLine/> +<#standardMode>Il giorno <#date/>, <#from/> ha scritto:<#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#replyPlacementOnBottom><#newLine/> +<#newLine/> +<#signaturePlacementOnBottom><#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailItalianReply.wo/SOGoMailItalianReply.wod b/SoObjects/Mailer/SOGoMailItalianReply.wo/SOGoMailItalianReply.wod index df3789cc3..3fbed6d61 100644 --- a/SoObjects/Mailer/SOGoMailItalianReply.wo/SOGoMailItalianReply.wod +++ b/SoObjects/Mailer/SOGoMailItalianReply.wo/SOGoMailItalianReply.wod @@ -22,6 +22,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailReply.m b/SoObjects/Mailer/SOGoMailReply.m index 22b7b7ac5..0e7638260 100644 --- a/SoObjects/Mailer/SOGoMailReply.m +++ b/SoObjects/Mailer/SOGoMailReply.m @@ -74,18 +74,21 @@ - (NSString *) messageBody { - NSString *s; - NSUserDefaults *ud; - - ud = [[context activeUser] userDefaults]; + NSString *s, *msgid; + NSRange r; s = [sourceMail contentForEditing]; if (s) { - if ([[ud objectForKey: @"ComposeMessagesType"] isEqualToString: @"html"]) + if (htmlComposition) { - s = [NSString stringWithFormat: @"
%@
", s]; + msgid = [[sourceMail envelope] messageID]; + r = NSMakeRange (1, [msgid length] - 2); + msgid = [msgid substringWithRange: r]; + s = [NSString stringWithFormat: + @"
%@
", + msgid, s]; } else { diff --git a/SoObjects/Mailer/SOGoMailRussianForward.wo/SOGoMailRussianForward.html b/SoObjects/Mailer/SOGoMailRussianForward.wo/SOGoMailRussianForward.html index 58d63020c..f8b141ae2 100644 --- a/SoObjects/Mailer/SOGoMailRussianForward.wo/SOGoMailRussianForward.html +++ b/SoObjects/Mailer/SOGoMailRussianForward.wo/SOGoMailRussianForward.html @@ -1,13 +1,13 @@ - - - --------- Original Message -------- -Subject: <#subject/> -Date: <#date/> -From: <#from/> -<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/> - -<#messageBody/> - -<#signature/> +<#newLine/> +<#newLine/> +<#newLine/> +-------- Original Message --------<#newLine/> +Subject: <#subject/><#newLine/> +Date: <#date/><#newLine/> +From: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#newLine/> +<#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailRussianForward.wo/SOGoMailRussianForward.wod b/SoObjects/Mailer/SOGoMailRussianForward.wo/SOGoMailRussianForward.wod index df237286f..7787fa18e 100644 --- a/SoObjects/Mailer/SOGoMailRussianForward.wo/SOGoMailRussianForward.wod +++ b/SoObjects/Mailer/SOGoMailRussianForward.wo/SOGoMailRussianForward.wod @@ -13,6 +13,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailRussianReply.wo/SOGoMailRussianReply.html b/SoObjects/Mailer/SOGoMailRussianReply.wo/SOGoMailRussianReply.html index add97cbc1..3f77594ae 100644 --- a/SoObjects/Mailer/SOGoMailRussianReply.wo/SOGoMailRussianReply.html +++ b/SoObjects/Mailer/SOGoMailRussianReply.wo/SOGoMailRussianReply.html @@ -1,16 +1,16 @@ -<#replyPlacementOnTop> - -<#signaturePlacementOnTop> -<#signature/> -<#outlookMode>-------- Original Message -------- -Subject: <#subject/> -Date: <#date/> -From: <#from/> -<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/> -<#standardMode>On <#date/>, <#from/> wrote: - -<#messageBody/> -<#replyPlacementOnBottom> - -<#signaturePlacementOnBottom><#signature/> +<#replyPlacementOnTop><#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +<#outlookMode>-------- Original Message --------<#newLine/> +Subject: <#subject/><#newLine/> +Date: <#date/><#newLine/> +From: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/><#newLine/> +<#standardMode>On <#date/>, <#from/> wrote:<#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#replyPlacementOnBottom><#newLine/> +<#newLine/> +<#signaturePlacementOnBottom><#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailRussianReply.wo/SOGoMailRussianReply.wod b/SoObjects/Mailer/SOGoMailRussianReply.wo/SOGoMailRussianReply.wod index df3789cc3..3fbed6d61 100644 --- a/SoObjects/Mailer/SOGoMailRussianReply.wo/SOGoMailRussianReply.wod +++ b/SoObjects/Mailer/SOGoMailRussianReply.wo/SOGoMailRussianReply.wod @@ -22,6 +22,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailSpanishForward.wo/SOGoMailSpanishForward.html b/SoObjects/Mailer/SOGoMailSpanishForward.wo/SOGoMailSpanishForward.html index 58d63020c..f8b141ae2 100644 --- a/SoObjects/Mailer/SOGoMailSpanishForward.wo/SOGoMailSpanishForward.html +++ b/SoObjects/Mailer/SOGoMailSpanishForward.wo/SOGoMailSpanishForward.html @@ -1,13 +1,13 @@ - - - --------- Original Message -------- -Subject: <#subject/> -Date: <#date/> -From: <#from/> -<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/> - -<#messageBody/> - -<#signature/> +<#newLine/> +<#newLine/> +<#newLine/> +-------- Original Message --------<#newLine/> +Subject: <#subject/><#newLine/> +Date: <#date/><#newLine/> +From: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#newLine/> +<#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailSpanishForward.wo/SOGoMailSpanishForward.wod b/SoObjects/Mailer/SOGoMailSpanishForward.wo/SOGoMailSpanishForward.wod index df237286f..7787fa18e 100644 --- a/SoObjects/Mailer/SOGoMailSpanishForward.wo/SOGoMailSpanishForward.wod +++ b/SoObjects/Mailer/SOGoMailSpanishForward.wo/SOGoMailSpanishForward.wod @@ -13,6 +13,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailSpanishReply.wo/SOGoMailSpanishReply.html b/SoObjects/Mailer/SOGoMailSpanishReply.wo/SOGoMailSpanishReply.html index e4e5dc000..8c34bdc8f 100644 --- a/SoObjects/Mailer/SOGoMailSpanishReply.wo/SOGoMailSpanishReply.html +++ b/SoObjects/Mailer/SOGoMailSpanishReply.wo/SOGoMailSpanishReply.html @@ -1,17 +1,17 @@ -<#signaturePlacementOnTop> - - -<#signature/> - -<#outlookMode>-------- Original Message -------- -Subject: <#subject/> -Date: <#date/> -From: <#from/> -<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/> -<#standardMode>On <#date/>, <#from/> wrote: - -<#messageBody/> - - -<#signaturePlacementOnBottom><#signature/> +<#signaturePlacementOnTop><#newLine/> +<#newLine/> +<#newLine/> +<#signature/><#newLine/> +<#newLine/> +<#outlookMode>-------- Original Message --------<#newLine/> +Subject: <#subject/><#newLine/> +Date: <#date/><#newLine/> +From: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/><#newLine/> +<#standardMode>On <#date/>, <#from/> wrote:<#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#newLine/> +<#newLine/> +<#signaturePlacementOnBottom><#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailSpanishReply.wo/SOGoMailSpanishReply.wod b/SoObjects/Mailer/SOGoMailSpanishReply.wo/SOGoMailSpanishReply.wod index df3789cc3..3fbed6d61 100644 --- a/SoObjects/Mailer/SOGoMailSpanishReply.wo/SOGoMailSpanishReply.wod +++ b/SoObjects/Mailer/SOGoMailSpanishReply.wo/SOGoMailSpanishReply.wod @@ -22,6 +22,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailWelshForward.wo/SOGoMailWelshForward.html b/SoObjects/Mailer/SOGoMailWelshForward.wo/SOGoMailWelshForward.html index d13f46cd0..a5db1d073 100644 --- a/SoObjects/Mailer/SOGoMailWelshForward.wo/SOGoMailWelshForward.html +++ b/SoObjects/Mailer/SOGoMailWelshForward.wo/SOGoMailWelshForward.html @@ -1,13 +1,13 @@ - - - --------- Original Message -------- -Testun: <#subject/> -Dyddiad: <#date/> -Oddi wrth: <#from/> -<#hasReplyTo>Ymateb i: <#replyTo/><#hasOrganization>Sefydliad: <#organization/>I: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Grwpiau newyddion: <#newsgroups/><#hasReferences>Cyfeirnodau: <#references/> - -<#messageBody/> - -<#signature/> +<#newLine/> +<#newLine/> +<#newLine/> +-------- Original Message --------<#newLine/> +Testun: <#subject/><#newLine/> +Dyddiad: <#date/><#newLine/> +Oddi wrth: <#from/><#newLine/> +<#hasReplyTo>Ymateb i: <#replyTo/><#hasOrganization>Sefydliad: <#organization/>I: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Grwpiau newyddion: <#newsgroups/><#hasReferences>Cyfeirnodau: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#newLine/> +<#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailWelshForward.wo/SOGoMailWelshForward.wod b/SoObjects/Mailer/SOGoMailWelshForward.wo/SOGoMailWelshForward.wod index df237286f..7787fa18e 100644 --- a/SoObjects/Mailer/SOGoMailWelshForward.wo/SOGoMailWelshForward.wod +++ b/SoObjects/Mailer/SOGoMailWelshForward.wo/SOGoMailWelshForward.wod @@ -13,6 +13,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/SoObjects/Mailer/SOGoMailWelshReply.wo/SOGoMailWelshReply.html b/SoObjects/Mailer/SOGoMailWelshReply.wo/SOGoMailWelshReply.html index 10adf3075..76c57b4ce 100644 --- a/SoObjects/Mailer/SOGoMailWelshReply.wo/SOGoMailWelshReply.html +++ b/SoObjects/Mailer/SOGoMailWelshReply.wo/SOGoMailWelshReply.html @@ -1,16 +1,16 @@ -<#replyPlacementOnTop> - -<#signaturePlacementOnTop> -<#signature/> -<#outlookMode>-------- Neges Wreiddiol -------- -Testun: <#subject/> -Dyddiad: <#date/> -Oddi wrth: <#from/> -<#hasReplyTo>Ymateb i: <#replyTo/><#hasOrganization>Sefydliad: <#organization/>I: <#to/> -<#hasCc>CC: <#cc/><#hasNewsGroups>Grwpiau newyddion: <#newsgroups/><#hasReferences>Cyfeirnodau: <#references/> -<#standardMode>Ar <#date/>, <#from/> ysgrifennodd: - -<#messageBody/> -<#replyPlacementOnBottom> - -<#signaturePlacementOnBottom><#signature/> +<#replyPlacementOnTop><#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +<#outlookMode>-------- Neges Wreiddiol --------<#newLine/> +Testun: <#subject/><#newLine/> +Dyddiad: <#date/><#newLine/> +Oddi wrth: <#from/><#newLine/> +<#hasReplyTo>Ymateb i: <#replyTo/><#hasOrganization>Sefydliad: <#organization/>I: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Grwpiau newyddion: <#newsgroups/><#hasReferences>Cyfeirnodau: <#references/><#newLine/> +<#standardMode>Ar <#date/>, <#from/> ysgrifennodd:<#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#replyPlacementOnBottom><#newLine/> +<#newLine/> +<#signaturePlacementOnBottom><#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailWelshReply.wo/SOGoMailWelshReply.wod b/SoObjects/Mailer/SOGoMailWelshReply.wo/SOGoMailWelshReply.wod index df3789cc3..3fbed6d61 100644 --- a/SoObjects/Mailer/SOGoMailWelshReply.wo/SOGoMailWelshReply.wod +++ b/SoObjects/Mailer/SOGoMailWelshReply.wo/SOGoMailWelshReply.wod @@ -22,6 +22,11 @@ from: WOString { escapeHTML = NO; } +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + hasReplyTo: WOConditional { condition = hasReplyTo; } diff --git a/UI/Templates/MailerUI/UIxMailEditor.wox b/UI/Templates/MailerUI/UIxMailEditor.wox index ab3e3f680..c43942889 100644 --- a/UI/Templates/MailerUI/UIxMailEditor.wox +++ b/UI/Templates/MailerUI/UIxMailEditor.wox @@ -10,7 +10,7 @@ className="UIxPageFrame" title="panelTitle" const:popup="YES" - const:jsFiles="UIxMailToSelection.js,fckeditor/fckeditor.js"> + const:jsFiles="UIxMailToSelection.js,ckeditor/ckeditor.js"> diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index e23ed241a..09e922561 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -10,7 +10,7 @@ className="UIxPageFrame" title="title" const:popup="YES" - const:jsFiles="fckeditor/fckeditor.js" + const:jsFiles="ckeditor/ckeditor.js" >
diff --git a/UI/WebServerResources/GNUmakefile b/UI/WebServerResources/GNUmakefile index 3b14c1781..eeee0e865 100644 --- a/UI/WebServerResources/GNUmakefile +++ b/UI/WebServerResources/GNUmakefile @@ -12,7 +12,7 @@ install :: else \ mkdir -p $(SOGO_WEBSERVERRESOURCESDIR); \ cp $(WEBSERVER_RESOURCE_FILES) $(SOGO_WEBSERVERRESOURCESDIR); \ - cp -r fckeditor $(SOGO_WEBSERVERRESOURCESDIR); \ + cp -r ckeditor $(SOGO_WEBSERVERRESOURCESDIR); \ fi clean :: diff --git a/UI/WebServerResources/UIxMailEditor.js b/UI/WebServerResources/UIxMailEditor.js index 2c170e98a..80f091381 100644 --- a/UI/WebServerResources/UIxMailEditor.js +++ b/UI/WebServerResources/UIxMailEditor.js @@ -561,10 +561,7 @@ function initMailEditor() { var subjectField = $$("div#subjectRow input").first(); initTabIndex($("addressList"), subjectField, textarea); - onWindowResize.defer(); - - Event.observe(window, "resize", onWindowResize); - Event.observe(window, "beforeunload", onMailEditorClose); + //onWindowResize.defer(); var focusField = (mailIsReply ? textarea : $("addr_0")); focusField.focus(); @@ -573,12 +570,23 @@ function initMailEditor() { var composeMode = UserDefaults["ComposeMessagesType"]; if (composeMode == "html") { - var oFCKeditor = new FCKeditor ('text'); - oFCKeditor.BasePath = "/SOGo.woa/WebServerResources/fckeditor/"; - oFCKeditor.ToolbarSet = 'Basic'; - oFCKeditor.ReplaceTextarea (); + CKEDITOR.replace('text', + { + skin: "v2", + toolbar : + [['Bold', 'Italic', '-', 'NumberedList', + 'BulletedList', '-', 'Link', 'Unlink', 'Image', + 'JustifyLeft','JustifyCenter','JustifyRight', + 'JustifyBlock','Font','FontSize','-','TextColor', + 'BGColor'] + ] + } + ); } - onWindowResize (null); + + Event.observe(window, "resize", onWindowResize); + Event.observe(window, "beforeunload", onMailEditorClose); + onWindowResize.defer(); } function initializePriorityMenu() { @@ -731,10 +739,17 @@ function onWindowResize(event) { // Resize the textarea (message content) var composeMode = UserDefaults["ComposeMessagesType"]; if (composeMode == "html") { - var editor = $('text___Frame'); - editor.height = Math.floor(window.height() - editor.offsetTop) + "px"; - editor.style.height = Math.floor(window.height() - editor.offsetTop) + "px"; - editor.setStyle({ 'top': hr.offsetTop + 'px' }); + var editor = $('cke_text'); + if (editor == null) { + setTimeout ('onWindowResize ()', 100); + return; + } + var content = $("cke_contents_text"); + var height = Math.floor(window.height() - editor.offsetTop); + + content.height = (height-60) + "px"; + content.style.height = (height-60) + "px"; + content.setStyle({ 'top': hr.offsetTop + 'px' }); } textarea.rows = Math.floor((window.height() - textarea.offsetTop) / rowheight); } diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index f42b81d55..5408eea1a 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -30,25 +30,30 @@ function onChoiceChanged(event) { } function initPreferences() { + CKEDITOR.replace('signature', + { + skin: "v2", + height: "90px", + toolbar : + [['Bold', 'Italic', '-', 'Link', + 'Font','FontSize','-','TextColor', + 'BGColor'] + ] + } + ); + _setupEvents(true); if (typeof (initAdditionalPreferences) != "undefined") initAdditionalPreferences(); $("replyPlacementList").observe ("change", onReplyPlacementListChange); onReplyPlacementListChange(); - var oFCKeditor = new FCKeditor ('signature'); - oFCKeditor.BasePath = "/SOGo.woa/WebServerResources/fckeditor/"; - oFCKeditor.ToolbarSet = 'Basic'; - oFCKeditor.ReplaceTextarea (); - $('signature___Frame').style.height = "150px"; - $('signature___Frame').height = "150px"; + $("composeMessagesType").observe ("change", onComposeMessagesTypeChange); if (UserDefaults["ComposeMessagesType"] != "html") { $("signature").style.display = 'inline'; - $('signature___Frame').style.display = 'none'; + $('cke_signature').style.display = 'none'; } - - $("composeMessagesType").observe ("change", onComposeMessagesTypeChange); } function onReplyPlacementListChange() { @@ -63,9 +68,9 @@ function onReplyPlacementListChange() { } function onComposeMessagesTypeChange () { - var textArea = $('signature'); - var oEditor = FCKeditorAPI.GetInstance('signature'); - var editor = $('signature___Frame'); +/* var textArea = $('signature'); + var oEditor = CKeditorAPI.GetInstance('signature'); + var editor = $('cke_signature'); if ($("composeMessagesType").value == 0) { textArea.style.display = 'inline'; @@ -76,7 +81,7 @@ function onComposeMessagesTypeChange () { textArea.style.display = 'none'; editor.style.display = ''; oEditor.SetHTML(textArea.value); - } + }*/ } document.observe("dom:loaded", initPreferences); diff --git a/UI/WebServerResources/ckeditor/.htaccess b/UI/WebServerResources/ckeditor/.htaccess new file mode 100644 index 000000000..7644c3205 --- /dev/null +++ b/UI/WebServerResources/ckeditor/.htaccess @@ -0,0 +1,24 @@ +# +# Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved. +# For licensing, see LICENSE.html or http://ckeditor.com/license +# + +# +# On some specific Linux installations you could face problems with Firefox. +# It could give you errors when loading the editor saying that some illegal +# characters were found (three strange chars in the beginning of the file). +# This could happen if you map the .js or .css files to PHP, for example. +# +# Those characters are the Byte Order Mask (BOM) of the Unicode encoded files. +# All FCKeditor files are Unicode encoded. +# + +AddType application/x-javascript .js +AddType text/css .css + +# +# If PHP is mapped to handle XML files, you could have some issues. The +# following will disable it. +# + +AddType text/xml .xml diff --git a/UI/WebServerResources/ckeditor/CHANGES.html b/UI/WebServerResources/ckeditor/CHANGES.html new file mode 100644 index 000000000..c05414cc1 --- /dev/null +++ b/UI/WebServerResources/ckeditor/CHANGES.html @@ -0,0 +1,52 @@ + + + + + Changelog - CKEditor + + + + +

+ CKEditor Changelog +

+

+ CKEditor 3.0 RC

+

+ No changelog available.

+ + + diff --git a/UI/WebServerResources/ckeditor/LICENSE.html b/UI/WebServerResources/ckeditor/LICENSE.html new file mode 100644 index 000000000..7d53df4a1 --- /dev/null +++ b/UI/WebServerResources/ckeditor/LICENSE.html @@ -0,0 +1,1334 @@ + + + + + License - CKEditor + + +

+ Software License Agreement +

+

+ CKEditor™ - The text editor for Internet™ - + http://ckeditor.com
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +

+

+ Licensed under the terms of any of the following licenses at your choice: +

+ +

+ You are not required to, but if you want to explicitly declare the license you have + chosen to be bound to when using, reproducing, modifying and distributing this software, + just include a text file titled "LEGAL" in your version of this software, indicating + your license choice. In any case, your choice will not restrict any recipient of + your version of this software to use, reproduce, modify and distribute this software + under any of the above licenses. +

+

+ Sources of Intellectual Property Included in CKEditor +

+

+ Where not otherwise indicated, all CKEditor content is authored by CKSource engineers + and consists of CKSource-owned intellectual property. In some specific instances, + CKEditor will incorporate work done by developers outside of CKSource with their + express permission. +

+

+ YUI Test: At _source/tests/yuitest.js + can be found part of the source code of YUI, which is licensed under the terms of + the BSD License. YUI is + Copyright © 2008, Yahoo! Inc. +

+

+ Trademarks +

+

+ CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product + names are trademarks, registered trademarks or service marks of their respective + holders. +

+ + diff --git a/UI/WebServerResources/ckeditor/_docs/api/files.html b/UI/WebServerResources/ckeditor/_docs/api/files.html new file mode 100644 index 000000000..b8692a76f --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/files.html @@ -0,0 +1,2555 @@ + + + + + + File Index - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + +
+ +
+

Namespaces

+ +

Classes

+ +
+
+ +
+

File Index

+ + +
+

core\_bootstrap.js

+ +API initialization code. +
+ + + + +
+
+
+ +
+

core\ajax.js

+ +Defines the CKEDITOR.ajax object, which holds ajax methods for + data loading. +
+ + + + +
+
+
+ +
+

core\ckeditor.js

+ +Contains the third and last part of the CKEDITOR object + definition. +
+ + + + +
+
+
+ +
+

core\ckeditor_base.js

+ +Contains the first and essential part of the CKEDITOR + object definition. +
+ + + + +
+
+
+ +
+

core\ckeditor_basic.js

+ +Contains the second part of the CKEDITOR object + definition, which defines the basic editor features to be available in + the root ckeditor_basic.js file. +
+ + + + +
+
+
+ +
+

core\command.js

+ +
+ + + + +
+
+
+ +
+

core\commanddefinition.js

+ +Defines the "virtual" CKEDITOR.commandDefinition class, + which contains the defintion of a command. +
+ + + + +
+
+
+ +
+

core\config.js

+ +Defines the CKEDITOR.config object, which holds the +default configuration settings. +
+ + + + +
+
+
+ +
+

core\dom.js

+ +Defines the CKEDITOR.dom object, which contains DOM + manipulation objects and function. +
+ + + + +
+
+
+ +
+

core\dom\document.js

+ +Defines the CKEDITOR.dom.document class, which + represents a DOM document. +
+ + + + +
+
+
+ +
+

core\dom\documentfragment.js

+ +
+ + + + +
+
+
+ +
+

core\dom\domobject.js

+ +Defines the CKEDITOR.editor class, which is the base + for other classes representing DOM objects. +
+ + + + +
+
+
+ +
+

core\dom\domwalker.js

+ +
+ + + + +
+
+
+ +
+

core\dom\element.js

+ +Defines the CKEDITOR.dom.element class, which + represents a DOM element. +
+ + + + +
+
+
+ +
+

core\dom\elementpath.js

+ +
+ + + + +
+
+
+ +
+

core\dom\event.js

+ +Defines the CKEDITOR.dom.event class, which + represents the a native DOM event object. +
+ + + + +
+
+
+ +
+

core\dom\node.js

+ +Defines the CKEDITOR.dom.node class, which is the base + class for classes that represent DOM nodes. +
+ + + + +
+
+
+ +
+

core\dom\nodelist.js

+ +
+ + + + +
+
+
+ +
+

core\dom\range.js

+ +
+ + + + +
+
+
+ +
+

core\dom\text.js

+ +Defines the CKEDITOR.dom.text class, which represents + a DOM text node. +
+ + + + +
+
+
+ +
+

core\dom\walker.js

+ +
+ + + + +
+
+
+ +
+

core\dom\window.js

+ +Defines the CKEDITOR.dom.document class, which + represents a DOM document. +
+ + + + +
+
+
+ +
+

core\dtd.js

+ +Defines the CKEDITOR.dtd object, which holds the DTD + mapping for XHTML 1.0 Transitional. +
+ + + + +
+
+
+ +
+

core\editor.js

+ +Defines the CKEDITOR.editor class, which represents an + editor instance. +
+ + + + +
+
+
+ +
+

core\editor_basic.js

+ +
+ + + + +
+
+
+ +
+

core\env.js

+ +Defines the CKEDITOR.env object, which constains + environment and browser information. +
+ + + + +
+
+
+ +
+

core\event.js

+ +Defines the CKEDITOR.event class, which serves as the + base for classes and objects that require event handling features. +
+ + + + +
+
+
+ +
+

core\eventInfo.js

+ +Defines the "virtual" CKEDITOR.eventInfo class, which + contains the defintions of the event object passed to event listeners. +
+ + + + +
+
+
+ +
+

core\focusmanager.js

+ +Defines the CKEDITOR.focusManager class, which is used + to handle the focus on editor instances. +
+ + + + +
+
+
+ +
+

core\htmlparser.js

+ +
+ + + + +
+
+
+ +
+

core\htmlparser\basicwriter.js

+ +
+ + + + +
+
+
+ +
+

core\htmlparser\cdata.js

+ +
+ + + + +
+
+
+ +
+

core\htmlparser\comment.js

+ +
+ + + + +
+
+
+ +
+

core\htmlparser\element.js

+ +
+ + + + +
+
+
+ +
+

core\htmlparser\filter.js

+ +
+ + + + +
+
+
+ +
+

core\htmlparser\fragment.js

+ +
+ + + + +
+
+
+ +
+

core\htmlparser\text.js

+ +
+ + + + +
+
+
+ +
+

core\imagecacher.js

+ +
+ + + + +
+
+
+ +
+

core\lang.js

+ +
+ + + + +
+
+
+ +
+

core\loader.js

+ +Defines the CKEDITOR.loader objects, which is used to + load core scripts and their dependencies from _source. +
+ + + + +
+
+
+ +
+

core\plugindefinition.js

+ +Defines the "virtual" CKEDITOR.pluginDefinition class, which + contains the defintion of a plugin. +
+ + + + +
+
+
+ +
+

core\plugins.js

+ +Defines the CKEDITOR.plugins object, which is used to + manage plugins registration and loading. +
+ + + + +
+
+
+ +
+

core\resourcemanager.js

+ +Defines the CKEDITOR.resourceManager class, which is + the base for resource managers, like plugins and themes. +
+ + + + +
+
+
+ +
+

core\scriptloader.js

+ +Defines the CKEDITOR.scriptLoader object, used to load scripts + asynchronously. +
+ + + + +
+
+
+ +
+

core\skins.js

+ +Defines the CKEDITOR.skins object, which is used to + manage skins loading. +
+ + + + +
+
+
+ +
+

core\test.js

+ +Defines the CKEDITOR.test object, which contains + functions used at our testing environment. +
+ + + + +
+
+
+ +
+

core\themes.js

+ +Defines the CKEDITOR.themes object, which is used to + manage themes registration and loading. +
+ + + + +
+
+
+ +
+

core\tools.js

+ +Defines the CKEDITOR.tools object, which contains + utility functions. +
+ + + + +
+
+
+ +
+

core\ui.js

+ +
+ + + + +
+
+
+ +
+

core\xml.js

+ +Defines the CKEDITOR.xml class, which represents a + loaded XML document. +
+ + + + +
+
+
+ +
+

lang\en.js

+ +Defines the CKEDITOR.lang object, for the English + language. +
+ + + + +
+
+
+ +
+

plugins\about\dialogs\about.js

+ +
+ + + + +
+
+
+ +
+

plugins\about\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\basicstyles\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\blockquote\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\button\plugin.js

+ +
+ + + + +
+
+
+ + +
+ +
+

plugins\clipboard\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\colorbutton\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\contextmenu\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\dialog\dialogDefinition.js

+ +Defines the "virtual" dialog, dialog content and dialog button +definition classes. +
+ + + + +
+
+
+ +
+

plugins\dialog\plugin.js

+ +The floating dialog plugin. +
+ + + + +
+
+
+ +
+

plugins\dialogui\plugin.js

+ +The "dialogui" plugin. +
+ + + + +
+
+
+ +
+

plugins\domiterator\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\editingblock\plugin.js

+ +The default editing block plugin, which holds the editing area + and source view. +
+ + + + +
+
+
+ +
+

plugins\elementspath\plugin.js

+ +The "elementspath" plugin. +
+ + + + +
+
+
+ +
+

plugins\enterkey\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\entities\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\fakeobjects\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\filebrowser\plugin.js

+ +The "filebrowser" plugin, it adds support for file uploads and + browsing. +
+ + + + +
+
+
+ +
+

plugins\find\dialogs\find.js

+ +
+ + + + +
+
+
+ +
+

plugins\find\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\flash\dialogs\flash.js

+ +
+ + + + +
+
+
+ +
+

plugins\flash\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\floatpanel\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\font\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\format\plugin.js

+ +
+ + + + +
+
+
+ + +
+ + +
+ +
+

plugins\forms\dialogs\form.js

+ +
+ + + + +
+
+
+ + +
+ +
+

plugins\forms\dialogs\radio.js

+ +
+ + + + +
+
+
+ + +
+ + +
+ + +
+ +
+

plugins\forms\plugin.js

+ +
+ + + + +
+
+
+ + +
+ + +
+ +
+

plugins\htmlwriter\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\iframedialog\plugin.js

+ +Plugin for making iframe based dialogs. +
+ + + + +
+
+
+ +
+

plugins\image\dialogs\image.js

+ +
+ + + + +
+
+
+ +
+

plugins\image\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\indent\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\justify\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\keystrokes\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\link\dialogs\anchor.js

+ +
+ + + + +
+
+
+ +
+

plugins\link\dialogs\link.js

+ +
+ + + + +
+
+
+ +
+

plugins\link\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\list\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\listblock\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\maximize\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\menu\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\menubutton\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\newpage\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\pagebreak\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\panel\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\panelbutton\plugin.js

+ +
+ + + + +
+
+
+ + +
+ + +
+ + +
+ +
+

plugins\pastetext\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\popup\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\preview\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\print\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\removeformat\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\resize\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\richcombo\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\save\plugin.js

+ +
+ + + + +
+
+
+ + +
+ +
+

plugins\scayt\plugin.js

+ +Spell Check As You Type (SCAYT). +
+ + + + +
+
+
+ +
+

plugins\selection\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\showblocks\plugin.js

+ +The "showblocks" plugin. +
+ + + + +
+
+
+ + +
+ +
+

plugins\smiley\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\sourcearea\plugin.js

+ +The "sourcearea" plugin. +
+ + + + +
+
+
+ + +
+ +
+

plugins\specialchar\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\styles\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\stylescombo\plugin.js

+ +
+ + + + +
+
+
+ + +
+ +
+

plugins\tab\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\table\dialogs\table.js

+ +
+ + + + +
+
+
+ +
+

plugins\table\plugin.js

+ +
+ + + + +
+
+
+ + +
+ +
+

plugins\tabletools\plugin.js

+ +
+ + + + +
+
+
+ + +
+ +
+

plugins\templates\plugin.js

+ +
+ + + + +
+
+
+ + +
+ +
+

plugins\toolbar\plugin.js

+ +The "toolbar" plugin. +
+ + + + +
+
+
+ + +
+ +
+

plugins\uicolor\lang\en.js

+ +
+ + + + +
+
+
+ +
+

plugins\uicolor\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\uicolor\yui\yui.js

+ +
+ + + + +
+
+
+ +
+

plugins\undo\plugin.js

+ +Undo/Redo system for saving shapshot for document modification + and other recordable changes. +
+ + + + +
+
+
+ +
+

plugins\wsc\dialogs\wsc.js

+ +
+ + + + +
+
+
+ +
+

plugins\wsc\plugin.js

+ +
+ + + + +
+
+
+ +
+

plugins\wysiwygarea\plugin.js

+ +The "wysiwygarea" plugin. +
+ + + + +
+
+
+ + +
+
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/index.html b/UI/WebServerResources/ckeditor/_docs/api/index.html new file mode 100644 index 000000000..8045e819b --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/index.html @@ -0,0 +1,1354 @@ + + + + + + CKEditor 3.0 JavaScript API Documentation + + + + + + + + + +
+ +
+

Namespaces

+ +

Classes

+ +
+
+ +
+

Namespace Index

+ + + + + +
+

CKEDITOR

+ +This is the API entry point. +
+
+ + + +
+

CKEDITOR.ajax

+ +Ajax methods for data loading. +
+
+ + + + + +
+

CKEDITOR.config

+ +Holds the default configuration settings. +
+
+ + + + + + + + + + + + + + + + + + + +
+

CKEDITOR.dom

+ +DOM manipulation objects and function. +
+
+ + + + + + + + + + + + + + + + + + + +
+

CKEDITOR.dtd

+ +Holds and object representation of the HTML DTD to be used by the editor in +its internal operations. +
+
+ + + + + +
+

CKEDITOR.env

+ +Environment and browser information. +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+

CKEDITOR.imageCacher

+ +Load images into the browser cache. +
+
+ + + + + +
+

CKEDITOR.loader

+ +Load core scripts and their dependencies from _source. +
+
+ + + + + +
+

CKEDITOR.plugins

+ +Manages plugins registration and loading. +
+
+ + + +
+

CKEDITOR.resourceManager

+ +Base class for resource managers, like plugins and themes. +
+
+ + + +
+

CKEDITOR.scriptLoader

+ +Load scripts asynchronously. +
+
+ + + +
+

CKEDITOR.skins

+ +Manages skins loading. +
+
+ + + +
+

CKEDITOR.test

+ +Contains functions used at our testing environment. +
+
+ + + +
+

CKEDITOR.themes

+ +Manages themes registration and loading. +
+
+ + + +
+

CKEDITOR.tools

+ +Utility functions. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Class Index

+ + + + + + + + + + +
+ + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + +
+

CKEDITOR.ui

+ +
+
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + +
+

CKEDITOR.xml

+ +
+
+ + + +
+
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ajax.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ajax.html new file mode 100644 index 000000000..2bf5aeb71 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ajax.html @@ -0,0 +1,999 @@ + + + + + + + CKEDITOR.ajax - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.ajax +

+ + +

+ + + +Ajax methods for data loading. + + +
Defined in: core/ajax.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Ajax methods for data loading.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.ajax.load(url, callback) +
+
Loads data from an URL as plain text.
+
<static>   +
CKEDITOR.ajax.loadXml(url, callback) +
+
Loads data from an URL as XML.
+
+ + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.ajax +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Ajax methods for data loading. + +
+ + + + + + + + + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
<static> + + {String} + CKEDITOR.ajax.load(url, callback) + +
+
+ Since: + + 3.0 + +
+
+
+ Loads data from an URL as plain text. + + +
+ + + + +
// Load data synchronously.
+var data = CKEDITOR.ajax.load( 'somedata.txt' );
+alert( data );
+ + + +
// Load data asynchronously.
+var data = CKEDITOR.ajax.load( 'somedata.txt', function( data )
+    {
+        alert( data );
+    } );
+ + + + + +
+
Parameters:
+ +
+ {String} url + +
+
The URL from which load data.
+ +
+ {Function} callback + Optional +
+
A callback function to be called on + data load. If not provided, the data will be loaded + asynchronously, passing the data value the function on load.
+ +
+ + + + +
+
Returns:
+ +
{String} The loaded data. For asynchronous requests, an + empty string. For invalid requests, null.
+ +
+ + + + +
+ + +
<static> + + {CKEDITOR.xml} + CKEDITOR.ajax.loadXml(url, callback) + +
+
+ Since: + + 3.0 + +
+
+
+ Loads data from an URL as XML. + + +
+ + + + +
// Load XML synchronously.
+var xml = CKEDITOR.ajax.loadXml( 'somedata.xml' );
+alert( xml.getInnerXml( '//' ) );
+ + + +
// Load XML asynchronously.
+var data = CKEDITOR.ajax.loadXml( 'somedata.xml', function( xml )
+    {
+        alert( xml.getInnerXml( '//' ) );
+    } );
+ + + + + +
+
Parameters:
+ +
+ {String} url + +
+
The URL from which load data.
+ +
+ {Function} callback + Optional +
+
A callback function to be called on + data load. If not provided, the data will be loaded + asynchronously, passing the data value the function on load.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.xml} An XML object holding the loaded data. For asynchronous requests, an + empty string. For invalid requests, null.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.commandDefinition.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.commandDefinition.html new file mode 100644 index 000000000..7b588dae9 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.commandDefinition.html @@ -0,0 +1,1046 @@ + + + + + + + CKEDITOR.commandDefinition - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.commandDefinition +

+ + +

+ + + + + +
Defined in: core/commanddefinition.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
(Virtual Class) Do not call this constructor.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.commandDefinition.async +
+
Whether the command is asynchronous, which means the 'afterCommandExec' event +will be fired by the command itself manually, and the 'exec' function return value +of this command is not to be returned.
+
<static>   +
+ CKEDITOR.commandDefinition.canUndo +
+
Whether the command need to be hooked into the redo/undo system.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
exec(editor, data) +
+
Executes the command.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.commandDefinition() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ (Virtual Class) Do not call this constructor. This class is not really part + of the API. It just illustrates the features of command objects to be + passed to the CKEDITOR.editor.prototype.addCommand function. + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {If defined as 'true', the command is asynchronous.} + CKEDITOR.commandDefinition.async + +
+
+ Since: + + 3.0 + +
+
+
+ Whether the command is asynchronous, which means the 'afterCommandExec' event +will be fired by the command itself manually, and the 'exec' function return value +of this command is not to be returned. + + +
+ + + + +
editorInstance.addCommand( 'alertName',
+{
+    exec : function( editor )
+    {
+        // Asynchronous operation below.
+        CKEDITOR.ajax.loadXml( 'data.xml' );
+    },
+    async : true    // The command need some time to complete after exec function returns.
+});
+ + + + + + + + +
+ + +
<static> + + {If not defined or 'true' both hook into undo system, set it + to 'false' explicitly keep it out.} + CKEDITOR.commandDefinition.canUndo + +
+
+ Since: + + 3.0 + +
+
+
+ Whether the command need to be hooked into the redo/undo system. + + +
+ + + + +
editorInstance.addCommand( 'alertName',
+{
+    exec : function( editor )
+    {
+        alert( editor.name );
+    },
+    canUndo : false    // No support for undo/redo
+});
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Boolean} + exec(editor, data) + +
+
+ Since: + + 3.0 + +
+
+
+ Executes the command. + + +
+ + + + +
editorInstance.addCommand( 'sample',
+{
+    exec : function( editor )
+    {
+        alert( 'Executing a command for the editor name "' + editor.name + '"!' );
+    }
+});
+ + + + + +
+
Parameters:
+ +
+ {CKEDITOR.editor} editor + +
+
The editor within which run the command.
+ +
+ {Object} data + Optional +
+
Additional data to be used to execute the command.
+ +
+ + + + +
+
Returns:
+ +
{Boolean} Whether the command has been successfully executed. + Defaults to "true", if nothing is returned.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.config.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.config.html new file mode 100644 index 000000000..e2b8738d9 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.config.html @@ -0,0 +1,2799 @@ + + + + + + + CKEDITOR.config - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.config +

+ + +

+ + + +Holds the default configuration settings. Changes to this object are +reflected in all editor instances, if not specificaly specified for those +instances. + + +
Defined in: core/config.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Holds the default configuration settings.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.config.baseFloatZIndex +
+
The base Z-index for floating dialogs and popups.
+
<static>   +
+ CKEDITOR.config.baseHref +
+
The base href URL used to resolve relative and absolute URLs in the +editor content.
+
<static>   +
+ CKEDITOR.config.blockedKeystrokes +
+
A list of keystrokes to be blocked if not defined in the #keystrokes +setting.
+
<static>   +
+ CKEDITOR.config.contentsCss +
+
The CSS file to be used to apply style to the contents.
+
<static>   +
+ CKEDITOR.config.contentsLangDirection +
+
The writting direction of the language used to write the editor +contents.
+
<static>   +
+ CKEDITOR.config.corePlugins +
+
A comma separated list of plugins that are not related to editor +instances.
+
<static>   +
+ CKEDITOR.config.customConfig +
+
The URL path for the custom configuration file to be loaded.
+
<static>   +
+ CKEDITOR.config.defaultLanguage +
+
The language to be used if [@link #language] is left empty and it's not +possible to localize the editor to the user language.
+
<static>   +
+ CKEDITOR.config.dialog_backgroundCoverColor +
+
The color of the dialog background cover.
+
<static>   +
+ CKEDITOR.config.dialog_backgroundCoverOpacity +
+
The opacity of the dialog background cover.
+
<static>   +
+ CKEDITOR.config.dialog_magnetDistance +
+
The distance of magnetic borders used in moving and resizing dialogs, +measured in pixels.
+
<static>   +
+ CKEDITOR.config.disableNativeSpellChecker +
+
Disables the built-in spell checker while typing natively available in the +browser (currently Firefox and Safari only).
+
<static>   +
+ CKEDITOR.config.disableNativeTableHandles +
+
Disables the "table tools" offered natively by the browser (currently +Firefox only) to make quick table editing operations, like adding or +deleting rows and columns.
+
<static>   +
+ CKEDITOR.config.disableObjectResizing +
+
Disables the ability of resize objects (image and tables) in the editing +area
+
<static>   +
+ CKEDITOR.config.docType +
+
Sets the doctype to be used when loading the editor content as HTML.
+
<static>   +
+ CKEDITOR.config.extraPlugins +
+
List of additional plugins to be loaded.
+
<static>   +
+ CKEDITOR.config.fullPage +
+
Indicates whether the contents to be edited are being inputted as a full +HTML page.
+
<static>   +
+ CKEDITOR.config.height +
+
The editor height, in CSS size format or pixel integer.
+
<static>   +
+ CKEDITOR.config.ignoreEmptyParagraph +
+
The editor will post an empty value ("") if you have just an empty paragraph on it, like this:
+
<static>   +
+ CKEDITOR.config.keystrokes +
+
A list associating keystrokes to editor commands.
+
<static>   +
+ CKEDITOR.config.language +
+
The user interface language localization to use.
+
<static>   +
+ CKEDITOR.config.plugins +
+
Comma separated list of plugins to load and initialize for an editor +instance.
+
<static>   +
+ CKEDITOR.config.protectedSource +
+
List of regular expressions to be executed over the input HTML, +indicating code that must stay untouched.
+
<static>   +
+ CKEDITOR.config.removePlugins +
+
List of plugins that must not be loaded.
+
<static>   +
+ CKEDITOR.config.skin +
+
The skin to load.
+
<static>   +
+ CKEDITOR.config.startupFocus +
+
Sets whether the editor should have the focus when the page loads.
+
<static>   +
+ CKEDITOR.config.startupMode +
+
The mode to load at the editor startup.
+
<static>   +
+ CKEDITOR.config.tabIndex +
+
The editor tabindex value.
+
<static>   +
+ CKEDITOR.config.tabSpaces +
+
Intructs the editor to add a number of spaces (&nbsp;) to the text when +hitting the TAB key.
+
<static>   +
+ CKEDITOR.config.templates +
+
The templates definition set to use.
+
<static>   +
+ CKEDITOR.config.templates_files +
+
The list of templates definition files to load.
+
<static>   +
+ CKEDITOR.config.templates_replaceContent +
+
Whether replace the current document content OR insert current +editing position.
+
<static>   +
+ CKEDITOR.config.theme +
+
The theme to be used to build the UI.
+
<static>   +
+ CKEDITOR.config.toolbar +
+
The toolbox (alias toolbar) definition.
+
<static>   +
+ CKEDITOR.config.toolbar_Basic +
+
The toolbar definition.
+
<static>   +
+ CKEDITOR.config.toolbarLocation +
+
The "theme space" to which rendering the toolbar.
+
<static>   +
+ CKEDITOR.config.width +
+
The editor width in CSS size format or pixel integer.
+
+ + + + + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.config +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Holds the default configuration settings. Changes to this object are +reflected in all editor instances, if not specificaly specified for those +instances. + +
+ + + + +
// All editor created after the following setting will not load custom
+// configuration files.
+CKEDITOR.config.customConfig = '';
+ + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {Number} + CKEDITOR.config.baseFloatZIndex + +
+
+ Since: + + 3.0 + +
+
+
+ The base Z-index for floating dialogs and popups. + + +
+ + + + +
config.baseFloatZIndex = 2000
+ + + + + + + +
+
Default Value:
+
+ 10000 +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.config.baseHref + +
+
+ Since: + + 3.0 + +
+
+
+ The base href URL used to resolve relative and absolute URLs in the +editor content. + + +
+ + + + +
config.baseHref = 'http://www.example.com/path/';
+ + + + + + + +
+
Default Value:
+
+ '' (empty string) +
+
+ + +
+ + +
<static> + + {Array} + CKEDITOR.config.blockedKeystrokes + +
+
+ Since: + + 3.0 + +
+
+
+ A list of keystrokes to be blocked if not defined in the #keystrokes +setting. In this way it is possible to block the default browser behavior +for those keystrokes. + +
+ Defined in: plugins/keystrokes/plugin.js. + + +
+ + + + + + + + + + + +
+ + +
<static> + + {String} + CKEDITOR.config.contentsCss + +
+
+ Since: + + 3.0 + +
+
+
+ The CSS file to be used to apply style to the contents. It should +reflect the CSS used in the final pages where the contents are to be +used. + + +
+ + + + +
config.contentsCss = '/css/mysitestyles.css';
+ + + + + + + +
+
Default Value:
+
+ '<CKEditor folder>/contents.css' +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.config.contentsLangDirection + +
+
+ Since: + + 3.0 + +
+
+
+ The writting direction of the language used to write the editor +contents. Allowed values are 'ltr' for Left-To-Right language (like +English), or 'rtl' for Right-To-Left languages (like Arabic). + + +
+ + + + +
config.contentsLangDirection = 'rtl';
+ + + + + + + +
+
Default Value:
+
+ 'ltr' +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.config.corePlugins + +
+
+ Since: + + 3.0 + +
+
+
+ A comma separated list of plugins that are not related to editor +instances. Reserved to plugins that extend the core code only.

+ +There are no ways to override this setting, except by editing the source +code of CKEditor (_source/core/config.js). + + +
+ + + + + + + + + + + +
+ + +
<static> + + {String} + CKEDITOR.config.customConfig + +
+
+ Since: + + 3.0 + +
+
+
+ The URL path for the custom configuration file to be loaded. If not +overloaded with inline configurations, it defaults to the "config.js" +file present in the root of the CKEditor installation directory.

+ +CKEditor will recursively load custom configuration files defined inside +other custom configuration files. + + +
+ + + + +
// Load a specific configuration file.
+CKEDITOR.replace( 'myfiled', { customConfig : '/myconfig.js' } );
+ + + +
// Do not load any custom configuration file.
+CKEDITOR.replace( 'myfiled', { customConfig : '' } );
+ + + + + + + +
+
Default Value:
+
+ '<CKEditor folder>/config.js' +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.config.defaultLanguage + +
+
+ Since: + + 3.0 + +
+
+
+ The language to be used if [@link #language] is left empty and it's not +possible to localize the editor to the user language. + + +
+ + + + +
config.defaultLanguage = 'it';
+ + + + + + + +
+
Default Value:
+
+ 'en' +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.config.dialog_backgroundCoverColor + +
+
+ Since: + + 3.0 + +
+
+
+ The color of the dialog background cover. It should be a valid CSS color +string. + +
+ Defined in: plugins/dialog/plugin.js. + + +
+ + + + +
config.dialog_backgroundCoverColor = 'rgb(255, 254, 253)';
+ + + + + + + +
+
Default Value:
+
+ white +
+
+ + +
+ + +
<static> + + {Number} + CKEDITOR.config.dialog_backgroundCoverOpacity + +
+
+ Since: + + 3.0 + +
+
+
+ The opacity of the dialog background cover. It should be a number within the +range [0.0, 1.0]. + +
+ Defined in: plugins/dialog/plugin.js. + + +
+ + + + +
config.dialog_backgroundCoverOpacity = 0.7;
+ + + + + + + +
+
Default Value:
+
+ 0.5 +
+
+ + +
+ + +
<static> + + {Number} + CKEDITOR.config.dialog_magnetDistance + +
+
+ Since: + + 3.0 + +
+
+
+ The distance of magnetic borders used in moving and resizing dialogs, +measured in pixels. + +
+ Defined in: plugins/dialog/plugin.js. + + +
+ + + + +
config.dialog_magnetDistance = 30;
+ + + + + + + +
+
Default Value:
+
+ 20 +
+
+ + +
+ + +
<static> + + {Boolean} + CKEDITOR.config.disableNativeSpellChecker + +
+
+ Since: + + 3.0 + +
+
+
+ Disables the built-in spell checker while typing natively available in the +browser (currently Firefox and Safari only).

+ +Even if word suggestions will not appear in the CKEditor context menu, this +feature is useful to help quickly identifying misspelled words.

+ +This setting is currently compatible with Firefox only due to limitations in +other browsers. + +
+ Defined in: plugins/wysiwygarea/plugin.js. + + +
+ + + + +
config.disableNativeSpellChecker = false;
+ + + + + + + +
+
Default Value:
+
+ true +
+
+ + +
+ + +
<static> + + {Boolean} + CKEDITOR.config.disableNativeTableHandles + +
+
+ Since: + + 3.0 + +
+
+
+ Disables the "table tools" offered natively by the browser (currently +Firefox only) to make quick table editing operations, like adding or +deleting rows and columns. + +
+ Defined in: plugins/wysiwygarea/plugin.js. + + +
+ + + + +
config.disableNativeTableHandles = false;
+ + + + + + + +
+
Default Value:
+
+ true +
+
+ + +
+ + +
<static> + + {Boolean} + CKEDITOR.config.disableObjectResizing + +
+
+ Since: + + 3.0 + +
+
+
+ Disables the ability of resize objects (image and tables) in the editing +area + +
+ Defined in: plugins/wysiwygarea/plugin.js. + + +
+ + + + +
config.disableObjectResizing = true;
+ + + + + + + +
+
Default Value:
+
+ false +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.config.docType + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the doctype to be used when loading the editor content as HTML. + + +
+ + + + +
// Set the doctype to the HTML 4 (quirks) mode.
+config.docType = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';
+ + + + + + + +
+
Default Value:
+
+ '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.config.extraPlugins + +
+
+ Since: + + 3.0 + +
+
+
+ List of additional plugins to be loaded. This is a tool setting which +makes it easier to add new plugins, whithout having to touch and +possibly breaking the plugins setting. + + +
+ + + + +
config.extraPlugins = 'myplugin,anotherplugin';
+ + + + + + + + +
+ + +
<static> + + {Boolean} + CKEDITOR.config.fullPage + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates whether the contents to be edited are being inputted as a full +HTML page. A full page includes the <html>, <head> and +<body> tags. The final output will also reflect this setting, +including the <body> contents only if this setting is disabled. + + +
+ + + + +
config.fullPage = true;
+ + + + + + + +
+
Default Value:
+
+ false +
+
+ + +
+ + +
<static> + + {String|Number} + CKEDITOR.config.height + +
+
+ Since: + + 3.0 + +
+
+
+ The editor height, in CSS size format or pixel integer. + + +
+ + + + + + + + + + +
+
Default Value:
+
+ '200' +
+
+ + +
+ + +
<static> + + {Undefined} + CKEDITOR.config.ignoreEmptyParagraph + +
+
+ Since: + + 3.0 + +
+
+
+ The editor will post an empty value ("") if you have just an empty paragraph on it, like this: + +
+ Defined in: plugins/wysiwygarea/plugin.js. + + +
+ + + + +

+


+

+ + + + + + + + +
+ + +
<static> + + {Array} + CKEDITOR.config.keystrokes + +
+
+ Since: + + 3.0 + +
+
+
+ A list associating keystrokes to editor commands. Each element in the list +is an array where the first item is the keystroke, and the second is the +command to be executed. + +
+ Defined in: plugins/keystrokes/plugin.js. + + +
+ + + + + + + + + + + +
+ + +
<static> + + {Boolean} + CKEDITOR.config.language + +
+
+ Since: + + 3.0 + +
+
+
+ The user interface language localization to use. If empty, the editor +automatically localize the editor to the user language, if supported, +otherwise the [@link #defaultLanguage] language is used. + + +
+ + + + +
// Load the German interface.
+config.language = 'de';
+ + + + + + + +
+
Default Value:
+
+ true +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.config.plugins + +
+
+ Since: + + 3.0 + +
+
+
+ Comma separated list of plugins to load and initialize for an editor +instance. + + +
+ + + + +
config.plugins = 'basicstyles,button,htmldataprocessor,toolbar,wysiwygarea';
+ + + + + + + + +
+ + +
<static> + + {Array} + CKEDITOR.config.protectedSource + +
+
+ Since: + + 3.0 + +
+
+
+ List of regular expressions to be executed over the input HTML, +indicating code that must stay untouched. + + +
+ + + + +
config.protectedSource.push( /<\?[\s\S]*?\?>/g );   // PHP Code
+config.protectedSource.push( /<%[\s\S]*?%>/g );   // ASP Code
+config.protectedSource.push( /(]+>[\s|\S]*?<\/asp:[^\>]+>)|(]+\/>)/gi );   // ASP.Net Code
+ + + + + + + + +
+ + +
<static> + + {String} + CKEDITOR.config.removePlugins + +
+
+ Since: + + 3.0 + +
+
+
+ List of plugins that must not be loaded. This is a tool setting which +makes it easier to avoid loading plugins definied in the plugins +setting, whithout having to touch and possibly breaking it. + + +
+ + + + +
config.removePlugins = 'elementspath,save,font';
+ + + + + + + + +
+ + +
<static> + + {String} + CKEDITOR.config.skin + +
+
+ Since: + + 3.0 + +
+
+
+ The skin to load. It may be the name of the skin folder inside the +editor installation path, or the name and the path separated by a comma. + + +
+ + + + +
config.skin = 'v2';
+ + + +
config.skin = 'myskin,/customstuff/myskin/';
+ + + + + + + +
+
Default Value:
+
+ 'default' +
+
+ + +
+ + +
<static> + + {Boolean} + CKEDITOR.config.startupFocus + +
+
+ Since: + + 3.0 + +
+
+
+ Sets whether the editor should have the focus when the page loads. + +
+ Defined in: plugins/editingblock/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + +
+
Default Value:
+
+ false +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.config.startupMode + +
+
+ Since: + + 3.0 + +
+
+
+ The mode to load at the editor startup. It depends on the plugins +loaded. By default, the "wysiwyg" and "source" modes are available. + +
+ Defined in: plugins/editingblock/plugin.js. + + +
+ + + + +
config.toolbarLocation = 'source';
+ + + + + + + +
+
Default Value:
+
+ 'wysiwyg' +
+
+ + +
+ + +
<static> + + {Number} + CKEDITOR.config.tabIndex + +
+
+ Since: + + 3.0 + +
+
+
+ The editor tabindex value. + + +
+ + + + +
config.tabIndex = 1;
+ + + + + + + +
+
Default Value:
+
+ 0 (zero) +
+
+ + +
+ + +
<static> + + {Undefined} + CKEDITOR.config.tabSpaces + +
+
+ Since: + + 3.0 + +
+
+
+ Intructs the editor to add a number of spaces (&nbsp;) to the text when +hitting the TAB key. If set to zero, the TAB key will have its default +behavior instead (like moving out of the editor). + +
+ Defined in: plugins/tab/plugin.js. + + +
+ + + + +
config.tabSpaces = 4;
+ + + + + + + +
+
Default Value:
+
+ 0 +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.config.templates + +
+
+ Since: + + 3.0 + +
+
+
+ The templates definition set to use. It accepts a list of names separated by +comma. It must match definitions loaded with the templates_files setting. + +
+ Defined in: plugins/templates/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + +
+
Default Value:
+
+ 'default' +
+
+ + +
+ + +
<static> + + {(String) Array} + CKEDITOR.config.templates_files + +
+
+ Since: + + 3.0 + +
+
+
+ The list of templates definition files to load. + +
+ Defined in: plugins/templates/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + +
+
Default Value:
+
+ [ 'plugins/templates/templates/default.js' ] +
+
+ + +
+ + +
<static> + + {Boolean} + CKEDITOR.config.templates_replaceContent + +
+
+ Since: + + 3.0 + +
+
+
+ Whether replace the current document content OR insert current +editing position. + +
+ Defined in: plugins/templates/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + +
+
Default Value:
+
+ true +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.config.theme + +
+
+ Since: + + 3.0 + +
+
+
+ The theme to be used to build the UI. + + +
+ + + + +
config.theme = 'default';
+ + + + + + +
+
See:
+ +
CKEDITOR.config.skin
+ +
+ + +
+
Default Value:
+
+ 'default' +
+
+ + +
+ + +
<static> + + {Array or String} + CKEDITOR.config.toolbar + +
+
+ Since: + + 3.0 + +
+
+
+ The toolbox (alias toolbar) definition. It is a toolbar name or an array of toolbars (strips), +each one being also an array, containing a list of UI items. + +
+ Defined in: plugins/toolbar/plugin.js. + + +
+ + + + +
// Defines a toolbar with only one strip containing the "Source" button, a
+// separator and the "Bold" and "Italic" buttons.
+CKEDITOR.config.toolbar =
+[
+    [ 'Source', '-', 'Bold', 'Italic' ]
+];
+// Load toolbar_Name where Name = Basic.
+CKEDITOR.config.toolbar = 'Basic';
+ + + + + + + + +
+ + +
<static> + + {Array} + CKEDITOR.config.toolbar_Basic + +
+
+ Since: + + 3.0 + +
+
+
+ The toolbar definition. It is an array of toolbars (strips), +each one being also an array, containing a list of UI items. + +
+ Defined in: plugins/toolbar/plugin.js. + + +
+ + + + +
// Defines a toolbar with only one strip containing the "Source" button, a
+// separator and the "Bold" and "Italic" buttons.
+CKEDITOR.config.toolbar_Basic =
+[
+    [ 'Source', '-', 'Bold', 'Italic' ]
+];
+ + + + + + + + +
+ + +
<static> + + {String} + CKEDITOR.config.toolbarLocation + +
+
+ Since: + + 3.0 + +
+
+
+ The "theme space" to which rendering the toolbar. For the default theme, +the recommended options are "top" and "bottom". + +
+ Defined in: plugins/toolbar/plugin.js. + + +
+ + + + +
config.toolbarLocation = 'bottom';
+ + + + + + +
+
See:
+ +
CKEDITOR.config.theme
+ +
+ + +
+
Default Value:
+
+ 'top' +
+
+ + +
+ + +
<static> + + {String|Number} + CKEDITOR.config.width + +
+
+ Since: + + 3.0 + +
+
+
+ The editor width in CSS size format or pixel integer. + + +
+ + + + + + + + + + +
+
Default Value:
+
+ '100%' +
+
+ + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.buttonDefinition.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.buttonDefinition.html new file mode 100644 index 000000000..febdf90ee --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.buttonDefinition.html @@ -0,0 +1,1101 @@ + + + + + + + CKEDITOR.dialog.buttonDefinition - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dialog.buttonDefinition +

+ + +

+ + + + + +
Defined in: plugins/dialog/dialogDefinition.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
This class is not really part of the API.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ accessKey +
+
The CTRL hotkey for the button.
+
  +
+ disabled +
+
Whether the button is disabled.
+
  +
+ id +
+
The id of the dialog button.
+
  +
+ label +
+
The label of the dialog button.
+
  +
+ onClick +
+
The function to execute when the button is clicked.
+
  +
+ title +
+
The popup message of the dialog button.
+
+ + + + + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dialog.buttonDefinition() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ This class is not really part of the API. It just illustrates the properties +that developers can use to define and create dialog buttons. + +
+ + + + +
// There is no constructor for this class, the user just has to define an
+// object with the appropriate properties.
+ + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {String} + accessKey + +
+
+ Since: + + 3.0 + +
+
+
+ The CTRL hotkey for the button. + + +
+ + + + +
exitButton.accessKey = 'X';		// Button will be pressed when user presses CTRL-X
+ + + + + + + + +
+ + +
+ + {Boolean} + disabled + +
+
+ Since: + + 3.0 + +
+
+
+ Whether the button is disabled. + + +
+ + + + + + + + + + +
+
Default Value:
+
+ false +
+
+ + +
+ + +
+ + {String} + id + +
+
+ Since: + + 3.0 + +
+
+
+ The id of the dialog button. Required. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + label + +
+
+ Since: + + 3.0 + +
+
+
+ The label of the dialog button. Required. + + +
+ + + + + + + + + + + +
+ + +
+ + {Function} + onClick + +
+
+ Since: + + 3.0 + +
+
+
+ The function to execute when the button is clicked. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + title + +
+
+ Since: + + 3.0 + +
+
+
+ The popup message of the dialog button. + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.contentDefinition.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.contentDefinition.html new file mode 100644 index 000000000..afdecf270 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.contentDefinition.html @@ -0,0 +1,1054 @@ + + + + + + + CKEDITOR.dialog.contentDefinition - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dialog.contentDefinition +

+ + +

+ + + + + +
Defined in: plugins/dialog/dialogDefinition.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
This class is not really part of the API.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ accessKey +
+
The CTRL hotkey for switching to the tab.
+
  +
+ elements +
+
The UI elements contained in this content page, defined as an array of +CKEDITOR.dialog.uiElementDefinition objects.
+
  +
+ id +
+
The id of the content page.
+
  +
+ label +
+
The tab label of the content page.
+
  +
+ title +
+
The popup message of the tab label.
+
+ + + + + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dialog.contentDefinition() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ This class is not really part of the API. It just illustrates the properties +that developers can use to define and create dialog content pages. + +
+ + + + +
// There is no constructor for this class, the user just has to define an
+// object with the appropriate properties.
+ + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {String} + accessKey + +
+
+ Since: + + 3.0 + +
+
+
+ The CTRL hotkey for switching to the tab. + + +
+ + + + +
contentDefinition.accessKey = 'Q';	// Switch to this page when CTRL-Q is pressed.
+ + + + + + + + +
+ + +
+ + {Array} + elements + +
+
+ Since: + + 3.0 + +
+
+
+ The UI elements contained in this content page, defined as an array of +CKEDITOR.dialog.uiElementDefinition objects. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + id + +
+
+ Since: + + 3.0 + +
+
+
+ The id of the content page. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + label + +
+
+ Since: + + 3.0 + +
+
+
+ The tab label of the content page. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + title + +
+
+ Since: + + 3.0 + +
+
+
+ The popup message of the tab label. + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.contentDefinitionObject.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.contentDefinitionObject.html new file mode 100644 index 000000000..2407fb1f3 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.contentDefinitionObject.html @@ -0,0 +1,1037 @@ + + + + + + + CKEDITOR.dialog.contentDefinitionObject - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dialog.contentDefinitionObject +

+ + +

+ + + + + +
Defined in: plugins/dialog/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
This class is not really part of the API.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
add(elementDefinition, nextSiblingId) +
+
Adds a UI element definition to the content definition.
+
  +
get(id) +
+
Gets a UI element definition under the content definition.
+
  +
remove(id) +
+
Removes a UI element definition from the content definition.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dialog.contentDefinitionObject() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ This class is not really part of the API. It is the template of the +objects representing content pages inside the +CKEDITOR.dialog.dialogDefinitionObject. + +
+ + + + +
CKEDITOR.on( 'dialogDefinition', function( evt )
+	{
+		var definition = evt.data.definition;
+		var content = definition.getContents( 'page1' );
+		content.remove( 'textInput1' );
+		...
+	} );
+ + + + + + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {CKEDITOR.dialog.uiElementDefinition} + add(elementDefinition, nextSiblingId) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a UI element definition to the content definition. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The + UI elemnet definition to be added.
+ +
+ {String} nextSiblingId + +
+
The id of an existing UI element + definition which the new UI element definition will be inserted + before. Omit if the new button definition is to be inserted as + the last item.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog.uiElementDefinition} The element + definition inserted.
+ +
+ + + + +
+ + + +
+ Since: + + 3.0 + +
+
+
+ Gets a UI element definition under the content definition. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {String} id + +
+
The id of the UI element definition.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog.uiElementDefinition}
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dialog.uiElementDefinition} + remove(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Removes a UI element definition from the content definition. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} id + +
+
The id of the UI element definition to be + removed.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog.uiElementDefinition} The element + definition removed.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.dialogDefinition.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.dialogDefinition.html new file mode 100644 index 000000000..7b33ed896 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.dialogDefinition.html @@ -0,0 +1,1281 @@ + + + + + + + CKEDITOR.dialog.dialogDefinition - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dialog.dialogDefinition +

+ + +

+ + + + + +
Defined in: plugins/dialog/dialogDefinition.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
This class is not really part of the API.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ buttons +
+
The buttons in the dialog, defined as an array of +CKEDITOR.dialog.buttonDefinition objects.
+
  +
+ contents +
+
The contents in the dialog, defined as an array of +CKEDITOR.dialog.contentDefinition objects.
+
  +
+ minHeight +
+
The minimum height of the dialog, in pixels.
+
  +
+ minWidth +
+
The minimum width of the dialog, in pixels.
+
  +
+ onCancel +
+
The function to execute when Cancel is pressed.
+
  +
+ onLoad +
+
The function to execute when the dialog is displayed for the first time.
+
  +
+ onOk +
+
The function to execute when OK is pressed.
+
  +
+ resizable +
+
How the dialog can be resized, must be one of the four contents defined below.
+
  +
+ title +
+
The dialog title, displayed in the dialog's header.
+
+ + + + + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dialog.dialogDefinition() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ This class is not really part of the API. It just illustrates the properties +that developers can use to define and create dialogs. + +
+ + + + +
// There is no constructor for this class, the user just has to define an
+// object with the appropriate properties.
+
+CKEDITOR.dialog.add( 'testOnly', function( editor )
+      {
+          return {
+              title : 'Test Dialog',
+              resizable : CKEDITOR.DIALOG_RESIZE_BOTH,
+              minWidth : 500,
+              minHeight : 400,
+              contents : [
+                  {
+                      id : 'tab1',
+                      label : 'First Tab',
+                      title : 'First Tab Title',
+                      accessKey : 'Q',
+                      elements : [
+                          {
+                              type : 'text',
+                              label : 'Test Text 1',
+                              id : 'testText1',
+                              'default' : 'hello world!'
+                          }
+                      ]
+                   }
+              ]
+          };
+      });
+ + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Array} + buttons + +
+
+ Since: + + 3.0 + +
+
+
+ The buttons in the dialog, defined as an array of +CKEDITOR.dialog.buttonDefinition objects. + + +
+ + + + + + + + + + +
+
Default Value:
+
+ [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ] +
+
+ + +
+ + +
+ + {Array} + contents + +
+
+ Since: + + 3.0 + +
+
+
+ The contents in the dialog, defined as an array of +CKEDITOR.dialog.contentDefinition objects. Required. + + +
+ + + + + + + + + + + +
+ + +
+ + {Number} + minHeight + +
+
+ Since: + + 3.0 + +
+
+
+ The minimum height of the dialog, in pixels. + + +
+ + + + + + + + + + +
+
Default Value:
+
+ 400 +
+
+ + +
+ + +
+ + {Number} + minWidth + +
+
+ Since: + + 3.0 + +
+
+
+ The minimum width of the dialog, in pixels. + + +
+ + + + + + + + + + +
+
Default Value:
+
+ 600 +
+
+ + +
+ + +
+ + {Function} + onCancel + +
+
+ Since: + + 3.0 + +
+
+
+ The function to execute when Cancel is pressed. + + +
+ + + + + + + + + + + +
+ + +
+ + {Function} + onLoad + +
+
+ Since: + + 3.0 + +
+
+
+ The function to execute when the dialog is displayed for the first time. + + +
+ + + + + + + + + + + +
+ + +
+ + {Function} + onOk + +
+
+ Since: + + 3.0 + +
+
+
+ The function to execute when OK is pressed. + + +
+ + + + + + + + + + + +
+ + +
+ + {Number} + resizable + +
+
+ Since: + + 3.0 + +
+
+
+ How the dialog can be resized, must be one of the four contents defined below. +

+CKEDITOR.DIALOG_RESIZE_NONE
+CKEDITOR.DIALOG_RESIZE_WIDTH
+CKEDITOR.DIALOG_RESIZE_HEIGHT
+CKEDITOR.DIALOG_RESIZE_BOTH
+ + +
+ + + + + + + + + + +
+
Default Value:
+
+ CKEDITOR.DIALOG_RESIZE_NONE +
+
+ + +
+ + +
+ + {String} + title + +
+
+ Since: + + 3.0 + +
+
+
+ The dialog title, displayed in the dialog's header. Required. + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.dialogDefinitionObject.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.dialogDefinitionObject.html new file mode 100644 index 000000000..9c40a0aed --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.dialogDefinitionObject.html @@ -0,0 +1,1245 @@ + + + + + + + CKEDITOR.dialog.dialogDefinitionObject - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dialog.dialogDefinitionObject +

+ + +

+
Extends + CKEDITOR.dialog.dialogDefinition.
+ + + + + +
Defined in: plugins/dialog/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
This class is not really part of the API.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.dialog.dialogDefinition:
buttons, contents, minHeight, minWidth, onCancel, onLoad, onOk, resizable, title
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
addButton(buttonDefinition, nextSiblingId) +
+
Adds a button definition object under this dialog definition.
+
  +
addContents(contentDefinition, nextSiblingId) +
+
Adds a content definition object under this dialog definition.
+
  +
getButton(id) +
+
Gets a button definition.
+
  + +
Gets a content definition.
+
  + +
Removes a button definition from the dialog definition.
+
  + +
Removes a content definition from this dialog definition.
+
+ + + +
+ +
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dialog.dialogDefinitionObject() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ This class is not really part of the API. It is the "definition" property value +passed to "dialogDefinition" event handlers. + +
+ + + + +
CKEDITOR.on( 'dialogDefinition', function( evt )
+	{
+		var definition = evt.data.definition;
+		var content = definition.getContents( 'page1' );
+		...
+	} );
+ + + + + + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {CKEDITOR.dialog.buttonDefinition} + addButton(buttonDefinition, nextSiblingId) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a button definition object under this dialog definition. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog.buttonDefinition} buttonDefinition + +
+
The + button definition.
+ +
+ {String} nextSiblingId + Optional +
+
The id of an existing button + definition which the new button definition will be inserted + before. Omit if the new button definition is to be inserted as + the last item.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog.buttonDefinition} The inserted button + definition.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dialog.contentDefinition} + addContents(contentDefinition, nextSiblingId) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a content definition object under this dialog definition. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog.contentDefinition} contentDefinition + +
+
The + content definition.
+ +
+ {String} nextSiblingId + Optional +
+
The id of an existing content + definition which the new content definition will be inserted + before. Omit if the new content definition is to be inserted as + the last item.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog.contentDefinition} The inserted content + definition.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dialog.buttonDefinition} + getButton(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets a button definition. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {String} id + +
+
The id of the button definition.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog.buttonDefinition} The button definition + matching id.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dialog.contentDefinition} + getContents(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets a content definition. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {String} id + +
+
The id of the content definition.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog.contentDefinition} The content definition + matching id.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dialog.buttonDefinition} + removeButton(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Removes a button definition from the dialog definition. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {String} id + +
+
The id of the button definition to be removed.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog.buttonDefinition} The removed button + definition.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dialog.contentDefinition} + removeContents(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Removes a content definition from this dialog definition. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {String} id + +
+
The id of the content definition to be removed.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog.contentDefinition} The removed content + definition.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.html new file mode 100644 index 000000000..a50d735da --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.html @@ -0,0 +1,2863 @@ + + + + + + + CKEDITOR.dialog - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dialog +

+ + +

+ + + + + +
Defined in: plugins/dialog/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.dialog(editor, dialogName) +
+
This is the base class for runtime dialog objects.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.dialog.cancelButton +
+
The default cancel button for dialogs.
+
<static>   +
+ CKEDITOR.dialog.okButton +
+
The default OK button for dialogs.
+
  +
+ reset +
+
Resets all input values in the dialog.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.dialog.add(name, dialogDefinition) +
+
Registers a dialog.
+
<static>   +
CKEDITOR.dialog.addIframe(name, title, src, width, height, onContentLoad) +
+
+
<static>   +
CKEDITOR.dialog.addUIElement(typeName, builder) +
+
Registers a dialog UI element.
+
<static>   +
CKEDITOR.dialog.exists(name) +
+
+
<static>   +
CKEDITOR.dialog.getCurrent() +
+
+
<inner>   +
changeFocus(forward) +
+
+
<inner>   + +
+
<inner>   +
iterContents(func) +
+
+
  +
addPage(contents) +
+
Adds a tabbed page into the dialog.
+
  +
click(id) +
+
Simulates a click to a dialog button in the dialog's button row.
+
  + +
+
  + +
Disables a dialog button.
+
  + +
Enables a dialog button.
+
  +
foreach(fn) +
+
Executes a function for each UI element.
+
  +
getButton(id) +
+
Gets the UI element of a button in the dialog's button row.
+
  +
getContentElement(pageId, elementId) +
+
Gets a dialog UI element object from a dialog page.
+
  + +
Gets the root DOM element of the dialog.
+
  +
getName() +
+
Gets the name of the dialog.
+
  + +
Gets the number of pages in the dialog.
+
  + +
Gets the editor instance which opened this dialog.
+
  + +
Gets the dialog's position in the window.
+
  + +
Gets the element that was selected when opening the dialog, if any.
+
  +
getSize() +
+
Gets the current size of the dialog in pixels.
+
  +
getValueOf(pageId, elementId) +
+
Gets the value of a dialog UI element.
+
  +
hide() +
+
Hides the dialog box.
+
  +
hidePage(id) +
+
Hides a page's tab away from the dialog.
+
  +
move(x, y) +
+
Moves the dialog to an (x, y) coordinate relative to the window.
+
  +
resize(width, height) +
+
Resizes the dialog.
+
  +
selectPage(id) +
+
Activates a tab page in the dialog by its id.
+
  + +
+
  +
setValueOf(pageId, elementId, value) +
+
Sets the value of a dialog UI element.
+
  +
show() +
+
Shows the dialog box.
+
  +
showPage(id) +
+
Unhides a page's tab.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dialog(editor, dialogName) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ This is the base class for runtime dialog objects. An instance of this +class represents a single named dialog for a single editor instance. + +
+ + + + +
var dialogObj = new CKEDITOR.dialog( editor, 'smiley' );
+ + + + + + +
+
Parameters:
+ +
+ {Object} editor + +
+
The editor which created the dialog.
+ +
+ {String} dialogName + +
+
The dialog's registered name.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {Function} + CKEDITOR.dialog.cancelButton + +
+
+ Since: + + 3.0 + +
+
+
+ The default cancel button for dialogs. Fires the "cancel" event and closes the dialog if no UI element value changed. + + +
+ + + + + + + + + + + +
+ + +
<static> + + {Function} + CKEDITOR.dialog.okButton + +
+
+ Since: + + 3.0 + +
+
+
+ The default OK button for dialogs. Fires the "ok" event and closes the dialog if the event succeeds. + + +
+ + + + + + + + + + + +
+ + +
+ + {CKEDITOR.dialog} + reset + +
+
+ Since: + + 3.0 + +
+
+
+ Resets all input values in the dialog. + + +
+ + + + +
dialogObj.reset();
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.dialog.add(name, dialogDefinition) + +
+
+ Since: + + 3.0 + +
+
+
+ Registers a dialog. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The dialog's name.
+ +
+ {Function|String} dialogDefinition + +
+
A function returning the dialog's definition, or the URL to the .js file holding the function. +The function should accept an argument "editor" which is the current editor instance, and +return an object conforming to CKEDITOR.dialog.dialogDefinition.
+ +
+ + + + + + +
+
See:
+ +
CKEDITOR.dialog.dialogDefinition
+ +
+ + +
+ + +
<static> + + {Undefined} + CKEDITOR.dialog.addIframe(name, title, src, width, height, onContentLoad) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/iframedialog/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} name + +
+
+ +
+ {Undefined} title + +
+
+ +
+ {Undefined} src + +
+
+ +
+ {Undefined} width + +
+
+ +
+ {Undefined} height + +
+
+ +
+ {Undefined} onContentLoad + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.dialog.addUIElement(typeName, builder) + +
+
+ Since: + + 3.0 + +
+
+
+ Registers a dialog UI element. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} typeName + +
+
The name of the UI element.
+ +
+ {Function} builder + +
+
The function to build the UI element.
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.dialog.exists(name) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} name + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.dialog.getCurrent() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
<inner> + + {Undefined} + changeFocus(forward) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} forward + +
+
+ +
+ + + + + + + +
+ + +
<inner> + + {Undefined} + focusKeydownHandler(evt) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} evt + +
+
+ +
+ + + + + + + +
+ + +
<inner> + + {Undefined} + iterContents(func) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} func + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + addPage(contents) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a tabbed page into the dialog. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {Object} contents + +
+
Content definition.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + click(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Simulates a click to a dialog button in the dialog's button row. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} id + +
+
The id of the button.
+ +
+ + + + +
+
Returns:
+ +
{Undefined} The return value of the dialog's "click" event.
+ +
+ + + + +
+ + +
+ + {Undefined} + commitContent() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + disableButton(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Disables a dialog button. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} id + +
+
The id of the button.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + enableButton(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Enables a dialog button. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} id + +
+
The id of the button.
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.dialog} + foreach(fn) + +
+
+ Since: + + 3.0 + +
+
+
+ Executes a function for each UI element. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Function} fn + +
+
Function to execute for each UI element.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog} The current dialog object.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.ui.dialog.button} + getButton(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the UI element of a button in the dialog's button row. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} id + +
+
The id of the button.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.ui.dialog.button} The button object.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.ui.dialog.uiElement} + getContentElement(pageId, elementId) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets a dialog UI element object from a dialog page. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} pageId + +
+
id of dialog page.
+ +
+ {String} elementId + +
+
id of UI element.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.ui.dialog.uiElement} The dialog UI element.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.element} + getElement() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the root DOM element of the dialog. + + +
+ + + + +
var dialogElement = dialogObj.getElement().getFirst();
+dialogElement.setStyle( 'padding', '5px' );
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The <span> element containing this dialog.
+ +
+ + + + +
+ + +
+ + {String} + getName() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the name of the dialog. + + +
+ + + + +
var dialogName = dialogObj.getName();
+ + + + + + + + +
+
Returns:
+ +
{String} The name of this dialog.
+ +
+ + + + +
+ + +
+ + {Number} + getPageCount() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the number of pages in the dialog. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + +
+
Returns:
+ +
{Number} Page count.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.editor} + getParentEditor() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the editor instance which opened this dialog. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + +
+
Returns:
+ +
{CKEDITOR.editor} Parent editor instances.
+ +
+ + + + +
+ + +
+ + {Object} + getPosition() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the dialog's position in the window. + + +
+ + + + +
var dialogX = dialogObj.getPosition().x;
+ + + + + + + + +
+
Returns:
+ +
{Object} An object with "x" and "y" properties.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.element} + getSelectedElement() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the element that was selected when opening the dialog, if any. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The element that was selected, or null.
+ +
+ + + + +
+ + +
+ + {Object} + getSize() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the current size of the dialog in pixels. + + +
+ + + + +
var width = dialogObj.getSize().width;
+ + + + + + + + +
+
Returns:
+ +
{Object} An object with "width" and "height" properties.
+ +
+ + + + +
+ + +
+ + {Object} + getValueOf(pageId, elementId) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the value of a dialog UI element. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} pageId + +
+
id of dialog page.
+ +
+ {String} elementId + +
+
id of UI element.
+ +
+ + + + +
+
Returns:
+ +
{Object} The value of the UI element.
+ +
+ + + + +
+ + +
+ + {Undefined} + hide() + +
+
+ Since: + + 3.0 + +
+
+
+ Hides the dialog box. + + +
+ + + + +
dialogObj.hide();
+ + + + + + + + + + + +
+ + +
+ + {Undefined} + hidePage(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Hides a page's tab away from the dialog. + + +
+ + + + +
dialog.hidePage( 'tab_3' );
+ + + + + +
+
Parameters:
+ +
+ {String} id + +
+
The page's Id.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + move(x, y) + +
+
+ Since: + + 3.0 + +
+
+
+ Moves the dialog to an (x, y) coordinate relative to the window. + + +
+ + + + +
dialogObj.move( 10, 40 );
+ + + + + +
+
Parameters:
+ +
+ {Number} x + +
+
The target x-coordinate.
+ +
+ {Number} y + +
+
The target y-coordinate.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + resize(width, height) + +
+
+ Since: + + 3.0 + +
+
+
+ Resizes the dialog. + + +
+ + + + +
dialogObj.resize( 800, 640 );
+ + + + + +
+
Parameters:
+ +
+ {Number} width + +
+
The width of the dialog in pixels.
+ +
+ {Number} height + +
+
The height of the dialog in pixels.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + selectPage(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Activates a tab page in the dialog by its id. + + +
+ + + + +
dialogObj.selectPage( 'tab_1' );
+ + + + + +
+
Parameters:
+ +
+ {String} id + +
+
The id of the dialog tab to be activated.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + setupContent() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + setValueOf(pageId, elementId, value) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the value of a dialog UI element. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} pageId + +
+
id of the dialog page.
+ +
+ {String} elementId + +
+
id of the UI element.
+ +
+ {Object} value + +
+
The new value of the UI element.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + show() + +
+
+ Since: + + 3.0 + +
+
+
+ Shows the dialog box. + + +
+ + + + +
dialogObj.show();
+ + + + + + + + + + + +
+ + +
+ + {Undefined} + showPage(id) + +
+
+ Since: + + 3.0 + +
+
+
+ Unhides a page's tab. + + +
+ + + + +
dialog.showPage( 'tab_2' );
+ + + + + +
+
Parameters:
+ +
+ {String} id + +
+
The page's Id.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.uiElementDefinition.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.uiElementDefinition.html new file mode 100644 index 000000000..ad52a4360 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialog.uiElementDefinition.html @@ -0,0 +1,1183 @@ + + + + + + + CKEDITOR.dialog.uiElementDefinition - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dialog.uiElementDefinition +

+ + +

+ + + + + +
Defined in: plugins/dialog/dialogDefinition.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
This class is not really part of the API.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ className +
+
CSS class names to append to the UI element.
+
  +
+ id +
+
The id of the UI element.
+
  +
+ onHide +
+
Function to execute whenever the UI element's parent dialog is closed.
+
  +
+ onLoad +
+
Function to execute the first time the UI element is displayed.
+
  +
+ onShow +
+
Function to execute whenever the UI element's parent dialog is displayed.
+
  +
+ style +
+
Inline CSS classes to append to the UI element.
+
  +
+ title +
+
The popup label of the UI element.
+
  +
+ type +
+
The type of the UI element.
+
+ + + + + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dialog.uiElementDefinition() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ This class is not really part of the API. It just illustrates the properties +that developers can use to define and create dialog UI elements. + +
+ + + + +
// There is no constructor for this class, the user just has to define an
+// object with the appropriate properties.
+ + + + + + + + + + + +
+
See:
+ +
CKEDITOR.ui.dialog.uiElement
+ +
+ + +
+ + + + +
+ Field Detail +
+ + +
+ + {String} + className + +
+
+ Since: + + 3.0 + +
+
+
+ CSS class names to append to the UI element. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + id + +
+
+ Since: + + 3.0 + +
+
+
+ The id of the UI element. + + +
+ + + + + + + + + + + +
+ + +
+ + {Function} + onHide + +
+
+ Since: + + 3.0 + +
+
+
+ Function to execute whenever the UI element's parent dialog is closed. + + +
+ + + + + + + + + + + +
+ + +
+ + {Function} + onLoad + +
+
+ Since: + + 3.0 + +
+
+
+ Function to execute the first time the UI element is displayed. + + +
+ + + + + + + + + + + +
+ + +
+ + {Function} + onShow + +
+
+ Since: + + 3.0 + +
+
+
+ Function to execute whenever the UI element's parent dialog is displayed. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + style + +
+
+ Since: + + 3.0 + +
+
+
+ Inline CSS classes to append to the UI element. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + title + +
+
+ Since: + + 3.0 + +
+
+
+ The popup label of the UI element. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + type + +
+
+ Since: + + 3.0 + +
+
+
+ The type of the UI element. Required. + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialogCommand.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialogCommand.html new file mode 100644 index 000000000..fd03281f1 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dialogCommand.html @@ -0,0 +1,848 @@ + + + + + + + CKEDITOR.dialogCommand - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dialogCommand +

+ + +

+
Extends + CKEDITOR.commandDefinition.
+ + + + + +
Defined in: plugins/dialog/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.dialogCommand(dialogName) +
+
Generic dialog command.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.commandDefinition:
async, canUndo
+
+ + + + + + + + + +
+
Methods borrowed from class CKEDITOR.commandDefinition:
exec
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dialogCommand(dialogName) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Generic dialog command. It opens a specific dialog when executed. + +
+ + + + +
// Register the "link" command, which opens the "link" dialog.
+editor.addCommand( 'link', new CKEDITOR.dialogCommand( 'link' ) );
+ + + + + + +
+
Parameters:
+ +
+ {string} dialogName + +
+
The name of the dialog to open when executing + this command.
+ +
+ + + + + + + +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.document.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.document.html new file mode 100644 index 000000000..40c69b704 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.document.html @@ -0,0 +1,1516 @@ + + + + + + + CKEDITOR.dom.document - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dom.document +

+ + +

+
Extends + CKEDITOR.dom.domObject.
+ + + + + +
Defined in: core/dom/document.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.dom.document(domDocument) +
+
Represents a DOM document.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.dom.domObject:
$
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
appendStyleSheet(cssFileUrl) +
+
Appends a CSS file to the document.
+
  +
createElement(name, attribsAndStyles) +
+
+
  +
createText(text) +
+
+
  +
focus() +
+
+
  +
getBody() +
+
Gets the <body> element for this document.
+
  +
getByAddress(address, normalized) +
+
+
  +
getById(elementId) +
+
Gets and element based on its id.
+
  + +
+
  +
getElementsByTag(tagName, namespace) +
+
+
  +
getHead() +
+
Gets the <head> element for this document.
+
  + +
Gets the current selection from the document.
+
  + +
Gets the window object that holds this document.
+
+ + + +
+
Methods borrowed from class CKEDITOR.dom.domObject:
equals, getCustomData, getPrivate, setCustomData
Methods borrowed from class CKEDITOR.event:
fire, fireOnce, hasListeners, implementOn, on, removeListener
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dom.document(domDocument) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Represents a DOM document. + +
+ + + + +
var document = new CKEDITOR.dom.document( document );
+ + + + + + +
+
Parameters:
+ +
+ {Object} domDocument + +
+
A native DOM document.
+ +
+ + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + appendStyleSheet(cssFileUrl) + +
+
+ Since: + + 3.0 + +
+
+
+ Appends a CSS file to the document. + + +
+ + + + +
CKEDITOR.document.appendStyleSheet( '/mystyles.css' );
+ + + + + +
+
Parameters:
+ +
+ {String} cssFileUrl + +
+
The CSS file URL.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + createElement(name, attribsAndStyles) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} name + +
+
+ +
+ {Undefined} attribsAndStyles + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + createText(text) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} text + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + focus() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {CKEDITOR.dom.element} + getBody() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the <body> element for this document. + + +
+ + + + +
var element = CKEDITOR.document.getBody();
+alert( element.getName() );  // "body"
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The <body> element.
+ +
+ + + + +
+ + +
+ + {Undefined} + getByAddress(address, normalized) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} address + +
+
+ +
+ {Undefined} normalized + +
+
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.dom.element} + getById(elementId) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets and element based on its id. + + +
+ + + + +
var element = CKEDITOR.document.getById( 'myElement' );
+alert( element.getId() );  // "myElement"
+ + + + + +
+
Parameters:
+ +
+ {String} elementId + +
+
The element id.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The element instance, or null if not found.
+ +
+ + + + +
+ + +
+ + {Undefined} + getDocumentElement() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + getElementsByTag(tagName, namespace) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} tagName + +
+
+ +
+ {Undefined} namespace + +
+
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.dom.element} + getHead() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the <head> element for this document. + + +
+ + + + +
var element = CKEDITOR.document.getHead();
+alert( element.getName() );  // "head"
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The <head> element.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.selection} + getSelection() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the current selection from the document. + +
+ Defined in: plugins/selection/plugin.js. + + +
+ + + + +
var selection = CKEDITOR.instances.editor1.document.getSelection();
+alert( selection.getType() );
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.selection} A selection object.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.window} + getWindow() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the window object that holds this document. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.window} The window object.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.domObject.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.domObject.html new file mode 100644 index 000000000..661aaadc7 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.domObject.html @@ -0,0 +1,1186 @@ + + + + + + + CKEDITOR.dom.domObject - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dom.domObject +

+ + +

+
Extends + CKEDITOR.event.
+ + + + + +
Defined in: core/dom/domobject.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.dom.domObject(nativeDomObject) +
+
Represents a DOM object.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ $ +
+
The native DOM object represented by this class instance.
+
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
equals(object) +
+
Determines whether the specified object is equal to the current object.
+
  + +
Gets the value set to a data slot in this object.
+
  + +
+
  +
setCustomData(key, value) +
+
Sets a data slot value for this object.
+
+ + + +
+
Methods borrowed from class CKEDITOR.event:
fire, fireOnce, hasListeners, implementOn, on, removeListener
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dom.domObject(nativeDomObject) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Represents a DOM object. This class is not intended to be used directly. It +serves as the base class for other classes representing specific DOM +objects. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {Object} nativeDomObject + +
+
A native DOM object.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + $ + +
+
+ Since: + + 3.0 + +
+
+
+ The native DOM object represented by this class instance. + + +
+ + + + +
var element = new CKEDITOR.dom.element( 'span' );
+alert( element.$.nodeType );  // "1"
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Boolean} + equals(object) + +
+
+ Since: + + 3.0 + +
+
+
+ Determines whether the specified object is equal to the current object. + + +
+ + + + +
var doc = new CKEDITOR.dom.document( document );
+alert( doc.equals( CKEDITOR.document ) );  // "true"
+alert( doc == CKEDITOR.document );         // "false"
+ + + + + +
+
Parameters:
+ +
+ {Object} object + +
+
The object to compare with the current object.
+ +
+ + + + +
+
Returns:
+ +
{Boolean} "true" if the object is equal.
+ +
+ + + + +
+ + +
+ + {Object} + getCustomData(key) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the value set to a data slot in this object. + + +
+ + + + +
var element = new CKEDITOR.dom.element( 'span' );
+alert( element.getCustomData( 'hasCustomData' ) );  // e.g. 'true'
+ + + + + +
+
Parameters:
+ +
+ {String} key + +
+
The key used to identify the data slot.
+ +
+ + + + +
+
Returns:
+ +
{Object} This value set to the data slot.
+ +
+ + + +
+
See:
+ +
CKEDITOR.dom.domObject.prototype.setCustomData
+ +
+ + +
+ + +
+ + {Undefined} + getPrivate() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {CKEDITOR.dom.domObject} + setCustomData(key, value) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets a data slot value for this object. These values are shared by all +instances pointing to that same DOM object. + + +
+ + + + +
var element = new CKEDITOR.dom.element( 'span' );
+element.setCustomData( 'hasCustomData', true );
+ + + + + +
+
Parameters:
+ +
+ {String} key + +
+
A key used to identify the data slot.
+ +
+ {Object} value + +
+
The value to set to the data slot.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.domObject} This DOM object instance.
+ +
+ + + +
+
See:
+ +
CKEDITOR.dom.domObject.prototype.getCustomData
+ +
+ + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.element.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.element.html new file mode 100644 index 000000000..2b04bb802 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.element.html @@ -0,0 +1,4551 @@ + + + + + + + CKEDITOR.dom.element - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dom.element +

+ + +

+
Extends + CKEDITOR.dom.node.
+ + + + + +
Defined in: core/dom/element.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.dom.element(element, ownerDocument) +
+
Represents a DOM element.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  + +
Indicates that the element has defined attributes.
+
  +
+ type +
+
The node type.
+
+ + + +
+
Fields borrowed from class CKEDITOR.dom.domObject:
$
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.dom.element.clearAllMarkers(database) +
+
+
<static>   +
CKEDITOR.dom.element.clearMarkers(database, element, removeFromDatabase) +
+
+
<static>   +
CKEDITOR.dom.element.createFromHtml(html, ownerDocument) +
+
Creates an instance of the CKEDITOR.dom.element class based on the +HTML representation of an element.
+
<static>   +
CKEDITOR.dom.element.get(element) +
+
The the CKEDITOR.dom.element representing and element.
+
<static>   +
CKEDITOR.dom.element.setMarker(database, element, name, value) +
+
+
  +
addClass(className) +
+
Adds a CSS class to the element.
+
  +
append(node, toStart) +
+
Append a node as a child of this element.
+
  + +
+
  +
appendHtml(html) +
+
+
  +
appendText(text) +
+
Append text to this element.
+
  +
breakParent(parent) +
+
Breaks one of the ancestor element in the element position, moving +this element between the broken parts.
+
  +
copyAttributes(dest, skipAttributes) +
+
Copy all the attributes from one node to the other, kinda like a clone +skipAttributes is an object with the attributes that must NOT be copied.
+
  +
focus() +
+
Moves the selection focus to this element.
+
  +
focusNext(ignoreChildren) +
+
Moves the UI focus to the element following this element in the tabindex +order.
+
  +
focusPrevious(ignoreChildren) +
+
Moves the UI focus to the element before this element in the tabindex order.
+
  +
getAttribute(name) +
+
Gets the value of an element attribute.
+
  +
getChild(indices) +
+
Gets a DOM tree descendant under the current node.
+
  + +
+
  + +
+
  +
getComputedStyle(propertyName) +
+
Gets the current computed value of one of the element CSS style +properties.
+
  +
getDocumentPosition(refDocument) +
+
+
  +
getDtd() +
+
Gets the DTD entries for this element.
+
  + +
Gets the first child node of this element.
+
  + +
Returns the inner document of this IFRAME element.
+
  +
getHtml() +
+
Gets the inner HTML of this element.
+
  +
getId() +
+
Gets the value of the "id" attribute of this element.
+
  +
getLast(ignoreEmpty) +
+
+
  +
getName() +
+
Gets the element name (tag name).
+
  + +
Gets the value of the "name" attribute of this element.
+
  + +
+
  + +
+
  +
getStyle(name) +
+
+
  + +
Gets the computed tabindex for this element.
+
  +
getText() +
+
Gets the text value of this element.
+
  + +
Gets the value set to this element.
+
  + +
Gets the window object that contains this element.
+
  +
hasAttribute((String)) +
+
Indicates whether a specified attribute is defined for this element.
+
  +
hasClass(className) +
+
+
  +
hide() +
+
Hides this element (display:none).
+
  +
is() +
+
Checks if the element name matches one or more names.
+
  +
isBlockBoundary(customNodeNames) +
+
+
  + +
+
  +
isIdentical(otherElement) +
+
+
  + +
Checks if this element is visible.
+
  +
moveChildren(target, toStart) +
+
+
  + +
Removes an attribute from the element.
+
  +
removeAttributes(attributes) +
+
+
  +
removeClass(className) +
+
Removes a CSS class name from the elements classes.
+
  +
removeStyle(name) +
+
Removes a style from the element.
+
  +
renameNode(newTag) +
+
Changes the tag name of the current element.
+
  +
scrollIntoView(alignTop) +
+
+
  +
setAttribute(name, value) +
+
Sets the value of an element attribute.
+
  +
setAttributes(attributesPairs) +
+
Sets the value of several element attributes.
+
  +
setHtml(html) +
+
Sets the inner HTML of this element.
+
  +
setOpacity(opacity) +
+
Sets the opacity of an element.
+
  +
setState(state) +
+
+
  +
setStyle(name, value) +
+
Sets the value of an element style.
+
  +
setStyles(stylesPairs) +
+
Sets the value of several element styles.
+
  +
setText(text) +
+
Sets the element contents as plain text.
+
  +
setValue(value) +
+
Sets the element value.
+
  +
show() +
+
Shows this element (display it).
+
  + +
Makes the element and its children unselectable.
+
+ + + +
+
Methods borrowed from class CKEDITOR.dom.node:
appendTo, clone, getAddress, getAscendant, getCommonAncestor, getDocument, getIndex, getNext, getNextSourceNode, getParent, getParents, getPosition, getPrevious, getPreviousSourceNode, hasAscendant, hasNext, hasPrevious, insertAfter, insertBefore, insertBeforeMe, ltrim, move, remove, replace, rtrim, trim
Methods borrowed from class CKEDITOR.dom.domObject:
equals, getCustomData, getPrivate, setCustomData
Methods borrowed from class CKEDITOR.event:
fire, fireOnce, hasListeners, implementOn, on, removeListener
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dom.element(element, ownerDocument) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Represents a DOM element. + +
+ + + + +
// Create a new <span> element.
+var element = new CKEDITOR.dom.element( 'span' );
+ + + +
// Create an element based on a native DOM element.
+var element = new CKEDITOR.dom.element( document.getElementById( 'myId' ) );
+ + + + + + +
+
Parameters:
+ +
+ {Object|String} element + +
+
A native DOM element or the element name for + new elements.
+ +
+ {CKEDITOR.dom.document} ownerDocument + Optional +
+
The document that will contain + the element in case of element creation.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Boolean} + hasAttributes + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that the element has defined attributes. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '
Example
' ); +alert( element.hasAttributes() ); "true"
+ + + +
var element = CKEDITOR.dom.element.createFromHtml( '
Example
' ); +alert( element.hasAttributes() ); "false"
+ + + + + + + + +
+ + +
+ + {Number} + type + +
+
+ Since: + + 3.0 + +
+
+
+ The node type. This is a constant value set to +CKEDITOR.NODE_ELEMENT. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.dom.element.clearAllMarkers(database) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} database + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.dom.element.clearMarkers(database, element, removeFromDatabase) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} database + +
+
+ +
+ {Undefined} element + +
+
+ +
+ {Undefined} removeFromDatabase + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {CKEDITOR.dom.element} + CKEDITOR.dom.element.createFromHtml(html, ownerDocument) + +
+
+ Since: + + 3.0 + +
+
+
+ Creates an instance of the CKEDITOR.dom.element class based on the +HTML representation of an element. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '<strong class="anyclass">My element</strong>' );
+alert( element.getName() );  // "strong"
+ + + + + +
+
Parameters:
+ +
+ {String} html + +
+
The element HTML. It should define only one element in + the "root" level. The "root" element can have child nodes, but not + siblings.
+ +
+ {Undefined} ownerDocument + +
+
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The element instance.
+ +
+ + + + +
+ + +
<static> + + {CKEDITOR.dom.element} + CKEDITOR.dom.element.get(element) + +
+
+ Since: + + 3.0 + +
+
+
+ The the CKEDITOR.dom.element representing and element. If the +element is a native DOM element, it will be transformed into a valid +CKEDITOR.dom.element object. + + +
+ + + + +
var element = new CKEDITOR.dom.element( 'span' );
+alert( element == CKEDITOR.dom.element.get( element ) );  "true"
+ + + +
var element = document.getElementById( 'myElement' );
+alert( CKEDITOR.dom.element.get( element ).getName() );  e.g. "p"
+ + + + + +
+
Parameters:
+ +
+ {Undefined} element + +
+
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The transformed element.
+ +
+ + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.dom.element.setMarker(database, element, name, value) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} database + +
+
+ +
+ {Undefined} element + +
+
+ +
+ {Undefined} name + +
+
+ +
+ {Undefined} value + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + addClass(className) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a CSS class to the element. It appends the class to the +already existing names. + + +
+ + + + +
var element = new CKEDITOR.dom.element( 'div' );
+element.addClass( 'classA' );  // <div class="classA">
+element.addClass( 'classB' );  // <div class="classA classB">
+element.addClass( 'classA' );  // <div class="classA classB">
+ + + + + +
+
Parameters:
+ +
+ {String} className + +
+
The name of the class to be added.
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.dom.node} + append(node, toStart) + +
+
+ Since: + + 3.0 + +
+
+
+ Append a node as a child of this element. + + +
+ + + + +
var p = new CKEDITOR.dom.element( 'p' );
+
+var strong = new CKEDITOR.dom.element( 'strong' );
+p.append( strong );
+
+var em = p.append( 'em' );
+
+// result: "<p><strong></strong><em></em></p>"
+ + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dom.node|String} node + +
+
The node or element name to be + appended.
+ +
+ {Boolean} toStart + Optional +
+
Indicates that the element is to be + appended at the start.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.node} The appended node.
+ +
+ + + + +
+ + +
+ + {Undefined} + appendBogus() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + appendHtml(html) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} html + +
+
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.dom.node} + appendText(text) + +
+
+ Since: + + 3.0 + +
+
+
+ Append text to this element. + + +
+ + + + +
var p = new CKEDITOR.dom.element( 'p' );
+p.appendText( 'This is' );
+p.appendText( ' some text' );
+
+// result: "<p>This is some text</p>"
+ + + + + +
+
Parameters:
+ +
+ {String} text + +
+
The text to be appended.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.node} The appended node.
+ +
+ + + + +
+ + +
+ + {Undefined} + breakParent(parent) + +
+
+ Since: + + 3.0 + +
+
+
+ Breaks one of the ancestor element in the element position, moving +this element between the broken parts. + + +
+ + + + +
// Before breaking:
+//     This is some sample test text
+// If "element" is  and "parent" is :
+//     This is some sample test text
+element.breakParent( parent );
+ + + +
// Before breaking:
+//     This is some sample test text
+// If "element" is  and "parent" is :
+//     This is some sample test text
+element.breakParent( parent );
+ + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dom.element} parent + +
+
The anscestor element to get broken.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + copyAttributes(dest, skipAttributes) + +
+
+ Since: + + 3.0 + +
+
+
+ Copy all the attributes from one node to the other, kinda like a clone +skipAttributes is an object with the attributes that must NOT be copied. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dom.element} dest + +
+
The destination element.
+ +
+ {Object} skipAttributes + +
+
A dictionary of attributes to skip.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + focus() + +
+
+ Since: + + 3.0 + +
+
+
+ Moves the selection focus to this element. + + +
+ + + + +
var element = CKEDITOR.document.getById( 'myTextarea' );
+element.focus();
+ + + + + + + + + + + +
+ + +
+ + {Undefined} + focusNext(ignoreChildren) + +
+
+ Since: + + 3.0 + +
+
+
+ Moves the UI focus to the element following this element in the tabindex +order. + +
+ Defined in: plugins/tab/plugin.js. + + +
+ + + + +
var element = CKEDITOR.document.getById( 'example' );
+element.focusNext();
+ + + + + +
+
Parameters:
+ +
+ {Undefined} ignoreChildren + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + focusPrevious(ignoreChildren) + +
+
+ Since: + + 3.0 + +
+
+
+ Moves the UI focus to the element before this element in the tabindex order. + +
+ Defined in: plugins/tab/plugin.js. + + +
+ + + + +
var element = CKEDITOR.document.getById( 'example' );
+element.focusPrevious();
+ + + + + +
+
Parameters:
+ +
+ {Undefined} ignoreChildren + +
+
+ +
+ + + + + + + +
+ + +
+ + {String} + getAttribute(name) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the value of an element attribute. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '<input type="text" />' );
+alert( element.getAttribute( 'type' ) );  // "text"
+ + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The attribute name.
+ +
+ + + + +
+
Returns:
+ +
{String} The attribute value or null if not defined.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.node} + getChild(indices) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets a DOM tree descendant under the current node. + + +
+ + + + +
var strong = p.getChild(0);
+ + + + + +
+
Parameters:
+ +
+ {Array|Number} indices + +
+
The child index or array of child indices under the node.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.node} The specified DOM child under the current node. Null if child does not exist.
+ +
+ + + + +
+ + +
+ + {Undefined} + getChildCount() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + getChildren() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {String} + getComputedStyle(propertyName) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the current computed value of one of the element CSS style +properties. + + +
+ + + + +
var element = new CKEDITOR.dom.element( 'span' );
+alert( element.getComputedStyle( 'display' ) );  // "inline"
+ + + + + +
+
Parameters:
+ +
+ {String} propertyName + +
+
The style property name.
+ +
+ + + + +
+
Returns:
+ +
{String} The property value.
+ +
+ + + + +
+ + +
+ + {Undefined} + getDocumentPosition(refDocument) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} refDocument + +
+
+ +
+ + + + + + + +
+ + +
+ + {Object} + getDtd() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the DTD entries for this element. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + +
+
Returns:
+ +
{Object} An object containing the list of elements accepted + by this element.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.node} + getFirst() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the first child node of this element. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '<div><b>Example</b></div>' );
+var first = element.getFirst();
+alert( first.getName() );  // "b"
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.node} The first child node or null if not + available.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.document} + getFrameDocument() + +
+
+ Since: + + 3.0 + +
+
+
+ Returns the inner document of this IFRAME element. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.document} The inner document.
+ +
+ + + + +
+ + +
+ + {String} + getHtml() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the inner HTML of this element. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '<div><b>Example</b></div>' );
+alert( p.getHtml() );  // "<b>Example</b>"
+ + + + + + + + +
+
Returns:
+ +
{String} The inner HTML of this element.
+ +
+ + + + +
+ + +
+ + {String} + getId() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the value of the "id" attribute of this element. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '<p id="myId"></p>' );
+alert( element.getId() );  // "myId"
+ + + + + + + + +
+
Returns:
+ +
{String} The element id, or null if not available.
+ +
+ + + + +
+ + +
+ + {Undefined} + getLast(ignoreEmpty) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} ignoreEmpty + +
+
Skip empty text nodes.
+ +
+ + + + + + + +
+ + +
+ + {String} + getName() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the element name (tag name). The returned name is guaranteed to +be always full lowercased. + + +
+ + + + +
var element = new CKEDITOR.dom.element( 'span' );
+alert( element.getName() );  // "span"
+ + + + + + + + +
+
Returns:
+ +
{String} The element name.
+ +
+ + + + +
+ + +
+ + {String} + getNameAtt() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the value of the "name" attribute of this element. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '<input name="myName"></input>' );
+alert( element.getNameAtt() );  // "myName"
+ + + + + + + + +
+
Returns:
+ +
{String} The element name, or null if not available.
+ +
+ + + + +
+ + +
+ + {Undefined} + getOuterHtml() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + getPositionedAncestor() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + getStyle(name) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} name + +
+
+ +
+ + + + + + + +
+ + +
+ + {Number} + getTabIndex() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the computed tabindex for this element. + + +
+ + + + +
var element = CKEDITOR.document.getById( 'myDiv' );
+alert( element.getTabIndex() );  // e.g. "-1"
+ + + + + + + + +
+
Returns:
+ +
{Number} The tabindex value.
+ +
+ + + + +
+ + +
+ + {String} + getText() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the text value of this element. + +Only in IE (which uses innerText), <br> will cause linebreaks, +and sucessive whitespaces (including line breaks) will be reduced to +a single space. This behavior is ok for us, for now. It may change +in the future. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '<div>Same <i>text</i>.</div>' );
+alert( element.getText() );  // "Sample text."
+ + + + + + + + +
+
Returns:
+ +
{String} The text value.
+ +
+ + + + +
+ + +
+ + {String} + getValue() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the value set to this element. This value is usually available +for form field elements. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + +
+
Returns:
+ +
{String} The element value.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.window} + getWindow() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the window object that contains this element. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.window} The window object.
+ +
+ + + + +
+ + +
+ + {Boolean} + hasAttribute((String)) + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates whether a specified attribute is defined for this element. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {Undefined} (String) + +
+
name The attribute name.
+ +
+ + + + +
+
Returns:
+ +
{Boolean} True if the specified attribute is defined.
+ +
+ + + + +
+ + +
+ + {Undefined} + hasClass(className) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} className + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + hide() + +
+
+ Since: + + 3.0 + +
+
+
+ Hides this element (display:none). + + +
+ + + + +
var element = CKEDITOR.dom.element.getById( 'myElement' );
+element.hide();
+ + + + + + + + + + + +
+ + +
+ + {Boolean} + is() + +
+
+ Since: + + 3.0 + +
+
+
+ Checks if the element name matches one or more names. + + +
+ + + + +
var element = new CKEDITOR.element( 'span' );
+alert( element.is( 'span' ) );  "true"
+alert( element.is( 'p', 'span' ) );  "true"
+alert( element.is( 'p' ) );  "false"
+alert( element.is( 'p', 'div' ) );  "false"
+ + + + + +
+
Parameters:
+ +
+ {String} name[,name[,...]] + +
+
One or more names to be checked.
+ +
+ + + + +
+
Returns:
+ +
{Boolean} true if the element name matches any of the names.
+ +
+ + + + +
+ + +
+ + {Undefined} + isBlockBoundary(customNodeNames) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/dom/walker.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} customNodeNames + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + isEditable() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + isIdentical(otherElement) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} otherElement + +
+
+ +
+ + + + + + + +
+ + +
+ + {Boolean} + isVisible() + +
+
+ Since: + + 3.0 + +
+
+
+ Checks if this element is visible. May not work if the element is +child of an element with visibility set to "hidden", but works well +on the great majority of cases. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + +
+
Returns:
+ +
{Boolean} True if the element is visible.
+ +
+ + + + +
+ + +
+ + {Undefined} + moveChildren(target, toStart) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} target + +
+
+ +
+ {Undefined} toStart + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + removeAttribute(name) + +
+
+ Since: + + 3.0 + +
+
+
+ Removes an attribute from the element. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '
' ); +element.removeAttribute( 'class' );
+ + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The attribute name.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + removeAttributes(attributes) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} attributes + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + removeClass(className) + +
+
+ Since: + + 3.0 + +
+
+
+ Removes a CSS class name from the elements classes. Other classes +remain untouched. + + +
+ + + + +
var element = new CKEDITOR.dom.element( 'div' );
+element.addClass( 'classA' );  // <div class="classA">
+element.addClass( 'classB' );  // <div class="classA classB">
+element.removeClass( 'classA' );  // <div class="classB">
+element.removeClass( 'classB' );  // <div>
+ + + + + +
+
Parameters:
+ +
+ {String} className + +
+
The name of the class to remove.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + removeStyle(name) + +
+
+ Since: + + 3.0 + +
+
+
+ Removes a style from the element. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '
' ); +element.removeStyle( 'display' );
+ + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The style name.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + renameNode(newTag) + +
+
+ Since: + + 3.0 + +
+
+
+ Changes the tag name of the current element. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {String} newTag + +
+
The new tag for the element.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + scrollIntoView(alignTop) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} alignTop + +
+
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.dom.element} + setAttribute(name, value) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the value of an element attribute. + + +
+ + + + +
var element = CKEDITOR.dom.element.getById( 'myElement' );
+element.setAttribute( 'class', 'myClass' );
+element.setAttribute( 'title', 'This is an example' );
+ + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The name of the attribute.
+ +
+ {String} value + +
+
The value to be set to the attribute.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} This element instance.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.element} + setAttributes(attributesPairs) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the value of several element attributes. + + +
+ + + + +
var element = CKEDITOR.dom.element.getById( 'myElement' );
+element.setAttributes({
+    'class' : 'myClass',
+    'title' : 'This is an example' });
+ + + + + +
+
Parameters:
+ +
+ {Object} attributesPairs + +
+
An object containing the names and + values of the attributes.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} This element instance.
+ +
+ + + + +
+ + +
+ + {String} + setHtml(html) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the inner HTML of this element. + + +
+ + + + +
var p = new CKEDITOR.dom.element( 'p' );
+p.setHtml( '<b>Inner</b> HTML' );
+
+// result: "<p><b>Inner</b> HTML</p>"
+ + + + + +
+
Parameters:
+ +
+ {String} html + +
+
The HTML to be set for this element.
+ +
+ + + + +
+
Returns:
+ +
{String} The inserted HTML.
+ +
+ + + + +
+ + +
+ + {Undefined} + setOpacity(opacity) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the opacity of an element. + + +
+ + + + +
var element = CKEDITOR.dom.element.getById( 'myElement' );
+element.setOpacity( 0.75 );
+ + + + + +
+
Parameters:
+ +
+ {Number} opacity + +
+
A number within the range [0.0, 1.0].
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + setState(state) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} state + +
+
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.dom.element} + setStyle(name, value) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the value of an element style. + + +
+ + + + +
var element = CKEDITOR.dom.element.getById( 'myElement' );
+element.setStyle( 'background-color', '#ff0000' );
+element.setStyle( 'margin-top', '10px' );
+element.setStyle( 'float', 'right' );
+ + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The name of the style. The CSS naming notation + must be used (e.g. "background-color").
+ +
+ {String} value + +
+
The value to be set to the style.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} This element instance.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.element} + setStyles(stylesPairs) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the value of several element styles. + + +
+ + + + +
var element = CKEDITOR.dom.element.getById( 'myElement' );
+element.setStyles({
+    'position' : 'absolute',
+    'float' : 'right' });
+ + + + + +
+
Parameters:
+ +
+ {Object} stylesPairs + +
+
An object containing the names and + values of the styles.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} This element instance.
+ +
+ + + + +
+ + +
+ + {String} + setText(text) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the element contents as plain text. + + +
+ + + + +
var element = new CKEDITOR.dom.element( 'div' );
+element.setText( 'A > B & C < D' );
+alert( element.innerHTML );  // "A &gt; B &amp; C &lt; D"
+ + + + + +
+
Parameters:
+ +
+ {String} text + +
+
The text to be set.
+ +
+ + + + +
+
Returns:
+ +
{String} The inserted text.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.element} + setValue(value) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the element value. This function is usually used with form +field element. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {String} value + +
+
The element value.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} This element instance.
+ +
+ + + + +
+ + +
+ + {Undefined} + show() + +
+
+ Since: + + 3.0 + +
+
+
+ Shows this element (display it). + + +
+ + + + +
var element = CKEDITOR.dom.element.getById( 'myElement' );
+element.show();
+ + + + + + + + + + + +
+ + +
+ + {Undefined} + unselectable() + +
+
+ Since: + + 3.0 + +
+
+
+ Makes the element and its children unselectable. + + +
+ + + + +
var element = CKEDITOR.dom.element.getById( 'myElement' );
+element.unselectable();
+ + + + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.event.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.event.html new file mode 100644 index 000000000..8253a3fe2 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.event.html @@ -0,0 +1,1149 @@ + + + + + + + CKEDITOR.dom.event - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dom.event +

+ + +

+ + + + + +
Defined in: core/dom/event.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.dom.event(domEvent) +
+
Represents a native DOM event object.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ $ +
+
The native DOM event object represented by this class instance.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
getKey() +
+
Gets the key code associated to the event.
+
  + +
Gets a number represeting the combination of the keys pressed during the +event.
+
  + +
Returns the DOM node where the event was targeted to.
+
  +
preventDefault(stopPropagation) +
+
Prevents the original behavior of the event to happen.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dom.event(domEvent) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Represents a native DOM event object. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {Object} domEvent + +
+
A native DOM event object.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + $ + +
+
+ Since: + + 3.0 + +
+
+
+ The native DOM event object represented by this class instance. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Number} + getKey() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the key code associated to the event. + + +
+ + + + +
alert( event.getKey() );  "65" is "a" has been pressed
+ + + + + + + + +
+
Returns:
+ +
{Number} The key code.
+ +
+ + + + +
+ + +
+ + {Number} + getKeystroke() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets a number represeting the combination of the keys pressed during the +event. It is the sum with the current key code and the CKEDITOR.CTRL, +CKEDITOR.SHIFT and CKEDITOR.ALT constants. + + +
+ + + + +
alert( event.getKeystroke() == 65 );                                   // "a" key
+alert( event.getKeystroke() == CKEDITOR.CTRL + 65 );                   // CTRL + "a" key
+alert( event.getKeystroke() == CKEDITOR.CTRL + CKEDITOR.SHIFT + 65 );  // CTRL + SHIFT + "a" key
+ + + + + + + + +
+
Returns:
+ +
{Number} The number representing the keys combination.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.node} + getTarget() + +
+
+ Since: + + 3.0 + +
+
+
+ Returns the DOM node where the event was targeted to. + + +
+ + + + +
var element = CKEDITOR.document.getById( 'myElement' );
+element.on( 'click', function( ev )
+    {
+        // The DOM event object is passed by the "data" property.
+        var domEvent = ev.data;
+        // Add a CSS class to the event target.
+        domEvent.getTarget().addClass( 'clicked' );
+    });
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.node} The target DOM node.
+ +
+ + + + +
+ + +
+ + {Undefined} + preventDefault(stopPropagation) + +
+
+ Since: + + 3.0 + +
+
+
+ Prevents the original behavior of the event to happen. It can optionally +stop propagating the event in the event chain. + + +
+ + + + +
var element = CKEDITOR.document.getById( 'myElement' );
+element.on( 'click', function( ev )
+    {
+        // The DOM event object is passed by the "data" property.
+        var domEvent = ev.data;
+        // Prevent the click to chave any effect in the element.
+        domEvent.preventDefault();
+    });
+ + + + + +
+
Parameters:
+ +
+ {Boolean} stopPropagation + Optional +
+
Stop propagating this event in the + event chain.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.html new file mode 100644 index 000000000..da15234d5 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.html @@ -0,0 +1,1126 @@ + + + + + + + CKEDITOR.dom - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.dom +

+ + +

+ + + +DOM manipulation objects and function.

+ + +
Defined in: core/dom.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
DOM manipulation objects and function.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.dom.documentFragment(ownerDocument) +
+
DocumentFragment is a "lightweight" or "minimal" Document object.
+
<static>   +
CKEDITOR.dom.domWalker(node) +
+
+
<static>   +
CKEDITOR.dom.elementPath(lastNode) +
+
+
<static>   +
CKEDITOR.dom.nodeList(nativeList) +
+
+
<static>   +
CKEDITOR.dom.range(document) +
+
+
+ + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.dom +
+ +
+ Since: + + 3.0 + +
+
+ +
+ DOM manipulation objects and function.

+ +
+ + + + + + + + + + + + + + +
+
See:
+ +
CKEDITOR.dom.element
+ +
CKEDITOR.dom.node
+ +
+ + +
+ + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.dom.documentFragment(ownerDocument) + +
+
+ Since: + + 3.0 + +
+
+
+ DocumentFragment is a "lightweight" or "minimal" Document object. It is +commonly used to extract a portion of a document's tree or to create a new +fragment of a document. Various operations may take DocumentFragment objects +as arguments and results in all the child nodes of the DocumentFragment being +moved to the child list of this node. + +
+ Defined in: core/dom/documentfragment.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Object} ownerDocument + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.dom.domWalker(node) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/dom/domwalker.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} node + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.dom.elementPath(lastNode) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/dom/elementpath.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} lastNode + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.dom.nodeList(nativeList) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/dom/nodelist.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} nativeList + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.dom.range(document) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/dom/range.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} document + +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.node.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.node.html new file mode 100644 index 000000000..a2706f235 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.node.html @@ -0,0 +1,2318 @@ + + + + + + + CKEDITOR.dom.node - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dom.node +

+ + +

+
Extends + CKEDITOR.dom.domObject.
+ + + + + +
Defined in: core/dom/node.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.dom.node(domNode) +
+
Base class for classes representing DOM nodes.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.dom.domObject:
$
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
appendTo(element, toStart) +
+
Makes this node child of another element.
+
  +
clone(includeChildren, cloneId) +
+
+
  +
getAddress(normalized) +
+
Retrieves a uniquely identifiable tree address for this node.
+
  +
getAscendant(name, includeSelf) +
+
Gets the closes ancestor node of a specified node name.
+
  + +
+
  + +
Gets the document containing this element.
+
  + +
+
  +
getNext(ignoreSpaces) +
+
Gets the node that follows this element in its parent's child list.
+
  +
getNextSourceNode(startFromSibling, nodeType, guard) +
+
+
  + +
Gets the parent element for this node.
+
  + +
+
  +
getPosition(otherNode) +
+
+
  +
getPrevious(ignoreSpaces) +
+
+
  +
getPreviousSourceNode(startFromSibling, nodeType, guard) +
+
+
  +
hasAscendant(name, includeSelf) +
+
+
  +
hasNext() +
+
+
  + +
+
  +
insertAfter(node) +
+
Inserts this element after a node.
+
  +
insertBefore(node) +
+
Inserts this element before a node.
+
  + +
+
  +
ltrim() +
+
+
  +
move(target, toStart) +
+
+
  +
remove(preserveChildren) +
+
Removes this node from the document DOM.
+
  +
replace(nodeToReplace) +
+
+
  +
rtrim() +
+
+
  +
trim() +
+
+
+ + + +
+
Methods borrowed from class CKEDITOR.dom.domObject:
equals, getCustomData, getPrivate, setCustomData
Methods borrowed from class CKEDITOR.event:
fire, fireOnce, hasListeners, implementOn, on, removeListener
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dom.node(domNode) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Base class for classes representing DOM nodes. This constructor may return +and instance of classes that inherits this class, like +CKEDITOR.dom.element or CKEDITOR.dom.text. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {Object} domNode + +
+
A native DOM node.
+ +
+ + + + + + +
+
See:
+ +
CKEDITOR.dom.element
+ +
CKEDITOR.dom.text
+ +
+ + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {CKEDITOR.dom.element} + appendTo(element, toStart) + +
+
+ Since: + + 3.0 + +
+
+
+ Makes this node child of another element. + + +
+ + + + +
var p = new CKEDITOR.dom.element( 'p' );
+var strong = new CKEDITOR.dom.element( 'strong' );
+strong.appendTo( p );
+
+// result: "<p><strong></strong></p>"
+ + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dom.element} element + +
+
The target element to which append + this node.
+ +
+ {Undefined} toStart + +
+
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The target element.
+ +
+ + + + +
+ + +
+ + {Undefined} + clone(includeChildren, cloneId) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} includeChildren + +
+
+ +
+ {Undefined} cloneId + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + getAddress(normalized) + +
+
+ Since: + + 3.0 + +
+
+
+ Retrieves a uniquely identifiable tree address for this node. +The tree address returns is an array of integers, with each integer +indicating a child index of a DOM node, starting from +document.documentElement. + +For example, assuming is the second child from ( +being the first), and we'd like to address the third child under the +fourth child of body, the tree address returned would be: +[1, 3, 2] + +The tree address cannot be used for finding back the DOM tree node once +the DOM tree structure has been modified. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} normalized + +
+
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.dom.node} + getAscendant(name, includeSelf) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the closes ancestor node of a specified node name. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {String} name + +
+
Node name of ancestor node.
+ +
+ {Boolean} includeSelf + +
+
(Optional) Whether to include the current +node in the calculation or not.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.node} Ancestor node.
+ +
+ + + + +
+ + +
+ + {Undefined} + getCommonAncestor(node) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} node + +
+
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.dom.document} + getDocument() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the document containing this element. + + +
+ + + + +
var element = CKEDITOR.document.getById( 'example' );
+alert( element.getDocument().equals( CKEDITOR.document ) );  // "true"
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.document} The document.
+ +
+ + + + +
+ + +
+ + {Undefined} + getIndex() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {CKEDITOR.dom.node} + getNext(ignoreSpaces) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the node that follows this element in its parent's child list. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '<div><b>Example</b> <i>next</i></div>' );
+var first = element.getFirst().getNext();
+alert( first.getName() );  // "i"
+ + + + + +
+
Parameters:
+ +
+ {Boolean} ignoreSpaces + +
+
Whether should ignore empty text nodes.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.node} The next node or null if not + available.
+ +
+ + + + +
+ + +
+ + {Undefined} + getNextSourceNode(startFromSibling, nodeType, guard) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} startFromSibling + +
+
+ +
+ {Undefined} nodeType + +
+
+ +
+ {Undefined} guard + +
+
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.dom.element} + getParent() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the parent element for this node. + + +
+ + + + +
var node = editor.document.getBody().getFirst();
+var parent = node.getParent();
+alert( node.getName() );  // "body"
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The parent element.
+ +
+ + + + +
+ + +
+ + {Undefined} + getParents() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + getPosition(otherNode) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} otherNode + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + getPrevious(ignoreSpaces) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} ignoreSpaces + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + getPreviousSourceNode(startFromSibling, nodeType, guard) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} startFromSibling + +
+
+ +
+ {Undefined} nodeType + +
+
+ +
+ {Undefined} guard + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + hasAscendant(name, includeSelf) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} name + +
+
+ +
+ {Undefined} includeSelf + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + hasNext() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + hasPrevious() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {CKEDITOR.dom.node} + insertAfter(node) + +
+
+ Since: + + 3.0 + +
+
+
+ Inserts this element after a node. + + +
+ + + + +
var em = new CKEDITOR.dom.element( 'em' );
+var strong = new CKEDITOR.dom.element( 'strong' );
+strong.insertAfter( em );
+
+// result: "<em></em><strong></strong>"
+ + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dom.node} node + +
+
The that will preceed this element.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.node} The node preceeding this one after + insertion.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.node} + insertBefore(node) + +
+
+ Since: + + 3.0 + +
+
+
+ Inserts this element before a node. + + +
+ + + + +
var em = new CKEDITOR.dom.element( 'em' );
+var strong = new CKEDITOR.dom.element( 'strong' );
+strong.insertBefore( em );
+
+// result: "<strong></strong><em></em>"
+ + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dom.node} node + +
+
The that will be after this element.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.node} The node being inserted.
+ +
+ + + + +
+ + +
+ + {Undefined} + insertBeforeMe(node) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} node + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + ltrim() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + move(target, toStart) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} target + +
+
+ +
+ {Undefined} toStart + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + remove(preserveChildren) + +
+
+ Since: + + 3.0 + +
+
+
+ Removes this node from the document DOM. + + +
+ + + + +
var element = CKEDITOR.dom.element.getById( 'MyElement' );
+element.remove();
+ + + + + +
+
Parameters:
+ +
+ {Boolean} preserveChildren + Optional +
+
Indicates that the children + elements must remain in the document, removing only the outer + tags.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + replace(nodeToReplace) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} nodeToReplace + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + rtrim() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + trim() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.selection.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.selection.html new file mode 100644 index 000000000..c0bb79b94 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.selection.html @@ -0,0 +1,1473 @@ + + + + + + + CKEDITOR.dom.selection - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dom.selection +

+ + +

+ + + + + +
Defined in: plugins/selection/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.dom.selection(document) +
+
Manipulates the selection in a DOM document.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
createBookmarks(serializable) +
+
+
  +
createBookmarks2(normalized) +
+
+
  + +
Gets the native selection object from the browser.
+
  + +
Gets the current selected element.
+
  + +
Gets the DOM element in which the selection starts.
+
  +
getType() +
+
Gets the type of the current selection.
+
  +
lock() +
+
+
  +
reset() +
+
+
  +
selectBookmarks(bookmarks) +
+
+
  +
selectElement(element) +
+
+
  +
selectRanges(ranges) +
+
+
  +
unlock(restore) +
+
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dom.selection(document) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Manipulates the selection in a DOM document. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {Undefined} document + +
+
+ +
+ + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + createBookmarks(serializable) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} serializable + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + createBookmarks2(normalized) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} normalized + +
+
+ +
+ + + + + + + +
+ + +
+ + {Object} + getNative() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the native selection object from the browser. + + +
+ + + + +
var selection = editor.getSelection().getNative();
+ + + + + + + + +
+
Returns:
+ +
{Object} The native selection object.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.element} + getSelectedElement() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the current selected element. + + +
+ + + + +
var element = editor.getSelection().getSelectedElement();
+alert( element.getName() );
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The selected element. Null if no + selection is available or the selection type is not + CKEDITOR.SELECTION_ELEMENT.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.element} + getStartElement() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the DOM element in which the selection starts. + + +
+ + + + +
var element = editor.getSelection().getStartElement();
+alert( element.getName() );
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The element at the beginning of the + selection.
+ +
+ + + + +
+ + +
+ + {Number} + getType() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the type of the current selection. The following values are +available: + + + +
+ + + + +
if ( editor.getSelection().getType() == CKEDITOR.SELECTION_TEXT )
+    alert( 'Text is selected' );
+ + + + + + + + +
+
Returns:
+ +
{Number} One of the following constant values: + CKEDITOR.SELECTION_NONE, CKEDITOR.SELECTION_TEXT or + CKEDITOR.SELECTION_ELEMENT.
+ +
+ + + + +
+ + +
+ + {Undefined} + lock() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + reset() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + selectBookmarks(bookmarks) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} bookmarks + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + selectElement(element) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} element + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + selectRanges(ranges) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} ranges + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + unlock(restore) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} restore + +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.text.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.text.html new file mode 100644 index 000000000..b49c48722 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.text.html @@ -0,0 +1,1194 @@ + + + + + + + CKEDITOR.dom.text - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dom.text +

+ + +

+
Extends + CKEDITOR.dom.node.
+ + + + + +
Defined in: core/dom/text.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.dom.text(text, ownerDocument) +
+
Represents a DOM text node.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ $ +
+
The native DOM text node represented by this class instance.
+
  +
+ type +
+
The node type.
+
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  + +
+
  +
getText() +
+
+
  +
split(The) +
+
Breaks this text node into two nodes at the specified offset, +keeping both in the tree as siblings.
+
  +
substring(indexA, indexB) +
+
Extracts characters from indexA up to but not including indexB.
+
+ + + +
+
Methods borrowed from class CKEDITOR.dom.node:
appendTo, clone, getAddress, getAscendant, getCommonAncestor, getDocument, getIndex, getNext, getNextSourceNode, getParent, getParents, getPosition, getPrevious, getPreviousSourceNode, hasAscendant, hasNext, hasPrevious, insertAfter, insertBefore, insertBeforeMe, ltrim, move, remove, replace, rtrim, trim
Methods borrowed from class CKEDITOR.dom.domObject:
equals, getCustomData, getPrivate, setCustomData
Methods borrowed from class CKEDITOR.event:
fire, fireOnce, hasListeners, implementOn, on, removeListener
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dom.text(text, ownerDocument) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Represents a DOM text node. + +
+ + + + +
var nativeNode = document.createTextNode( 'Example' );
+var text = CKEDITOR.dom.text( nativeNode );
+ + + +
var text = CKEDITOR.dom.text( 'Example' );
+ + + + + + +
+
Parameters:
+ +
+ {Object|String} text + +
+
A native DOM text node or a string containing + the text to use to create a new text node.
+ +
+ {CKEDITOR.dom.document} ownerDocument + Optional +
+
The document that will contain + the node in case of new node creation. Defaults to the current document.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + $ + +
+
+ Since: + + 3.0 + +
+
+
+ The native DOM text node represented by this class instance. + + +
+ + + + +
var element = new CKEDITOR.dom.text( 'Example' );
+alert( element.$.nodeType );  // "3"
+ + + + + + + + +
+ + +
+ + {Number} + type + +
+
+ Since: + + 3.0 + +
+
+
+ The node type. This is a constant value set to +CKEDITOR.NODE_TEXT. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + getLength() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + getText() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {CKEDITOR.dom.text} + split(The) + +
+
+ Since: + + 3.0 + +
+
+
+ Breaks this text node into two nodes at the specified offset, +keeping both in the tree as siblings. This node then only contains +all the content up to the offset point. A new text node, which is +inserted as the next sibling of this node, contains all the content +at and after the offset point. When the offset is equal to the +length of this node, the new node has no data. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Number} The + +
+
position at which to split, starting from zero.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dom.text} The new text node.
+ +
+ + + + +
+ + +
+ + {Undefined} + substring(indexA, indexB) + +
+
+ Since: + + 3.0 + +
+
+
+ Extracts characters from indexA up to but not including indexB. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Number} indexA + +
+
An integer between 0 and one less than the + length of the text.
+ +
+ {Number} indexB + Optional +
+
An integer between 0 and the length of the + string. If omitted, extracts characters to the end of the text.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.window.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.window.html new file mode 100644 index 000000000..ac9d263a0 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dom.window.html @@ -0,0 +1,1025 @@ + + + + + + + CKEDITOR.dom.window - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.dom.window +

+ + +

+
Extends + CKEDITOR.dom.domObject.
+ + + + + +
Defined in: core/dom/window.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.dom.window(domWindow) +
+
Represents a DOM window.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.dom.domObject:
$
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
focus() +
+
Moves the selection focus to this window.
+
  + +
Gets the current position of the window's scroll.
+
  + +
Gets the width and height of this window's viewable area.
+
+ + + +
+
Methods borrowed from class CKEDITOR.dom.domObject:
equals, getCustomData, getPrivate, setCustomData
Methods borrowed from class CKEDITOR.event:
fire, fireOnce, hasListeners, implementOn, on, removeListener
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.dom.window(domWindow) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Represents a DOM window. + +
+ + + + +
var document = new CKEDITOR.dom.window( window );
+ + + + + + +
+
Parameters:
+ +
+ {Object} domWindow + +
+
A native DOM window.
+ +
+ + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + focus() + +
+
+ Since: + + 3.0 + +
+
+
+ Moves the selection focus to this window. + + +
+ + + + +
var win = new CKEDITOR.dom.window( window );
+win.focus();
+ + + + + + + + + + + +
+ + +
+ + {Object} + getScrollPosition() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the current position of the window's scroll. + + +
+ + + + +
var win = new CKEDITOR.dom.window( window );
+var pos = win.getScrollPosition();
+alert( pos.x );
+alert( pos.y );
+ + + + + + + + +
+
Returns:
+ +
{Object} An object with the "x" and "y" properties + containing the scroll position.
+ +
+ + + + +
+ + +
+ + {Object} + getViewPaneSize() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the width and height of this window's viewable area. + + +
+ + + + +
var win = new CKEDITOR.dom.window( window );
+var size = win.getViewPaneSize();
+alert( size.width );
+alert( size.height );
+ + + + + + + + +
+
Returns:
+ +
{Object} An object with the "width" and "height" + properties containing the size.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dtd.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dtd.html new file mode 100644 index 000000000..12b08ad8a --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.dtd.html @@ -0,0 +1,1163 @@ + + + + + + + CKEDITOR.dtd - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.dtd +

+ + +

+ + + +Holds and object representation of the HTML DTD to be used by the editor in +its internal operations. + +Each element in the DTD is represented by a +property in this object. Each property contains the list of elements that +can be contained by the element. Text is represented by the "#" property. + +Several special grouping properties are also available. Their names start +with the "$" character. + + +
Defined in: core/dtd.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Holds and object representation of the HTML DTD to be used by the editor in +its internal operations.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.dtd.$block +
+
List of block elements, like "p" or "div".
+
<static>   +
+ CKEDITOR.dtd.$empty +
+
List of empty (self-closing) elements, like "br" or "img".
+
<static>   +
+ CKEDITOR.dtd.$listItem +
+
List of list item elements, like "li" or "dd".
+
<static>   +
+ CKEDITOR.dtd.$nonEditable +
+
Elements that accept text nodes, but are not possible to edit into +the browser.
+
<static>   +
+ CKEDITOR.dtd.$removeEmpty +
+
List of elements that can be ignored if empty, like "b" or "span".
+
<static>   +
+ CKEDITOR.dtd.$tabIndex +
+
List of elements that have tabindex set to zero by default.
+
<static>   +
+ CKEDITOR.dtd.$tableContent +
+
List of elements used inside the "table" element, like "tbody" or "td".
+
+ + + + + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.dtd +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Holds and object representation of the HTML DTD to be used by the editor in +its internal operations. + +Each element in the DTD is represented by a +property in this object. Each property contains the list of elements that +can be contained by the element. Text is represented by the "#" property. + +Several special grouping properties are also available. Their names start +with the "$" character. + +
+ + + + +
// Check if "div" can be contained in a "p" element.
+alert( !!CKEDITOR.dtd[ 'p' ][ 'div' ] );  "false"
+ + + +
// Check if "p" can be contained in a "div" element.
+alert( !!CKEDITOR.dtd[ 'div' ][ 'p' ] );  "true"
+ + + +
// Check if "p" is a block element.
+alert( !!CKEDITOR.dtd.$block[ 'p' ] );  "true"
+ + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {Object} + CKEDITOR.dtd.$block + +
+
+ Since: + + 3.0 + +
+
+
+ List of block elements, like "p" or "div". + + +
+ + + + + + + + + + + +
+ + +
<static> + + {Object} + CKEDITOR.dtd.$empty + +
+
+ Since: + + 3.0 + +
+
+
+ List of empty (self-closing) elements, like "br" or "img". + + +
+ + + + + + + + + + + +
+ + +
<static> + + {Object} + CKEDITOR.dtd.$listItem + +
+
+ Since: + + 3.0 + +
+
+
+ List of list item elements, like "li" or "dd". + + +
+ + + + + + + + + + + +
+ + +
<static> + + {Object} + CKEDITOR.dtd.$nonEditable + +
+
+ Since: + + 3.0 + +
+
+
+ Elements that accept text nodes, but are not possible to edit into +the browser. + + +
+ + + + + + + + + + + +
+ + +
<static> + + {Object} + CKEDITOR.dtd.$removeEmpty + +
+
+ Since: + + 3.0 + +
+
+
+ List of elements that can be ignored if empty, like "b" or "span". + + +
+ + + + + + + + + + + +
+ + +
<static> + + {Object} + CKEDITOR.dtd.$tabIndex + +
+
+ Since: + + 3.0 + +
+
+
+ List of elements that have tabindex set to zero by default. + + +
+ + + + + + + + + + + +
+ + +
<static> + + {Object} + CKEDITOR.dtd.$tableContent + +
+
+ Since: + + 3.0 + +
+
+
+ List of elements used inside the "table" element, like "tbody" or "td". + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.editor.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.editor.html new file mode 100644 index 000000000..05ddccd4c --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.editor.html @@ -0,0 +1,2939 @@ + + + + + + + CKEDITOR.editor - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.editor +

+ + +

+
Extends + CKEDITOR.event.
+ + + + + +
Defined in: core/editor_basic.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.editor(instanceConfig, element, mode) +
+
Represents an editor instance.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ config +
+
The configurations for this editor instance.
+
  +
+ element +
+
The DOM element that has been replaced by this editor instance.
+
  + +
The mode in which the #element is linked to this editor +instance.
+
  + +
Controls the focus state of this editor instance.
+
  + +
Controls keystrokes typing in this editor instance.
+
  +
+ mode +
+
The current editing mode.
+
  +
+ name +
+
The editor instance name.
+
  +
+ ui +
+
Namespace containing UI features related to this editor instance.
+
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.editor.appendTo(elementOrId, config) +
+
Creates a new editor instance inside a specific DOM element.
+
<static>   +
CKEDITOR.editor.replace(elementOrIdOrName, config) +
+
Replaces a <textarea> or a DOM element (DIV) with a CKEditor +instance.
+
  +
addCommand(commandName, commandDefinition) +
+
Adds a command definition to the editor instance.
+
  +
addCss(css) +
+
+
  +
addMode(mode, modeEditor) +
+
Registers an editing mode.
+
  + +
Registers a function to be called whenever a style changes its state in the +editing area.
+
  + +
+
  +
createFakeElement(realElement, className, realElementType, isResizable) +
+
+
  +
createFakeParserElement(realElement, className, realElementType, isResizable) +
+
+
  +
destroy(noUpdate) +
+
Destroys the editor instance, releasing all resources used by it.
+
  +
execCommand(commandName, data) +
+
Executes a command.
+
  +
focus() +
+
Moves the selection focus to the editing are space in the editor.
+
  + +
+
  +
getCommand(commandName) +
+
Gets one of the registered commands.
+
  +
getData() +
+
Gets the editor data.
+
  + +
Gets the current selection from the editing area when in WYSIWYG mode.
+
  + +
+
  +
insertElement(element) +
+
Inserts an element into the currently selected position in the +editor.
+
  +
insertHtml(data) +
+
Inserts HTML into the currently selected position in the editor.
+
  +
insertText(text) +
+
+
  +
loadSnapshot(snapshot) +
+
+
  +
openDialog(dialogName) +
+
Loads and opens a registered dialog.
+
  + +
+
  +
restoreRealElement(fakeElement) +
+
+
  +
setData(data) +
+
Sets the editor data.
+
  +
setMode(mode) +
+
Sets the current editing mode in this editor instance.
+
  + +
Updates the <textarea> element that has been replaced by the editor with +the current data available in the editor.
+
+ + + +
+
Methods borrowed from class CKEDITOR.event:
fire, fireOnce, hasListeners, implementOn, on, removeListener
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.editor(instanceConfig, element, mode) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Represents an editor instance. This constructor should be rarely used, +being the CKEDITOR methods preferible. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {Object} instanceConfig + +
+
Configuration values for this specific + instance.
+ +
+ {CKEDITOR.dom.element} element + Optional +
+
The element linked to this + instance.
+ +
+ {Number} mode + Optional +
+
The mode in which the element is linked to this + instance.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + config + +
+
+ Since: + + 3.0 + +
+
+
+ The configurations for this editor instance. It inherits all +settings defined in (@link CKEDITOR.config}, combined with settings +loaded from custom configuration files and those defined inline in +the page when creating the editor. + +
+ Defined in: core/editor.js. + + +
+ + + + +
var editor = CKEDITOR.instances.editor1;
+alert( editor.config.theme );  "default" e.g.
+ + + + + + + + +
+ + +
+ + {CKEDITOR.dom.element} + element + +
+
+ Since: + + 3.0 + +
+
+
+ The DOM element that has been replaced by this editor instance. This +element holds the editor data on load and post. + +
+ Defined in: core/editor.js. + + +
+ + + + +
var editor = CKEDITOR.instances.editor1;
+alert( editor.element.getName() );  "textarea"
+ + + + + + + + +
+ + +
+ + {Number} + elementMode + +
+
+ Since: + + 3.0 + +
+
+
+ The mode in which the #element is linked to this editor +instance. It can be any of the following values: +
    +
  • CKEDITOR.ELEMENT_MODE_NONE: No element is linked to the + editor instance.
  • +
  • CKEDITOR.ELEMENT_MODE_REPLACE: The element is to be + replaced by the editor instance.
  • +
  • CKEDITOR.ELEMENT_MODE_APPENDTO: The editor is to be + created inside the element.
  • +
+ + +
+ + + + +
var editor = CKEDITOR.replace( 'editor1' );
+alert( editor.elementMode );  "1"
+ + + + + + + + +
+ + +
+ + {CKEDITOR.focusManager} + focusManager + +
+
+ Since: + + 3.0 + +
+
+
+ Controls the focus state of this editor instance. This property +is rarely used for normal API operations. It is mainly +destinated to developer adding UI elements to the editor interface. + +
+ Defined in: core/editor.js. + + +
+ + + + + + + + + + + +
+ + +
+ + {CKEDITOR.keystrokeHandler} + keystrokeHandler + +
+
+ Since: + + 3.0 + +
+
+
+ Controls keystrokes typing in this editor instance. + +
+ Defined in: plugins/keystrokes/plugin.js. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + mode + +
+
+ Since: + + 3.0 + +
+
+
+ The current editing mode. An editing mode is basically a viewport for +editing or content viewing. By default the possible values for this +property are "wysiwyg" and "source". + +
+ Defined in: plugins/editingblock/plugin.js. + + +
+ + + + +
alert( CKEDITOR.instances.editor1.mode );  // "wysiwyg" (e.g.)
+ + + + + + + + +
+ + +
+ + {String} + name + +
+
+ Since: + + 3.0 + +
+
+
+ The editor instance name. It hay be the replaced element id, name or +a default name using a progressive counter (editor1, editor2, ...). + +
+ Defined in: core/editor.js. + + +
+ + + + +
var editor = CKEDITOR.instances.editor1;
+alert( editor.name );  "editor1"
+ + + + + + + + +
+ + +
+ + {CKEDITOR.ui} + ui + +
+
+ Since: + + 3.0 + +
+
+
+ Namespace containing UI features related to this editor instance. + +
+ Defined in: core/editor.js. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
<static> + + {CKEDITOR.editor} + CKEDITOR.editor.appendTo(elementOrId, config) + +
+
+ Since: + + 3.0 + +
+
+
+ Creates a new editor instance inside a specific DOM element. Do not use +this function directly. Use CKEDITOR.appendTo instead. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {Object|String} elementOrId + +
+
The DOM element or its ID.
+ +
+ {Object} config + Optional +
+
The specific configurations to apply to this + editor instance. Configurations set here will override global CKEditor + settings.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.editor} The editor instance created.
+ +
+ + + + +
+ + +
<static> + + {CKEDITOR.editor} + CKEDITOR.editor.replace(elementOrIdOrName, config) + +
+
+ Since: + + 3.0 + +
+
+
+ Replaces a <textarea> or a DOM element (DIV) with a CKEditor +instance. For textareas, the initial value in the editor will be the +textarea value. For DOM elements, their innerHTML will be used +instead. We recommend using TEXTAREA and DIV elements only. Do not use +this function directly. Use CKEDITOR.replace instead. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {Object|String} elementOrIdOrName + +
+
The DOM element (textarea), its + ID or name.
+ +
+ {Object} config + Optional +
+
The specific configurations to apply to this + editor instance. Configurations set here will override global CKEditor + settings.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.editor} The editor instance created.
+ +
+ + + + +
+ + +
+ + {Undefined} + addCommand(commandName, commandDefinition) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a command definition to the editor instance. Commands added with +this function can be later executed with #execCommand. + +
+ Defined in: core/editor.js. + + +
+ + + + +
editorInstance.addCommand( 'sample',
+{
+    exec : function( editor )
+    {
+        alert( 'Executing a command for the editor name "' + editor.name + '"!' );
+    }
+});
+ + + + + +
+
Parameters:
+ +
+ {String} commandName + +
+
The indentifier name of the command.
+ +
+ {CKEDITOR.commandDefinition} commandDefinition + +
+
The command definition.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + addCss(css) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/editor.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} css + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + addMode(mode, modeEditor) + +
+
+ Since: + + 3.0 + +
+
+
+ Registers an editing mode. This function is to be used mainly by plugins. + +
+ Defined in: plugins/editingblock/plugin.js. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} mode + +
+
The mode name.
+ +
+ {Object} modeEditor + +
+
The mode editor definition.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + attachStyleStateChange(The, The) + +
+
+ Since: + + 3.0 + +
+
+
+ Registers a function to be called whenever a style changes its state in the +editing area. The current state is passed to the function. The possible +states are CKEDITOR.TRISTATE_ON and CKEDITOR.TRISTATE_OFF. + +
+ Defined in: plugins/styles/plugin.js. + + +
+ + + + +
// Create a style object for the <b> element.
+var style = new CKEDITOR.style( { element : 'b' } );
+var editor = CKEDITOR.instances.editor1;
+editor.attachStyleStateChange( style, function( state )
+    {
+        if ( state == CKEDITOR.TRISTATE_ON )
+            alert( 'The current state for the B element is ON' );
+        else
+            alert( 'The current state for the B element is OFF' );
+    });
+ + + + + +
+
Parameters:
+ +
+ {CKEDITOR.style} The + +
+
style to be watched.
+ +
+ {Function} The + +
+
function to be called when the style state changes.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + checkDirty() + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/editor.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + createFakeElement(realElement, className, realElementType, isResizable) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/fakeobjects/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} realElement + +
+
+ +
+ {Undefined} className + +
+
+ +
+ {Undefined} realElementType + +
+
+ +
+ {Undefined} isResizable + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + createFakeParserElement(realElement, className, realElementType, isResizable) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/fakeobjects/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} realElement + +
+
+ +
+ {Undefined} className + +
+
+ +
+ {Undefined} realElementType + +
+
+ +
+ {Undefined} isResizable + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + destroy(noUpdate) + +
+
+ Since: + + 3.0 + +
+
+
+ Destroys the editor instance, releasing all resources used by it. +If the editor replaced an element, the element will be recovered. + +
+ Defined in: core/editor.js. + + +
+ + + + +
alert( CKEDITOR.instances.editor1 );  e.g "object"
+CKEDITOR.instances.editor1.destroy();
+alert( CKEDITOR.instances.editor1 );  "undefined"
+ + + + + +
+
Parameters:
+ +
+ {Boolean} noUpdate + Optional +
+
If the instance is replacing a DOM + element, this parameter indicates whether or not to update the + element with the instance contents.
+ +
+ + + + + + + +
+ + +
+ + {Boolean} + execCommand(commandName, data) + +
+
+ Since: + + 3.0 + +
+
+
+ Executes a command. + +
+ Defined in: core/editor.js. + + +
+ + + + +
editorInstance.execCommand( 'Bold' );
+ + + + + +
+
Parameters:
+ +
+ {String} commandName + +
+
The indentifier name of the command.
+ +
+ {Object} data + Optional +
+
Data to be passed to the command
+ +
+ + + + +
+
Returns:
+ +
{Boolean} "true" if the command has been successfuly + executed, otherwise "false".
+ +
+ + + + +
+ + +
+ + {Undefined} + focus() + +
+
+ Since: + + 3.0 + +
+
+
+ Moves the selection focus to the editing are space in the editor. + +
+ Defined in: plugins/editingblock/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + forceNextSelectionCheck() + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/selection/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {CKEDITOR.command} + getCommand(commandName) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets one of the registered commands. Note that, after registering a +command definition with addCommand, it is transformed internally +into an instance of CKEDITOR.command, which will be then +returned by this function. + +
+ Defined in: core/editor.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {String} commandName + +
+
The name of the command to be returned. +This is the same used to register the command with addCommand.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.command} The command object identified by the +provided name.
+ +
+ + + + +
+ + +
+ + {String} + getData() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the editor data. The data will be in raw format. It is the same +data that is posted by the editor. + +
+ Defined in: core/editor.js. + + +
+ + + + +
if ( CKEDITOR.instances.editor1.getData() == '' )
+    alert( 'There is no data available' );
+ + + + + + + + +
+
Returns:
+ +
{Undefined} (String) The editor data.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.selection} + getSelection() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the current selection from the editing area when in WYSIWYG mode. + +
+ Defined in: plugins/selection/plugin.js. + + +
+ + + + +
var selection = CKEDITOR.instances.editor1.getSelection();
+alert( selection.getType() );
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.selection} A selection object or null if not on + WYSIWYG mode or no selection is available.
+ +
+ + + + +
+ + +
+ + {Undefined} + getSnapshot() + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/editor.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + insertElement(element) + +
+
+ Since: + + 3.0 + +
+
+
+ Inserts an element into the currently selected position in the +editor. + +
+ Defined in: core/editor.js. + + +
+ + + + +
var element = CKEDITOR.dom.element.createFromHtml( '<img src="hello.png" border="0" title="Hello" />' );
+CKEDITOR.instances.editor1.insertElement( element );
+ + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dom.element} element + +
+
The element to be inserted + into the editor.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + insertHtml(data) + +
+
+ Since: + + 3.0 + +
+
+
+ Inserts HTML into the currently selected position in the editor. + +
+ Defined in: core/editor.js. + + +
+ + + + +
CKEDITOR.instances.editor1.insertHtml( '<p>This is a new paragraph.</p>' );
+ + + + + +
+
Parameters:
+ +
+ {String} data + +
+
HTML code to be inserted into the editor.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + insertText(text) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/pastetext/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} text + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + loadSnapshot(snapshot) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/editor.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} snapshot + +
+
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.dialog} + openDialog(dialogName) + +
+
+ Since: + + 3.0 + +
+
+
+ Loads and opens a registered dialog. + +
+ Defined in: plugins/dialog/plugin.js. + + +
+ + + + +
CKEDITOR.instances.editor1.openDialog( 'smiley' );
+ + + + + +
+
Parameters:
+ +
+ {String} dialogName + +
+
The registered name of the dialog.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog} The dialog object corresponding to the dialog displayed. null if the dialog name is not registered.
+ +
+ + + +
+
See:
+ +
CKEDITOR.dialog.add
+ +
+ + +
+ + +
+ + {Undefined} + resetDirty() + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/editor.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + restoreRealElement(fakeElement) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/fakeobjects/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} fakeElement + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + setData(data) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the editor data. The data must be provided in raw format. + +
+ Defined in: core/editor.js. + + +
+ + + + +
CKEDITOR.instances.editor1.setData( '<p>This is the editor data.</p>' );
+ + + + + +
+
Parameters:
+ +
+ {String} data + +
+
HTML code to replace the curent content in the editor.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + setMode(mode) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the current editing mode in this editor instance. + +
+ Defined in: plugins/editingblock/plugin.js. + + +
+ + + + +
// Switch to "source" view.
+CKEDITOR.instances.editor1.setMode( 'source' );
+ + + + + +
+
Parameters:
+ +
+ {String} mode + +
+
A registered mode name.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + updateElement() + +
+
+ Since: + + 3.0 + +
+
+
+ Updates the <textarea> element that has been replaced by the editor with +the current data available in the editor. + +
+ Defined in: core/editor.js. + + +
+ + + + +
CKEDITOR.instances.editor1.updateElement();
+alert( document.getElementById( 'editor1' ).value );  // The current editor data.
+ + + + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.env.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.env.html new file mode 100644 index 000000000..d9f83bb80 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.env.html @@ -0,0 +1,1273 @@ + + + + + + + CKEDITOR.env - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.env +

+ + +

+ + + +Environment and browser information. + + +
Defined in: core/env.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Environment and browser information.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.env.air +
+
Indicates that CKEditor is running on Adobe AIR.
+
<static>   +
+ CKEDITOR.env.gecko +
+
Indicates that CKEditor is running on a Gecko based browser, like +Firefox.
+
<static>   +
+ CKEDITOR.env.ie +
+
Indicates that CKEditor is running on Internet Explorer.
+
<static>   +
+ CKEDITOR.env.isCompatible +
+
Indicates that CKEditor is running on a compatible browser.
+
<static>   +
+ CKEDITOR.env.mac +
+
Indicates that CKEditor is running on Macintosh.
+
<static>   +
+ CKEDITOR.env.opera +
+
Indicates that CKEditor is running on Opera.
+
<static>   +
+ CKEDITOR.env.version +
+
Contains the browser version.
+
<static>   +
+ CKEDITOR.env.webkit +
+
Indicates that CKEditor is running on a WebKit based browser, like +Safari.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.env.isCustomDomain() +
+
+
+ + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.env +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Environment and browser information. + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {Boolean} + CKEDITOR.env.air + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that CKEditor is running on Adobe AIR. + + +
+ + + + +
if ( CKEDITOR.env.air )
+    alert( "I'm on AIR!" );
+ + + + + + + + +
+ + +
<static> + + {Boolean} + CKEDITOR.env.gecko + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that CKEditor is running on a Gecko based browser, like +Firefox. + + +
+ + + + +
if ( CKEDITOR.env.gecko )
+    alert( "I'm riding a gecko!" );
+ + + + + + + + +
+ + +
<static> + + {Boolean} + CKEDITOR.env.ie + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that CKEditor is running on Internet Explorer. + + +
+ + + + +
if ( CKEDITOR.env.ie )
+    alert( "I'm on IE!" );
+ + + + + + + + +
+ + +
<static> + + {Boolean} + CKEDITOR.env.isCompatible + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that CKEditor is running on a compatible browser. + + +
+ + + + +
if ( CKEDITOR.env.isCompatible )
+    alert( "Your browser is pretty cool!" );
+ + + + + + + + +
+ + +
<static> + + {Boolean} + CKEDITOR.env.mac + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that CKEditor is running on Macintosh. + + +
+ + + + +
if ( CKEDITOR.env.mac )
+    alert( "I love apples!" );
+ + + + + + + + +
+ + +
<static> + + {Boolean} + CKEDITOR.env.opera + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that CKEditor is running on Opera. + + +
+ + + + +
if ( CKEDITOR.env.opera )
+    alert( "I'm on Opera!" );
+ + + + + + + + +
+ + +
<static> + + {Boolean} + CKEDITOR.env.version + +
+
+ Since: + + 3.0 + +
+
+
+ Contains the browser version. + +For gecko based browsers (like Firefox) it contains the revision +number with first three parts concatenated with a padding zero +(e.g. for revision 1.9.0.2 we have 10900). + +For webkit based browser (like Safari and Chrome) it contains the +WebKit build version (e.g. 522). + + +
+ + + + +
if ( CKEDITOR.env.ie && CKEDITOR.env.version <= 6 )
+    alert( "Ouch!" );
+ + + + + + + + +
+ + +
<static> + + {Boolean} + CKEDITOR.env.webkit + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that CKEditor is running on a WebKit based browser, like +Safari. + + +
+ + + + +
if ( CKEDITOR.env.webkit )
+    alert( "I'm on WebKit!" );
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.env.isCustomDomain() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.event.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.event.html new file mode 100644 index 000000000..ebb4d543f --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.event.html @@ -0,0 +1,1324 @@ + + + + + + + CKEDITOR.event - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.event +

+ + +

+ + + + + +
Defined in: core/event.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
This is a base class for classes and objects that require event handling +features.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.event.implementOn(targetObject, isTargetPrototype) +
+
Implements the CKEDITOR.event features in an object.
+
  +
fire(eventName, data, editor) +
+
Fires an specific event in the object.
+
  +
fireOnce(eventName, data, editor) +
+
Fires an specific event in the object, releasing all listeners +registered to that event.
+
  +
hasListeners(eventName) +
+
Checks if there is any listener registered to a given event.
+
  +
on(eventName, listenerFunction, scopeObj, listenerData, priority) +
+
Registers a listener to a specific event in the current object.
+
  +
removeListener(eventName, listenerFunction) +
+
Unregisters a listener function from being called at the specified + event.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.event() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ This is a base class for classes and objects that require event handling +features. + +
+ + + + + + + + + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.event.implementOn(targetObject, isTargetPrototype) + +
+
+ Since: + + 3.0 + +
+
+
+ Implements the CKEDITOR.event features in an object. + + +
+ + + + +
var myObject = { message : 'Example' };
+CKEDITOR.event.implementOn( myObject };
+myObject.on( 'testEvent', function()
+    {
+        alert( this.message );  // "Example"
+    });
+myObject.fire( 'testEvent' );
+ + + + + +
+
Parameters:
+ +
+ {Object} targetObject + +
+
The object in which implement the features.
+ +
+ {Undefined} isTargetPrototype + +
+
+ +
+ + + + + + + +
+ + +
+ + {Boolean|Object} + fire(eventName, data, editor) + +
+
+ Since: + + 3.0 + +
+
+
+ Fires an specific event in the object. All registered listeners are +called at this point. + + +
+ + + + +
someObject.on( 'someEvent', function() { ... } );
+someObject.on( 'someEvent', function() { ... } );
+someObject.fire( 'someEvent' );  // both listeners are called
+ + + +
someObject.on( 'someEvent', function( event )
+    {
+        alert( event.data );  // "Example"
+    });
+someObject.fire( 'someEvent', 'Example' );
+ + + + + +
+
Parameters:
+ +
+ {String} eventName + +
+
The event name to fire.
+ +
+ {Object} data + Optional +
+
Data to be sent as the + CKEDITOR.eventInfo#data when calling the + listeners.
+ +
+ {CKEDITOR.editor} editor + Optional +
+
The editor instance to send as the + CKEDITOR.eventInfo#editor when calling the + listener.
+ +
+ + + + +
+
Returns:
+ +
{Boolean|Object} A booloan indicating that the event is to be + canceled, or data returned by one of the listeners.
+ +
+ + + + +
+ + +
+ + {Boolean|Object} + fireOnce(eventName, data, editor) + +
+
+ Since: + + 3.0 + +
+
+
+ Fires an specific event in the object, releasing all listeners +registered to that event. The same listeners are not called again on +successive calls of it or of #fire. + + +
+ + + + +
someObject.on( 'someEvent', function() { ... } );
+someObject.fire( 'someEvent' );  // above listener called
+someObject.fireOnce( 'someEvent' );  // above listener called
+someObject.fire( 'someEvent' );  // no listeners called
+ + + + + +
+
Parameters:
+ +
+ {String} eventName + +
+
The event name to fire.
+ +
+ {Object} data + Optional +
+
Data to be sent as the + CKEDITOR.eventInfo#data when calling the + listeners.
+ +
+ {CKEDITOR.editor} editor + Optional +
+
The editor instance to send as the + CKEDITOR.eventInfo#editor when calling the + listener.
+ +
+ + + + +
+
Returns:
+ +
{Boolean|Object} A booloan indicating that the event is to be + canceled, or data returned by one of the listeners.
+ +
+ + + + +
+ + +
+ + {Undefined} + hasListeners(eventName) + +
+
+ Since: + + 3.0 + +
+
+
+ Checks if there is any listener registered to a given event. + + +
+ + + + +
var myListener = function() { ... };
+someObject.on( 'someEvent', myListener );
+alert( someObject.hasListeners( 'someEvent' ) );  // "true"
+alert( someObject.hasListeners( 'noEvent' ) );    // "false"
+ + + + + +
+
Parameters:
+ +
+ {String} eventName + +
+
The event name.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + on(eventName, listenerFunction, scopeObj, listenerData, priority) + +
+
+ Since: + + 3.0 + +
+
+
+ Registers a listener to a specific event in the current object. + + +
+ + + + +
someObject.on( 'someEvent', function()
+    {
+        alert( this == someObject );  // "true"
+    });
+ + + +
someObject.on( 'someEvent', function()
+    {
+        alert( this == anotherObject );  // "true"
+    }
+    , anotherObject );
+ + + +
someObject.on( 'someEvent', function( event )
+    {
+        alert( event.listenerData );  // "Example"
+    }
+    , null, 'Example' );
+ + + +
someObject.on( 'someEvent', function() { ... } );                   // 2nd called
+someObject.on( 'someEvent', function() { ... }, null, null, 100 );  // 3rd called
+someObject.on( 'someEvent', function() { ... }, null, null, 1 );    // 1st called
+ + + + + +
+
Parameters:
+ +
+ {String} eventName + +
+
The event name to which listen.
+ +
+ {Function} listenerFunction + +
+
The function listening to the + event.
+ +
+ {Object} scopeObj + Optional +
+
The object used to scope the listener + call (the this object. If omitted, the current object is used.
+ +
+ {Object} listenerData + Optional +
+
Data to be sent as the + CKEDITOR.eventInfo#listenerData when calling the + listener.
+ +
+ {Number} priority + Optional +
+
The listener priority. Lower priority + listeners are called first. Listeners with the same priority + value are called in registration order. Defaults to 10.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + removeListener(eventName, listenerFunction) + +
+
+ Since: + + 3.0 + +
+
+
+ Unregisters a listener function from being called at the specified + event. No errors are thrown if the listener has not been + registered previously. + + +
+ + + + +
var myListener = function() { ... };
+someObject.on( 'someEvent', myListener );
+someObject.fire( 'someEvent' );  // myListener called
+someObject.removeListener( 'someEvent', myListener );
+someObject.fire( 'someEvent' );  // myListener not called
+ + + + + +
+
Parameters:
+ +
+ {String} eventName + +
+
The event name.
+ +
+ {Function} listenerFunction + +
+
The listener function to unregister.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.eventInfo.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.eventInfo.html new file mode 100644 index 000000000..cfec491e7 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.eventInfo.html @@ -0,0 +1,1214 @@ + + + + + + + CKEDITOR.eventInfo - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.eventInfo +

+ + +

+ + + + + +
Defined in: core/eventInfo.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
This class is not really part of the API.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ data +
+
Any kind of additional data.
+
  +
+ editor +
+
The editor instance that holds the sender.
+
  + +
Any extra data appended during the listener registration.
+
  +
+ name +
+
The event name.
+
  +
+ sender +
+
The object that publishes (sends) the event.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
cancel() +
+
Indicates that the event is to be cancelled (if cancelable).
+
  +
stop() +
+
Indicates that no further listeners are to be called.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.eventInfo() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ This class is not really part of the API. It just illustrates the features +of the event object passed to event listeners by a CKEDITOR.event +based object. + +
+ + + + +
// Do not do this.
+var myEvent = new CKEDITOR.eventInfo();  // Error: CKEDITOR.eventInfo is undefined
+ + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + data + +
+
+ Since: + + 3.0 + +
+
+
+ Any kind of additional data. Its format and usage is event dependent. + + +
+ + + + +
someObject.on( 'someEvent', function( event )
+    {
+        alert( event.data );  // "Example"
+    });
+someObject.fire( 'someEvent', 'Example' );
+ + + + + + + + +
+ + +
+ + {CKEDITOR.editor} + editor + +
+
+ Since: + + 3.0 + +
+
+
+ The editor instance that holds the sender. May be the same as sender. May be +null if the sender is not part of an editor instance, like a component +running in standalone mode. + + +
+ + + + +
myButton.on( 'someEvent', function( event )
+    {
+        alert( event.editor == myEditor );  // "true"
+    });
+myButton.fire( 'someEvent', null, myEditor );
+ + + + + + + + +
+ + +
+ + {Object} + listenerData + +
+
+ Since: + + 3.0 + +
+
+
+ Any extra data appended during the listener registration. + + +
+ + + + +
someObject.on( 'someEvent', function( event )
+    {
+        alert( event.listenerData );  // "Example"
+    }
+    , null, 'Example' );
+ + + + + + + + +
+ + +
+ + {String} + name + +
+
+ Since: + + 3.0 + +
+
+
+ The event name. + + +
+ + + + +
someObject.on( 'someEvent', function( event )
+    {
+        alert( event.name );  // "someEvent"
+    });
+someObject.fire( 'someEvent' );
+ + + + + + + + +
+ + +
+ + {Object} + sender + +
+
+ Since: + + 3.0 + +
+
+
+ The object that publishes (sends) the event. + + +
+ + + + +
someObject.on( 'someEvent', function( event )
+    {
+        alert( event.sender == someObject );  // "true"
+    });
+someObject.fire( 'someEvent' );
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + cancel() + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that the event is to be cancelled (if cancelable). + + +
+ + + + +
someObject.on( 'someEvent', function( event )
+    {
+        event.cancel();
+    });
+someObject.on( 'someEvent', function( event )
+    {
+        // This one will not be called.
+    });
+alert( someObject.fire( 'someEvent' ) );  // "true"
+ + + + + + + + + + + +
+ + +
+ + {Undefined} + stop() + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that no further listeners are to be called. + + +
+ + + + +
someObject.on( 'someEvent', function( event )
+    {
+        event.stop();
+    });
+someObject.on( 'someEvent', function( event )
+    {
+        // This one will not be called.
+    });
+alert( someObject.fire( 'someEvent' ) );  // "false"
+ + + + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.focusManager.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.focusManager.html new file mode 100644 index 000000000..ab9a64c84 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.focusManager.html @@ -0,0 +1,1064 @@ + + + + + + + CKEDITOR.focusManager - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.focusManager +

+ + +

+ + + + + +
Defined in: core/focusmanager.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.focusManager(editor) +
+
Manages the focus activity in an editor instance.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ hasFocus +
+
Indicates that the editor instance has focus.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
blur() +
+
Indicates that the editor instance has lost the focus.
+
  +
focus() +
+
Indicates that the editor instance has the focus.
+
  + +
Indicates that the editor instance has lost the focus.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.focusManager(editor) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Manages the focus activity in an editor instance. This class is to be used +mainly by UI elements coders when adding interface elements to CKEditor. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.editor} editor + +
+
The editor instance.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Boolean} + hasFocus + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that the editor instance has focus. + + +
+ + + + +
alert( CKEDITOR.instances.editor1.focusManager.hasFocus );  // e.g "true"
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + blur() + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that the editor instance has lost the focus. Note that this +functions acts asynchronously with a delay of 100ms to avoid subsequent +blur/focus effects. If you want the "blur" to happen immediately, use +the #forceBlur function instead. + + +
+ + + + +
var editor = CKEDITOR.instances.editor1;
+editor.focusManager.blur();
+ + + + + + + + + + + +
+ + +
+ + {Undefined} + focus() + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that the editor instance has the focus. + +This function is not used to set the focus in the editor. Use +CKEDITOR.editor#focus for it instead. + + +
+ + + + +
var editor = CKEDITOR.instances.editor1;
+editor.focusManager.focus();
+ + + + + + + + + + + +
+ + +
+ + {Undefined} + forceBlur() + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates that the editor instance has lost the focus. Unlike +#blur, this function is synchronous, marking the instance as +"blured" immediately. + + +
+ + + + +
var editor = CKEDITOR.instances.editor1;
+editor.focusManager.forceBlur();
+ + + + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.html new file mode 100644 index 000000000..38c582011 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.html @@ -0,0 +1,2837 @@ + + + + + + + CKEDITOR - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR +

+ + +

+ + + +This is the API entry point. The entire CKEditor code runs under this object. + + +
Defined in: core/ckeditor_base.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR +
+
This is the API entry point.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Constants Summary
Constant AttributesConstant Name and Description
<static>   +
+ CKEDITOR.ALT +
+
ALT key (4000).
+
<static>   +
+ CKEDITOR.CTRL +
+
CTRL key (1000).
+
<static>   +
+ CKEDITOR.DIALOG_RESIZE_HEIGHT +
+
Only allow vertical resizing for this dialog, disable horizontal resizing.
+
<static>   +
+ CKEDITOR.DIALOG_RESIZE_NONE +
+
No resize for this dialog.
+
<static>   +
+ CKEDITOR.DIALOG_RESIZE_WIDTH +
+
Only allow horizontal resizing for this dialog, disable vertical resizing.
+
<static>   +
+ CKEDITOR.ELEMENT_MODE_APPENDTO +
+
The editor is to be created inside the element.
+
<static>   +
+ CKEDITOR.ELEMENT_MODE_NONE +
+
No element is linked to the editor instance.
+
<static>   +
+ CKEDITOR.ELEMENT_MODE_REPLACE +
+
The element is to be replaced by the editor instance.
+
<static>   +
+ CKEDITOR.NODE_COMMENT +
+
Comment node type.
+
<static>   +
+ CKEDITOR.NODE_ELEMENT +
+
Element node type.
+
<static>   +
+ CKEDITOR.NODE_TEXT +
+
Text node type.
+
<static>   +
+ CKEDITOR.SELECTION_ELEMENT +
+
Element selection.
+
<static>   +
+ CKEDITOR.SELECTION_NONE +
+
No selection.
+
<static>   +
+ CKEDITOR.SELECTION_TEXT +
+
Text or collapsed selection.
+
<static>   +
+ CKEDITOR.SHIFT +
+
SHIFT key (2000).
+
<static>   +
+ CKEDITOR.TRISTATE_DISABLED +
+
Used to indicate DISABLED state.
+
<static>   +
+ CKEDITOR.TRISTATE_OFF +
+
Used to indicate the OFF or NON ACTIVE state.
+
<static>   +
+ CKEDITOR.TRISTATE_ON +
+
Used to indicate the ON or ACTIVE state.
+
<static>   +
+ CKEDITOR.UI_BUTTON +
+
Button UI element.
+
<static>   +
+ CKEDITOR.UI_MENUBUTTON +
+
Button UI element.
+
<static>   +
+ CKEDITOR.UI_PANEL +
+
Panel UI element.
+
<static>   +
+ CKEDITOR.UI_PANELBUTTON +
+
Button UI element.
+
<static>   +
+ CKEDITOR.UI_RICHCOMBO +
+
Button UI element.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.basePath +
+
Contains the full URL for the CKEditor installation directory.
+
<static>   +
+ CKEDITOR.document +
+
The document of the window holding the CKEDITOR object.
+
<static>   +
+ CKEDITOR.instances +
+
Holds references to all editor instances created.
+
<static>   +
+ CKEDITOR.loadFullCoreTimeout +
+
The time to wait (in seconds) to load the full editor code after the +page load, if the "ckeditor_basic" file is used.
+
<static>   +
+ CKEDITOR.replaceByClassEnabled +
+
Enables the replacement of all textareas with class name matching +CKEDITOR.replaceClass.
+
<static>   +
+ CKEDITOR.replaceClass +
+
The class name used to identify <textarea> elements to be replace +by CKEditor instances.
+
<static>   +
+ CKEDITOR.revision +
+
Contains the CKEditor revision number.
+
<static>   +
+ CKEDITOR.START +
+
Check boundary types.
+
<static>   +
+ CKEDITOR.status +
+
Indicates the API loading status.
+
<static>   +
+ CKEDITOR.timestamp +
+
A constant string unique for each release of CKEditor.
+
<static>   +
+ CKEDITOR.version +
+
Contains the CKEditor version number.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.add(editor) +
+
Adds an editor instance to the global CKEDITOR object.
+
<static>   +
CKEDITOR.addStylesSet(name, styles) +
+
+
<static>   +
CKEDITOR.addTemplates(name, definition) +
+
+
<static>   +
CKEDITOR.appendTo(elementOrId, config) +
+
Creates a new editor instance inside a specific DOM element.
+
<static>   +
CKEDITOR.command(editor, commandDefinition) +
+
+
<static>   +
CKEDITOR.exec(data) +
+
+
<static>   +
CKEDITOR.getClipboardData() +
+
+
<static>   +
CKEDITOR.getTemplates(name) +
+
+
<static>   +
CKEDITOR.getUrl(resource) +
+
Gets the full URL for CKEditor resources.
+
<static>   +
CKEDITOR.htmlDataProcessor(editor) +
+
+
<static>   +
CKEDITOR.loadFullCore() +
+
Forces the full CKEditor core code, in the case only the basic code has been +loaded (ckeditor_basic.js).
+
<static>   +
CKEDITOR.loadStylesSet(name, url, callback) +
+
+
<static>   +
CKEDITOR.loadTemplates(templateFiles, callback) +
+
+
<static>   +
CKEDITOR.remove(editor) +
+
Removes and editor instance from the global CKEDITOR object.
+
<static>   +
CKEDITOR.replace(elementOrIdOrName, config) +
+
Replaces a <textarea> or a DOM element (DIV) with a CKEditor +instance.
+
<static>   +
CKEDITOR.replaceAll() +
+
Replace all <textarea> elements available in the document with +editor instances.
+
<static>   +
CKEDITOR.style(styleDefinition, variablesValues) +
+
+
<static>   +
CKEDITOR.styleCommand(style) +
+
+
<static>   +
CKEDITOR.unlinkCommand() +
+
+
+ + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR +
+ +
+ Since: + + 3.0 + +
+
+ +
+ This is the API entry point. The entire CKEditor code runs under this object. + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {String} + CKEDITOR.basePath + +
+
+ Since: + + 3.0 + +
+
+
+ Contains the full URL for the CKEditor installation directory. +It's possible to manually provide the base path by setting a +global variable named CKEDITOR_BASEPATH. This global variable +must be set "before" the editor script loading. + + +
+ + + + +
alert( CKEDITOR.basePath );  // "http://www.example.com/ckeditor/" (e.g.)
+ + + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.document + +
+
+ Since: + + 3.0 + +
+
+
+ The document of the window holding the CKEDITOR object. + +
+ Defined in: core/ckeditor.js. + + +
+ + + + +
alert( CKEDITOR.document.getBody().getName() );  // "body"
+ + + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.instances + +
+
+ Since: + + 3.0 + +
+
+
+ Holds references to all editor instances created. The name of the properties +in this object correspond to instance names, and their values contains the +CKEDITOR.editor object representing them. + +
+ Defined in: core/ckeditor.js. + + +
+ + + + +
alert( CKEDITOR.instances.editor1.name );  // "editor1"
+ + + + + + + + +
+ + +
<static> + + {Number} + CKEDITOR.loadFullCoreTimeout + +
+
+ Since: + + 3.0 + +
+
+
+ The time to wait (in seconds) to load the full editor code after the +page load, if the "ckeditor_basic" file is used. If set to zero, the +editor is loaded on demand, as soon as an instance is created. + +This value must be set on the page before the page load completion. + +
+ Defined in: core/ckeditor_basic.js. + + +
+ + + + +
// Loads the full source after five seconds.
+CKEDITOR.loadFullCoreTimeout = 5;
+ + + + + + + +
+
Default Value:
+
+ 0 (zero) +
+
+ + +
+ + +
<static> + + {Boolean} + CKEDITOR.replaceByClassEnabled + +
+
+ Since: + + 3.0 + +
+
+
+ Enables the replacement of all textareas with class name matching +CKEDITOR.replaceClass. + +
+ Defined in: core/ckeditor_basic.js. + + +
+ + + + +
// Disable the auto-replace feature.
+CKEDITOR.replaceByClassEnabled = false;
+ + + + + + + +
+
Default Value:
+
+ true +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.replaceClass + +
+
+ Since: + + 3.0 + +
+
+
+ The class name used to identify <textarea> elements to be replace +by CKEditor instances. + +
+ Defined in: core/ckeditor_basic.js. + + +
+ + + + +
CKEDITOR.replaceClass = 'rich_editor';
+ + + + + + + +
+
Default Value:
+
+ 'ckeditor' +
+
+ + +
+ + +
<static> + + {String} + CKEDITOR.revision + +
+
+ Since: + + 3.0 + +
+
+
+ Contains the CKEditor revision number. +Revision number is incremented automatically after each modification of CKEditor source code. + + +
+ + + + +
alert( CKEDITOR.revision );  // e.g. '3975'
+ + + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.START + +
+
+ Since: + + 3.0 + +
+
+
+ Check boundary types. + +
+ Defined in: core/dom/range.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + +
+
See:
+ +
CKEDITOR.dom.range::checkBoundaryOfElement
+ +
+ + + +
+ + +
<static> + + {String} + CKEDITOR.status + +
+
+ Since: + + 3.0 + +
+
+
+ Indicates the API loading status. The following status are available: +
    +
  • unloaded: the API is not yet loaded.
  • +
  • basic_loaded: the basic API features are available.
  • +
  • basic_ready: the basic API is ready to load the full core code.
  • +
  • loading: the full API is being loaded.
  • +
  • ready: the API can be fully used.
  • +
+ + +
+ + + + +
if ( CKEDITOR.status == 'ready' )
+{
+    // The API can now be fully used.
+}
+ + + + + + + + +
+ + +
<static> + + {String} + CKEDITOR.timestamp + +
+
+ Since: + + 3.0 + +
+
+
+ A constant string unique for each release of CKEditor. Its value +is used, by default, to build the URL for all resources loaded +by the editor code, guaranteing clean cache results when +upgrading. + + +
+ + + + +
alert( CKEDITOR.timestamp );  // e.g. '87dm'
+ + + + + + + + +
+ + +
<static> + + {String} + CKEDITOR.version + +
+
+ Since: + + 3.0 + +
+
+
+ Contains the CKEditor version number. + + +
+ + + + +
alert( CKEDITOR.version );  // e.g. 'CKEditor 3.0 Beta'
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.add(editor) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds an editor instance to the global CKEDITOR object. This function +is available for internal use mainly. + +
+ Defined in: core/ckeditor.js. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.editor} editor + +
+
The editor instance to be added.
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.addStylesSet(name, styles) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/stylescombo/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} name + +
+
+ +
+ {Undefined} styles + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.addTemplates(name, definition) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/templates/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} name + +
+
+ +
+ {Undefined} definition + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {CKEDITOR.editor} + CKEDITOR.appendTo(elementOrId, config) + +
+
+ Since: + + 3.0 + +
+
+
+ Creates a new editor instance inside a specific DOM element. + +
+ Defined in: core/ckeditor_basic.js. + + +
+ + + + +
<div id="editorSpace"><:/div>
+...
+CKEDITOR.appendTo( 'editorSpace' );
+ + + + + +
+
Parameters:
+ +
+ {Object|String} elementOrId + +
+
The DOM element or its ID.
+ +
+ {Object} config + Optional +
+
The specific configurations to apply to this + editor instance. Configurations set here will override global CKEditor + settings.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.editor} The editor instance created.
+ +
+ + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.command(editor, commandDefinition) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/command.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} editor + +
+
+ +
+ {Undefined} commandDefinition + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.exec(data) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/command.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} data + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.getClipboardData() + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/pastetext/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.getTemplates(name) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/templates/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} name + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {String} + CKEDITOR.getUrl(resource) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the full URL for CKEditor resources. By default, URLs +returned by this function contains a querystring parameter ("t") +set to the CKEDITOR.timestamp value. +It's possible to provide a custom implementation to this +function by setting a global variable named CKEDITOR_GETURL. +This global variable must be set "before" the editor script +loading. If the custom implementation returns nothing, the +default implementation is used. + + +
+ + + + +
// e.g. http://www.example.com/ckeditor/skins/default/editor.css?t=87dm
+alert( CKEDITOR.getUrl( 'skins/default/editor.css' ) );
+ + + +
// e.g. http://www.example.com/skins/default/editor.css?t=87dm
+alert( CKEDITOR.getUrl( '/skins/default/editor.css' ) );
+ + + +
// e.g. http://www.somesite.com/skins/default/editor.css?t=87dm
+alert( CKEDITOR.getUrl( 'http://www.somesite.com/skins/default/editor.css' ) );
+ + + + + +
+
Parameters:
+ +
+ {Undefined} resource + +
+
+ +
+ + + + +
+
Returns:
+ +
{String} The full URL.
+ +
+ + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.htmlDataProcessor(editor) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/htmldataprocessor/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} editor + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.loadFullCore() + +
+
+ Since: + + 3.0 + +
+
+
+ Forces the full CKEditor core code, in the case only the basic code has been +loaded (ckeditor_basic.js). This method self-destroys (becomes undefined) in +the first call or as soon as the full code is available. + +
+ Defined in: core/ckeditor_basic.js. + + +
+ + + + +
// Check if the full core code has been loaded and load it.
+if ( CKEDITOR.loadFullCore )
+    CKEDITOR.loadFullCore();
+ + + + + + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.loadStylesSet(name, url, callback) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/stylescombo/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} name + +
+
+ +
+ {Undefined} url + +
+
+ +
+ {Undefined} callback + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.loadTemplates(templateFiles, callback) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/templates/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} templateFiles + +
+
+ +
+ {Undefined} callback + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.remove(editor) + +
+
+ Since: + + 3.0 + +
+
+
+ Removes and editor instance from the global CKEDITOR object. his function +is available for internal use mainly. + +
+ Defined in: core/ckeditor.js. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.editor} editor + +
+
The editor instance to be added.
+ +
+ + + + + + + +
+ + +
<static> + + {CKEDITOR.editor} + CKEDITOR.replace(elementOrIdOrName, config) + +
+
+ Since: + + 3.0 + +
+
+
+ Replaces a <textarea> or a DOM element (DIV) with a CKEditor +instance. For textareas, the initial value in the editor will be the +textarea value. For DOM elements, their innerHTML will be used +instead. We recommend using TEXTAREA and DIV elements only. + +
+ Defined in: core/ckeditor_basic.js. + + +
+ + + + +
<textarea id="myfield" name="myfield"><:/textarea>
+...
+CKEDITOR.replace( 'myfield' );
+ + + +
var textarea = document.body.appendChild( document.createElement( 'textarea' ) );
+CKEDITOR.replace( textarea );
+ + + + + +
+
Parameters:
+ +
+ {Object|String} elementOrIdOrName + +
+
The DOM element (textarea), its + ID or name.
+ +
+ {Object} config + Optional +
+
The specific configurations to apply to this + editor instance. Configurations set here will override global CKEditor + settings.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.editor} The editor instance created.
+ +
+ + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.replaceAll() + +
+
+ Since: + + 3.0 + +
+
+
+ Replace all <textarea> elements available in the document with +editor instances. + +
+ Defined in: core/ckeditor_basic.js. + + +
+ + + + +
// Replace all <textarea> elements in the page.
+CKEDITOR.replaceAll();
+ + + +
// Replace all <textarea class="myClassName"> elements in the page.
+CKEDITOR.replaceAll( 'myClassName' );
+ + + +
// Selectively replace <textarea> elements, based on custom assertions.
+CKEDITOR.replaceAll( function( textarea, config )
+    {
+        // Custom code to evaluate the replace, returning false
+        // if it must not be done.
+        // It also passes the "config" parameter, so the
+        // developer can customize the instance.
+    } );
+ + + + + + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.style(styleDefinition, variablesValues) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/styles/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} styleDefinition + +
+
+ +
+ {Undefined} variablesValues + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.styleCommand(style) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/styles/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} style + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.unlinkCommand() + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/link/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.cdata.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.cdata.html new file mode 100644 index 000000000..3142d5c23 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.cdata.html @@ -0,0 +1,1009 @@ + + + + + + + CKEDITOR.htmlParser.cdata - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.htmlParser.cdata +

+ + +

+ + + + + +
Defined in: core/htmlparser/cdata.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
A lightweight representation of HTML text.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ type +
+
CDATA has the same type as CKEDITOR.htmlParser.text This is +a constant value set to CKEDITOR.NODE_TEXT.
+
  +
+ value +
+
The CDATA value.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
writeHtml(writer) +
+
Writes write the CDATA with no special manipulations.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.htmlParser.cdata(value) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A lightweight representation of HTML text. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {Undefined} value + +
+
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Number} + type + +
+
+ Since: + + 3.0 + +
+
+
+ CDATA has the same type as CKEDITOR.htmlParser.text This is +a constant value set to CKEDITOR.NODE_TEXT. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + value + +
+
+ Since: + + 3.0 + +
+
+
+ The CDATA value. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + writeHtml(writer) + +
+
+ Since: + + 3.0 + +
+
+
+ Writes write the CDATA with no special manipulations. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {CKEDITOR.htmlWriter} writer + +
+
The writer to which write the HTML.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.comment.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.comment.html new file mode 100644 index 000000000..e33149334 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.comment.html @@ -0,0 +1,1015 @@ + + + + + + + CKEDITOR.htmlParser.comment - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.htmlParser.comment +

+ + +

+ + + + + +
Defined in: core/htmlparser/comment.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
A lightweight representation of an HTML comment.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ type +
+
The node type.
+
  +
+ value +
+
The comment text.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
writeHtml(writer, filter) +
+
Writes the HTML representation of this comment to a CKEDITOR.htmlWriter.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.htmlParser.comment(value) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A lightweight representation of an HTML comment. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {Undefined} value + +
+
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Number} + type + +
+
+ Since: + + 3.0 + +
+
+
+ The node type. This is a constant value set to CKEDITOR.NODE_COMMENT. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + value + +
+
+ Since: + + 3.0 + +
+
+
+ The comment text. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + writeHtml(writer, filter) + +
+
+ Since: + + 3.0 + +
+
+
+ Writes the HTML representation of this comment to a CKEDITOR.htmlWriter. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.htmlWriter} writer + +
+
The writer to which write the HTML.
+ +
+ {Undefined} filter + +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.element.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.element.html new file mode 100644 index 000000000..391a1a189 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.element.html @@ -0,0 +1,1215 @@ + + + + + + + CKEDITOR.htmlParser.element - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.htmlParser.element +

+ + +

+ + + + + +
Defined in: core/htmlparser/element.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.htmlParser.element(name, attributes) +
+
A lightweight representation of an HTML element.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  + +
Holds the attributes defined for this element.
+
  +
+ children +
+
The nodes that are direct children of this element.
+
  +
+ name +
+
The element name.
+
  +
+ type +
+
The node type.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
add(node) +
+
Adds a node to the element children list.
+
  +
clone() +
+
Clone this element.
+
  +
writeHtml(writer, filter) +
+
Writes the element HTML to a CKEDITOR.htmlWriter.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.htmlParser.element(name, attributes) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A lightweight representation of an HTML element. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The element name.
+ +
+ {Object} attributes + +
+
And object holding all attributes defined for + this element.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + attributes + +
+
+ Since: + + 3.0 + +
+
+
+ Holds the attributes defined for this element. + + +
+ + + + + + + + + + + +
+ + +
+ + {Array} + children + +
+
+ Since: + + 3.0 + +
+
+
+ The nodes that are direct children of this element. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + name + +
+
+ Since: + + 3.0 + +
+
+
+ The element name. + + +
+ + + + + + + + + + + +
+ + +
+ + {Number} + type + +
+
+ Since: + + 3.0 + +
+
+
+ The node type. This is a constant value set to CKEDITOR.NODE_ELEMENT. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + add(node) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a node to the element children list. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {Object} node + +
+
The node to be added. It can be any of of the + following types: CKEDITOR.htmlParser.element, + CKEDITOR.htmlParser.text and + CKEDITOR.htmlParser.comment.
+ +
+ + + + + + + +
+ + +
+ + {CKEDITOR.htmlParser.element} + clone() + +
+
+ Since: + + 3.0 + +
+
+
+ Clone this element. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{CKEDITOR.htmlParser.element} The element clone.
+ +
+ + + + +
+ + +
+ + {Undefined} + writeHtml(writer, filter) + +
+
+ Since: + + 3.0 + +
+
+
+ Writes the element HTML to a CKEDITOR.htmlWriter. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.htmlWriter} writer + +
+
The writer to which write the HTML.
+ +
+ {Undefined} filter + +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.fragment.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.fragment.html new file mode 100644 index 000000000..d48a208b0 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.fragment.html @@ -0,0 +1,1149 @@ + + + + + + + CKEDITOR.htmlParser.fragment - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.htmlParser.fragment +

+ + +

+ + + + + +
Defined in: core/htmlparser/fragment.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
A lightweight representation of an HTML DOM structure.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ children +
+
The nodes contained in the root of this fragment.
+
  +
+ parent +
+
Get the fragment parent.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.htmlParser.fragment.fromHtml(fragmentHtml, fixForBody) +
+
Creates a CKEDITOR.htmlParser.fragment from an HTML string.
+
  +
add(node) +
+
Adds a node to this fragment.
+
  +
writeHtml(writer, filter) +
+
Writes the fragment HTML to a CKEDITOR.htmlWriter.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.htmlParser.fragment() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A lightweight representation of an HTML DOM structure. + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Array} + children + +
+
+ Since: + + 3.0 + +
+
+
+ The nodes contained in the root of this fragment. + + +
+ + + + +
var fragment = CKEDITOR.htmlParser.fragment.fromHtml( 'Sample Text' );
+alert( fragment.children.length );  "2"
+ + + + + + + + +
+ + +
+ + {Object} + parent + +
+
+ Since: + + 3.0 + +
+
+
+ Get the fragment parent. Should always be null. + + +
+ + + + + + + + + + +
+
Default Value:
+
+ null +
+
+ + + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.htmlParser.fragment.fromHtml(fragmentHtml, fixForBody) + +
+
+ Since: + + 3.0 + +
+
+
+ Creates a CKEDITOR.htmlParser.fragment from an HTML string. + + +
+ + + + +
var fragment = CKEDITOR.htmlParser.fragment.fromHtml( 'Sample Text' );
+alert( fragment.children[0].name );  "b"
+alert( fragment.children[1].value );  " Text"
+ + + + + +
+
Parameters:
+ +
+ {String} fragmentHtml + +
+
The HTML to be parsed, filling the fragment.
+ +
+ {Number} fixForBody + Optional, Default: false +
+
Wrap body with specified element if needed.
+ +
+ + + + +
+
Returns:
+ +
{Undefined} CKEDITOR.htmlParser.fragment The fragment created.
+ +
+ + + + +
+ + +
+ + {Undefined} + add(node) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a node to this fragment. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {Object} node + +
+
The node to be added. It can be any of of the + following types: CKEDITOR.htmlParser.element, + CKEDITOR.htmlParser.text and + CKEDITOR.htmlParser.comment.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + writeHtml(writer, filter) + +
+
+ Since: + + 3.0 + +
+
+
+ Writes the fragment HTML to a CKEDITOR.htmlWriter. + + +
+ + + + +
var writer = new CKEDITOR.htmlWriter();
+var fragment = CKEDITOR.htmlParser.fragment.fromHtml( '<P><B>Example' );
+fragment.writeHtml( writer )
+alert( writer.getHtml() );  "<p><b>Example</b></p>"
+ + + + + +
+
Parameters:
+ +
+ {CKEDITOR.htmlWriter} writer + +
+
The writer to which write the HTML.
+ +
+ {Undefined} filter + +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.html new file mode 100644 index 000000000..8a3e5bff7 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.html @@ -0,0 +1,1227 @@ + + + + + + + CKEDITOR.htmlParser - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.htmlParser +

+ + +

+ + + + + +
Defined in: core/htmlparser.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
HTML text parser.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
onCDATA(cdata) +
+
Function to be fired when CDATA section is found.
+
  +
onComment(comment) +
+
Function to be fired when a commend is found.
+
  +
onTagClose(tagName) +
+
Function to be fired when a tag closer is found.
+
  +
onTagOpen(tagName, attributes, selfClosing) +
+
Function to be fired when a tag opener is found.
+
  +
onText(text) +
+
Function to be fired when text is found.
+
  +
parse(html) +
+
Parses text, looking for HTML tokens, like tag openers or closers, +or comments.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.htmlParser() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ HTML text parser. + +
+ + + + + + + + + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + onCDATA(cdata) + +
+
+ Since: + + 3.0 + +
+
+
+ Function to be fired when CDATA section is found. This function +should be overriden when using this class. + + +
+ + + + +
var parser = new CKEDITOR.htmlParser();
+parser.onCDATA = function( cdata )
+    {
+        alert( cdata );  // e.g. "var hello;"
+    });
+parser.parse( "<script>var hello;</script>" );
+ + + + + +
+
Parameters:
+ +
+ {String} cdata + +
+
The CDATA been found.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + onComment(comment) + +
+
+ Since: + + 3.0 + +
+
+
+ Function to be fired when a commend is found. This function +should be overriden when using this class. + + +
+ + + + +
var parser = new CKEDITOR.htmlParser();
+parser.onText = function( comment )
+    {
+        alert( comment );  // e.g. " Example "
+    });
+parser.parse( "<!-- Example --><b>Hello</b>" );
+ + + + + +
+
Parameters:
+ +
+ {String} comment + +
+
The comment text.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + onTagClose(tagName) + +
+
+ Since: + + 3.0 + +
+
+
+ Function to be fired when a tag closer is found. This function +should be overriden when using this class. + + +
+ + + + +
var parser = new CKEDITOR.htmlParser();
+parser.onTagClose = function( tagName )
+    {
+        alert( tagName );  // e.g. "b"
+    });
+parser.parse( "<!-- Example --><b>Hello</b>" );
+ + + + + +
+
Parameters:
+ +
+ {String} tagName + +
+
The tag name. The name is guarantted to be + lowercased.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + onTagOpen(tagName, attributes, selfClosing) + +
+
+ Since: + + 3.0 + +
+
+
+ Function to be fired when a tag opener is found. This function +should be overriden when using this class. + + +
+ + + + +
var parser = new CKEDITOR.htmlParser();
+parser.onTagOpen = function( tagName, attributes, selfClosing )
+    {
+        alert( tagName );  // e.g. "b"
+    });
+parser.parse( "<!-- Example --><b>Hello</b>" );
+ + + + + +
+
Parameters:
+ +
+ {String} tagName + +
+
The tag name. The name is guarantted to be + lowercased.
+ +
+ {Object} attributes + +
+
An object containing all tag attributes. Each + property in this object represent and attribute name and its + value is the attribute value.
+ +
+ {Boolean} selfClosing + +
+
true if the tag closes itself, false if the + tag doesn't.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + onText(text) + +
+
+ Since: + + 3.0 + +
+
+
+ Function to be fired when text is found. This function +should be overriden when using this class. + + +
+ + + + +
var parser = new CKEDITOR.htmlParser();
+parser.onText = function( text )
+    {
+        alert( text );  // e.g. "Hello"
+    });
+parser.parse( "<!-- Example --><b>Hello</b>" );
+ + + + + +
+
Parameters:
+ +
+ {String} text + +
+
The text found.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + parse(html) + +
+
+ Since: + + 3.0 + +
+
+
+ Parses text, looking for HTML tokens, like tag openers or closers, +or comments. This function fires the onTagOpen, onTagClose, onText +and onComment function during its execution. + + +
+ + + + +
var parser = new CKEDITOR.htmlParser();
+// The onTagOpen, onTagClose, onText and onComment should be overriden
+// at this point.
+parser.parse( "<!-- Example --><b>Hello</b>" );
+ + + + + +
+
Parameters:
+ +
+ {String} html + +
+
The HTML to be parsed.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.text.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.text.html new file mode 100644 index 000000000..c977a34c3 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlParser.text.html @@ -0,0 +1,1015 @@ + + + + + + + CKEDITOR.htmlParser.text - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.htmlParser.text +

+ + +

+ + + + + +
Defined in: core/htmlparser/text.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
A lightweight representation of HTML text.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ type +
+
The node type.
+
  +
+ value +
+
The text value.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
writeHtml(writer, filter) +
+
Writes the HTML representation of this text to a CKEDITOR.htmlWriter.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.htmlParser.text(value) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A lightweight representation of HTML text. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {Undefined} value + +
+
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Number} + type + +
+
+ Since: + + 3.0 + +
+
+
+ The node type. This is a constant value set to CKEDITOR.NODE_TEXT. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + value + +
+
+ Since: + + 3.0 + +
+
+
+ The text value. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + writeHtml(writer, filter) + +
+
+ Since: + + 3.0 + +
+
+
+ Writes the HTML representation of this text to a CKEDITOR.htmlWriter. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.htmlWriter} writer + +
+
The writer to which write the HTML.
+ +
+ {Undefined} filter + +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlWriter.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlWriter.html new file mode 100644 index 000000000..6bdbf74f1 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.htmlWriter.html @@ -0,0 +1,817 @@ + + + + + + + CKEDITOR.htmlWriter - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.htmlWriter +

+ + +

+ + + + + +
Defined in: plugins/htmlwriter/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
Class used to write HTML data.
+
+ + + + + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.htmlWriter() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Class used to write HTML data. + +
+ + + + +
var writer = new CKEDITOR.htmlWriter();
+writer.openTag( 'p' );
+writer.attribute( 'class', 'MyClass' );
+writer.openTagClose( 'p' );
+writer.text( 'Hello' );
+writer.closeTag( 'p' );
+alert( writer.getHtml() );  "<p class="MyClass">Hello</p>"
+ + + + + + + + + + + + +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.imageCacher.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.imageCacher.html new file mode 100644 index 000000000..7305227e1 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.imageCacher.html @@ -0,0 +1,893 @@ + + + + + + + CKEDITOR.imageCacher - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.imageCacher +

+ + +

+ + + +Load images into the browser cache. + + +
Defined in: core/imagecacher.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Load images into the browser cache.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.imageCacher.load(images, callback) +
+
Loads one or more images.
+
+ + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.imageCacher +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Load images into the browser cache. + +
+ + + + + + + + + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.imageCacher.load(images, callback) + +
+
+ Since: + + 3.0 + +
+
+
+ Loads one or more images. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Array} images + +
+
The URLs for the images to be loaded.
+ +
+ {Function} callback + +
+
The function to be called once all images + are loaded.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.keystrokeHandler.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.keystrokeHandler.html new file mode 100644 index 000000000..6ac87cb3d --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.keystrokeHandler.html @@ -0,0 +1,1015 @@ + + + + + + + CKEDITOR.keystrokeHandler - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.keystrokeHandler +

+ + +

+ + + + + +
Defined in: plugins/keystrokes/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
Controls keystrokes typing in an editor instance.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  + +
List of keystrokes that should be blocked if not defined at +keystrokes.
+
  + +
List of keystrokes associated to commands.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
attach(domObject) +
+
Attaches this keystroke handle to a DOM object.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.keystrokeHandler(editor) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Controls keystrokes typing in an editor instance. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.editor} editor + +
+
The editor instance.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + blockedKeystrokes + +
+
+ Since: + + 3.0 + +
+
+
+ List of keystrokes that should be blocked if not defined at +keystrokes. In this way it is possible to block the default +browser behavior for those keystrokes. + + +
+ + + + + + + + + + + +
+ + +
+ + {Object} + keystrokes + +
+
+ Since: + + 3.0 + +
+
+
+ List of keystrokes associated to commands. Each entry points to the +command to be executed. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + attach(domObject) + +
+
+ Since: + + 3.0 + +
+
+
+ Attaches this keystroke handle to a DOM object. Keystrokes typed +* over this object will get handled by this keystrokeHandler. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dom.domObject} domObject + +
+
The DOM object to attach + to.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.loader.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.loader.html new file mode 100644 index 000000000..9a9a59e56 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.loader.html @@ -0,0 +1,964 @@ + + + + + + + CKEDITOR.loader - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.loader +

+ + +

+ + + +Load core scripts and their dependencies from _source. + + +
Defined in: core/loader.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Load core scripts and their dependencies from _source.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.loader.loadedScripts +
+
The list of loaded scripts in their loading order.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.loader.load(scriptName) +
+
Loads a specific script, including its dependencies.
+
+ + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.loader +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Load core scripts and their dependencies from _source. + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {Array} + CKEDITOR.loader.loadedScripts + +
+
+ Since: + + 3.0 + +
+
+
+ The list of loaded scripts in their loading order. + + +
+ + + + +
// Alert the loaded script names.
+alert( CKEDITOR.loader.loadedScripts );
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.loader.load(scriptName) + +
+
+ Since: + + 3.0 + +
+
+
+ Loads a specific script, including its dependencies. This is not a +synchronous loading, which means that the code the be loaded will +not necessarily be available after this call. + + +
+ + + + +
CKEDITOR.loader.load( 'core/dom/element' );
+ + + + + +
+
Parameters:
+ +
+ {Undefined} scriptName + +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.pluginDefinition.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.pluginDefinition.html new file mode 100644 index 000000000..31225b774 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.pluginDefinition.html @@ -0,0 +1,1042 @@ + + + + + + + CKEDITOR.pluginDefinition - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.pluginDefinition +

+ + +

+ + + + + +
Defined in: core/plugindefinition.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
(Virtual Class) Do not call this constructor.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ requires +
+
A list of plugins that are required by this plugin.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
beforeInit(editor) +
+
Function called on initialization of every editor instance created in the +page before the init() call task.
+
  +
init(editor) +
+
Function called on initialization of every editor instance created in the +page.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.pluginDefinition() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ (Virtual Class) Do not call this constructor. This class is not really part + of the API. It just illustrates the features of plugin objects to be + passed to the CKEDITOR.plugins.add function. + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Array} + requires + +
+
+ Since: + + 3.0 + +
+
+
+ A list of plugins that are required by this plugin. Note that this property +doesn't guarantee the loading order of the plugins. + + +
+ + + + +
CKEDITOR.plugins.add( 'sample',
+{
+    requires : [ 'button', 'selection' ]
+});
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + beforeInit(editor) + +
+
+ Since: + + 3.0 + +
+
+
+ Function called on initialization of every editor instance created in the +page before the init() call task. The beforeInit function will be called for +all plugins, after that the init function is called for all of them. This +feature makes it possible to initialize things that could be used in the +init function of other plugins. + + +
+ + + + +
CKEDITOR.plugins.add( 'sample',
+{
+    beforeInit : function( editor )
+    {
+        alert( 'Editor "' + editor.name + '" is to be initialized!' );
+    }
+});
+ + + + + +
+
Parameters:
+ +
+ {CKEDITOR.editor} editor + +
+
The editor instance being initialized.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + init(editor) + +
+
+ Since: + + 3.0 + +
+
+
+ Function called on initialization of every editor instance created in the +page. + + +
+ + + + +
CKEDITOR.plugins.add( 'sample',
+{
+    init : function( editor )
+    {
+        alert( 'Editor "' + editor.name + '" is being initialized!' );
+    }
+});
+ + + + + +
+
Parameters:
+ +
+ {CKEDITOR.editor} editor + +
+
The editor instance being initialized.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.plugins.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.plugins.html new file mode 100644 index 000000000..115a4976c --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.plugins.html @@ -0,0 +1,982 @@ + + + + + + + CKEDITOR.plugins - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.plugins +

+ + +

+
Extends + CKEDITOR.resourceManager.
+ + + +Manages plugins registration and loading. + + +
Defined in: core/plugins.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Manages plugins registration and loading.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.plugins.sourcearea +
+
Holds the definition of commands an UI elements included with the sourcearea +plugin.
+
+ + + +
+
Fields borrowed from class CKEDITOR.resourceManager:
basePath, externals, fileName, loaded, registered
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.plugins.setLang(pluginName, languageCode, languageEntries) +
+
+
+ + + +
+
Methods borrowed from class CKEDITOR.resourceManager:
add, addExternal, get, getFilePath, getPath, load
+
+ + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.plugins +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Manages plugins registration and loading. + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.plugins.sourcearea + +
+
+ Since: + + 3.0 + +
+
+
+ Holds the definition of commands an UI elements included with the sourcearea +plugin. + +
+ Defined in: plugins/sourcearea/plugin.js. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.plugins.setLang(pluginName, languageCode, languageEntries) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} pluginName + +
+
+ +
+ {Undefined} languageCode + +
+
+ +
+ {Undefined} languageEntries + +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.resourceManager.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.resourceManager.html new file mode 100644 index 000000000..5feac8f68 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.resourceManager.html @@ -0,0 +1,1490 @@ + + + + + + + CKEDITOR.resourceManager - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Function Namespace CKEDITOR.resourceManager +

+ + +

+ + + +Base class for resource managers, like plugins and themes. This class is not +intended to be used out of the CKEditor core code. + + +
Defined in: core/resourcemanager.js. + +

+ + + + + + + + + + + + + + + + + +
Function Namespace Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.resourceManager(basePath, fileName) +
+
Base class for resource managers, like plugins and themes.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ basePath +
+
The base directory containing all resources.
+
  +
+ externals +
+
Contains references to all resources that have already been registered +with #addExternal.
+
  +
+ fileName +
+
The name used for resource files.
+
  +
+ loaded +
+
Contains references to all resources that have already been loaded +with #load.
+
  + +
Contains references to all resources that have already been registered +with #add.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
add(name, definition) +
+
Registers a resource.
+
  +
addExternal(names, path, fileName) +
+
Registers one or more resources to be loaded from an external path +instead of the core base path.
+
  +
get(name) +
+
Gets the definition of a specific resource.
+
  +
getFilePath(name) +
+
Get the file path for a specific loaded resource.
+
  +
getPath(name) +
+
Get the folder path for a specific loaded resource.
+
  +
load(name, callback, scope) +
+
Loads one or more resources.
+
+ + + + + + + +
+
+ Function Namespace Detail +
+ +
+ CKEDITOR.resourceManager(basePath, fileName) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Base class for resource managers, like plugins and themes. This class is not +intended to be used out of the CKEditor core code. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {String} basePath + +
+
The path for the resources folder.
+ +
+ {String} fileName + +
+
The name used for resource files.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {String} + basePath + +
+
+ Since: + + 3.0 + +
+
+
+ The base directory containing all resources. + + +
+ + + + + + + + + + + +
+ + +
+ + {Object} + externals + +
+
+ Since: + + 3.0 + +
+
+
+ Contains references to all resources that have already been registered +with #addExternal. + + +
+ + + + + + + + + + + +
+ + +
+ + {String} + fileName + +
+
+ Since: + + 3.0 + +
+
+
+ The name used for resource files. + + +
+ + + + + + + + + + + +
+ + +
+ + {Object} + loaded + +
+
+ Since: + + 3.0 + +
+
+
+ Contains references to all resources that have already been loaded +with #load. + + +
+ + + + + + + + + + + +
+ + +
+ + {Object} + registered + +
+
+ Since: + + 3.0 + +
+
+
+ Contains references to all resources that have already been registered +with #add. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + add(name, definition) + +
+
+ Since: + + 3.0 + +
+
+
+ Registers a resource. + + +
+ + + + +
CKEDITOR.plugins.add( 'sample', { ... plugin definition ... } );
+ + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The resource name.
+ +
+ {Object} definition + Optional +
+
The resource definition.
+ +
+ + + + + + +
+
See:
+ +
CKEDITOR.pluginDefinition
+ +
+ + +
+ + +
+ + {Undefined} + addExternal(names, path, fileName) + +
+
+ Since: + + 3.0 + +
+
+
+ Registers one or more resources to be loaded from an external path +instead of the core base path. + + +
+ + + + +
// Loads a plugin from '/myplugin/samples/plugin.js'.
+CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/' );
+ + + +
// Loads a plugin from '/myplugin/samples/my_plugin.js'.
+CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/', 'my_plugin.js' );
+ + + + + +
+
Parameters:
+ +
+ {String} names + +
+
The resource names, separated by commas.
+ +
+ {String} path + +
+
The path of the folder containing the resource.
+ +
+ {String} fileName + Optional +
+
The resource file name. If not provided, the + default name is used.
+ +
+ + + + + + + +
+ + +
+ + {Object} + get(name) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the definition of a specific resource. + + +
+ + + + +
var definition = CKEDITOR.plugins.get( 'sample' );
+ + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The resource name.
+ +
+ + + + + + + +
+ + +
+ + {String} + getFilePath(name) + +
+
+ Since: + + 3.0 + +
+
+
+ Get the file path for a specific loaded resource. + + +
+ + + + +
alert( CKEDITOR.plugins.getFilePath( 'sample' ) );  // "<editor path>/plugins/sample/plugin.js"
+ + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The resource name.
+ +
+ + + + + + + +
+ + +
+ + {String} + getPath(name) + +
+
+ Since: + + 3.0 + +
+
+
+ Get the folder path for a specific loaded resource. + + +
+ + + + +
alert( CKEDITOR.plugins.getPath( 'sample' ) );  // "<editor path>/plugins/sample/"
+ + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The resource name.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + load(name, callback, scope) + +
+
+ Since: + + 3.0 + +
+
+
+ Loads one or more resources. + + +
+ + + + +
CKEDITOR.plugins.load( 'myplugin', function( plugins )
+    {
+        alert( plugins['myplugin'] );  // "object"
+    });
+ + + + + +
+
Parameters:
+ +
+ {String|Array} name + +
+
The name of the resource to load. It may be a + string with a single resource name, or an array with several names.
+ +
+ {Function} callback + +
+
A function to be called when all resources + are loaded. The callback will receive an array containing all + loaded names.
+ +
+ {Object} scope + Optional +
+
The scope object to be used for the callback + call.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.scriptLoader.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.scriptLoader.html new file mode 100644 index 000000000..617391801 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.scriptLoader.html @@ -0,0 +1,994 @@ + + + + + + + CKEDITOR.scriptLoader - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.scriptLoader +

+ + +

+ + + +Load scripts asynchronously. + + +
Defined in: core/scriptloader.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Load scripts asynchronously.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.scriptLoader.load(scriptUrl, callback, scope, noCheck) +
+
Loads one or more external script checking if not already loaded +previously by this function.
+
<static>   +
CKEDITOR.scriptLoader.loadCode(code) +
+
Executes a JavaScript code into the current document.
+
+ + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.scriptLoader +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Load scripts asynchronously. + +
+ + + + + + + + + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.scriptLoader.load(scriptUrl, callback, scope, noCheck) + +
+
+ Since: + + 3.0 + +
+
+
+ Loads one or more external script checking if not already loaded +previously by this function. + + +
+ + + + +
CKEDITOR.scriptLoader.load( '/myscript.js' );
+ + + +
CKEDITOR.scriptLoader.load( '/myscript.js', function( success )
+    {
+        // Alerts "true" if the script has been properly loaded.
+        // HTTP error 404 should return "false".
+        alert( success );
+    });
+ + + +
CKEDITOR.scriptLoader.load( [ '/myscript1.js', '/myscript2.js' ], function( completed, failed )
+    {
+        alert( 'Number of scripts loaded: ' + completed.length );
+        alert( 'Number of failures: ' + failed.length );
+    });
+ + + + + +
+
Parameters:
+ +
+ {String|Array} scriptUrl + +
+
One or more URLs pointing to the + scripts to be loaded.
+ +
+ {Function} callback + Optional +
+
A function to be called when the script + is loaded and executed. If a string is passed to "scriptUrl", a + boolean parameter is passed to the callback, indicating the + success of the load. If an array is passed instead, two array + parameters are passed to the callback; the first contains the + URLs that have been properly loaded, and the second the failed + ones.
+ +
+ {Object} scope + Optional +
+
The scope ("this" reference) to be used for + the callback call. Default to CKEDITOR.
+ +
+ {Boolean} noCheck + Optional +
+
Indicates that the script must be loaded + anyway, not checking if it has already loaded.
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.scriptLoader.loadCode(code) + +
+
+ Since: + + 3.0 + +
+
+
+ Executes a JavaScript code into the current document. + + +
+ + + + +
CKEDITOR.scriptLoader.loadCode( 'var x = 10;' );
+alert( x );  // "10"
+ + + + + +
+
Parameters:
+ +
+ {String} code + +
+
The code to be executed.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.skins.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.skins.html new file mode 100644 index 000000000..342c0d2d3 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.skins.html @@ -0,0 +1,965 @@ + + + + + + + CKEDITOR.skins - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.skins +

+ + +

+ + + +Manages skins loading. + + +
Defined in: core/skins.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Manages skins loading.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.skins.add(skinName, skinDefinition) +
+
Registers a skin definition.
+
<static>   +
CKEDITOR.skins.load(skinName, skinPart, callback) +
+
Loads a skin part.
+
+ + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.skins +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Manages skins loading. + +
+ + + + + + + + + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.skins.add(skinName, skinDefinition) + +
+
+ Since: + + 3.0 + +
+
+
+ Registers a skin definition. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} skinName + +
+
The skin name.
+ +
+ {Object} skinDefinition + +
+
The skin definition.
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.skins.load(skinName, skinPart, callback) + +
+
+ Since: + + 3.0 + +
+
+
+ Loads a skin part. Skins are defined in parts, which are basically +separated CSS files. This function is mainly used by the core code and +should not have much use out of it. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} skinName + +
+
The name of the skin to be loaded.
+ +
+ {String} skinPart + +
+
The skin part to be loaded. Common skin parts + are "editor" and "dialog".
+ +
+ {Function} callback + Optional +
+
A function to be called once the skin + part files are loaded.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.test.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.test.html new file mode 100644 index 000000000..c9c6f38c3 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.test.html @@ -0,0 +1,1034 @@ + + + + + + + CKEDITOR.test - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.test +

+ + +

+ + + +Contains functions used at our testing environment. Currently, +our testing system is based on the +YUI Test. + + +
Defined in: core/test.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Contains functions used at our testing environment.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.test.assert +
+
The assertion namespace, containing all assertion functions.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.test.addTestCase(testCase) +
+
Adds a test case to the test runner.
+
<static>   +
CKEDITOR.test.getInnerHtml(elementOrId) +
+
Gets the inner HTML of an element, for testing purposes.
+
+ + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.test +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Contains functions used at our testing environment. Currently, +our testing system is based on the +YUI Test. + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.test.assert + +
+
+ Since: + + 3.0 + +
+
+
+ The assertion namespace, containing all assertion functions. Currently, +this is an alias for +YAHOO.util.Assert. + + +
+ + + + +
CKEDITOR.test.assert.areEqual( '10', 10 );        // "true"
+CKEDITOR.test.assert.areSame( '10', 10 );         // "false"
+CKEDITOR.test.assert.isUndefined( window.test );  // "true"
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.test.addTestCase(testCase) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a test case to the test runner. + + +
+ + + + +
CKEDITOR.test.addTestCase((function()
+{
+    // Local reference to the "assert" object.
+    var assert = CKEDITOR.test.assert;
+
+    return {
+        test_example : function()
+        {
+            assert.areSame( '10', 10 );  // FAIL
+        }
+     };
+})());
+ + + + + +
+
Parameters:
+ +
+ {Object} testCase + +
+
The test case object. See other tests for + examples.
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.test.getInnerHtml(elementOrId) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the inner HTML of an element, for testing purposes. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} elementOrId + +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.themes.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.themes.html new file mode 100644 index 000000000..79b445df1 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.themes.html @@ -0,0 +1,834 @@ + + + + + + + CKEDITOR.themes - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.themes +

+ + +

+
Extends + CKEDITOR.resourceManager.
+ + + +Manages themes registration and loading. + + +
Defined in: core/themes.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Manages themes registration and loading.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.resourceManager:
basePath, externals, fileName, loaded, registered
+
+ + + + + + + + + +
+
Methods borrowed from class CKEDITOR.resourceManager:
add, addExternal, get, getFilePath, getPath, load
+
+ + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.themes +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Manages themes registration and loading. + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.tools.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.tools.html new file mode 100644 index 000000000..b746012a6 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.tools.html @@ -0,0 +1,2080 @@ + + + + + + + CKEDITOR.tools - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Namespace CKEDITOR.tools +

+ + +

+ + + +Utility functions. + + +
Defined in: core/tools.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  + +
Utility functions.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.tools.indexOf +
+
Returns the index of an element in an array.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.tools.addFunction(fn, scope) +
+
+
<static>   +
CKEDITOR.tools.arrayCompare(arrayA, arrayB) +
+
+
<static>   +
CKEDITOR.tools.bind(func, obj) +
+
+
<static>   +
CKEDITOR.tools.callFunction(index) +
+
+
<static>   +
CKEDITOR.tools.clone(object) +
+
Creates a deep copy of an object.
+
<static>   +
CKEDITOR.tools.createClass(definiton) +
+
Class creation based on prototype inheritance, with supports of the +following features: +
    +
  • Static fields
  • +
  • Private fields
  • +
  • Public(prototype) fields
  • +
  • Chainable base class constructor
  • +
+
<static>   +
CKEDITOR.tools.cssStyleToDomStyle(cssName) +
+
Transforms a CSS property name to its relative DOM style name.
+
<static>   +
CKEDITOR.tools.extend(target, source[,souce(n)], overwrite, properties) +
+
Copy the properties from one object to another.
+
<static>   +
CKEDITOR.tools.getNextNumber() +
+
Gets a unique number for this CKEDITOR execution session.
+
<static>   +
CKEDITOR.tools.htmlEncode(text) +
+
Replace special HTML characters in a string with their relative HTML +entity values.
+
<static>   +
CKEDITOR.tools.isArray(object) +
+
Checks if an object is an Array.
+
<static>   +
CKEDITOR.tools.ltrim(str) +
+
Remove spaces from the start (left) of a string.
+
<static>   +
CKEDITOR.tools.override(originalFunction, functionBuilder) +
+
Creates a function override.
+
<static>   +
CKEDITOR.tools.rtrim(str) +
+
Remove spaces from the end (right) of a string.
+
<static>   +
CKEDITOR.tools.setTimeout(func, milliseconds, scope, args, ownerWindow) +
+
Executes a function after specified delay.
+
<static>   +
CKEDITOR.tools.trim(str) +
+
Remove spaces from the start and the end of a string.
+
  +
dCopy(source) +
+
Creates an object which is an instance of a class which prototype is a +predefined object.
+
+ + + + + + + +
+
+ Namespace Detail +
+ +
+ CKEDITOR.tools +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Utility functions. + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {Number} + CKEDITOR.tools.indexOf + +
+
+ Since: + + 3.0 + +
+
+
+ Returns the index of an element in an array. + + +
+ + + + +
var letters = [ 'a', 'b', 0, 'c', false ];
+alert( CKEDITOR.tools.indexOf( letters, '0' ) );  "-1" because 0 !== '0'
+alert( CKEDITOR.tools.indexOf( letters, false ) );  "4" because 0 !== false
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.tools.addFunction(fn, scope) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} fn + +
+
+ +
+ {Undefined} scope + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.tools.arrayCompare(arrayA, arrayB) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} arrayA + +
+
+ +
+ {Undefined} arrayB + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.tools.bind(func, obj) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} func + +
+
+ +
+ {Undefined} obj + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.tools.callFunction(index) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} index + +
+
+ +
+ + + + + + + +
+ + +
<static> + + {Object} + CKEDITOR.tools.clone(object) + +
+
+ Since: + + 3.0 + +
+
+
+ Creates a deep copy of an object. +Attention: there is no support for recursive references. + + +
+ + + + +
var obj =
+    {
+        name : 'John',
+        cars :
+            {
+                Mercedes : { color : 'blue' },
+                Porsche : { color : 'red' }
+            }
+    };
+var clone = CKEDITOR.tools.clone( obj );
+clone.name = 'Paul';
+clone.cars.Porsche.color = 'silver';
+alert( obj.name );	// John
+alert( clone.name );	// Paul
+alert( obj.cars.Porsche.color );	// red
+alert( clone.cars.Porsche.color );	// silver
+ + + + + +
+
Parameters:
+ +
+ {Object} object + +
+
The object to be cloned.
+ +
+ + + + +
+
Returns:
+ +
{Object} The object clone.
+ +
+ + + + +
+ + +
<static> + + {Undefined} + CKEDITOR.tools.createClass(definiton) + +
+
+ Since: + + 3.0 + +
+
+
+ Class creation based on prototype inheritance, with supports of the +following features: +
    +
  • Static fields
  • +
  • Private fields
  • +
  • Public(prototype) fields
  • +
  • Chainable base class constructor
  • +
+ + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Object} definiton + +
+
(Optional)The class definiton object.
+ +
+ + + + + + + +
+ + +
<static> + + {String} + CKEDITOR.tools.cssStyleToDomStyle(cssName) + +
+
+ Since: + + 3.0 + +
+
+
+ Transforms a CSS property name to its relative DOM style name. + + +
+ + + + +
alert( CKEDITOR.tools.cssStyleToDomStyle( 'background-color' ) );  // "backgroundColor"
+alert( CKEDITOR.tools.cssStyleToDomStyle( 'float' ) );             // "cssFloat"
+ + + + + +
+
Parameters:
+ +
+ {String} cssName + +
+
The CSS property name.
+ +
+ + + + +
+
Returns:
+ +
{String} The transformed name.
+ +
+ + + + +
+ + +
<static> + + {Object} + CKEDITOR.tools.extend(target, source[,souce(n)], overwrite, properties) + +
+
+ Since: + + 3.0 + +
+
+
+ Copy the properties from one object to another. By default, properties +already present in the target object are not overwritten. + + +
+ + + + +
// Create the sample object.
+var myObject =
+{
+    prop1 : true
+};
+
+// Extend the above object with two properties.
+CKEDITOR.tools.extend( myObject,
+    {
+        prop2 : true,
+        prop3 : true
+    } );
+
+// Alert "prop1", "prop2" and "prop3".
+for ( var p in myObject )
+    alert( p );
+ + + + + +
+
Parameters:
+ +
+ {Object} target + +
+
The object to be extended.
+ +
+ {Object} source[,souce(n)] + +
+
The objects from which copy + properties. Any number of objects can be passed to this function.
+ +
+ {Boolean} overwrite + Optional +
+
If 'true' is specified it indicates that + properties already present in the target object could be + overwritten by subsequent objects.
+ +
+ {Object} properties + Optional +
+
Only properties within the specified names + list will be received from the source object.
+ +
+ + + + +
+
Returns:
+ +
{Object} the extended object (target).
+ +
+ + + + +
+ + +
<static> + + {Number} + CKEDITOR.tools.getNextNumber() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets a unique number for this CKEDITOR execution session. It returns +progressive numbers starting at 1. + + +
+ + + + +
alert( CKEDITOR.tools.getNextNumber() );  // "1" (e.g.)
+alert( CKEDITOR.tools.getNextNumber() );  // "2"
+ + + + + + + + +
+
Returns:
+ +
{Number} A unique number.
+ +
+ + + + +
+ + +
<static> + + {String} + CKEDITOR.tools.htmlEncode(text) + +
+
+ Since: + + 3.0 + +
+
+
+ Replace special HTML characters in a string with their relative HTML +entity values. + + +
+ + + + +
alert( CKEDITOR.tools.htmlEncode( 'A > B & C < D' ) );  // "A &gt; B &amp; C &lt; D"
+ + + + + +
+
Parameters:
+ +
+ {String} text + +
+
The string to be encoded.
+ +
+ + + + +
+
Returns:
+ +
{String} The encode string.
+ +
+ + + + +
+ + +
<static> + + {Boolean} + CKEDITOR.tools.isArray(object) + +
+
+ Since: + + 3.0 + +
+
+
+ Checks if an object is an Array. + + +
+ + + + +
alert( CKEDITOR.tools.isArray( [] ) );      // "true"
+alert( CKEDITOR.tools.isArray( 'Test' ) );  // "false"
+ + + + + +
+
Parameters:
+ +
+ {Object} object + +
+
The object to be checked.
+ +
+ + + + +
+
Returns:
+ +
{Undefined} true if the object is an Array, otherwise false.
+ +
+ + + + +
+ + +
<static> + + {String} + CKEDITOR.tools.ltrim(str) + +
+
+ Since: + + 3.0 + +
+
+
+ Remove spaces from the start (left) of a string. The following +characters are removed: space, tab, line break, line feed. + + +
+ + + + +
alert( CKEDITOR.tools.ltrim( '  example ' );  // "example "
+ + + + + +
+
Parameters:
+ +
+ {String} str + +
+
The text from which remove the spaces.
+ +
+ + + + +
+
Returns:
+ +
{String} The modified string excluding the removed spaces.
+ +
+ + + + +
+ + +
<static> + + {Function} + CKEDITOR.tools.override(originalFunction, functionBuilder) + +
+
+ Since: + + 3.0 + +
+
+
+ Creates a function override. + + +
+ + + + +
var example =
+{
+    myFunction : function( name )
+    {
+        alert( 'Name: ' + name );
+    }
+};
+
+example.myFunction = CKEDITOR.tools.override( example.myFunction, function( myFunctionOriginal )
+    {
+        return function( name )
+            {
+                alert( 'Override Name: ' + name );
+                myFunctionOriginal.call( this, name );
+            };
+    });
+ + + + + +
+
Parameters:
+ +
+ {Function} originalFunction + +
+
The function to be overridden.
+ +
+ {Function} functionBuilder + +
+
A function that returns the new + function. The original function reference will be passed to this + function.
+ +
+ + + + +
+
Returns:
+ +
{Function} The new function.
+ +
+ + + + +
+ + +
<static> + + {String} + CKEDITOR.tools.rtrim(str) + +
+
+ Since: + + 3.0 + +
+
+
+ Remove spaces from the end (right) of a string. The following +characters are removed: space, tab, line break, line feed. + + +
+ + + + +
alert( CKEDITOR.tools.ltrim( '  example ' );  // "  example"
+ + + + + +
+
Parameters:
+ +
+ {String} str + +
+
The text from which remove the spaces.
+ +
+ + + + +
+
Returns:
+ +
{String} The modified string excluding the removed spaces.
+ +
+ + + + +
+ + +
<static> + + {Object} + CKEDITOR.tools.setTimeout(func, milliseconds, scope, args, ownerWindow) + +
+
+ Since: + + 3.0 + +
+
+
+ Executes a function after specified delay. + + +
+ + + + +
CKEDITOR.tools.setTimeout(
+    function()
+    {
+        alert( 'Executed after 2 seconds' );
+    },
+    2000 );
+ + + + + +
+
Parameters:
+ +
+ {Function} func + +
+
The function to be executed.
+ +
+ {Number} milliseconds + Optional +
+
The amount of time (millisecods) to wait + to fire the function execution. Defaults to zero.
+ +
+ {Object} scope + Optional +
+
The object to hold the function execution scope + (the "this" object). By default the "window" object.
+ +
+ {Object|Array} args + Optional +
+
A single object, or an array of objects, to + pass as arguments to the function.
+ +
+ {Object} ownerWindow + Optional +
+
The window that will be used to set the + timeout. By default the current "window".
+ +
+ + + + +
+
Returns:
+ +
{Object} A value that can be used to cancel the function execution.
+ +
+ + + + +
+ + +
<static> + + {String} + CKEDITOR.tools.trim(str) + +
+
+ Since: + + 3.0 + +
+
+
+ Remove spaces from the start and the end of a string. The following +characters are removed: space, tab, line break, line feed. + + +
+ + + + +
alert( CKEDITOR.tools.trim( '  example ' );  // "example"
+ + + + + +
+
Parameters:
+ +
+ {String} str + +
+
The text from which remove the spaces.
+ +
+ + + + +
+
Returns:
+ +
{String} The modified string without the boundary spaces.
+ +
+ + + + +
+ + +
+ + {Object} + dCopy(source) + +
+
+ Since: + + 3.0 + +
+
+
+ Creates an object which is an instance of a class which prototype is a +predefined object. All properties defined in the source object are +automatically inherited by the resulting object, including future +changes to it. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Object} source + +
+
The source object to be used as the prototype for + the final object.
+ +
+ + + + +
+
Returns:
+ +
{Object} The resulting copy.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.button.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.button.html new file mode 100644 index 000000000..6dd821d67 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.button.html @@ -0,0 +1,1029 @@ + + + + + + + CKEDITOR.ui.button - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.button +

+ + +

+ + + + + +
Defined in: plugins/button/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.button(definition) +
+
Represents a button UI element.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.ui.button.handler +
+
Transforms a button definition in a CKEDITOR.ui.button instance.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
render(editor, output) +
+
Renders the button.
+
  +
setState(state) +
+
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.button(definition) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Represents a button UI element. This class should not be called directly. To +create new buttons use CKEDITOR.ui.prototype.addButton instead. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {Object} definition + +
+
The button definition.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {Object} + CKEDITOR.ui.button.handler + +
+
+ Since: + + 3.0 + +
+
+
+ Transforms a button definition in a CKEDITOR.ui.button instance. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + render(editor, output) + +
+
+ Since: + + 3.0 + +
+
+
+ Renders the button. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.editor} editor + +
+
The editor instance which this button is + to be used by.
+ +
+ {Array} output + +
+
The output array to which append the HTML relative + to this button.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + setState(state) + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} state + +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.button.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.button.html new file mode 100644 index 000000000..c717c9b22 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.button.html @@ -0,0 +1,1252 @@ + + + + + + + CKEDITOR.ui.dialog.button - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.button +

+ + +

+
Extends + CKEDITOR.ui.dialog.uiElement.
+ + + + + +
Defined in: plugins/dialogui/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.button(dialog, elementDefinition, htmlList) +
+
A button with a label inside.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  + +
Defines the onChange event and onClick for button element definitions.
+
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  + +
Handler for the element's access key down event.
+
  + +
Handler for the element's access key up event.
+
  +
click() +
+
Simulates a click to the button.
+
  +
disable() +
+
Disables the button.
+
  +
enable() +
+
Enables the button.
+
  + +
+
  + +
+
+ + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
focus, getDialog, getElement, getInputElement, getValue, isChanged, isFocusable, registerEvents, selectParentTab, setValue
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.button(dialog, elementDefinition, htmlList) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A button with a label inside. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The element definition. Accepted fields: +
    +
  • label (Required) The button label.
  • +
  • disabled (Optional) Set to true if you want the + button to appear in disabled state.
  • +
+ +
+ {Array} htmlList + +
+
List of HTML code to output to.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + eventProcessors + +
+
+ Since: + + 3.0 + +
+
+
+ Defines the onChange event and onClick for button element definitions. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + accessKeyDown() + +
+
+ Since: + + 3.0 + +
+
+
+ Handler for the element's access key down event. Simulates a mouse +down to the button. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {Undefined} + accessKeyUp() + +
+
+ Since: + + 3.0 + +
+
+
+ Handler for the element's access key up event. Simulates a click to +the button. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {Object} + click() + +
+
+ Since: + + 3.0 + +
+
+
+ Simulates a click to the button. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{Object} Return value of the 'click' event.
+ +
+ + + + +
+ + +
+ + {Undefined} + disable() + +
+
+ Since: + + 3.0 + +
+
+
+ Disables the button. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {Undefined} + enable() + +
+
+ Since: + + 3.0 + +
+
+
+ Enables the button. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {Undefined} + isEnabled() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + isVisible() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.checkbox.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.checkbox.html new file mode 100644 index 000000000..c2a0d7b12 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.checkbox.html @@ -0,0 +1,1141 @@ + + + + + + + CKEDITOR.ui.dialog.checkbox - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.checkbox +

+ + +

+
Extends + CKEDITOR.ui.dialog.uiElement.
+ + + + + +
Defined in: plugins/dialogui/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.checkbox(dialog, elementDefinition, htmlList) +
+
A single checkbox with a label on the right.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  + +
Defines the onChange event for UI element definitions.
+
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  + +
Handler for the access key up event.
+
  + +
Gets the checkbox DOM element.
+
  + +
Gets the state of the checkbox.
+
  +
setValue(true) +
+
Sets the state of the checkbox.
+
+ + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
accessKeyDown, disable, enable, focus, getDialog, getElement, isChanged, isEnabled, isFocusable, isVisible, registerEvents, selectParentTab
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.checkbox(dialog, elementDefinition, htmlList) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A single checkbox with a label on the right. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The element definition. Accepted fields: +
    +
  • checked (Optional) Whether the checkbox is checked + on instantiation. Defaults to false.
  • +
  • validate (Optional) The validation function.
  • +
  • label (Optional) The checkbox label.
  • +
+ +
+ {Array} htmlList + +
+
List of HTML code to output to.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + eventProcessors + +
+
+ Since: + + 3.0 + +
+
+
+ Defines the onChange event for UI element definitions. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + accessKeyUp() + +
+
+ Since: + + 3.0 + +
+
+
+ Handler for the access key up event. Toggles the checkbox. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {CKEDITOR.dom.element} + getInputElement() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the checkbox DOM element. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The DOM element of the checkbox.
+ +
+ + + + +
+ + +
+ + {Boolean} + getValue() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the state of the checkbox. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{Boolean} true means the checkbox is ticked, false means it's not ticked.
+ +
+ + + + +
+ + +
+ + {Undefined} + setValue(true) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the state of the checkbox. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {Boolean} true + +
+
to tick the checkbox, false to untick it.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.file.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.file.html new file mode 100644 index 000000000..27ff13d97 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.file.html @@ -0,0 +1,1189 @@ + + + + + + + CKEDITOR.ui.dialog.file - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.file +

+ + +

+
Extends + CKEDITOR.ui.dialog.labeledElement.
+ + + + + +
Defined in: plugins/dialogui/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.file(dialog, elementDefinition, htmlList) +
+
A file upload input.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  + +
Defines the onChange event for UI element definitions.
+
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
getAction(action) +
+
Get the action assigned to the form.
+
  + +
Gets the <input> element of this file input.
+
  + +
+
  +
reset() +
+
Redraws the file input and resets the file path in the file input.
+
  +
submit() +
+
Uploads the file in the file input.
+
+ + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.labeledElement:
getLabel, setLabel
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
accessKeyDown, accessKeyUp, disable, enable, focus, getDialog, getElement, isChanged, isEnabled, isFocusable, isVisible, registerEvents, selectParentTab, setValue
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.file(dialog, elementDefinition, htmlList) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A file upload input. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The element definition. Accepted fields: +
    +
  • validate (Optional) The validation function.
  • +
+ +
+ {Array} htmlList + +
+
List of HTML code to output to.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + eventProcessors + +
+
+ Since: + + 3.0 + +
+
+
+ Defines the onChange event for UI element definitions. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {String} + getAction(action) + +
+
+ Since: + + 3.0 + +
+
+
+ Get the action assigned to the form. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {Undefined} action + +
+
+ +
+ + + + +
+
Returns:
+ +
{String} The value of the action.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.element} + getInputElement() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the <input> element of this file input. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The file input element.
+ +
+ + + + +
+ + +
+ + {Undefined} + getValue() + +
+
+ Since: + + 3.0 + +
+
+
+ + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + reset() + +
+
+ Since: + + 3.0 + +
+
+
+ Redraws the file input and resets the file path in the file input. +The redraw logic is necessary because non-IE browsers tend to clear +the <iframe> containing the file input after closing the dialog. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {CKEDITOR.ui.dialog.file} + submit() + +
+
+ Since: + + 3.0 + +
+
+
+ Uploads the file in the file input. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{CKEDITOR.ui.dialog.file} This object.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.fileButton.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.fileButton.html new file mode 100644 index 000000000..ced03271b --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.fileButton.html @@ -0,0 +1,862 @@ + + + + + + + CKEDITOR.ui.dialog.fileButton - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.fileButton +

+ + +

+
Extends + CKEDITOR.ui.dialog.button.
+ + + + + +
Defined in: plugins/dialogui/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.fileButton(dialog, elementDefinition, htmlList) +
+
A button for submitting the file in a file upload input.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.ui.dialog.button:
eventProcessors
+
+ + + + + + + + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.button:
accessKeyDown, accessKeyUp, click, disable, enable, isEnabled, isVisible
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
focus, getDialog, getElement, getInputElement, getValue, isChanged, isFocusable, registerEvents, selectParentTab, setValue
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.fileButton(dialog, elementDefinition, htmlList) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A button for submitting the file in a file upload input. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The element definition. Accepted fields: +
    +
  • for (Required) The file input's page and element Id + to associate to, in a 2-item array format: [ 'page_id', 'element_id' ]. +
  • +
  • validate (Optional) The validation function.
  • +
+ +
+ {Array} htmlList + +
+
List of HTML code to output to.
+ +
+ + + + + + + +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.hbox.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.hbox.html new file mode 100644 index 000000000..7cd208cf0 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.hbox.html @@ -0,0 +1,963 @@ + + + + + + + CKEDITOR.ui.dialog.hbox - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.hbox +

+ + +

+
Extends + CKEDITOR.ui.dialog.uiElement.
+ + + + + +
Defined in: plugins/dialog/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.hbox(dialog, childObjList, childHtmlList, htmlList, elementDefinition) +
+
Horizontal layout box for dialog UI elements, auto-expends to available width of container.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.ui.dialog.uiElement:
eventProcessors
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
getChild(indices) +
+
Gets a child UI element inside this container.
+
+ + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
accessKeyDown, accessKeyUp, disable, enable, focus, getDialog, getElement, getInputElement, getValue, isChanged, isEnabled, isFocusable, isVisible, registerEvents, selectParentTab, setValue
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.hbox(dialog, childObjList, childHtmlList, htmlList, elementDefinition) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Horizontal layout box for dialog UI elements, auto-expends to available width of container. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {Array} childObjList + +
+
Array of CKEDITOR.ui.dialog.uiElement objects inside this +container.
+ +
+ {Array} childHtmlList + +
+
Array of HTML code that correspond to the HTML output of all the +objects in childObjList.
+ +
+ {Array} htmlList + +
+
Array of HTML code that this element will output to.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The element definition. Accepted fields: +
    +
  • widths (Optional) The widths of child cells.
  • +
  • height (Optional) The height of the layout.
  • +
  • padding (Optional) The padding width inside child + cells.
  • +
  • align (Optional) The alignment of the whole layout +
  • +
+ +
+ + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {Array|CKEDITOR.ui.dialog.uiElement} + getChild(indices) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets a child UI element inside this container. + + +
+ + + + +
var checkbox = hbox.getChild( [0,1] );
+checkbox.setValue( true );
+ + + + + +
+
Parameters:
+ +
+ {Array|Number} indices + +
+
An array or a single number to indicate the child's +position in the container's descendant tree. Omit to get all the children in an array.
+ +
+ + + + +
+
Returns:
+ +
{Array|CKEDITOR.ui.dialog.uiElement} Array of all UI elements in the container +if no argument given, or the specified UI element if indices is given.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.html.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.html.html new file mode 100644 index 000000000..6f3a10554 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.html.html @@ -0,0 +1,860 @@ + + + + + + + CKEDITOR.ui.dialog.html - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.html +

+ + +

+
Extends + CKEDITOR.ui.dialog.uiElement.
+ + + + + +
Defined in: plugins/dialogui/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.html(dialog, elementDefinition, htmlList) +
+
A dialog element made from raw HTML code.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.ui.dialog.uiElement:
eventProcessors
+
+ + + + + + + + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
accessKeyDown, accessKeyUp, disable, enable, focus, getDialog, getElement, getInputElement, getValue, isChanged, isEnabled, isFocusable, isVisible, registerEvents, selectParentTab, setValue
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.html(dialog, elementDefinition, htmlList) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A dialog element made from raw HTML code. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
Element definition. +Accepted fields: +
    +
  • html (Required) HTML code of this element.
  • +
+ +
+ {Array} htmlList + +
+
List of HTML code to be added to the dialog's content area.
+ +
+ + + + + + + +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.labeledElement.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.labeledElement.html new file mode 100644 index 000000000..9f6a73da3 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.labeledElement.html @@ -0,0 +1,1063 @@ + + + + + + + CKEDITOR.ui.dialog.labeledElement - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.labeledElement +

+ + +

+
Extends + CKEDITOR.ui.dialog.uiElement.
+ + + + + +
Defined in: plugins/dialogui/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.labeledElement(dialog, elementDefinition, htmlList, contentHtml) +
+
Base class for all dialog elements with a textual label on the left.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  + +
Defines the onChange event for UI element definitions.
+
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  + +
Retrieves the current label text of the elment.
+
  +
setLabel(label) +
+
Sets the label text of the element.
+
+ + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
accessKeyDown, accessKeyUp, disable, enable, focus, getDialog, getElement, getInputElement, getValue, isChanged, isEnabled, isFocusable, isVisible, registerEvents, selectParentTab, setValue
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.labeledElement(dialog, elementDefinition, htmlList, contentHtml) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Base class for all dialog elements with a textual label on the left. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The element definition. Accepted fields: +
    +
  • label (Required) The label string.
  • +
  • labelLayout (Optional) Put 'horizontal' here if the + label element is to be layed out horizontally. Otherwise a vertical + layout will be used.
  • +
  • widths (Optional) This applies only for horizontal + layouts - an 2-element array of lengths to specify the widths of the + label and the content element.
  • +
+ +
+ {Array} htmlList + +
+
List of HTML code to output to.
+ +
+ {Function} contentHtml + +
+
A function returning the HTML code string to be added inside the content +cell.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + eventProcessors + +
+
+ Since: + + 3.0 + +
+
+
+ Defines the onChange event for UI element definitions. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {String} + getLabel() + +
+
+ Since: + + 3.0 + +
+
+
+ Retrieves the current label text of the elment. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{String} The current label text.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.ui.dialog.labeledElement} + setLabel(label) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the label text of the element. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} label + +
+
The new label text.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.ui.dialog.labeledElement} The current labeled element.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.radio.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.radio.html new file mode 100644 index 000000000..9d82ec2e7 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.radio.html @@ -0,0 +1,1094 @@ + + + + + + + CKEDITOR.ui.dialog.radio - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.radio +

+ + +

+
Extends + CKEDITOR.ui.dialog.labeledElement.
+ + + + + +
Defined in: plugins/dialogui/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.radio(dialog, elementDefinition, htmlList) +
+
A group of radio buttons.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  + +
Defines the onChange event for UI element definitions.
+
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  + +
Handler for the access key up event.
+
  + +
Gets the value of the currently checked radio button.
+
  +
setValue(value) +
+
Checks one of the radio buttons in this button group.
+
+ + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.labeledElement:
getLabel, setLabel
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
accessKeyDown, disable, enable, focus, getDialog, getElement, getInputElement, isChanged, isEnabled, isFocusable, isVisible, registerEvents, selectParentTab
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.radio(dialog, elementDefinition, htmlList) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A group of radio buttons. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The element definition. Accepted fields: +
    +
  • default (Required) The default value.
  • +
  • validate (Optional) The validation function.
  • +
  • items (Required) An array of options. Each option + is a 1- or 2-item array of format [ 'Description', 'Value' ]. If 'Value' + is missing, then the value would be assumed to be the same as the + description.
  • +
+ +
+ {Array} htmlList + +
+
List of HTML code to output to.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + eventProcessors + +
+
+ Since: + + 3.0 + +
+
+
+ Defines the onChange event for UI element definitions. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + accessKeyUp() + +
+
+ Since: + + 3.0 + +
+
+
+ Handler for the access key up event. Focuses the currently +selected radio button, or the first radio button if none is +selected. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {String} + getValue() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the value of the currently checked radio button. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{String} The currently checked button's value.
+ +
+ + + + +
+ + +
+ + {Undefined} + setValue(value) + +
+
+ Since: + + 3.0 + +
+
+
+ Checks one of the radio buttons in this button group. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} value + +
+
The value of the button to be chcked.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.select.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.select.html new file mode 100644 index 000000000..9e01c2e33 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.select.html @@ -0,0 +1,1125 @@ + + + + + + + CKEDITOR.ui.dialog.select - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.select +

+ + +

+
Extends + CKEDITOR.ui.dialog.uiElement.
+ + + + + +
Defined in: plugins/dialogui/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.select(dialog, elementDefinition, htmlList) +
+
A select box.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.ui.dialog.uiElement:
eventProcessors
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
add(label, value, index) +
+
Adds an option to the select box.
+
  +
clear() +
+
Clears all options out of the selection list.
+
  + +
Gets the DOM element of the select box.
+
  +
remove(index) +
+
Removes an option from the selection list.
+
+ + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
accessKeyDown, accessKeyUp, disable, enable, focus, getDialog, getElement, getValue, isChanged, isEnabled, isFocusable, isVisible, registerEvents, selectParentTab, setValue
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.select(dialog, elementDefinition, htmlList) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A select box. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The element definition. Accepted fields: +
    +
  • default (Required) The default value.
  • +
  • validate (Optional) The validation function.
  • +
  • items (Required) An array of options. Each option + is a 1- or 2-item array of format [ 'Description', 'Value' ]. If 'Value' + is missing, then the value would be assumed to be the same as the + description.
  • +
  • multiple (Optional) Set this to true if you'd like + to have a multiple-choice select box.
  • +
  • size (Optional) The number of items to display in + the select box.
  • +
+ +
+ {Array} htmlList + +
+
List of HTML code to output to.
+ +
+ + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {CKEDITOR.ui.dialog.select} + add(label, value, index) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds an option to the select box. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} label + +
+
Option label.
+ +
+ {String} value + +
+
(Optional) Option value, if not defined it'll be +assumed to be the same as the label.
+ +
+ {Number} index + +
+
(Optional) Position of the option to be inserted +to. If not defined the new option will be inserted to the end of list.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.ui.dialog.select} The current select UI element.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.ui.dialog.select} + clear() + +
+
+ Since: + + 3.0 + +
+
+
+ Clears all options out of the selection list. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + +
+
Returns:
+ +
{CKEDITOR.ui.dialog.select} The current select UI element.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.element} + getInputElement() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the DOM element of the select box. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The <select> element of this UI +element.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.ui.dialog.select} + remove(index) + +
+
+ Since: + + 3.0 + +
+
+
+ Removes an option from the selection list. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {Number} index + +
+
Index of the option to be removed.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.ui.dialog.select} The current select UI element.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.textInput.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.textInput.html new file mode 100644 index 000000000..83d3e12ba --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.textInput.html @@ -0,0 +1,1131 @@ + + + + + + + CKEDITOR.ui.dialog.textInput - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.textInput +

+ + +

+
Extends + CKEDITOR.ui.dialog.labeledElement.
+ + + + + +
Defined in: plugins/dialogui/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.textInput(dialog, elementDefinition, htmlList) +
+
A text input with a label.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.ui.dialog.labeledElement:
eventProcessors
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  + +
Handler for the text input's access key up event.
+
  +
focus() +
+
Puts focus into the text input.
+
  + +
Gets the text input DOM element under this UI object.
+
  +
select() +
+
Selects all the text in the text input.
+
  +
setValue(value) +
+
Sets the value of this text input object.
+
+ + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.labeledElement:
getLabel, setLabel
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
accessKeyDown, disable, enable, getDialog, getElement, getValue, isChanged, isEnabled, isFocusable, isVisible, registerEvents, selectParentTab
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.textInput(dialog, elementDefinition, htmlList) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A text input with a label. This UI element class represents both the +single-line text inputs and password inputs in dialog boxes. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The element definition. Accepted fields: +
    +
  • default (Optional) The default value.
  • +
  • validate (Optional) The validation function.
  • +
  • maxLength (Optional) The maximum length of text box + contents.
  • +
  • size (Optional) The size of the text box. This is + usually overridden by the size defined by the skin, however.
  • +
+ +
+ {Array} htmlList + +
+
List of HTML code to output to.
+ +
+ + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + accessKeyUp() + +
+
+ Since: + + 3.0 + +
+
+
+ Handler for the text input's access key up event. Makes a select() +call to the text input. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {Undefined} + focus() + +
+
+ Since: + + 3.0 + +
+
+
+ Puts focus into the text input. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {CKEDITOR.dom.element} + getInputElement() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the text input DOM element under this UI object. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The DOM element of the text input.
+ +
+ + + + +
+ + +
+ + {Undefined} + select() + +
+
+ Since: + + 3.0 + +
+
+
+ Selects all the text in the text input. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {CKEDITOR.ui.dialog.textInput} + setValue(value) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the value of this text input object. + + +
+ + + + +
uiElement.setValue( 'Blamo' );
+ + + + + +
+
Parameters:
+ +
+ {Object} value + +
+
The new value.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.ui.dialog.textInput} The current UI element.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.textarea.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.textarea.html new file mode 100644 index 000000000..9da598a5c --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.textarea.html @@ -0,0 +1,864 @@ + + + + + + + CKEDITOR.ui.dialog.textarea - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.textarea +

+ + +

+
Extends + CKEDITOR.ui.dialog.labeledElement.
+ + + + + +
Defined in: plugins/dialogui/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.textarea(dialog, elementDefinition, htmlList) +
+
A text area with a label on the top or left.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.ui.dialog.labeledElement:
eventProcessors
+
+ + + + + + + + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.labeledElement:
getLabel, setLabel
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
accessKeyDown, accessKeyUp, disable, enable, focus, getDialog, getElement, getInputElement, getValue, isChanged, isEnabled, isFocusable, isVisible, registerEvents, selectParentTab, setValue
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.textarea(dialog, elementDefinition, htmlList) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ A text area with a label on the top or left. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The element definition. Accepted fields: +
    +
  • rows (Optional) The number of rows displayed. + Defaults to 5 if not defined.
  • +
  • cols (Optional) The number of cols displayed. + Defaults to 20 if not defined. Usually overridden by skins.
  • +
  • default (Optional) The default value.
  • +
  • validate (Optional) The validation function.
  • +
+ +
+ {Array} htmlList + +
+
List of HTML code to output to.
+ +
+ + + + + + + +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.uiElement.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.uiElement.html new file mode 100644 index 000000000..c7ea03be4 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.uiElement.html @@ -0,0 +1,1891 @@ + + + + + + + CKEDITOR.ui.dialog.uiElement - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.uiElement +

+ + +

+ + + + + +
Defined in: plugins/dialog/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.uiElement(dialog, elementDefinition, htmlList, nodeNameArg, stylesArg, attributesArg, contentsArg) +
+
The base class of all dialog UI elements.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  + +
The event processor list used by +CKEDITOR.ui.dialog.uiElement#getInputElement at UI element +instantiation.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
accessKeyDown(dialog, key) +
+
The default handler for a UI element's access key down event, which +tries to put focus to the UI element.
+
  +
accessKeyUp(dialog, key) +
+
The default handler for a UI element's access key up event, which +does nothing.
+
  +
disable() +
+
Disables a UI element.
+
  +
enable() +
+
Enables a UI element.
+
  +
focus() +
+
Puts the focus to the UI object.
+
  + +
Gets the parent dialog object containing this UI element.
+
  + +
Gets the root DOM element of this dialog UI object.
+
  + +
Gets the DOM element that the user inputs values.
+
  + +
Gets the current value of this dialog UI object.
+
  + +
Tells whether the UI object's value has changed.
+
  + +
Determines whether an UI element is enabled or not.
+
  + +
Determines whether an UI element is focus-able or not.
+
  + +
Determines whether an UI element is visible or not.
+
  +
registerEvents(definition) +
+
Registers the on* event handlers defined in the element definition.
+
  + +
Selects the parent tab of this element.
+
  +
setValue(value) +
+
Sets the value of this dialog UI object.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.uiElement(dialog, elementDefinition, htmlList, nodeNameArg, stylesArg, attributesArg, contentsArg) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ The base class of all dialog UI elements. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
Element +definition. Accepted fields: +
    +
  • id (Required) The id of the UI element. See {@link + CKEDITOR.dialog#getContentElement}
  • +
  • type (Required) The type of the UI element. The + value to this field specifies which UI element class will be used to + generate the final widget.
  • +
  • title (Optional) The popup tooltip for the UI + element.
  • +
  • hidden (Optional) A flag that tells if the element + should be initially visible.
  • +
  • className (Optional) Additional CSS class names + to add to the UI element. Separated by space.
  • +
  • style (Optional) Additional CSS inline styles + to add to the UI element. A semicolon (;) is required after the last + style declaration.
  • +
  • accessKey (Optional) The alphanumeric access key + for this element. Access keys are automatically prefixed by CTRL.
  • +
  • on* (Optional) Any UI element definition field that + starts with on followed immediately by a capital letter and + probably more letters is an event handler. Event handlers may be further + divided into registered event handlers and DOM event handlers. Please + refer to CKEDITOR.ui.dialog.uiElement#registerEvents and + CKEDITOR.ui.dialog.uiElement#eventProcessors for more + information.
  • +
+ +
+ {Array} htmlList + +
+
List of HTML code to be added to the dialog's content area.
+ +
+ {Function|String} nodeNameArg + +
+
A function returning a string, or a simple string for the node name for +the root DOM node. Default is 'div'.
+ +
+ {Function|Object} stylesArg + +
+
A function returning an object, or a simple object for CSS styles applied +to the DOM node. Default is empty object.
+ +
+ {Function|Object} attributesArg + +
+
A fucntion returning an object, or a simple object for attributes applied +to the DOM node. Default is empty object.
+ +
+ {Function|String} contentsArg + +
+
A function returning a string, or a simple string for the HTML code inside +the root DOM node. Default is empty string.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {Object} + eventProcessors + +
+
+ Since: + + 3.0 + +
+
+
+ The event processor list used by +CKEDITOR.ui.dialog.uiElement#getInputElement at UI element +instantiation. The default list defines three on* events: +
    +
  1. onLoad - Called when the element's parent dialog opens for the + first time
  2. +
  3. onShow - Called whenever the element's parent dialog opens.
  4. +
  5. onHide - Called whenever the element's parent dialog closes.
  6. +
+ + +
+ + + + +
// This connects the 'click' event in CKEDITOR.ui.dialog.button to onClick
+// handlers in the UI element's definitions.
+CKEDITOR.ui.dialog.button.eventProcessors = CKEDITOR.tools.extend( {},
+  CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,
+  { onClick : function( dialog, func ) { this.on( 'click', func ); } },
+  true );
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + accessKeyDown(dialog, key) + +
+
+ Since: + + 3.0 + +
+
+
+ The default handler for a UI element's access key down event, which +tries to put focus to the UI element.
+Can be overridded in child classes for more sophisticaed behavior. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
The parent dialog object.
+ +
+ {String} key + +
+
The key combination pressed. Since access keys +are defined to always include the CTRL key, its value should always +include a 'CTRL+' prefix.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + accessKeyUp(dialog, key) + +
+
+ Since: + + 3.0 + +
+
+
+ The default handler for a UI element's access key up event, which +does nothing.
+Can be overridded in child classes for more sophisticated behavior. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
The parent dialog object.
+ +
+ {String} key + +
+
The key combination pressed. Since access keys +are defined to always include the CTRL key, its value should always +include a 'CTRL+' prefix.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + disable() + +
+
+ Since: + + 3.0 + +
+
+
+ Disables a UI element. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {Undefined} + enable() + +
+
+ Since: + + 3.0 + +
+
+
+ Enables a UI element. + + +
+ + + + + + + + + + + + + + +
+ + +
+ + {CKEDITOR.dialog.uiElement} + focus() + +
+
+ Since: + + 3.0 + +
+
+
+ Puts the focus to the UI object. Switches tabs if the UI object isn't in the active tab page. + + +
+ + + + +
uiElement.focus();
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dialog.uiElement} The current UI element.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dialog} + getDialog() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the parent dialog object containing this UI element. + + +
+ + + + +
var dialog = uiElement.getDialog();
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dialog} Parent dialog object.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.element} + getElement() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the root DOM element of this dialog UI object. + + +
+ + + + +
uiElement.getElement().hide();
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} Root DOM element of UI object.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dom.element} + getInputElement() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the DOM element that the user inputs values. +This function is used by setValue(), getValue() and focus(). It should +be overrided in child classes where the input element isn't the root +element. + + +
+ + + + +
var rawValue = textInput.getInputElement().$.value;
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dom.element} The element where the user input values.
+ +
+ + + + +
+ + +
+ + {Object} + getValue() + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the current value of this dialog UI object. + + +
+ + + + +
var myValue = uiElement.getValue();
+ + + + + + + + +
+
Returns:
+ +
{Object} The current value.
+ +
+ + + + +
+ + +
+ + {Boolean} + isChanged() + +
+
+ Since: + + 3.0 + +
+
+
+ Tells whether the UI object's value has changed. + + +
+ + + + +
if ( uiElement.isChanged() )
+  confirm( 'Value changed! Continue?' );
+ + + + + + + + +
+
Returns:
+ +
{Boolean} true if changed, false if not changed.
+ +
+ + + + +
+ + +
+ + {Boolean} + isEnabled() + +
+
+ Since: + + 3.0 + +
+
+
+ Determines whether an UI element is enabled or not. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{Boolean} Whether the UI element is enabled.
+ +
+ + + + +
+ + +
+ + {Boolean} + isFocusable() + +
+
+ Since: + + 3.0 + +
+
+
+ Determines whether an UI element is focus-able or not. +Focus-able is defined as being both visible and enabled. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{Boolean} Whether the UI element can be focused.
+ +
+ + + + +
+ + +
+ + {Boolean} + isVisible() + +
+
+ Since: + + 3.0 + +
+
+
+ Determines whether an UI element is visible or not. + + +
+ + + + + + + + + + + +
+
Returns:
+ +
{Boolean} Whether the UI element is visible.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dialog.uiElement} + registerEvents(definition) + +
+
+ Since: + + 3.0 + +
+
+
+ Registers the on* event handlers defined in the element definition. +The default behavior of this function is: +
    +
  1. + If the on* event is defined in the class's eventProcesors list, + then the registration is delegated to the corresponding function + in the eventProcessors list. +
  2. +
  3. + If the on* event is not defined in the eventProcessors list, then + register the event handler under the corresponding DOM event of + the UI element's input DOM element (as defined by the return value + of CKEDITOR.ui.dialog.uiElement#getInputElement). +
  4. +
+This function is only called at UI element instantiation, but can +be overridded in child classes if they require more flexibility. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog.uiElementDefinition} definition + +
+
The UI element +definition.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog.uiElement} The current UI element.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dialog.uiElement} + selectParentTab() + +
+
+ Since: + + 3.0 + +
+
+
+ Selects the parent tab of this element. Usually called by focus() or overridden focus() methods. + + +
+ + + + +
focus : function()
+{
+		this.selectParentTab();
+		// do something else.
+}
+ + + + + + + + +
+
Returns:
+ +
{CKEDITOR.dialog.uiElement} The current UI element.
+ +
+ + + + +
+ + +
+ + {CKEDITOR.dialog.uiElement} + setValue(value) + +
+
+ Since: + + 3.0 + +
+
+
+ Sets the value of this dialog UI object. + + +
+ + + + +
uiElement.setValue( 'Dingo' );
+ + + + + +
+
Parameters:
+ +
+ {Object} value + +
+
The new value.
+ +
+ + + + +
+
Returns:
+ +
{CKEDITOR.dialog.uiElement} The current UI element.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.vbox.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.vbox.html new file mode 100644 index 000000000..40e3eaee9 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.dialog.vbox.html @@ -0,0 +1,880 @@ + + + + + + + CKEDITOR.ui.dialog.vbox - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.dialog.vbox +

+ + +

+
Extends + CKEDITOR.ui.dialog.hbox.
+ + + + + +
Defined in: plugins/dialog/plugin.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui.dialog.vbox(dialog, childObjList, childHtmlList, htmlList, elementDefinition) +
+
Vertical layout box for dialog UI elements.
+
+ + + + + + + + + + + + +
+
Fields borrowed from class CKEDITOR.ui.dialog.uiElement:
eventProcessors
+
+ + + + + + + + + +
+
Methods borrowed from class CKEDITOR.ui.dialog.hbox:
getChild
Methods borrowed from class CKEDITOR.ui.dialog.uiElement:
accessKeyDown, accessKeyUp, disable, enable, focus, getDialog, getElement, getInputElement, getValue, isChanged, isEnabled, isFocusable, isVisible, registerEvents, selectParentTab, setValue
+
+ + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.dialog.vbox(dialog, childObjList, childHtmlList, htmlList, elementDefinition) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Vertical layout box for dialog UI elements. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.dialog} dialog + +
+
Parent dialog object.
+ +
+ {Array} childObjList + +
+
Array of CKEDITOR.ui.dialog.uiElement objects inside this +container.
+ +
+ {Array} childHtmlList + +
+
Array of HTML code that correspond to the HTML output of all the +objects in childObjList.
+ +
+ {Array} htmlList + +
+
Array of HTML code that this element will output to.
+ +
+ {CKEDITOR.dialog.uiElementDefinition} elementDefinition + +
+
The element definition. Accepted fields: +
    +
  • width (Optional) The width of the layout.
  • +
  • heights (Optional) The heights of individual cells. +
  • +
  • align (Optional) The alignment of the layout.
  • +
  • padding (Optional) The padding width inside child + cells.
  • +
  • expand (Optional) Whether the layout should expand + vertically to fill its container.
  • +
+ +
+ + + + + + + +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.handlerDefinition.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.handlerDefinition.html new file mode 100644 index 000000000..281994e2d --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.handlerDefinition.html @@ -0,0 +1,811 @@ + + + + + + + CKEDITOR.ui.handlerDefinition - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui.handlerDefinition +

+ + +

+ + + + + +
Defined in: core/ui.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
(Virtual Class) Do not call this constructor.
+
+ + + + + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui.handlerDefinition() +
+ +
+ Since: + + 3.0 + +
+
+ +
+ (Virtual Class) Do not call this constructor. This class is not really part + of the API. It just illustrates the features of hanlder objects to be + passed to the CKEDITOR.ui.prototype.addHandler function. + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.html new file mode 100644 index 000000000..04e71ed9b --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.ui.html @@ -0,0 +1,1302 @@ + + + + + + + CKEDITOR.ui - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.ui +

+ + +

+ + + + + +
Defined in: core/ui.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.ui(editor) +
+
Contains UI features related to an editor instance.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   +
+ CKEDITOR.ui.separator +
+
The UI element that renders a toolbar separator.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   +
CKEDITOR.ui.panel(document, definition) +
+
+
  +
add(name, type, definition) +
+
Adds a UI item to the items collection.
+
  +
addButton(The, The) +
+
Adds a button definition to the UI elements list.
+
  +
addHandler(type, handler) +
+
Adds a handler for a UI item type.
+
  +
addRichCombo(name, definition) +
+
+
  +
create(name) +
+
Gets a UI object.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.ui(editor) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Contains UI features related to an editor instance. + +
+ + + + + + + + + +
+
Parameters:
+ +
+ {CKEDITOR.editor} editor + +
+
The editor instance.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + {Object} + CKEDITOR.ui.separator + +
+
+ Since: + + 3.0 + +
+
+
+ The UI element that renders a toolbar separator. + +
+ Defined in: plugins/toolbar/plugin.js. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
<static> + + {Undefined} + CKEDITOR.ui.panel(document, definition) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/panel/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} document + +
+
+ +
+ {Undefined} definition + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + add(name, type, definition) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a UI item to the items collection. These items can be later used in +the interface. + + +
+ + + + +
// Add a new button named "MyBold".
+editorInstance.ui.add( 'MyBold', CKEDITOR.UI_BUTTON,
+    {
+        label : 'My Bold',
+        command : 'bold'
+    });
+ + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The UI item name.
+ +
+ {Object} type + +
+
The item type.
+ +
+ {Object} definition + +
+
The item definition. The properties of this + object depend on the item type.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + addButton(The, The) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a button definition to the UI elements list. + +
+ Defined in: plugins/button/plugin.js. + + +
+ + + + +
editorInstance.ui.addButton( 'MyBold',
+    {
+        label : 'My Bold',
+        command : 'bold'
+    });
+ + + + + +
+
Parameters:
+ +
+ {String} The + +
+
button name.
+ +
+ {Object} The + +
+
button definition.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + addHandler(type, handler) + +
+
+ Since: + + 3.0 + +
+
+
+ Adds a handler for a UI item type. The handler is responsible for +transforming UI item definitions in UI objects. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {Object} type + +
+
The item type.
+ +
+ {Object} handler + +
+
The handler definition.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + addRichCombo(name, definition) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/richcombo/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} name + +
+
+ +
+ {Undefined} definition + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + create(name) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets a UI object. + + +
+ + + + + + + + +
+
Parameters:
+ +
+ {String} name + +
+
The UI item hame.
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.xml.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.xml.html new file mode 100644 index 000000000..1e9d83faf --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/CKEDITOR.xml.html @@ -0,0 +1,1146 @@ + + + + + + + CKEDITOR.xml - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Class CKEDITOR.xml +

+ + +

+ + + + + +
Defined in: core/xml.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ CKEDITOR.xml(xmlObjectOrData) +
+
Represents a loaded XML document.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ baseXml +
+
The native XML (DOM document) used by the class instance.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
getInnerXml(xpath, contextNode) +
+
Gets the string representation of hte inner contents of a XML node, +based on a XPath query.
+
  +
selectNodes(xpath, contextNode) +
+
Gets a list node from the XML document, based on a XPath query.
+
  +
selectSingleNode(xpath, contextNode) +
+
Get a single node from the XML document, based on a XPath query.
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ CKEDITOR.xml(xmlObjectOrData) +
+ +
+ Since: + + 3.0 + +
+
+ +
+ Represents a loaded XML document. + +
+ + + + +
var xml = new CKEDITOR.xml( '' );
+ + + + + + +
+
Parameters:
+ +
+ {object|string} xmlObjectOrData + +
+
A native XML (DOM document) object or + a string containing the XML definition to be loaded.
+ +
+ + + + + + + +
+ + + + +
+ Field Detail +
+ + +
+ + {object} + baseXml + +
+
+ Since: + + 3.0 + +
+
+
+ The native XML (DOM document) used by the class instance. + + +
+ + + + + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + {String} + getInnerXml(xpath, contextNode) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets the string representation of hte inner contents of a XML node, +based on a XPath query. + + +
+ + + + +
// Create the XML instance.
+var xml = new CKEDITOR.xml( '' );
+// Alert "".
+alert( xml.getInnerXml( 'list' ) );
+ + + + + +
+
Parameters:
+ +
+ {String} xpath + +
+
The XPath query to execute.
+ +
+ {Object} contextNode + Optional +
+
The XML DOM node to be used as the context + for the XPath query. The document root is used by default.
+ +
+ + + + +
+
Returns:
+ +
{String} The textual representation of the inner contents of + the node or null if the query has no results.
+ +
+ + + + +
+ + +
+ + {ArrayLike} + selectNodes(xpath, contextNode) + +
+
+ Since: + + 3.0 + +
+
+
+ Gets a list node from the XML document, based on a XPath query. + + +
+ + + + +
// Create the XML instance.
+var xml = new CKEDITOR.xml( '' );
+// Get the first  node.
+var itemNodes = xml.selectSingleNode( 'list/item' );
+// Alert "item" twice, one for each .
+for ( var i = 0 ; i < itemNodes.length ; i++ )
+    alert( itemNodes[i].nodeName );
+ + + + + +
+
Parameters:
+ +
+ {String} xpath + +
+
The XPath query to execute.
+ +
+ {Object} contextNode + Optional +
+
The XML DOM node to be used as the context + for the XPath query. The document root is used by default.
+ +
+ + + + +
+
Returns:
+ +
{ArrayLike} An array containing all matched nodes. The array will + be empty if the query has no results.
+ +
+ + + + +
+ + +
+ + {Object} + selectSingleNode(xpath, contextNode) + +
+
+ Since: + + 3.0 + +
+
+
+ Get a single node from the XML document, based on a XPath query. + + +
+ + + + +
// Create the XML instance.
+var xml = new CKEDITOR.xml( '' );
+// Get the first  node.
+var itemNode = xml.selectSingleNode( 'list/item' );
+// Alert "item".
+alert( itemNode.nodeName );
+ + + + + +
+
Parameters:
+ +
+ {String} xpath + +
+
The XPath query to execute.
+ +
+ {Object} contextNode + Optional +
+
The XML DOM node to be used as the context + for the XPath query. The document root is used by default.
+ +
+ + + + +
+
Returns:
+ +
{Object} A XML node element or null if the query has no results.
+ +
+ + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/_global_.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/_global_.html new file mode 100644 index 000000000..7e6a66016 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/_global_.html @@ -0,0 +1,1717 @@ + + + + + + + _global_ - CKEditor 3.0 JavaScript API Documentation + + + + + + + + + + + + +
+ + +
+

Namespaces

+ +

Classes

+ +
+ +
+ +
+ +

+ + Built-In Namespace _global_ +

+ + +

+ + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ dir +
+
The language reading direction.
+
  + +
Add EMBED tag as alternative: <object><embed></embed></object>
+
  + +
Use embedTagOnly and addEmbedTag values on edit.
+
  + +
Save as EMBED tag only.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
$() +
+
+
  +
boundaryGuard(node) +
+
+
  + +
+
  +
guard(node, movingOut) +
+
+
  +
L() +
+
+
  +
mergeSibling(rtl) +
+
+
  +
onHide() +
+
+
  + +
+
  +
popup(url, width, height) +
+
Opens Browser in a popup.
+
  +
R(U, V) +
+
+
  +
T(U, V) +
+
+
  +
tailBrGuard(node) +
+
+
  + +
+
+ + + + + + + + + + +
+ Field Detail +
+ + +
+ + {String} + dir + +
+
+ Since: + + 3.0 + +
+
+
+ The language reading direction. Possible values are "rtl" for +Right-To-Left languages (like Arabic) and "ltr" for Left-To-Right +languages (like English). + +
+ Defined in: lang/en.js. + + +
+ + + + + + + + + + +
+
Default Value:
+
+ 'ltr' +
+
+ + +
+ + +
+ + {Boolean} + flashAddEmbedTag + +
+
+ Since: + + 3.0 + +
+
+
+ Add EMBED tag as alternative: <object><embed></embed></object> + +
+ Defined in: plugins/flash/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + +
+
Default Value:
+
+ false +
+
+ + +
+ + +
+ + {Boolean} + flashConvertOnEdit + +
+
+ Since: + + 3.0 + +
+
+
+ Use embedTagOnly and addEmbedTag values on edit. + +
+ Defined in: plugins/flash/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + +
+
Default Value:
+
+ false +
+
+ + +
+ + +
+ + {Boolean} + flashEmbedTagOnly + +
+
+ Since: + + 3.0 + +
+
+
+ Save as EMBED tag only. This tag is unrecommended. + +
+ Defined in: plugins/flash/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + +
+
Default Value:
+
+ false +
+
+ + + + + + + + +
+ Method Detail +
+ + +
+ + {Undefined} + $() + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/tools.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + boundaryGuard(node) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/dom/range.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} node + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + cleanInnerDefinition(def) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/dialogui/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} def + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + guard(node, movingOut) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/dom/walker.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} node + +
+
+ +
+ {Undefined} movingOut + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + L() + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/uicolor/yui/yui.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + mergeSibling(rtl) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/list/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} rtl + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + onHide() + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/richcombo/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + onResize() + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/sourcearea/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + + + + + + + +
+ + +
+ + {Undefined} + popup(url, width, height) + +
+
+ Since: + + 3.0 + +
+
+
+ Opens Browser in a popup. The "width" and "height" parameters accept +numbers (pixels) or percent (of screen size) values. + +
+ Defined in: plugins/popup/plugin.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {String} url + +
+
The url of the external file browser.
+ +
+ {String} width + +
+
Popup window width.
+ +
+ {String} height + +
+
Popup window height.
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + R(U, V) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/uicolor/yui/yui.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} U + +
+
+ +
+ {Undefined} V + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + T(U, V) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/uicolor/yui/yui.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} U + +
+
+ +
+ {Undefined} V + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + tailBrGuard(node) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: core/dom/range.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} node + +
+
+ +
+ + + + + + + +
+ + +
+ + {Undefined} + updatePreview(src) + +
+
+ Since: + + 3.0 + +
+
+
+ + +
+ Defined in: plugins/flash/dialogs/flash.js. + + +
+ + +
NO EXAMPLE AVAILABLE
+ + + +
+
Parameters:
+ +
+ {Undefined} src + +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+ Copyright © 2003-2009, CKSource - Frederico Knabben. All rights reserved. +
+ + + diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core__bootstrap.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core__bootstrap.js.html new file mode 100644 index 000000000..44c5b6f26 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core__bootstrap.js.html @@ -0,0 +1,72 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview API initialization code.
+  8  */
+  9
+ 10 (function()
+ 11 {
+ 12 	// Check is High Contrast is active by creating a temporary element with a
+ 13 	// background image.
+ 14
+ 15 	var testImage = ( CKEDITOR.env.ie && CKEDITOR.env.version < 7 ) ? ( CKEDITOR.basePath + 'images/spacer.gif' ) : 'about:blank';
+ 16
+ 17 	var hcDetect = CKEDITOR.dom.element.createFromHtml(
+ 18 		'<div style="width:0px;height:0px;' +
+ 19 			'position:absolute;left:-10000px;' +
+ 20 			'background-image:url(' + testImage + ')"></div>', CKEDITOR.document );
+ 21
+ 22 	hcDetect.appendTo( CKEDITOR.document.getHead() );
+ 23
+ 24 	// Update CKEDITOR.env.
+ 25 	if ( ( CKEDITOR.env.hc = ( hcDetect.getComputedStyle( 'background-image' ) == 'none' ) ) )
+ 26 		CKEDITOR.env.cssClass += ' cke_hc';
+ 27
+ 28 	hcDetect.remove();
+ 29 })();
+ 30
+ 31 // Load core plugins.
+ 32 CKEDITOR.plugins.load( CKEDITOR.config.corePlugins.split( ',' ), function()
+ 33 	{
+ 34 		CKEDITOR.status = 'loaded';
+ 35 		CKEDITOR.fire( 'loaded' );
+ 36
+ 37 		// Process all instances created by the "basic" implementation.
+ 38 		var pending = CKEDITOR._.pending;
+ 39 		if ( pending )
+ 40 		{
+ 41 			delete CKEDITOR._.pending;
+ 42
+ 43 			for ( var i = 0 ; i < pending.length ; i++ )
+ 44 				CKEDITOR.add( pending[ i ] );
+ 45 		}
+ 46 	});
+ 47
+ 48 /*
+ 49 TODO: Enable the following and check if effective.
+ 50
+ 51 if ( CKEDITOR.env.ie )
+ 52 {
+ 53 	// Remove IE mouse flickering on IE6 because of background images.
+ 54 	try
+ 55 	{
+ 56 		document.execCommand( 'BackgroundImageCache', false, true );
+ 57 	}
+ 58 	catch (e)
+ 59 	{
+ 60 		// We have been reported about loading problems caused by the above
+ 61 		// line. For safety, let's just ignore errors.
+ 62 	}
+ 63 }
+ 64 */
+ 65 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ajax.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ajax.js.html new file mode 100644 index 000000000..db2c9bf18 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ajax.js.html @@ -0,0 +1,151 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.ajax} object, which holds ajax methods for
+  8  *		data loading.
+  9  */
+ 10
+ 11 /**
+ 12  * Ajax methods for data loading.
+ 13  * @namespace
+ 14  * @example
+ 15  */
+ 16 CKEDITOR.ajax = (function()
+ 17 {
+ 18 	var createXMLHttpRequest = function()
+ 19 	{
+ 20 		// In IE, using the native XMLHttpRequest for local files may throw
+ 21 		// "Access is Denied" errors.
+ 22 		if ( !CKEDITOR.env.ie || location.protocol != 'file:' )
+ 23 			try { return new XMLHttpRequest(); } catch(e) {}
+ 24
+ 25 		try { return new ActiveXObject( 'Msxml2.XMLHTTP' ); } catch (e) {}
+ 26 		try { return new ActiveXObject( 'Microsoft.XMLHTTP' ); } catch (e) {}
+ 27
+ 28 		return null;
+ 29 	};
+ 30
+ 31 	var checkStatus = function( xhr )
+ 32 	{
+ 33 		// HTTP Status Codes:
+ 34 		//	 2xx : Success
+ 35 		//	 304 : Not Modified
+ 36 		//	   0 : Returned when running locally (file://)
+ 37 		//	1223 : IE may change 204 to 1223 (see http://dev.jquery.com/ticket/1450)
+ 38
+ 39 		return ( xhr.readyState == 4 &&
+ 40 				(	( xhr.status >= 200 && xhr.status < 300 ) ||
+ 41 					xhr.status == 304 ||
+ 42 					xhr.status === 0 ||
+ 43 					xhr.status == 1223 ) );
+ 44 	};
+ 45
+ 46 	var getResponseText = function( xhr )
+ 47 	{
+ 48 		if ( checkStatus( xhr ) )
+ 49 			return xhr.responseText;
+ 50 		return null;
+ 51 	};
+ 52
+ 53 	var getResponseXml = function( xhr )
+ 54 	{
+ 55 		if ( checkStatus( xhr ) )
+ 56 		{
+ 57 			var xml = xhr.responseXML;
+ 58 			return new CKEDITOR.xml( xml && xml.firstChild ? xml : xhr.responseText );
+ 59 		}
+ 60 		return null;
+ 61 	};
+ 62
+ 63 	var load = function( url, callback, getResponseFn )
+ 64 	{
+ 65 		var async = !!callback;
+ 66
+ 67 		var xhr = createXMLHttpRequest();
+ 68
+ 69 		if ( !xhr )
+ 70 			return null;
+ 71
+ 72 		xhr.open( 'GET', url, async );
+ 73
+ 74 		if ( async )
+ 75 		{
+ 76 			// TODO: perform leak checks on this closure.
+ 77 			/** @ignore */
+ 78 			xhr.onreadystatechange = function()
+ 79 			{
+ 80 				if ( xhr.readyState == 4 )
+ 81 				{
+ 82 					callback( getResponseFn( xhr ) );
+ 83 					xhr = null;
+ 84 				}
+ 85 			};
+ 86 		}
+ 87
+ 88 		xhr.send(null);
+ 89
+ 90 		return async ? '' : getResponseFn( xhr );
+ 91 	};
+ 92
+ 93 	return 	/** @lends CKEDITOR.ajax */ {
+ 94
+ 95 		/**
+ 96 		 * Loads data from an URL as plain text.
+ 97 		 * @param {String} url The URL from which load data.
+ 98 		 * @param {Function} [callback] A callback function to be called on
+ 99 		 *		data load. If not provided, the data will be loaded
+100 		 *		asynchronously, passing the data value the function on load.
+101 		 * @returns {String} The loaded data. For asynchronous requests, an
+102 		 *		empty string. For invalid requests, null.
+103 		 * @example
+104 		 * // Load data synchronously.
+105 		 * var data = CKEDITOR.ajax.load( 'somedata.txt' );
+106 		 * alert( data );
+107 		 * @example
+108 		 * // Load data asynchronously.
+109 		 * var data = CKEDITOR.ajax.load( 'somedata.txt', function( data )
+110 		 *     {
+111 		 *         alert( data );
+112 		 *     } );
+113 		 */
+114 		load : function( url, callback )
+115 		{
+116 			return load( url, callback, getResponseText );
+117 		},
+118
+119 		/**
+120 		 * Loads data from an URL as XML.
+121 		 * @param {String} url The URL from which load data.
+122 		 * @param {Function} [callback] A callback function to be called on
+123 		 *		data load. If not provided, the data will be loaded
+124 		 *		asynchronously, passing the data value the function on load.
+125 		 * @returns {CKEDITOR.xml} An XML object holding the loaded data. For asynchronous requests, an
+126 		 *		empty string. For invalid requests, null.
+127 		 * @example
+128 		 * // Load XML synchronously.
+129 		 * var xml = CKEDITOR.ajax.loadXml( 'somedata.xml' );
+130 		 * alert( xml.getInnerXml( '//' ) );
+131 		 * @example
+132 		 * // Load XML asynchronously.
+133 		 * var data = CKEDITOR.ajax.loadXml( 'somedata.xml', function( xml )
+134 		 *     {
+135 		 *         alert( xml.getInnerXml( '//' ) );
+136 		 *     } );
+137 		 */
+138 		loadXml : function( url, callback )
+139 		{
+140 			return load( url, callback, getResponseXml );
+141 		}
+142 	};
+143 })();
+144 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor.js.html new file mode 100644 index 000000000..20d5042a9 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor.js.html @@ -0,0 +1,104 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Contains the third and last part of the {@link CKEDITOR} object
+  8  *		definition.
+  9  */
+ 10
+ 11 // Remove the CKEDITOR.loadFullCore reference defined on ckeditor_basic.
+ 12 delete CKEDITOR.loadFullCore;
+ 13
+ 14 /**
+ 15  * Holds references to all editor instances created. The name of the properties
+ 16  * in this object correspond to instance names, and their values contains the
+ 17  * {@link CKEDITOR.editor} object representing them.
+ 18  * @type {Object}
+ 19  * @example
+ 20  * alert( <b>CKEDITOR.instances</b>.editor1.name );  // "editor1"
+ 21  */
+ 22 CKEDITOR.instances = {};
+ 23
+ 24 /**
+ 25  * The document of the window holding the CKEDITOR object.
+ 26  * @type {CKEDITOR.dom.document}
+ 27  * @example
+ 28  * alert( <b>CKEDITOR.document</b>.getBody().getName() );  // "body"
+ 29  */
+ 30 CKEDITOR.document = new CKEDITOR.dom.document( document );
+ 31
+ 32 /**
+ 33  * Adds an editor instance to the global {@link CKEDITOR} object. This function
+ 34  * is available for internal use mainly.
+ 35  * @param {CKEDITOR.editor} editor The editor instance to be added.
+ 36  * @example
+ 37  */
+ 38 CKEDITOR.add = function( editor )
+ 39 {
+ 40 	CKEDITOR.instances[ editor.name ] = editor;
+ 41
+ 42 	editor.on( 'focus', function()
+ 43 		{
+ 44 			if ( CKEDITOR.currentInstance != editor )
+ 45 			{
+ 46 				CKEDITOR.currentInstance = editor;
+ 47 				CKEDITOR.fire( 'currentInstance' );
+ 48 			}
+ 49 		});
+ 50
+ 51 	editor.on( 'blur', function()
+ 52 		{
+ 53 			if ( CKEDITOR.currentInstance == editor )
+ 54 			{
+ 55 				CKEDITOR.currentInstance = null;
+ 56 				CKEDITOR.fire( 'currentInstance' );
+ 57 			}
+ 58 		});
+ 59 };
+ 60
+ 61 /**
+ 62  * Removes and editor instance from the global {@link CKEDITOR} object. his function
+ 63  * is available for internal use mainly.
+ 64  * @param {CKEDITOR.editor} editor The editor instance to be added.
+ 65  * @example
+ 66  */
+ 67 CKEDITOR.remove = function( editor )
+ 68 {
+ 69 	delete CKEDITOR.instances[ editor.name ];
+ 70 };
+ 71
+ 72 // Load the bootstrap script.
+ 73 CKEDITOR.loader.load( 'core/_bootstrap' );		// @Packager.RemoveLine
+ 74
+ 75 // Tri-state constants.
+ 76
+ 77 /**
+ 78  * Used to indicate the ON or ACTIVE state.
+ 79  * @constant
+ 80  * @example
+ 81  */
+ 82 CKEDITOR.TRISTATE_ON = 1;
+ 83
+ 84 /**
+ 85  * Used to indicate the OFF or NON ACTIVE state.
+ 86  * @constant
+ 87  * @example
+ 88  */
+ 89 CKEDITOR.TRISTATE_OFF = 2;
+ 90
+ 91 /**
+ 92  * Used to indicate DISABLED state.
+ 93  * @constant
+ 94  * @example
+ 95  */
+ 96 CKEDITOR.TRISTATE_DISABLED = 0;
+ 97 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor_base.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor_base.js.html new file mode 100644 index 000000000..43fdb5737 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor_base.js.html @@ -0,0 +1,198 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Contains the first and essential part of the {@link CKEDITOR}
+  8  *		object definition.
+  9  */
+ 10
+ 11 // #### Compressed Code
+ 12 // Must be updated on changes in the script, as well as updated in the
+ 13 // ckeditor_source.js and ckeditor_basic_source.js files.
+ 14
+ 15 // if(!window.CKEDITOR)window.CKEDITOR=(function(){var a={timestamp:'',version:'3.0 RC',rev:'3753',_:{},status:'unloaded',basePath:(function(){var d=window.CKEDITOR_BASEPATH||'';if(!d){var e=document.getElementsByTagName('script');for(var f=0;f<e.length;f++){var g=e[f].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(g){d=g[1];break;}}}if(d.indexOf('://')==-1)if(d.indexOf('/')===0)d=location.href.match(/^.*?:\/\/[^\/]*/)[0]+d;else d=location.href.match(/^[^\?]*\/(?:)/)[0]+d;return d;})(),getUrl:function(d){if(d.indexOf('://')==-1&&d.indexOf('/')!==0)d=this.basePath+d;if(this.timestamp&&d.charAt(d.length-1)!='/')d+=(d.indexOf('?')>=0?'&':'?')+('t=')+this.timestamp;return d;}},b=window.CKEDITOR_GETURL;if(b){var c=a.getUrl;a.getUrl=function(d){return b.call(a,d)||c.call(a,d);};}return a;})();
+ 16
+ 17 // #### Raw code
+ 18 // ATTENTION: read the above "Compressed Code" notes when changing this code.
+ 19
+ 20 if ( !window.CKEDITOR )
+ 21 {
+ 22 	/**
+ 23 	 * This is the API entry point. The entire CKEditor code runs under this object.
+ 24 	 * @name CKEDITOR
+ 25 	 * @namespace
+ 26 	 * @example
+ 27 	 */
+ 28 	window.CKEDITOR = (function()
+ 29 	{
+ 30 		var CKEDITOR =
+ 31 		/** @lends CKEDITOR */
+ 32 		{
+ 33
+ 34 			/**
+ 35 			 * A constant string unique for each release of CKEditor. Its value
+ 36 			 * is used, by default, to build the URL for all resources loaded
+ 37 			 * by the editor code, guaranteing clean cache results when
+ 38 			 * upgrading.
+ 39 			 * @type String
+ 40 			 * @example
+ 41 			 * alert( CKEDITOR.timestamp );  // e.g. '87dm'
+ 42 			 */
+ 45 			// The production implementation contains a fixed timestamp, unique
+ 46 			// for each release, generated by the releaser.
+ 47 			// (Base 36 value of each component of YYMMDDHH - 4 chars total - e.g. 87bm == 08071122)
+ 48 			timestamp : '95MI',
+ 50
+ 51 			/**
+ 52 			 * Contains the CKEditor version number.
+ 53 			 * @type String
+ 54 			 * @example
+ 55 			 * alert( CKEDITOR.version );  // e.g. 'CKEditor 3.0 Beta'
+ 56 			 */
+ 57 			version : '3.0 RC',
+ 58
+ 59 			/**
+ 60 			 * Contains the CKEditor revision number.
+ 61 			 * Revision number is incremented automatically after each modification of CKEditor source code.
+ 62 			 * @type String
+ 63 			 * @example
+ 64 			 * alert( CKEDITOR.revision );  // e.g. '3975'
+ 65 			 */
+ 66 			revision : '3753',
+ 67
+ 68 			/**
+ 69 			 * Private object used to hold core stuff. It should not be used out of
+ 70 			 * the API code as properties defined here may change at any time
+ 71 			 * without notice.
+ 72 			 * @private
+ 73 			 */
+ 74 			_ : {},
+ 75
+ 76 			/**
+ 77 			 * Indicates the API loading status. The following status are available:
+ 78 			 *		<ul>
+ 79 			 *			<li><b>unloaded</b>: the API is not yet loaded.</li>
+ 80 			 *			<li><b>basic_loaded</b>: the basic API features are available.</li>
+ 81 			 *			<li><b>basic_ready</b>: the basic API is ready to load the full core code.</li>
+ 82 			 *			<li><b>loading</b>: the full API is being loaded.</li>
+ 83 			 *			<li><b>ready</b>: the API can be fully used.</li>
+ 84 			 *		</ul>
+ 85 			 * @type String
+ 86 			 * @example
+ 87 			 * if ( <b>CKEDITOR.status</b> == 'ready' )
+ 88 			 * {
+ 89 			 *     // The API can now be fully used.
+ 90 			 * }
+ 91 			 */
+ 92 			status : 'unloaded',
+ 93
+ 94 			/**
+ 95 			 * Contains the full URL for the CKEditor installation directory.
+ 96 			 * It's possible to manually provide the base path by setting a
+ 97 			 * global variable named CKEDITOR_BASEPATH. This global variable
+ 98 			 * must be set "before" the editor script loading.
+ 99 			 * @type String
+100 			 * @example
+101 			 * alert( <b>CKEDITOR.basePath</b> );  // "http://www.example.com/ckeditor/" (e.g.)
+102 			 */
+103 			basePath : (function()
+104 			{
+105 				// ATTENTION: fixes on this code must be ported to
+106 				// var basePath in "core/loader.js".
+107
+108 				// Find out the editor directory path, based on its <script> tag.
+109 				var path = window.CKEDITOR_BASEPATH || '';
+110
+111 				if ( !path )
+112 				{
+113 					var scripts = document.getElementsByTagName( 'script' );
+114
+115 					for ( var i = 0 ; i < scripts.length ; i++ )
+116 					{
+117 						var match = scripts[i].src.match( /(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i );
+118
+119 						if ( match )
+120 						{
+121 							path = match[1];
+122 							break;
+123 						}
+124 					}
+125 				}
+126
+127 				// In IE (only) the script.src string is the raw valued entered in the
+128 				// HTML. Other browsers return the full resolved URL instead.
+129 				if ( path.indexOf('://') == -1 )
+130 				{
+131 					// Absolute path.
+132 					if ( path.indexOf( '/' ) === 0 )
+133 						path = location.href.match( /^.*?:\/\/[^\/]*/ )[0] + path;
+134 					// Relative path.
+135 					else
+136 						path = location.href.match( /^[^\?]*\/(?:)/ )[0] + path;
+137 				}
+138
+139 				return path;
+140 			})(),
+141
+142 			/**
+143 			 * Gets the full URL for CKEditor resources. By default, URLs
+144 			 * returned by this function contains a querystring parameter ("t")
+145 			 * set to the {@link CKEDITOR.timestamp} value.
+146 			 * It's possible to provide a custom implementation to this
+147 			 * function by setting a global variable named CKEDITOR_GETURL.
+148 			 * This global variable must be set "before" the editor script
+149 			 * loading. If the custom implementation returns nothing, the
+150 			 * default implementation is used.
+151 			 * @returns {String} The full URL.
+152 			 * @example
+153 			 * // e.g. http://www.example.com/ckeditor/skins/default/editor.css?t=87dm
+154 			 * alert( CKEDITOR.getUrl( 'skins/default/editor.css' ) );
+155 			 * @example
+156 			 * // e.g. http://www.example.com/skins/default/editor.css?t=87dm
+157 			 * alert( CKEDITOR.getUrl( '/skins/default/editor.css' ) );
+158 			 * @example
+159 			 * // e.g. http://www.somesite.com/skins/default/editor.css?t=87dm
+160 			 * alert( CKEDITOR.getUrl( 'http://www.somesite.com/skins/default/editor.css' ) );
+161 			 */
+162 			getUrl : function( resource )
+163 			{
+164 				// If this is not a full or absolute path.
+165 				if ( resource.indexOf('://') == -1 && resource.indexOf( '/' ) !== 0 )
+166 					resource = this.basePath + resource;
+167
+168 				// Add the timestamp, except for directories.
+169 				if ( this.timestamp && resource.charAt( resource.length - 1 ) != '/' )
+170 					resource += ( resource.indexOf( '?' ) >= 0 ? '&' : '?' ) + 't=' + this.timestamp;
+171
+172 				return resource;
+173 			}
+174 		};
+175
+176 		// Make it possible to override the getUrl function with a custom
+177 		// implementation pointing to a global named CKEDITOR_GETURL.
+178 		var newGetUrl = window.CKEDITOR_GETURL;
+179 		if ( newGetUrl )
+180 		{
+181 			var originalGetUrl = CKEDITOR.getUrl;
+182 			CKEDITOR.getUrl = function ( resource )
+183 			{
+184 				return newGetUrl.call( CKEDITOR, resource ) ||
+185 					originalGetUrl.call( CKEDITOR, resource );
+186 			};
+187 		}
+188
+189 		return CKEDITOR;
+190 	})();
+191 }
+192
+193 // PACKAGER_RENAME( CKEDITOR )
+194 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor_basic.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor_basic.js.html new file mode 100644 index 000000000..1bd8bc706 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ckeditor_basic.js.html @@ -0,0 +1,249 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Contains the second part of the {@link CKEDITOR} object
+  8  *		definition, which defines the basic editor features to be available in
+  9  *		the root ckeditor_basic.js file.
+ 10  */
+ 11
+ 12 if ( CKEDITOR.status == 'unloaded' )
+ 13 {
+ 14 	(function()
+ 15 	{
+ 16 		CKEDITOR.event.implementOn( CKEDITOR );
+ 17
+ 18 		/**
+ 19 		 * Forces the full CKEditor core code, in the case only the basic code has been
+ 20 		 * loaded (ckeditor_basic.js). This method self-destroys (becomes undefined) in
+ 21 		 * the first call or as soon as the full code is available.
+ 22 		 * @example
+ 23 		 * // Check if the full core code has been loaded and load it.
+ 24 		 * if ( CKEDITOR.loadFullCore )
+ 25 		 *     <b>CKEDITOR.loadFullCore()</b>;
+ 26 		 */
+ 27 		CKEDITOR.loadFullCore = function()
+ 28 		{
+ 29 			// If not the basic code is not ready it, just mark it to be loaded.
+ 30 			if ( CKEDITOR.status != 'basic_ready' )
+ 31 			{
+ 32 				CKEDITOR.loadFullCore._load = true;
+ 33 				return;
+ 34 			}
+ 35
+ 36 			// Destroy this function.
+ 37 			delete CKEDITOR.loadFullCore;
+ 38
+ 39 			// Append the script to the head.
+ 40 			var script = document.createElement( 'script' );
+ 41 			script.type = 'text/javascript';
+ 42 			script.src = CKEDITOR.basePath + 'ckeditor.js';
+ 44
+ 45 			document.getElementsByTagName( 'head' )[0].appendChild( script );
+ 46 		};
+ 47
+ 48 		/**
+ 49 		 * The time to wait (in seconds) to load the full editor code after the
+ 50 		 * page load, if the "ckeditor_basic" file is used. If set to zero, the
+ 51 		 * editor is loaded on demand, as soon as an instance is created.
+ 52 		 *
+ 53 		 * This value must be set on the page before the page load completion.
+ 54 		 * @type Number
+ 55 		 * @default 0 (zero)
+ 56 		 * @example
+ 57 		 * // Loads the full source after five seconds.
+ 58 		 * CKEDITOR.loadFullCoreTimeout = 5;
+ 59 		 */
+ 60 		CKEDITOR.loadFullCoreTimeout = 0;
+ 61
+ 62 		/**
+ 63 		 * The class name used to identify <textarea> elements to be replace
+ 64 		 * by CKEditor instances.
+ 65 		 * @type String
+ 66 		 * @default 'ckeditor'
+ 67 		 * @example
+ 68 		 * <b>CKEDITOR.replaceClass</b> = 'rich_editor';
+ 69 		 */
+ 70 		CKEDITOR.replaceClass = 'ckeditor';
+ 71
+ 72 		/**
+ 73 		 * Enables the replacement of all textareas with class name matching
+ 74 		 * {@link CKEDITOR.replaceClass}.
+ 75 		 * @type Boolean
+ 76 		 * @default true
+ 77 		 * @example
+ 78 		 * // Disable the auto-replace feature.
+ 79 		 * <b>CKEDITOR.replaceByClassEnabled</b> = false;
+ 80 		 */
+ 81 		CKEDITOR.replaceByClassEnabled = true;
+ 82
+ 83 		var createInstance = function( elementOrIdOrName, config, creationFunction )
+ 84 		{
+ 85 			if ( CKEDITOR.env.isCompatible )
+ 86 			{
+ 87 				// Load the full core.
+ 88 				if ( CKEDITOR.loadFullCore )
+ 89 					CKEDITOR.loadFullCore();
+ 90
+ 91 				var editor = creationFunction( elementOrIdOrName, config );
+ 92 				CKEDITOR.add( editor );
+ 93 				return editor;
+ 94 			}
+ 95
+ 96 			return null;
+ 97 		};
+ 98
+ 99 		/**
+100 		 * Replaces a <textarea> or a DOM element (DIV) with a CKEditor
+101 		 * instance. For textareas, the initial value in the editor will be the
+102 		 * textarea value. For DOM elements, their innerHTML will be used
+103 		 * instead. We recommend using TEXTAREA and DIV elements only.
+104 		 * @param {Object|String} elementOrIdOrName The DOM element (textarea), its
+105 		 *		ID or name.
+106 		 * @param {Object} [config] The specific configurations to apply to this
+107 		 *		editor instance. Configurations set here will override global CKEditor
+108 		 *		settings.
+109 		 * @returns {CKEDITOR.editor} The editor instance created.
+110 		 * @example
+111 		 * <textarea id="myfield" name="myfield"><:/textarea>
+112 		 * ...
+113 		 * <b>CKEDITOR.replace( 'myfield' )</b>;
+114 		 * @example
+115 		 * var textarea = document.body.appendChild( document.createElement( 'textarea' ) );
+116 		 * <b>CKEDITOR.replace( textarea )</b>;
+117 		 */
+118 		CKEDITOR.replace = function( elementOrIdOrName, config )
+119 		{
+120 			return createInstance( elementOrIdOrName, config, CKEDITOR.editor.replace );
+121 		};
+122
+123 		/**
+124 		 * Creates a new editor instance inside a specific DOM element.
+125 		 * @param {Object|String} elementOrId The DOM element or its ID.
+126 		 * @param {Object} [config] The specific configurations to apply to this
+127 		 *		editor instance. Configurations set here will override global CKEditor
+128 		 *		settings.
+129 		 * @returns {CKEDITOR.editor} The editor instance created.
+130 		 * @example
+131 		 * <div id="editorSpace"><:/div>
+132 		 * ...
+133 		 * <b>CKEDITOR.appendTo( 'editorSpace' )</b>;
+134 		 */
+135 		CKEDITOR.appendTo = function( elementOrId, config )
+136 		{
+137 			return createInstance( elementOrId, config, CKEDITOR.editor.appendTo );
+138 		};
+139
+140 		/**
+141 		 * @ignore
+142 		 * Documented at ckeditor.js.
+143 		 */
+144 		CKEDITOR.add = function( editor )
+145 		{
+146 			// For now, just put the editor in the pending list. It will be
+147 			// processed as soon as the full code gets loaded.
+148 			var pending = this._.pending || ( this._.pending = [] );
+149 			pending.push( editor );
+150 		};
+151
+152 		/**
+153 		 * Replace all <textarea> elements available in the document with
+154 		 * editor instances.
+155 		 * @example
+156 		 * // Replace all <textarea> elements in the page.
+157 		 * CKEDITOR.replaceAll();
+158 		 * @example
+159 		 * // Replace all <textarea class="myClassName"> elements in the page.
+160 		 * CKEDITOR.replaceAll( 'myClassName' );
+161 		 * @example
+162 		 * // Selectively replace <textarea> elements, based on custom assertions.
+163 		 * CKEDITOR.replaceAll( function( textarea, config )
+164 		 *     {
+165 		 *         // Custom code to evaluate the replace, returning false
+166 		 *         // if it must not be done.
+167 		 *         // It also passes the "config" parameter, so the
+168 		 *         // developer can customize the instance.
+169 		 *     } );
+170 		 */
+171 		CKEDITOR.replaceAll = function()
+172 		{
+173 			var textareas = document.getElementsByTagName( 'textarea' );
+174
+175 			for ( var i = 0 ; i < textareas.length ; i++ )
+176 			{
+177 				var config = null;
+178 				var textarea = textareas[i];
+179 				var name = textarea.name;
+180
+181 				// The "name" and/or "id" attribute must exist.
+182 				if ( !textarea.name && !textarea.id )
+183 					continue;
+184
+185 				if ( typeof arguments[0] == 'string' )
+186 				{
+187 					// The textarea class name could be passed as the function
+188 					// parameter.
+189
+190 					var classRegex = new RegExp( '(?:^| )' + arguments[0] + '(?:$| )' );
+191
+192 					if ( !classRegex.test( textarea.className ) )
+193 						continue;
+194 				}
+195 				else if ( typeof arguments[0] == 'function' )
+196 				{
+197 					// An assertion function could be passed as the function parameter.
+198 					// It must explicitly return "false" to ignore a specific <textarea>.
+199 					config = {};
+200 					if ( arguments[0]( textarea, config ) === false )
+201 						continue;
+202 				}
+203
+204 				this.replace( textarea, config );
+205 			}
+206 		};
+207
+208 		(function()
+209 		{
+210 			var onload = function()
+211 			{
+212 				var loadFullCore = CKEDITOR.loadFullCore,
+213 					loadFullCoreTimeout = CKEDITOR.loadFullCoreTimeout;
+214
+215 				// Replace all textareas with the default class name.
+216 				if ( CKEDITOR.replaceByClassEnabled )
+217 					CKEDITOR.replaceAll( CKEDITOR.replaceClass );
+218
+219 				CKEDITOR.status = 'basic_ready';
+220
+221 				if ( loadFullCore && loadFullCore._load )
+222 					loadFullCore();
+223 				else if ( loadFullCoreTimeout )
+224 				{
+225 					setTimeout( function()
+226 						{
+227 							if ( CKEDITOR.loadFullCore )
+228 								CKEDITOR.loadFullCore();
+229 						}
+230 						, loadFullCoreTimeout * 1000 );
+231 				}
+232 			};
+233
+234 			if ( window.addEventListener )
+235 				window.addEventListener( 'load', onload, false );
+236 			else if ( window.attachEvent )
+237 				window.attachEvent( 'onload', onload );
+238 		})();
+239
+240 		CKEDITOR.status = 'basic_loaded';
+241 	})();
+242 }
+243 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_command.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_command.js.html new file mode 100644 index 000000000..f7b04f8f2 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_command.js.html @@ -0,0 +1,78 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.command = function( editor, commandDefinition )
+  7 {
+  8 	this.exec = function( data )
+  9 	{
+ 10 		if ( this.state == CKEDITOR.TRISTATE_DISABLED )
+ 11 			return false;
+ 12
+ 13 		// The editor will always have the focus when executing a command.
+ 14 		editor.focus();
+ 15
+ 16 		return ( commandDefinition.exec.call( this, editor, data ) !== false );
+ 17 	};
+ 18
+ 19 	CKEDITOR.tools.extend( this, commandDefinition,
+ 20 		// Defaults
+ 21 		{
+ 22 			modes : { wysiwyg : 1 },
+ 23 			state : CKEDITOR.TRISTATE_OFF
+ 24 		});
+ 25
+ 26 	// Call the CKEDITOR.event constructor to initialize this instance.
+ 27 	CKEDITOR.event.call( this );
+ 28 };
+ 29
+ 30 CKEDITOR.command.prototype =
+ 31 {
+ 32 	enable : function()
+ 33 	{
+ 34 		if ( this.state == CKEDITOR.TRISTATE_DISABLED )
+ 35 			this.setState( ( !this.preserveState || ( typeof this.previousState == 'undefined' ) ) ? CKEDITOR.TRISTATE_OFF : this.previousState );
+ 36 	},
+ 37
+ 38 	disable : function()
+ 39 	{
+ 40 		this.setState( CKEDITOR.TRISTATE_DISABLED );
+ 41 	},
+ 42
+ 43 	setState : function( newState )
+ 44 	{
+ 45 		// Do nothing if there is no state change.
+ 46 		if ( this.state == newState )
+ 47 			return false;
+ 48
+ 49 		this.previousState = this.state;
+ 50
+ 51 		// Set the new state.
+ 52 		this.state = newState;
+ 53
+ 54 		// Fire the "state" event, so other parts of the code can react to the
+ 55 		// change.
+ 56 		this.fire( 'state' );
+ 57
+ 58 		return true;
+ 59 	},
+ 60
+ 61 	toggleState : function()
+ 62 	{
+ 63 		if ( this.state == CKEDITOR.TRISTATE_OFF )
+ 64 			this.setState( CKEDITOR.TRISTATE_ON );
+ 65 		else if ( this.state == CKEDITOR.TRISTATE_ON )
+ 66 			this.setState( CKEDITOR.TRISTATE_OFF );
+ 67 	}
+ 68 };
+ 69
+ 70 CKEDITOR.event.implementOn( CKEDITOR.command.prototype, true );
+ 71 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_commanddefinition.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_commanddefinition.js.html new file mode 100644 index 000000000..8313fbf38 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_commanddefinition.js.html @@ -0,0 +1,80 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the "virtual" {@link CKEDITOR.commandDefinition} class,
+  8  *		which contains the defintion of a command. This file is for
+  9  *		documentation purposes only.
+ 10  */
+ 11
+ 12 /**
+ 13  * (Virtual Class) Do not call this constructor. This class is not really part
+ 14  *		of the API. It just illustrates the features of command objects to be
+ 15  *		passed to the {@link CKEDITOR.editor.prototype.addCommand} function.
+ 16  * @name CKEDITOR.commandDefinition
+ 17  * @constructor
+ 18  * @example
+ 19  */
+ 20
+ 21  /**
+ 22  * Executes the command.
+ 23  * @name CKEDITOR.commandDefinition.prototype.exec
+ 24  * @function
+ 25  * @param {CKEDITOR.editor} editor The editor within which run the command.
+ 26  * @param {Object} [data] Additional data to be used to execute the command.
+ 27  * @returns {Boolean} Whether the command has been successfully executed.
+ 28  *		Defaults to "true", if nothing is returned.
+ 29  * @example
+ 30  * editorInstance.addCommand( 'sample',
+ 31  * {
+ 32  *     exec : function( editor )
+ 33  *     {
+ 34  *         alert( 'Executing a command for the editor name "' + editor.name + '"!' );
+ 35  *     }
+ 36  * });
+ 37  */
+ 38
+ 39 /**
+ 40  * Whether the command need to be hooked into the redo/undo system.
+ 41  * @name  CKEDITOR.commandDefinition.canUndo
+ 42  * @type {Boolean} If not defined or 'true' both hook into undo system, set it
+ 43  *		to 'false' explicitly  keep it out.
+ 44  * @field
+ 45  * @example
+ 46  * editorInstance.addCommand( 'alertName',
+ 47  * {
+ 48  *     exec : function( editor )
+ 49  *     {
+ 50  *         alert( editor.name );
+ 51  *     },
+ 52  *     canUndo : false    // No support for undo/redo
+ 53  * });
+ 54  */
+ 55
+ 56 /**
+ 57  * Whether the command is asynchronous, which means the 'afterCommandExec' event
+ 58  * will be fired by the command itself manually, and the 'exec' function return value
+ 59  * of this command is not to be returned.
+ 60  * @name  CKEDITOR.commandDefinition.async
+ 61  * @type {Boolean} If defined as 'true', the command is asynchronous.
+ 62  * @example
+ 63  * editorInstance.addCommand( 'alertName',
+ 64  * {
+ 65  *     exec : function( editor )
+ 66  *     {
+ 67  *         // Asynchronous operation below.
+ 68  *         CKEDITOR.ajax.loadXml( 'data.xml' );
+ 69  *     },
+ 70  *     async : true    // The command need some time to complete after exec function returns.
+ 71  * });
+ 72  */
+ 73 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_config.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_config.js.html new file mode 100644 index 000000000..03c074f96 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_config.js.html @@ -0,0 +1,243 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.config} object, which holds the
+  8  * default configuration settings.
+  9  */
+ 10
+ 11 CKEDITOR.ENTER_P	= 1;
+ 12 CKEDITOR.ENTER_BR	= 2;
+ 13 CKEDITOR.ENTER_DIV	= 3;
+ 14
+ 15 /**
+ 16  * Holds the default configuration settings. Changes to this object are
+ 17  * reflected in all editor instances, if not specificaly specified for those
+ 18  * instances.
+ 19  * @namespace
+ 20  * @example
+ 21  * // All editor created after the following setting will not load custom
+ 22  * // configuration files.
+ 23  * CKEDITOR.config.customConfig = '';
+ 24  */
+ 25 CKEDITOR.config =
+ 26 {
+ 27 	/**
+ 28 	 * The URL path for the custom configuration file to be loaded. If not
+ 29 	 * overloaded with inline configurations, it defaults to the "config.js"
+ 30 	 * file present in the root of the CKEditor installation directory.<br /><br />
+ 31 	 *
+ 32 	 * CKEditor will recursively load custom configuration files defined inside
+ 33 	 * other custom configuration files.
+ 34 	 * @type String
+ 35 	 * @default '<CKEditor folder>/config.js'
+ 36 	 * @example
+ 37 	 * // Load a specific configuration file.
+ 38 	 * CKEDITOR.replace( 'myfiled', { customConfig : '/myconfig.js' } );
+ 39 	 * @example
+ 40 	 * // Do not load any custom configuration file.
+ 41 	 * CKEDITOR.replace( 'myfiled', { customConfig : '' } );
+ 42 	 */
+ 43 	customConfig : CKEDITOR.getUrl( 'config.js' ),
+ 44
+ 45 	autoUpdateElement : true,
+ 46
+ 47 	/**
+ 48 	 * The base href URL used to resolve relative and absolute URLs in the
+ 49 	 * editor content.
+ 50 	 * @type String
+ 51 	 * @default '' (empty string)
+ 52 	 * @example
+ 53 	 * config.baseHref = 'http://www.example.com/path/';
+ 54 	 */
+ 55 	baseHref : '',
+ 56
+ 57 	/**
+ 58 	 * The CSS file to be used to apply style to the contents. It should
+ 59 	 * reflect the CSS used in the final pages where the contents are to be
+ 60 	 * used.
+ 61 	 * @type String
+ 62 	 * @default '<CKEditor folder>/contents.css'
+ 63 	 * @example
+ 64 	 * config.contentsCss = '/css/mysitestyles.css';
+ 65 	 */
+ 66 	contentsCss : CKEDITOR.basePath + 'contents.css',
+ 67
+ 68 	/**
+ 69 	 * The writting direction of the language used to write the editor
+ 70 	 * contents. Allowed values are 'ltr' for Left-To-Right language (like
+ 71 	 * English), or 'rtl' for Right-To-Left languages (like Arabic).
+ 72 	 * @default 'ltr'
+ 73 	 * @type String
+ 74 	 * @example
+ 75 	 * config.contentsLangDirection = 'rtl';
+ 76 	 */
+ 77 	contentsLangDirection : 'ltr',
+ 78
+ 79 	/**
+ 80 	 * The user interface language localization to use. If empty, the editor
+ 81 	 * automatically localize the editor to the user language, if supported,
+ 82 	 * otherwise the [@link #defaultLanguage] language is used.
+ 83 	 * @default true
+ 84 	 * @type Boolean
+ 85 	 * @example
+ 86 	 * // Load the German interface.
+ 87 	 * config.language = 'de';
+ 88 	 */
+ 89 	language : '',
+ 90
+ 91 	/**
+ 92 	 * The language to be used if [@link #language] is left empty and it's not
+ 93 	 * possible to localize the editor to the user language.
+ 94 	 * @default 'en'
+ 95 	 * @type String
+ 96 	 * @example
+ 97 	 * config.defaultLanguage = 'it';
+ 98 	 */
+ 99 	defaultLanguage : 'en',
+100
+101 	enterMode : CKEDITOR.ENTER_P,
+102 	shiftEnterMode : CKEDITOR.ENTER_BR,
+103
+104 	/**
+105 	 * A comma separated list of plugins that are not related to editor
+106 	 * instances. Reserved to plugins that extend the core code only.<br /><br />
+107 	 *
+108 	 * There are no ways to override this setting, except by editing the source
+109 	 * code of CKEditor (_source/core/config.js).
+110 	 * @type String
+111 	 * @example
+112 	 */
+113 	corePlugins : '',
+114
+115 	/**
+116 	 * Sets the doctype to be used when loading the editor content as HTML.
+117 	 * @type String
+118 	 * @default '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
+119 	 * @example
+120 	 * // Set the doctype to the HTML 4 (quirks) mode.
+121 	 * config.docType = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';
+122 	 */
+123 	docType : '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
+124
+125 	/**
+126 	 * Indicates whether the contents to be edited are being inputted as a full
+127 	 * HTML page. A full page includes the <html>, <head> and
+128 	 * <body> tags. The final output will also reflect this setting,
+129 	 * including the <body> contents only if this setting is disabled.
+130 	 * @type Boolean
+131 	 * @default false
+132 	 * @example
+133 	 * config.fullPage = true;
+134 	 */
+135 	fullPage : false,
+136
+137 	/**
+138 	 * The editor height, in CSS size format or pixel integer.
+139 	 * @type String|Number
+140 	 * @default '200'
+141 	 * @example
+142 	 */
+143 	height : 200,
+144
+145 	/**
+146 	 * Comma separated list of plugins to load and initialize for an editor
+147 	 * instance.
+148 	 * @type String
+149 	 * @example
+150 	 * config.plugins = 'basicstyles,button,htmldataprocessor,toolbar,wysiwygarea';
+151 	 */
+152 	plugins : 'about,basicstyles,blockquote,button,clipboard,colorbutton,contextmenu,elementspath,enterkey,entities,filebrowser,find,flash,font,format,forms,horizontalrule,htmldataprocessor,image,indent,justify,keystrokes,link,list,maximize,newpage,pagebreak,pastefromword,pastetext,popup,preview,print,removeformat,resize,save,scayt,smiley,showblocks,sourcearea,stylescombo,table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc',
+153
+154 	/**
+155 	 * List of additional plugins to be loaded. This is a tool setting which
+156 	 * makes it easier to add new plugins, whithout having to touch and
+157 	 * possibly breaking the <i>plugins</i> setting.
+158 	 * @type String
+159 	 * @example
+160 	 * config.extraPlugins = 'myplugin,anotherplugin';
+161 	 */
+162 	extraPlugins : '',
+163
+164 	/**
+165 	 * List of plugins that must not be loaded. This is a tool setting which
+166 	 * makes it easier to avoid loading plugins definied in the <i>plugins</i>
+167 	 * setting, whithout having to touch and possibly breaking it.
+168 	 * @type String
+169 	 * @example
+170 	 * config.removePlugins = 'elementspath,save,font';
+171 	 */
+172 	removePlugins : '',
+173
+174 	/**
+175 	 * List of regular expressions to be executed over the input HTML,
+176 	 * indicating code that must stay untouched.
+177 	 * @type Array
+178 	 * @example
+179 	 * config.protectedSource.push( /<\?[\s\S]*?\?>/g );   // PHP Code
+180 	 * config.protectedSource.push( /<%[\s\S]*?%>/g );   // ASP Code
+181 	 * config.protectedSource.push( /(<asp:[^\>]+>[\s|\S]*?<\/asp:[^\>]+>)|(<asp:[^\>]+\/>)/gi );   // ASP.Net Code
+182 	 */
+183 	protectedSource : [],
+184
+185 	/**
+186 	 * The editor tabindex value.
+187 	 * @type Number
+188 	 * @default 0 (zero)
+189 	 * @example
+190 	 * config.tabIndex = 1;
+191 	 */
+192 	tabIndex : 0,
+193
+194 	/**
+195 	 * The theme to be used to build the UI.
+196 	 * @type String
+197 	 * @default 'default'
+198 	 * @see CKEDITOR.config.skin
+199 	 * @example
+200 	 * config.theme = 'default';
+201 	 */
+202 	theme : 'default',
+203
+204 	/**
+205 	 * The skin to load. It may be the name of the skin folder inside the
+206 	 * editor installation path, or the name and the path separated by a comma.
+207 	 * @type String
+208 	 * @default 'default'
+209 	 * @example
+210 	 * config.skin = 'v2';
+211 	 * @example
+212 	 * config.skin = 'myskin,/customstuff/myskin/';
+213 	 */
+214 	skin : 'kama',
+215
+216 	/**
+217 	 * The editor width in CSS size format or pixel integer.
+218 	 * @type String|Number
+219 	 * @default '100%'
+220 	 * @example
+221 	 */
+222 	width : '100%',
+223
+224 	/**
+225 	 * The base Z-index for floating dialogs and popups.
+226 	 * @type Number
+227 	 * @default 10000
+228 	 * @example
+229 	 * config.baseFloatZIndex = 2000
+230 	 */
+231 	baseFloatZIndex : 10000
+232
+233 };
+234
+235 // PACKAGER_RENAME( CKEDITOR.config )
+236 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom.js.html new file mode 100644 index 000000000..7f8407d2e --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom.js.html @@ -0,0 +1,29 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.dom} object, which contains DOM
+  8  *		manipulation objects and function.
+  9  */
+ 10
+ 11 /**
+ 12  * DOM manipulation objects and function.<br /><br />
+ 13  * @see CKEDITOR.dom.element
+ 14  * @see CKEDITOR.dom.node
+ 15  * @namespace
+ 16  * @example
+ 17  */
+ 18 CKEDITOR.dom =
+ 19 {};
+ 20
+ 21 // PACKAGER_RENAME( CKEDITOR.dom )
+ 22 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_document.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_document.js.html new file mode 100644 index 000000000..f7df8fbb2 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_document.js.html @@ -0,0 +1,218 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.dom.document} class, which
+  8  *		represents a DOM document.
+  9  */
+ 10
+ 11 /**
+ 12  * Represents a DOM document.
+ 13  * @constructor
+ 14  * @augments CKEDITOR.dom.domObject
+ 15  * @param {Object} domDocument A native DOM document.
+ 16  * @example
+ 17  * var document = new CKEDITOR.dom.document( document );
+ 18  */
+ 19 CKEDITOR.dom.document = function( domDocument )
+ 20 {
+ 21 	CKEDITOR.dom.domObject.call( this, domDocument );
+ 22 };
+ 23
+ 24 // PACKAGER_RENAME( CKEDITOR.dom.document )
+ 25
+ 26 CKEDITOR.dom.document.prototype = new CKEDITOR.dom.domObject();
+ 27
+ 28 CKEDITOR.tools.extend( CKEDITOR.dom.document.prototype,
+ 29 	/** @lends CKEDITOR.dom.document.prototype */
+ 30 	{
+ 31 		/**
+ 32 		 * Appends a CSS file to the document.
+ 33 		 * @param {String} cssFileUrl The CSS file URL.
+ 34 		 * @example
+ 35 		 * <b>CKEDITOR.document.appendStyleSheet( '/mystyles.css' )</b>;
+ 36 		 */
+ 37 		appendStyleSheet : function( cssFileUrl )
+ 38 		{
+ 39 			if ( this.$.createStyleSheet )
+ 40 				this.$.createStyleSheet( cssFileUrl );
+ 41 			else
+ 42 			{
+ 43 				var link = new CKEDITOR.dom.element( 'link' );
+ 44 				link.setAttributes(
+ 45 					{
+ 46 						rel		:'stylesheet',
+ 47 						type	: 'text/css',
+ 48 						href	: cssFileUrl
+ 49 					});
+ 50
+ 51 				this.getHead().append( link );
+ 52 			}
+ 53 		},
+ 54
+ 55 		createElement : function( name, attribsAndStyles )
+ 56 		{
+ 57 			var element = new CKEDITOR.dom.element( name, this );
+ 58
+ 59 			if ( attribsAndStyles )
+ 60 			{
+ 61 				if ( attribsAndStyles.attributes )
+ 62 					element.setAttributes( attribsAndStyles.attributes );
+ 63
+ 64 				if ( attribsAndStyles.styles )
+ 65 					element.setStyles( attribsAndStyles.styles );
+ 66 			}
+ 67
+ 68 			return element;
+ 69 		},
+ 70
+ 71 		createText : function( text )
+ 72 		{
+ 73 			return new CKEDITOR.dom.text( text, this );
+ 74 		},
+ 75
+ 76 		focus : function()
+ 77 		{
+ 78 			this.getWindow().focus();
+ 79 		},
+ 80
+ 81 		/**
+ 82 		 * Gets and element based on its id.
+ 83 		 * @param {String} elementId The element id.
+ 84 		 * @returns {CKEDITOR.dom.element} The element instance, or null if not found.
+ 85 		 * @example
+ 86 		 * var element = <b>CKEDITOR.document.getById( 'myElement' )</b>;
+ 87 		 * alert( element.getId() );  // "myElement"
+ 88 		 */
+ 89 		getById : function( elementId )
+ 90 		{
+ 91 			var $ = this.$.getElementById( elementId );
+ 92 			return $ ? new CKEDITOR.dom.element( $ ) : null;
+ 93 		},
+ 94
+ 95 		getByAddress : function( address, normalized )
+ 96 		{
+ 97 			var $ = this.$.documentElement;
+ 98
+ 99 			for ( var i = 0 ; $ && i < address.length ; i++ )
+100 			{
+101 				var target = address[ i ];
+102
+103 				if ( !normalized )
+104 				{
+105 					$ = $.childNodes[ target ];
+106 					continue;
+107 				}
+108
+109 				var currentIndex = -1;
+110
+111 				for (var j = 0 ; j < $.childNodes.length ; j++ )
+112 				{
+113 					var candidate = $.childNodes[ j ];
+114
+115 					if ( normalized === true &&
+116 							candidate.nodeType == 3 &&
+117 							candidate.previousSibling &&
+118 							candidate.previousSibling.nodeType == 3 )
+119 					{
+120 						continue;
+121 					}
+122
+123 					currentIndex++;
+124
+125 					if ( currentIndex == target )
+126 					{
+127 						$ = candidate;
+128 						break;
+129 					}
+130 				}
+131 			}
+132
+133 			return $ ? new CKEDITOR.dom.node( $ ) : null;
+134 		},
+135
+136 		getElementsByTag : function( tagName, namespace )
+137 		{
+138 			if ( !CKEDITOR.env.ie && namespace )
+139 				tagName = namespace + ':' + tagName;
+140 			return new CKEDITOR.dom.nodeList( this.$.getElementsByTagName( tagName ) );
+141 		},
+142
+143 		/**
+144 		 * Gets the <head> element for this document.
+145 		 * @returns {CKEDITOR.dom.element} The <head> element.
+146 		 * @example
+147 		 * var element = <b>CKEDITOR.document.getHead()</b>;
+148 		 * alert( element.getName() );  // "head"
+149 		 */
+150 		getHead : function()
+151 		{
+152 			var head = this.$.getElementsByTagName( 'head' )[0];
+153 			head = new CKEDITOR.dom.element( head );
+154
+155 			return (
+156 			/** @ignore */
+157 			this.getHead = function()
+158 				{
+159 					return head;
+160 				})();
+161 		},
+162
+163 		/**
+164 		 * Gets the <body> element for this document.
+165 		 * @returns {CKEDITOR.dom.element} The <body> element.
+166 		 * @example
+167 		 * var element = <b>CKEDITOR.document.getBody()</b>;
+168 		 * alert( element.getName() );  // "body"
+169 		 */
+170 		getBody : function()
+171 		{
+172 			var body = new CKEDITOR.dom.element( this.$.body );
+173
+174 			return (
+175 			/** @ignore */
+176 			this.getBody = function()
+177 				{
+178 					return body;
+179 				})();
+180 		},
+181
+182 		getDocumentElement : function()
+183 		{
+184 			var documentElement = new CKEDITOR.dom.element( this.$.documentElement );
+185
+186 			return (
+187 			/** @ignore */
+188 			this.getDocumentElement = function()
+189 				{
+190 					return documentElement;
+191 				})();
+192 		},
+193
+194 		/**
+195 		 * Gets the window object that holds this document.
+196 		 * @returns {CKEDITOR.dom.window} The window object.
+197 		 * @example
+198 		 */
+199 		getWindow : function()
+200 		{
+201 			var win = new CKEDITOR.dom.window( this.$.parentWindow || this.$.defaultView );
+202
+203 			return (
+204 			/** @ignore */
+205 			this.getWindow = function()
+206 				{
+207 					return win;
+208 				})();
+209 		}
+210 	});
+211 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_documentfragment.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_documentfragment.js.html new file mode 100644 index 000000000..c6a31a9ef --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_documentfragment.js.html @@ -0,0 +1,55 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5 /**
+  6  * DocumentFragment is a "lightweight" or "minimal" Document object. It is
+  7  * commonly used to extract a portion of a document's tree or to create a new
+  8  * fragment of a document. Various operations may take DocumentFragment objects
+  9  * as arguments and results in all the child nodes of the DocumentFragment being
+ 10  * moved to the child list of this node.
+ 11  *
+ 12  * @param {Object} ownerDocument
+ 13  */
+ 14 CKEDITOR.dom.documentFragment = function( ownerDocument )
+ 15 {
+ 16 	ownerDocument = ownerDocument || CKEDITOR.document;
+ 17 	this.$ = ownerDocument.$.createDocumentFragment();
+ 18 };
+ 19
+ 20 CKEDITOR.tools.extend( CKEDITOR.dom.documentFragment.prototype,
+ 21 	CKEDITOR.dom.element.prototype,
+ 22 	{
+ 23 		type : CKEDITOR.NODE_DOCUMENT_FRAGMENT,
+ 24 		insertAfterNode : function( node )
+ 25 		{
+ 26 			node = node.$;
+ 27 			node.parentNode.insertBefore( this.$, node.nextSibling );
+ 28 		}
+ 29 	},
+ 30 	true,
+ 31 	{
+ 32 		'append' : 1,
+ 33 		'getFirst' : 1,
+ 34 		'getLast' : 1,
+ 35 		'appendTo' : 1,
+ 36 		'moveChildren' : 1,
+ 37 		'insertBefore' : 1,
+ 38 		'insertAfterNode' : 1,
+ 39 		'replace' : 1,
+ 40 		'trim' : 1,
+ 41 		'ltrim' : 1,
+ 42 		'rtrim' : 1,
+ 43 		'getDocument' : 1,
+ 44 		'getChildCount' : 1,
+ 45 		'getChild' : 1,
+ 46 		'getChildren' : 1
+ 47 	} );
+ 48 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_domwalker.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_domwalker.js.html new file mode 100644 index 000000000..00d0c8f04 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_domwalker.js.html @@ -0,0 +1,250 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	var fireDomWalkerEvent = function( transistionType, fromNode, toNode )
+  9 		{
+ 10 			var eventData = { from : fromNode, to : toNode, type : transistionType };
+ 11 			this.fire( transistionType, eventData );
+ 12 			this._.actionEvents.push( eventData );
+ 13 		};
+ 14
+ 15 	CKEDITOR.dom.domWalker = function( node )
+ 16 	{
+ 17 		if ( arguments.length < 1 )
+ 18 			return;
+ 19
+ 20 		this._ = { currentNode : node, actionEvents : [], stopFlag : false };
+ 21 		CKEDITOR.event.implementOn( this );
+ 22 	};
+ 23
+ 24 	CKEDITOR.dom.domWalker.prototype = {
+ 25 		next : (function()
+ 26 		{
+ 27 			var dfsStepForward = function()
+ 28 			{
+ 29 				var current = this._.currentNode, next;
+ 30
+ 31 				if ( !current )
+ 32 					return null;
+ 33
+ 34 				if ( current.getChildCount && current.getChildCount() > 0 )
+ 35 				{
+ 36 					next = current.getChild( 0 );
+ 37 					fireDomWalkerEvent.call( this, 'down', current, next );
+ 38 					return next;
+ 39 				}
+ 40 				else if ( current.getNext() )
+ 41 				{
+ 42 					next = current.getNext();
+ 43 					fireDomWalkerEvent.call( this, 'sibling', current, next );
+ 44 					return next;
+ 45 				}
+ 46 				else
+ 47 				{
+ 48 					var ancestor = current.getParent();
+ 49 					fireDomWalkerEvent.call( this, 'up', current, ancestor );
+ 50
+ 51 					while ( ancestor )
+ 52 					{
+ 53 						if ( ancestor.getNext() )
+ 54 						{
+ 55 							next = ancestor.getNext();
+ 56 							fireDomWalkerEvent.call( this, 'sibling', ancestor, next );
+ 57 							return next;
+ 58 						}
+ 59 						else
+ 60 						{
+ 61 							next = ancestor.getParent();
+ 62 							fireDomWalkerEvent.call( this, 'up', ancestor, next );
+ 63 							ancestor = next;
+ 64 						}
+ 65 					}
+ 66 				}
+ 67 				return null;
+ 68 			};
+ 69
+ 70 			return function()
+ 71 			{
+ 72 				this._.actionEvents = [];
+ 73 				return {
+ 74 					node : ( this._.currentNode = dfsStepForward.apply( this ) ),
+ 75 					events : this._.actionEvents
+ 76 				};
+ 77 			};
+ 78 		})(),
+ 79
+ 80 		back : (function()
+ 81 		{
+ 82 			var dfsStepBackward = function()
+ 83 			{
+ 84 				var current = this._.currentNode, next;
+ 85
+ 86 				if ( !current )
+ 87 					return null;
+ 88
+ 89 				if ( current.getPrevious() )
+ 90 				{
+ 91 					var lastChild = current.getPrevious();
+ 92 					fireDomWalkerEvent.call( this, 'sibling', current, lastChild );
+ 93 					while ( lastChild.getChildCount && lastChild.getChildCount() > 0 )
+ 94 					{
+ 95 						next = lastChild.getChild( lastChild.getChildCount() - 1 );
+ 96 						fireDomWalkerEvent.call( this, 'down', lastChild, next );
+ 97 						lastChild = next;
+ 98 					}
+ 99 					return lastChild;
+100 				}
+101 				else
+102 				{
+103 					next = current.getParent();
+104 					fireDomWalkerEvent.call( this, 'up', current, next );
+105 					return next;
+106 				}
+107 				return null;
+108 			};
+109
+110 			return function()
+111 			{
+112 				this._.actionEvents = [];
+113 				return {
+114 					node : ( this._.currentNode = dfsStepBackward.apply( this ) ),
+115 					events : this._.actionEvents
+116 				};
+117 			};
+118 		})(),
+119
+120 		forward : function( guardFunc )
+121 		{
+122 			var retval;
+123 			this._.stopFlag = false;
+124
+125 			// The default behavior is to stop once the end of document is reached.
+126 			guardFunc = guardFunc || function( evt ) {};
+127
+128 			this.on( 'sibling', guardFunc );
+129 			this.on( 'up', guardFunc );
+130 			this.on( 'down', guardFunc );
+131 			while( ( !retval || retval.node ) && !this._.stopFlag )
+132 			{
+133 				retval = this.next();
+134 				this.fire( 'step', retval );
+135 			}
+136 			this.removeListener( 'sibling', guardFunc );
+137 			this.removeListener( 'up', guardFunc );
+138 			this.removeListener( 'down', guardFunc );
+139 			return retval;
+140 		},
+141
+142 		reverse : function( guardFunc )
+143 		{
+144 			var retval;
+145 			this._.stopFlag = false;
+146
+147 			// The default behavior is top stop once the start of document is reached.
+148 			guardFunc = guardFunc || function( evt ) {};
+149
+150 			this.on( 'sibling', guardFunc );
+151 			this.on( 'up', guardFunc );
+152 			this.on( 'down', guardFunc );
+153 			while( ( !retval || retval.node ) && !this._.stopFlag )
+154 			{
+155 				retval = this.back();
+156 				this.fire( 'step', retval );
+157 			}
+158 			this.removeListener( 'sibling', guardFunc );
+159 			this.removeListener( 'up', guardFunc );
+160 			this.removeListener( 'down', guardFunc );
+161 			return retval;
+162 		},
+163
+164 		stop : function()
+165 		{
+166 			this._.stopFlag = true;
+167 			return this;
+168 		},
+169
+170 		stopped : function()
+171 		{
+172 			return this._.stopFlag;
+173 		},
+174
+175 		setNode : function( node )
+176 		{
+177 			this._.currentNode = node;
+178 			return this;
+179 		}
+180 	};
+181
+182 	/*
+183 	 * Anything whose display computed style is block, list-item, table,
+184 	 * table-row-group, table-header-group, table-footer-group, table-row,
+185 	 * table-column-group, table-column, table-cell, table-caption, or whose node
+186 	 * name is hr, br (when enterMode is br only) is a block boundary.
+187 	 */
+188 	var blockBoundaryDisplayMatch =
+189 	{
+190 		block : 1,
+191 		'list-item' : 1,
+192 		table : 1,
+193 		'table-row-group' : 1,
+194 		'table-header-group' : 1,
+195 		'table-footer-group' : 1,
+196 		'table-row' : 1,
+197 		'table-column-group' : 1,
+198 		'table-column' : 1,
+199 		'table-cell' : 1,
+200 		'table-caption' : 1
+201 	},
+202 		blockBoundaryNodeNameMatch = { hr : 1 };
+203
+204 	CKEDITOR.dom.element.prototype.isBlockBoundary = function( customNodeNames )
+205 	{
+206 		var nodeNameMatches = CKEDITOR.tools.extend( {}, blockBoundaryNodeNameMatch, customNodeNames || {} );
+207
+208 		return blockBoundaryDisplayMatch[ this.getComputedStyle( 'display' ) ] ||
+209 			nodeNameMatches[ this.getName() ];
+210 	};
+211
+212 	CKEDITOR.dom.domWalker.blockBoundary = function( customNodeNames )
+213 	{
+214 		return function( evt )
+215 		{
+216 			var to = evt.data.to,
+217 				from = evt.data.from;
+218 			if ( to && to.type == CKEDITOR.NODE_ELEMENT )
+219 			{
+220 				if ( to.isBlockBoundary( customNodeNames ) )
+221 				{
+222 					evt.stop();
+223 					this.stop();
+224 					return;
+225 				}
+226 			}
+227 			if ( ( evt.data.type == 'up' || evt.data.type == 'sibling' ) && from && from.type == CKEDITOR.NODE_ELEMENT )
+228 			{
+229 				if ( from.isBlockBoundary( customNodeNames ) )
+230 				{
+231 					evt.stop();
+232 					this.stop();
+233 				}
+234 			}
+235 		};
+236 	};
+237
+238 	CKEDITOR.dom.domWalker.listItemBoundary = function()
+239 	{
+240 		return CKEDITOR.dom.domWalker.blockBoundary( { br : 1 } );
+241 	};
+242 })();
+243 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_element.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_element.js.html new file mode 100644 index 000000000..f27b7f964 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_element.js.html @@ -0,0 +1,1393 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.dom.element} class, which
+  8  *		represents a DOM element.
+  9  */
+ 10
+ 11 /**
+ 12  * Represents a DOM element.
+ 13  * @constructor
+ 14  * @augments CKEDITOR.dom.node
+ 15  * @param {Object|String} element A native DOM element or the element name for
+ 16  *		new elements.
+ 17  * @param {CKEDITOR.dom.document} [ownerDocument] The document that will contain
+ 18  *		the element in case of element creation.
+ 19  * @example
+ 20  * // Create a new <span> element.
+ 21  * var element = new CKEDITOR.dom.element( 'span' );
+ 22  * @example
+ 23  * // Create an element based on a native DOM element.
+ 24  * var element = new CKEDITOR.dom.element( document.getElementById( 'myId' ) );
+ 25  */
+ 26 CKEDITOR.dom.element = function( element, ownerDocument )
+ 27 {
+ 28 	if ( typeof element == 'string' )
+ 29 		element = ( ownerDocument ? ownerDocument.$ : document ).createElement( element );
+ 30
+ 31 	// Call the base constructor (we must not call CKEDITOR.dom.node).
+ 32 	CKEDITOR.dom.domObject.call( this, element );
+ 33 };
+ 34
+ 35 // PACKAGER_RENAME( CKEDITOR.dom.element )
+ 36
+ 37 /**
+ 38  * The the {@link CKEDITOR.dom.element} representing and element. If the
+ 39  * element is a native DOM element, it will be transformed into a valid
+ 40  * CKEDITOR.dom.element object.
+ 41  * @returns {CKEDITOR.dom.element} The transformed element.
+ 42  * @example
+ 43  * var element = new CKEDITOR.dom.element( 'span' );
+ 44  * alert( element == <b>CKEDITOR.dom.element.get( element )</b> );  "true"
+ 45  * @example
+ 46  * var element = document.getElementById( 'myElement' );
+ 47  * alert( <b>CKEDITOR.dom.element.get( element )</b>.getName() );  e.g. "p"
+ 48  */
+ 49 CKEDITOR.dom.element.get = function( element )
+ 50 {
+ 51 	return element && ( element.$ ? element : new CKEDITOR.dom.element( element ) );
+ 52 };
+ 53
+ 54 CKEDITOR.dom.element.prototype = new CKEDITOR.dom.node();
+ 55
+ 56 /**
+ 57  * Creates an instance of the {@link CKEDITOR.dom.element} class based on the
+ 58  * HTML representation of an element.
+ 59  * @param {String} html The element HTML. It should define only one element in
+ 60  *		the "root" level. The "root" element can have child nodes, but not
+ 61  *		siblings.
+ 62  * @returns {CKEDITOR.dom.element} The element instance.
+ 63  * @example
+ 64  * var element = <b>CKEDITOR.dom.element.createFromHtml( '<strong class="anyclass">My element</strong>' )</b>;
+ 65  * alert( element.getName() );  // "strong"
+ 66  */
+ 67 CKEDITOR.dom.element.createFromHtml = function( html, ownerDocument )
+ 68 {
+ 69 	var temp = new CKEDITOR.dom.element( 'div', ownerDocument );
+ 70 	temp.setHtml( html );
+ 71
+ 72 	// When returning the node, remove it from its parent to detach it.
+ 73 	return temp.getFirst().remove();
+ 74 };
+ 75
+ 76 CKEDITOR.dom.element.setMarker = function( database, element, name, value )
+ 77 {
+ 78 	var id = element.getCustomData( 'list_marker_id' ) ||
+ 79 			( element.setCustomData( 'list_marker_id', CKEDITOR.tools.getNextNumber() ).getCustomData( 'list_marker_id' ) ),
+ 80 		markerNames = element.getCustomData( 'list_marker_names' ) ||
+ 81 			( element.setCustomData( 'list_marker_names', {} ).getCustomData( 'list_marker_names' ) );
+ 82 	database[id] = element;
+ 83 	markerNames[name] = 1;
+ 84
+ 85 	return element.setCustomData( name, value );
+ 86 };
+ 87
+ 88 CKEDITOR.dom.element.clearAllMarkers = function( database )
+ 89 {
+ 90 	for ( var i in database )
+ 91 		CKEDITOR.dom.element.clearMarkers( database, database[i], true );
+ 92 };
+ 93
+ 94 CKEDITOR.dom.element.clearMarkers = function( database, element, removeFromDatabase )
+ 95 {
+ 96 	var names = element.getCustomData( 'list_marker_names' ),
+ 97 		id = element.getCustomData( 'list_marker_id' );
+ 98 	for ( var i in names )
+ 99 		element.removeCustomData( i );
+100 	element.removeCustomData( 'list_marker_names' );
+101 	if ( removeFromDatabase )
+102 	{
+103 		element.removeCustomData( 'list_marker_id' );
+104 		delete database[id];
+105 	}
+106 };
+107
+108 CKEDITOR.tools.extend( CKEDITOR.dom.element.prototype,
+109 	/** @lends CKEDITOR.dom.element.prototype */
+110 	{
+111 		/**
+112 		 * The node type. This is a constant value set to
+113 		 * {@link CKEDITOR.NODE_ELEMENT}.
+114 		 * @type Number
+115 		 * @example
+116 		 */
+117 		type : CKEDITOR.NODE_ELEMENT,
+118
+119 		/**
+120 		 * Adds a CSS class to the element. It appends the class to the
+121 		 * already existing names.
+122 		 * @param {String} className The name of the class to be added.
+123 		 * @example
+124 		 * var element = new CKEDITOR.dom.element( 'div' );
+125 		 * element.addClass( 'classA' );  // <div class="classA">
+126 		 * element.addClass( 'classB' );  // <div class="classA classB">
+127 		 * element.addClass( 'classA' );  // <div class="classA classB">
+128 		 */
+129 		addClass : function( className )
+130 		{
+131 			var c = this.$.className;
+132 			if ( c )
+133 			{
+134 				var regex = new RegExp( '(?:^|\\s)' + className + '(?:\\s|$)', '' );
+135 				if ( !regex.test( c ) )
+136 					c += ' ' + className;
+137 			}
+138 			this.$.className = c || className;
+139 		},
+140
+141 		/**
+142 		 * Removes a CSS class name from the elements classes. Other classes
+143 		 * remain untouched.
+144 		 * @param {String} className The name of the class to remove.
+145 		 * @example
+146 		 * var element = new CKEDITOR.dom.element( 'div' );
+147 		 * element.addClass( 'classA' );  // <div class="classA">
+148 		 * element.addClass( 'classB' );  // <div class="classA classB">
+149 		 * element.removeClass( 'classA' );  // <div class="classB">
+150 		 * element.removeClass( 'classB' );  // <div>
+151 		 */
+152 		removeClass : function( className )
+153 		{
+154 			var c = this.getAttribute( 'class' );
+155 			if ( c )
+156 			{
+157 				var regex = new RegExp( '(?:^|\\s+)' + className + '(?=\\s|$)', 'i' );
+158 				if ( regex.test( c ) )
+159 				{
+160 					c = c.replace( regex, '' ).replace( /^\s+/, '' );
+161
+162 					if ( c )
+163 						this.setAttribute( 'class', c );
+164 					else
+165 						this.removeAttribute( 'class' );
+166 				}
+167 			}
+168 		},
+169
+170 		hasClass : function( className )
+171 		{
+172 			var regex = new RegExp( '(?:^|\\s+)' + className + '(?=\\s|$)', '' );
+173 			return regex.test( this.getAttribute('class') );
+174 		},
+175
+176 		/**
+177 		 * Append a node as a child of this element.
+178 		 * @param {CKEDITOR.dom.node|String} node The node or element name to be
+179 		 *		appended.
+180 		 * @param {Boolean} [toStart] Indicates that the element is to be
+181 		 *		appended at the start.
+182 		 * @returns {CKEDITOR.dom.node} The appended node.
+183 		 * @example
+184 		 * var p = new CKEDITOR.dom.element( 'p' );
+185 		 *
+186 		 * var strong = new CKEDITOR.dom.element( 'strong' );
+187 		 * <b>p.append( strong );</b>
+188 		 *
+189 		 * var em = <b>p.append( 'em' );</b>
+190 		 *
+191 		 * // result: "<p><strong></strong><em></em></p>"
+192 		 */
+193 		append : function( node, toStart )
+194 		{
+195 			if ( typeof node == 'string' )
+196 				node = this.getDocument().createElement( node );
+197
+198 			if ( toStart )
+199 				this.$.insertBefore( node.$, this.$.firstChild );
+200 			else
+201 				this.$.appendChild( node.$ );
+202
+203 			return node;
+204 		},
+205
+206 		appendHtml : function( html )
+207 		{
+208 			if ( !this.$.childNodes.length )
+209 				this.setHtml( html );
+210 			else
+211 			{
+212 				var temp = new CKEDITOR.dom.element( 'div', this.getDocument() );
+213 				temp.setHtml( html );
+214 				temp.moveChildren( this );
+215 			}
+216 		},
+217
+218 		/**
+219 		 * Append text to this element.
+220 		 * @param {String} text The text to be appended.
+221 		 * @returns {CKEDITOR.dom.node} The appended node.
+222 		 * @example
+223 		 * var p = new CKEDITOR.dom.element( 'p' );
+224 		 * p.appendText( 'This is' );
+225 		 * p.appendText( ' some text' );
+226 		 *
+227 		 * // result: "<p>This is some text</p>"
+228 		 */
+229 		appendText : function( text )
+230 		{
+231 			if ( this.$.text != undefined )
+232 				this.$.text += text;
+233 			else
+234 				this.append( new CKEDITOR.dom.text( text ) );
+235 		},
+236
+237 		appendBogus : function()
+238 		{
+239 			var lastChild = this.getLast() ;
+240
+241 			// Ignore empty/spaces text.
+242 			while ( lastChild && lastChild.type == CKEDITOR.NODE_TEXT && !CKEDITOR.tools.rtrim( lastChild.getText() ) )
+243 				lastChild = lastChild.getPrevious();
+244 			if ( !lastChild || !lastChild.is || !lastChild.is( 'br' ) )
+245 			{
+246 				this.append(
+247 					CKEDITOR.env.opera ?
+248 						this.getDocument().createText('') :
+249 						this.getDocument().createElement( 'br' ) );
+250 			}
+251 		},
+252
+253 		/**
+254 		 * Breaks one of the ancestor element in the element position, moving
+255 		 * this element between the broken parts.
+256 		 * @param {CKEDITOR.dom.element} parent The anscestor element to get broken.
+257 		 * @example
+258 		 * // Before breaking:
+259 		 * //     <b>This <i>is some<span /> sample</i> test text</b>
+260 		 * // If "element" is <span /> and "parent" is <i>:
+261 		 * //     <b>This <i>is some</i><span /><i> sample</i> test text</b>
+262 		 * element.breakParent( parent );
+263 		 * @example
+264 		 * // Before breaking:
+265 		 * //     <b>This <i>is some<span /> sample</i> test text</b>
+266 		 * // If "element" is <span /> and "parent" is <b>:
+267 		 * //     <b>This <i>is some</i></b><span /><b><i> sample</i> test text</b>
+268 		 * element.breakParent( parent );
+269 		 */
+270 		breakParent : function( parent )
+271 		{
+272 			var range = new CKEDITOR.dom.range( this.getDocument() );
+273
+274 			// We'll be extracting part of this element, so let's use our
+275 			// range to get the correct piece.
+276 			range.setStartAfter( this );
+277 			range.setEndAfter( parent );
+278
+279 			// Extract it.
+280 			var docFrag = range.extractContents();
+281
+282 			// Move the element outside the broken element.
+283 			range.insertNode( this.remove() );
+284
+285 			// Re-insert the extracted piece after the element.
+286 			docFrag.insertAfterNode( this );
+287 		},
+288
+289 		contains :
+290 			CKEDITOR.env.ie || CKEDITOR.env.webkit ?
+291 				function( node )
+292 				{
+293 					var $ = this.$;
+294
+295 					return node.type != CKEDITOR.NODE_ELEMENT ?
+296 						$.contains( node.getParent().$ ) :
+297 						$ != node.$ && $.contains( node.$ );
+298 				}
+299 			:
+300 				function( node )
+301 				{
+302 					return !!( this.$.compareDocumentPosition( node.$ ) & 16 );
+303 				},
+304
+305 		/**
+306 		 * Moves the selection focus to this element.
+307 		 * @example
+308 		 * var element = CKEDITOR.document.getById( 'myTextarea' );
+309 		 * <b>element.focus()</b>;
+310 		 */
+311 		focus : function()
+312 		{
+313 			// IE throws error if the element is not visible.
+314 			try
+315 			{
+316 				this.$.focus();
+317 			}
+318 			catch (e)
+319 			{}
+320 		},
+321
+322 		/**
+323 		 * Gets the inner HTML of this element.
+324 		 * @returns {String} The inner HTML of this element.
+325 		 * @example
+326 		 * var element = CKEDITOR.dom.element.createFromHtml( '<div><b>Example</b></div>' );
+327 		 * alert( <b>p.getHtml()</b> );  // "<b>Example</b>"
+328 		 */
+329 		getHtml : function()
+330 		{
+331 			return this.$.innerHTML;
+332 		},
+333
+334 		getOuterHtml : function()
+335 		{
+336 			if ( this.$.outerHTML )
+337 			{
+338 				// IE includes the <?xml:namespace> tag in the outerHTML of
+339 				// namespaced element. So, we must strip it here. (#3341)
+340 				return this.$.outerHTML.replace( /<\?[^>]*>/, '' );
+341 			}
+342
+343 			var tmpDiv = this.$.ownerDocument.createElement( 'div' );
+344 			tmpDiv.appendChild( this.$.cloneNode( true ) );
+345 			return tmpDiv.innerHTML;
+346 		},
+347
+348 		/**
+349 		 * Sets the inner HTML of this element.
+350 		 * @param {String} html The HTML to be set for this element.
+351 		 * @returns {String} The inserted HTML.
+352 		 * @example
+353 		 * var p = new CKEDITOR.dom.element( 'p' );
+354 		 * <b>p.setHtml( '<b>Inner</b> HTML' );</b>
+355 		 *
+356 		 * // result: "<p><b>Inner</b> HTML</p>"
+357 		 */
+358 		setHtml : function( html )
+359 		{
+360 			return ( this.$.innerHTML = html );
+361 		},
+362
+363 		/**
+364 		 * Sets the element contents as plain text.
+365 		 * @param {String} text The text to be set.
+366 		 * @returns {String} The inserted text.
+367 		 * @example
+368 		 * var element = new CKEDITOR.dom.element( 'div' );
+369 		 * element.setText( 'A > B & C < D' );
+370 		 * alert( element.innerHTML );  // "A &gt; B &amp; C &lt; D"
+371 		 */
+372 		setText : function( text )
+373 		{
+374 			CKEDITOR.dom.element.prototype.setText = ( this.$.innerText != undefined ) ?
+375 				function ( text )
+376 				{
+377 					return this.$.innerText = text;
+378 				} :
+379 				function ( text )
+380 				{
+381 					return this.$.textContent = text;
+382 				};
+383
+384 			return this.setText( text );
+385 		},
+386
+387 		/**
+388 		 * Gets the value of an element attribute.
+389 		 * @function
+390 		 * @param {String} name The attribute name.
+391 		 * @returns {String} The attribute value or null if not defined.
+392 		 * @example
+393 		 * var element = CKEDITOR.dom.element.createFromHtml( '<input type="text" />' );
+394 		 * alert( <b>element.getAttribute( 'type' )</b> );  // "text"
+395 		 */
+396 		getAttribute : (function()
+397 		{
+398 			var standard = function( name )
+399 			{
+400 				return this.$.getAttribute( name, 2 );
+401 			};
+402
+403 			if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
+404 			{
+405 				return function( name )
+406 				{
+407 					switch ( name )
+408 					{
+409 						case 'class':
+410 							name = 'className';
+411 							break;
+412
+413 						case 'tabindex':
+414 							var tabIndex = standard.call( this, name );
+415
+416 							// IE returns tabIndex=0 by default for all
+417 							// elements. For those elements,
+418 							// getAtrribute( 'tabindex', 2 ) returns 32768
+419 							// instead. So, we must make this check to give a
+420 							// uniform result among all browsers.
+421 							if ( tabIndex !== 0 && this.$.tabIndex === 0 )
+422 								tabIndex = null;
+423
+424 							return tabIndex;
+425 							break;
+426
+427 						case 'checked':
+428 							return this.$.checked;
+429 							break;
+430
+431 						case 'style':
+432 							// IE does not return inline styles via getAttribute(). See #2947.
+433 							var styleText = this.$.style.cssText;
+434 							return styleText.toLowerCase().replace(
+435 								/\s*(?:;\s*|$)/, ';').replace(
+436 									/([^;])$/, '$1;');
+437 					}
+438
+439 					return standard.call( this, name );
+440 				};
+441 			}
+442 			else
+443 				return standard;
+444 		})(),
+445
+446 		getChildren : function()
+447 		{
+448 			return new CKEDITOR.dom.nodeList( this.$.childNodes );
+449 		},
+450
+451 		/**
+452 		 * Gets the current computed value of one of the element CSS style
+453 		 * properties.
+454 		 * @function
+455 		 * @param {String} propertyName The style property name.
+456 		 * @returns {String} The property value.
+457 		 * @example
+458 		 * var element = new CKEDITOR.dom.element( 'span' );
+459 		 * alert( <b>element.getComputedStyle( 'display' )</b> );  // "inline"
+460 		 */
+461 		getComputedStyle :
+462 			CKEDITOR.env.ie ?
+463 				function( propertyName )
+464 				{
+465 					return this.$.currentStyle[ CKEDITOR.tools.cssStyleToDomStyle( propertyName ) ];
+466 				}
+467 			:
+468 				function( propertyName )
+469 				{
+470 					return this.getWindow().$.getComputedStyle( this.$, '' ).getPropertyValue( propertyName );
+471 				},
+472
+473 		/**
+474 		 * Gets the DTD entries for this element.
+475 		 * @returns {Object} An object containing the list of elements accepted
+476 		 *		by this element.
+477 		 */
+478 		getDtd : function()
+479 		{
+480 			var dtd = CKEDITOR.dtd[ this.getName() ];
+481
+482 			this.getDtd = function()
+483 			{
+484 				return dtd;
+485 			};
+486
+487 			return dtd;
+488 		},
+489
+490 		getElementsByTag : CKEDITOR.dom.document.prototype.getElementsByTag,
+491
+492 		/**
+493 		 * Gets the computed tabindex for this element.
+494 		 * @function
+495 		 * @returns {Number} The tabindex value.
+496 		 * @example
+497 		 * var element = CKEDITOR.document.getById( 'myDiv' );
+498 		 * alert( <b>element.getTabIndex()</b> );  // e.g. "-1"
+499 		 */
+500 		getTabIndex :
+501 			CKEDITOR.env.ie ?
+502 				function()
+503 				{
+504 					var tabIndex = this.$.tabIndex;
+505
+506 					// IE returns tabIndex=0 by default for all elements. In
+507 					// those cases we must check that the element really has
+508 					// the tabindex attribute set to zero, or it is one of
+509 					// those element that should have zero by default.
+510 					if ( tabIndex === 0 && !CKEDITOR.dtd.$tabIndex[ this.getName() ] && parseInt( this.getAttribute( 'tabindex' ), 10 ) !== 0 )
+511 						tabIndex = -1;
+512
+513 						return tabIndex;
+514 				}
+515 			: CKEDITOR.env.webkit ?
+516 				function()
+517 				{
+518 					var tabIndex = this.$.tabIndex;
+519
+520 					// Safari returns "undefined" for elements that should not
+521 					// have tabindex (like a div). So, we must try to get it
+522 					// from the attribute.
+523 					// https://bugs.webkit.org/show_bug.cgi?id=20596
+524 					if ( tabIndex == undefined )
+525 					{
+526 						tabIndex = parseInt( this.getAttribute( 'tabindex' ), 10 );
+527
+528 						// If the element don't have the tabindex attribute,
+529 						// then we should return -1.
+530 						if ( isNaN( tabIndex ) )
+531 							tabIndex = -1;
+532 					}
+533
+534 					return tabIndex;
+535 				}
+536 			:
+537 				function()
+538 				{
+539 					return this.$.tabIndex;
+540 				},
+541
+542 		/**
+543 		 * Gets the text value of this element.
+544 		 *
+545 		 * Only in IE (which uses innerText), <br> will cause linebreaks,
+546 		 * and sucessive whitespaces (including line breaks) will be reduced to
+547 		 * a single space. This behavior is ok for us, for now. It may change
+548 		 * in the future.
+549 		 * @returns {String} The text value.
+550 		 * @example
+551 		 * var element = CKEDITOR.dom.element.createFromHtml( '<div>Same <i>text</i>.</div>' );
+552 		 * alert( <b>element.getText()</b> );  // "Sample text."
+553 		 */
+554 		getText : function()
+555 		{
+556 			return this.$.textContent || this.$.innerText || '';
+557 		},
+558
+559 		/**
+560 		 * Gets the window object that contains this element.
+561 		 * @returns {CKEDITOR.dom.window} The window object.
+562 		 * @example
+563 		 */
+564 		getWindow : function()
+565 		{
+566 			return this.getDocument().getWindow();
+567 		},
+568
+569 		/**
+570 		 * Gets the value of the "id" attribute of this element.
+571 		 * @returns {String} The element id, or null if not available.
+572 		 * @example
+573 		 * var element = CKEDITOR.dom.element.createFromHtml( '<p id="myId"></p>' );
+574 		 * alert( <b>element.getId()</b> );  // "myId"
+575 		 */
+576 		getId : function()
+577 		{
+578 			return this.$.id || null;
+579 		},
+580
+581 		/**
+582 		 * Gets the value of the "name" attribute of this element.
+583 		 * @returns {String} The element name, or null if not available.
+584 		 * @example
+585 		 * var element = CKEDITOR.dom.element.createFromHtml( '<input name="myName"></input>' );
+586 		 * alert( <b>element.getNameAtt()</b> );  // "myName"
+587 		 */
+588 		getNameAtt : function()
+589 		{
+590 			return this.$.name || null;
+591 		},
+592
+593 		/**
+594 		 * Gets the element name (tag name). The returned name is guaranteed to
+595 		 * be always full lowercased.
+596 		 * @returns {String} The element name.
+597 		 * @example
+598 		 * var element = new CKEDITOR.dom.element( 'span' );
+599 		 * alert( <b>element.getName()</b> );  // "span"
+600 		 */
+601 		getName : function()
+602 		{
+603 			// Cache the lowercased name inside a closure.
+604 			var nodeName = this.$.nodeName.toLowerCase();
+605
+606 			if ( CKEDITOR.env.ie )
+607 			{
+608 				var scopeName = this.$.scopeName;
+609 				if ( scopeName != 'HTML' )
+610 					nodeName = scopeName.toLowerCase() + ':' + nodeName;
+611 			}
+612
+613 			return (
+614 			/** @ignore */
+615 			this.getName = function()
+616 				{
+617 					return nodeName;
+618 				})();
+619 		},
+620
+621 		/**
+622 		 * Gets the value set to this element. This value is usually available
+623 		 * for form field elements.
+624 		 * @returns {String} The element value.
+625 		 */
+626 		getValue : function()
+627 		{
+628 			return this.$.value;
+629 		},
+630
+631 		/**
+632 		 * Gets the first child node of this element.
+633 		 * @returns {CKEDITOR.dom.node} The first child node or null if not
+634 		 *		available.
+635 		 * @example
+636 		 * var element = CKEDITOR.dom.element.createFromHtml( '<div><b>Example</b></div>' );
+637 		 * var first = <b>element.getFirst()</b>;
+638 		 * alert( first.getName() );  // "b"
+639 		 */
+640 		getFirst : function()
+641 		{
+642 			var $ = this.$.firstChild;
+643 			return $ ? new CKEDITOR.dom.node( $ ) : null;
+644 		},
+645
+646 		/**
+647 		 * @param ignoreEmpty Skip empty text nodes.
+648 		 */
+649 		getLast : function( ignoreEmpty )
+650 		{
+651 			var $ = this.$.lastChild;
+652 			if ( ignoreEmpty && $ && ( $.nodeType == CKEDITOR.NODE_TEXT )
+653 					&& !CKEDITOR.tools.trim( $.nodeValue ) )
+654 				return new CKEDITOR.dom.node( $ ).getPrevious( true );
+655 			else
+656 				return $ ? new CKEDITOR.dom.node( $ ) : null;
+657 		},
+658
+659 		getStyle : function( name )
+660 		{
+661 			return this.$.style[ CKEDITOR.tools.cssStyleToDomStyle( name ) ];
+662 		},
+663
+664 		/**
+665 		 * Checks if the element name matches one or more names.
+666 		 * @param {String} name[,name[,...]] One or more names to be checked.
+667 		 * @returns {Boolean} true if the element name matches any of the names.
+668 		 * @example
+669 		 * var element = new CKEDITOR.element( 'span' );
+670 		 * alert( <b>element.is( 'span' )</b> );  "true"
+671 		 * alert( <b>element.is( 'p', 'span' )</b> );  "true"
+672 		 * alert( <b>element.is( 'p' )</b> );  "false"
+673 		 * alert( <b>element.is( 'p', 'div' )</b> );  "false"
+674 		 */
+675 		is : function()
+676 		{
+677 			var name = this.getName();
+678 			for ( var i = 0 ; i < arguments.length ; i++ )
+679 			{
+680 				if ( arguments[ i ] == name )
+681 					return true;
+682 			}
+683 			return false;
+684 		},
+685
+686 		isEditable : function()
+687 		{
+688 			// Get the element name.
+689 			var name = this.getName();
+690
+691 			// Get the element DTD (defaults to span for unknown elements).
+692 			var dtd = !CKEDITOR.dtd.$nonEditable[ name ]
+693 						&& ( CKEDITOR.dtd[ name ] || CKEDITOR.dtd.span );
+694
+695 			// In the DTD # == text node.
+696 			return ( dtd && dtd['#'] );
+697 		},
+698
+699 		isIdentical : function( otherElement )
+700 		{
+701 			if ( this.getName() != otherElement.getName() )
+702 				return false;
+703
+704 			var thisAttribs = this.$.attributes,
+705 				otherAttribs = otherElement.$.attributes;
+706
+707 			var thisLength = thisAttribs.length,
+708 				otherLength = otherAttribs.length;
+709
+710 			if ( !CKEDITOR.env.ie && thisLength != otherLength )
+711 				return false;
+712
+713 			for ( var i = 0 ; i < thisLength ; i++ )
+714 			{
+715 				var attribute = thisAttribs[ i ];
+716
+717 				if ( ( !CKEDITOR.env.ie || ( attribute.specified && attribute.nodeName != '_cke_expando' ) ) && attribute.nodeValue != otherElement.getAttribute( attribute.nodeName ) )
+718 					return false;
+719 			}
+720
+721 			// For IE, we have to for both elements, because it's difficult to
+722 			// know how the atttibutes collection is organized in its DOM.
+723 			if ( CKEDITOR.env.ie )
+724 			{
+725 				for ( i = 0 ; i < otherLength ; i++ )
+726 				{
+727 					attribute = otherAttribs[ i ];
+728
+729 					if ( ( !CKEDITOR.env.ie || ( attribute.specified && attribute.nodeName != '_cke_expando' ) ) && attribute.nodeValue != thisAttribs.getAttribute( attribute.nodeName ) )
+730 						return false;
+731 				}
+732 			}
+733
+734 			return true;
+735 		},
+736
+737 		/**
+738 		 * Checks if this element is visible. May not work if the element is
+739 		 * child of an element with visibility set to "hidden", but works well
+740 		 * on the great majority of cases.
+741 		 * @return {Boolean} True if the element is visible.
+742 		 */
+743 		isVisible : function()
+744 		{
+745 			return this.$.offsetWidth && ( this.$.style.visibility != 'hidden' );
+746 		},
+747
+748 		/**
+749 		 * Indicates that the element has defined attributes.
+750 		 * @returns {Boolean} True if the element has attributes.
+751 		 * @example
+752 		 * var element = CKEDITOR.dom.element.createFromHtml( '<div title="Test">Example</div>' );
+753 		 * alert( <b>element.hasAttributes()</b> );  "true"
+754 		 * @example
+755 		 * var element = CKEDITOR.dom.element.createFromHtml( '<div>Example</div>' );
+756 		 * alert( <b>element.hasAttributes()</b> );  "false"
+757 		 */
+758 		hasAttributes :
+759 			CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) ?
+760 				function()
+761 				{
+762 					var attributes = this.$.attributes;
+763
+764 					for ( var i = 0 ; i < attributes.length ; i++ )
+765 					{
+766 						var attribute = attributes[i];
+767
+768 						switch ( attribute.nodeName )
+769 						{
+770 							case 'class' :
+771 								// IE has a strange bug. If calling removeAttribute('className'),
+772 								// the attributes collection will still contain the "class"
+773 								// attribute, which will be marked as "specified", even if the
+774 								// outerHTML of the element is not displaying the class attribute.
+775 								// Note : I was not able to reproduce it outside the editor,
+776 								// but I've faced it while working on the TC of #1391.
+777 								if ( this.getAttribute( 'class' ) > 0 )
+778 									return true;
+779
+780 							// Attributes to be ignored.
+781 							case '_cke_expando' :
+782 								continue;
+783
+784 							/*jsl:fallthru*/
+785
+786 							default :
+787 								if ( attribute.specified )
+788 									return true;
+789 						}
+790 					}
+791
+792 					return false;
+793 				}
+794 			:
+795 				function()
+796 				{
+797 					var attributes = this.$.attributes;
+798 					return ( attributes.length > 1 || ( attributes.length == 1 && attributes[0].nodeName != '_cke_expando' ) );
+799 				},
+800
+801 		/**
+802 		 * Indicates whether a specified attribute is defined for this element.
+803 		 * @returns {Boolean} True if the specified attribute is defined.
+804 		 * @param (String) name The attribute name.
+805 		 * @example
+806 		 */
+807 		hasAttribute : function( name )
+808 		{
+809 			var $attr = this.$.attributes.getNamedItem( name );
+810 			return !!( $attr && $attr.specified );
+811 		},
+812
+813 		/**
+814 		 * Hides this element (display:none).
+815 		 * @example
+816 		 * var element = CKEDITOR.dom.element.getById( 'myElement' );
+817 		 * <b>element.hide()</b>;
+818 		 */
+819 		hide : function()
+820 		{
+821 			this.setStyle( 'display', 'none' );
+822 		},
+823
+824 		moveChildren : function( target, toStart )
+825 		{
+826 			var $ = this.$;
+827 			target = target.$;
+828
+829 			if ( $ == target )
+830 				return;
+831
+832 			var child;
+833
+834 			if ( toStart )
+835 			{
+836 				while ( ( child = $.lastChild ) )
+837 					target.insertBefore( $.removeChild( child ), target.firstChild );
+838 			}
+839 			else
+840 			{
+841 				while ( ( child = $.firstChild ) )
+842 					target.appendChild( $.removeChild( child ) );
+843 			}
+844 		},
+845
+846 		/**
+847 		 * Shows this element (display it).
+848 		 * @example
+849 		 * var element = CKEDITOR.dom.element.getById( 'myElement' );
+850 		 * <b>element.show()</b>;
+851 		 */
+852 		show : function()
+853 		{
+854 			this.setStyles(
+855 				{
+856 					display : '',
+857 					visibility : ''
+858 				});
+859 		},
+860
+861 		/**
+862 		 * Sets the value of an element attribute.
+863 		 * @param {String} name The name of the attribute.
+864 		 * @param {String} value The value to be set to the attribute.
+865 		 * @function
+866 		 * @returns {CKEDITOR.dom.element} This element instance.
+867 		 * @example
+868 		 * var element = CKEDITOR.dom.element.getById( 'myElement' );
+869 		 * <b>element.setAttribute( 'class', 'myClass' )</b>;
+870 		 * <b>element.setAttribute( 'title', 'This is an example' )</b>;
+871 		 */
+872 		setAttribute : (function()
+873 		{
+874 			var standard = function( name, value )
+875 			{
+876 				this.$.setAttribute( name, value );
+877 				return this;
+878 			};
+879
+880 			if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
+881 			{
+882 				return function( name, value )
+883 				{
+884 					if ( name == 'class' )
+885 						this.$.className = value;
+886 					else if ( name == 'style' )
+887 						this.$.style.cssText = value;
+888 					else if ( name == 'tabindex' )	// Case sensitive.
+889 						this.$.tabIndex = value;
+890 					else if ( name == 'checked' )
+891 						this.$.checked = value;
+892 					else
+893 						standard.apply( this, arguments );
+894 					return this;
+895 				};
+896 			}
+897 			else
+898 				return standard;
+899 		})(),
+900
+901 		/**
+902 		 * Sets the value of several element attributes.
+903 		 * @param {Object} attributesPairs An object containing the names and
+904 		 *		values of the attributes.
+905 		 * @returns {CKEDITOR.dom.element} This element instance.
+906 		 * @example
+907 		 * var element = CKEDITOR.dom.element.getById( 'myElement' );
+908 		 * <b>element.setAttributes({
+909 		 *     'class' : 'myClass',
+910 		 *     'title' : 'This is an example' })</b>;
+911 		 */
+912 		setAttributes : function( attributesPairs )
+913 		{
+914 			for ( var name in attributesPairs )
+915 				this.setAttribute( name, attributesPairs[ name ] );
+916 			return this;
+917 		},
+918
+919 		/**
+920 		 * Sets the element value. This function is usually used with form
+921 		 * field element.
+922 		 * @param {String} value The element value.
+923 		 * @returns {CKEDITOR.dom.element} This element instance.
+924 		 */
+925 		setValue : function( value )
+926 		{
+927 			this.$.value = value;
+928 			return this;
+929 		},
+930
+931 		/**
+932 		 * Removes an attribute from the element.
+933 		 * @param {String} name The attribute name.
+934 		 * @function
+935 		 * @example
+936 		 * var element = CKEDITOR.dom.element.createFromHtml( '<div class="classA"></div>' );
+937 		 * element.removeAttribute( 'class' );
+938 		 */
+939 		removeAttribute : (function()
+940 		{
+941 			var standard = function( name )
+942 			{
+943 				this.$.removeAttribute( name );
+944 			};
+945
+946 			if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
+947 			{
+948 				return function( name )
+949 				{
+950 					if ( name == 'class' )
+951 						name = 'className';
+952 					else if ( name == 'tabindex' )
+953 						name = 'tabIndex';
+954 					standard.call( this, name );
+955 				};
+956 			}
+957 			else
+958 				return standard;
+959 		})(),
+960
+961 		removeAttributes : function ( attributes )
+962 		{
+963 			for ( var i = 0 ; i < attributes.length ; i++ )
+964 				this.removeAttribute( attributes[ i ] );
+965 		},
+966
+967 		/**
+968 		 * Removes a style from the element.
+969 		 * @param {String} name The style name.
+970 		 * @function
+971 		 * @example
+972 		 * var element = CKEDITOR.dom.element.createFromHtml( '<div style="display:none"></div>' );
+973 		 * element.removeStyle( 'display' );
+974 		 */
+975 		removeStyle : function( name )
+976 		{
+977 			if ( this.$.style.removeAttribute )
+978 				this.$.style.removeAttribute( CKEDITOR.tools.cssStyleToDomStyle( name ) );
+979 			else
+980 				this.setStyle( name, '' );
+981
+982 			if ( !this.$.style.cssText )
+983 				this.removeAttribute( 'style' );
+984 		},
+985
+986 		/**
+987 		 * Sets the value of an element style.
+988 		 * @param {String} name The name of the style. The CSS naming notation
+989 		 *		must be used (e.g. "background-color").
+990 		 * @param {String} value The value to be set to the style.
+991 		 * @returns {CKEDITOR.dom.element} This element instance.
+992 		 * @example
+993 		 * var element = CKEDITOR.dom.element.getById( 'myElement' );
+994 		 * <b>element.setStyle( 'background-color', '#ff0000' )</b>;
+995 		 * <b>element.setStyle( 'margin-top', '10px' )</b>;
+996 		 * <b>element.setStyle( 'float', 'right' )</b>;
+997 		 */
+998 		setStyle : function( name, value )
+999 		{
+1000 			this.$.style[ CKEDITOR.tools.cssStyleToDomStyle( name ) ] = value;
+1001 			return this;
+1002 		},
+1003
+1004 		/**
+1005 		 * Sets the value of several element styles.
+1006 		 * @param {Object} stylesPairs An object containing the names and
+1007 		 *		values of the styles.
+1008 		 * @returns {CKEDITOR.dom.element} This element instance.
+1009 		 * @example
+1010 		 * var element = CKEDITOR.dom.element.getById( 'myElement' );
+1011 		 * <b>element.setStyles({
+1012 		 *     'position' : 'absolute',
+1013 		 *     'float' : 'right' })</b>;
+1014 		 */
+1015 		setStyles : function( stylesPairs )
+1016 		{
+1017 			for ( var name in stylesPairs )
+1018 				this.setStyle( name, stylesPairs[ name ] );
+1019 			return this;
+1020 		},
+1021
+1022 		/**
+1023 		 * Sets the opacity of an element.
+1024 		 * @param {Number} opacity A number within the range [0.0, 1.0].
+1025 		 * @example
+1026 		 * var element = CKEDITOR.dom.element.getById( 'myElement' );
+1027 		 * <b>element.setOpacity( 0.75 )</b>;
+1028 		 */
+1029 		setOpacity : function( opacity )
+1030 		{
+1031 			if ( CKEDITOR.env.ie )
+1032 			{
+1033 				opacity = Math.round( opacity * 100 );
+1034 				this.setStyle( 'filter', opacity >= 100 ? '' : 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')' );
+1035 			}
+1036 			else
+1037 				this.setStyle( 'opacity', opacity );
+1038 		},
+1039
+1040 		/**
+1041 		 * Makes the element and its children unselectable.
+1042 		 * @function
+1043 		 * @example
+1044 		 * var element = CKEDITOR.dom.element.getById( 'myElement' );
+1045 		 * element.unselectable();
+1046 		 */
+1047 		unselectable :
+1048 			CKEDITOR.env.gecko ?
+1049 				function()
+1050 				{
+1051 					this.$.style.MozUserSelect = 'none';
+1052 				}
+1053 			: CKEDITOR.env.webkit ?
+1054 				function()
+1055 				{
+1056 					this.$.style.KhtmlUserSelect = 'none';
+1057 				}
+1058 			:
+1059 				function()
+1060 				{
+1061 					if ( CKEDITOR.env.ie || CKEDITOR.env.opera )
+1062 					{
+1063 						var element = this.$,
+1064 							e,
+1065 							i = 0;
+1066
+1067 						element.unselectable = 'on';
+1068
+1069 						while ( ( e = element.all[ i++ ] ) )
+1070 						{
+1071 							switch ( e.tagName.toLowerCase() )
+1072 							{
+1073 								case 'iframe' :
+1074 								case 'textarea' :
+1075 								case 'input' :
+1076 								case 'select' :
+1077 									/* Ignore the above tags */
+1078 									break;
+1079 								default :
+1080 									e.unselectable = 'on';
+1081 							}
+1082 						}
+1083 					}
+1084 				},
+1085
+1086 		getPositionedAncestor : function()
+1087 		{
+1088 			var current = this;
+1089 			while ( current.getName() != 'html' )
+1090 			{
+1091 				if ( current.getComputedStyle( 'position' ) != 'static' )
+1092 					return current;
+1093
+1094 				current = current.getParent();
+1095 			}
+1096 			return null;
+1097 		},
+1098
+1099 		getDocumentPosition : function( refDocument )
+1100 		{
+1101 			var x = 0, y = 0,
+1102 				body = this.getDocument().getBody(),
+1103 				quirks = this.getDocument().$.compatMode == 'BackCompat';
+1104
+1105 			var doc = this.getDocument();
+1106
+1107 			if ( document.documentElement[ "getBoundingClientRect" ] )
+1108 			{
+1109 				var box  = this.$.getBoundingClientRect(),
+1110 					$doc = doc.$,
+1111 					$docElem = $doc.documentElement;
+1112
+1113 				var clientTop = $docElem.clientTop || body.$.clientTop || 0,
+1114 					clientLeft = $docElem.clientLeft || body.$.clientLeft || 0,
+1115 					needAdjustScrollAndBorders = true;
+1116
+1117 				/*
+1118 				 * #3804: getBoundingClientRect() works differently on IE and non-IE
+1119 				 * browsers, regarding scroll positions.
+1120 				 *
+1121 				 * On IE, the top position of the <html> element is always 0, no matter
+1122 				 * how much you scrolled down.
+1123 				 *
+1124 				 * On other browsers, the top position of the <html> element is negative
+1125 				 * scrollTop.
+1126 				 */
+1127 				if ( CKEDITOR.env.ie )
+1128 				{
+1129 					var inDocElem = doc.getDocumentElement().contains( this ),
+1130 						inBody = doc.getBody().contains( this );
+1131
+1132 					needAdjustScrollAndBorders = ( quirks && inBody ) || ( !quirks && inDocElem );
+1133 				}
+1134
+1135 				if ( needAdjustScrollAndBorders )
+1136 				{
+1137 					x = box.left + ( !quirks && $docElem.scrollLeft || body.$.scrollLeft );
+1138 					x -= clientLeft;
+1139 					y = box.top  + ( !quirks && $docElem.scrollTop || body.$.scrollTop );
+1140 					y -= clientTop;
+1141 				}
+1142 			}
+1143 			else
+1144  			{
+1145 				var current = this, previous = null, offsetParent;
+1146 				while ( current && !( current.getName() == 'body' || current.getName() == 'html' ) )
+1147 				{
+1148 					x += current.$.offsetLeft - current.$.scrollLeft;
+1149 					y += current.$.offsetTop - current.$.scrollTop;
+1150
+1151 					// Opera includes clientTop|Left into offsetTop|Left.
+1152 					if ( !current.equals( this ) )
+1153 					{
+1154 						x += ( current.$.clientLeft || 0 );
+1155 						y += ( current.$.clientTop || 0 );
+1156 					}
+1157
+1158 					var scrollElement = previous;
+1159 					while ( scrollElement && !scrollElement.equals( current ) )
+1160 					{
+1161 						x -= scrollElement.$.scrollLeft;
+1162 						y -= scrollElement.$.scrollTop;
+1163 						scrollElement = scrollElement.getParent();
+1164 					}
+1165
+1166 					previous = current;
+1167 					current = ( offsetParent = current.$.offsetParent ) ?
+1168 					          new CKEDITOR.dom.element( offsetParent ) : null;
+1169 				}
+1170 			}
+1171
+1172 			if ( refDocument )
+1173 			{
+1174 				var currentWindow = this.getWindow(),
+1175 					refWindow = refDocument.getWindow();
+1176
+1177 				if ( !currentWindow.equals( refWindow ) && currentWindow.$.frameElement )
+1178 				{
+1179 					var iframePosition = ( new CKEDITOR.dom.element( currentWindow.$.frameElement ) ).getDocumentPosition( refDocument );
+1180
+1181 					x += iframePosition.x;
+1182 					y += iframePosition.y;
+1183 				}
+1184 			}
+1185
+1186 			if ( !document.documentElement[ "getBoundingClientRect" ] )
+1187 			{
+1188 				// In Firefox, we'll endup one pixel before the element positions,
+1189 				// so we must add it here.
+1190 				if ( CKEDITOR.env.gecko && !quirks )
+1191 				{
+1192 					x += this.$.clientLeft ? 1 : 0;
+1193 					y += this.$.clientTop ? 1 : 0;
+1194 				}
+1195 			}
+1196
+1197 			return { x : x, y : y };
+1198 		},
+1199
+1200 		scrollIntoView : function( alignTop )
+1201 		{
+1202 			// Get the element window.
+1203 			var win = this.getWindow(),
+1204 				winHeight = win.getViewPaneSize().height;
+1205
+1206 			// Starts from the offset that will be scrolled with the negative value of
+1207 			// the visible window height.
+1208 			var offset = winHeight * -1;
+1209
+1210 			// Append the view pane's height if align to top.
+1211 			// Append element height if we are aligning to the bottom.
+1212 			if ( alignTop )
+1213 				offset += winHeight;
+1214 			else
+1215 			{
+1216 				offset += this.$.offsetHeight || 0;
+1217
+1218 				// Consider the margin in the scroll, which is ok for our current needs, but
+1219 				// needs investigation if we will be using this function in other places.
+1220 				offset += parseInt( this.getComputedStyle( 'marginBottom' ) || 0, 10 ) || 0;
+1221 			}
+1222
+1223 			// Append the offsets for the entire element hierarchy.
+1224 			var elementPosition = this.getDocumentPosition();
+1225 			offset += elementPosition.y;
+1226 			// Scroll the window to the desired position, if not already visible.
+1227 			var currentScroll = win.getScrollPosition().y;
+1228
+1229 			// Though the computed offset value maybe out of range ( e.g.
+1230 			// a negative value ), browser will try to scroll as much as possible. (#3692)
+1231 			win.$.scrollTo( 0, offset > 0 ? offset : 0 );
+1232 		},
+1233
+1234 		setState : function( state )
+1235 		{
+1236 			switch ( state )
+1237 			{
+1238 				case CKEDITOR.TRISTATE_ON :
+1239 					this.addClass( 'cke_on' );
+1240 					this.removeClass( 'cke_off' );
+1241 					this.removeClass( 'cke_disabled' );
+1242 					break;
+1243 				case CKEDITOR.TRISTATE_DISABLED :
+1244 					this.addClass( 'cke_disabled' );
+1245 					this.removeClass( 'cke_off' );
+1246 					this.removeClass( 'cke_on' );
+1247 					break;
+1248 				default :
+1249 					this.addClass( 'cke_off' );
+1250 					this.removeClass( 'cke_on' );
+1251 					this.removeClass( 'cke_disabled' );
+1252 					break;
+1253 			}
+1254 		},
+1255
+1256 		/**
+1257 		 * Returns the inner document of this IFRAME element.
+1258 		 * @returns {CKEDITOR.dom.document} The inner document.
+1259 		 */
+1260 		getFrameDocument : function()
+1261 		{
+1262 			var $ = this.$;
+1263
+1264 			try
+1265 			{
+1266 				// In IE, with custom document.domain, it may happen that
+1267 				// the iframe is not yet available, resulting in "Access
+1268 				// Denied" for the following property access.
+1269 				$.contentWindow.document;
+1270 			}
+1271 			catch ( e )
+1272 			{
+1273 				// Trick to solve this issue, forcing the iframe to get ready
+1274 				// by simply setting its "src" property.
+1275 				$.src = $.src;
+1276
+1277 				// In IE6 though, the above is not enough, so we must pause the
+1278 				// execution for a while, giving it time to think.
+1279 				if ( CKEDITOR.env.ie && CKEDITOR.env.version < 7 )
+1280 				{
+1281 					window.showModalDialog(
+1282 						'javascript:document.write("' +
+1283 							'<script>' +
+1284 								'window.setTimeout(' +
+1285 									'function(){window.close();}' +
+1286 									',50);' +
+1287 							'</script>")' );
+1288 				}
+1289 			}
+1290
+1291 			return $ && new CKEDITOR.dom.document( $.contentWindow.document );
+1292 		},
+1293
+1294 		/**
+1295 		 * Copy all the attributes from one node to the other, kinda like a clone
+1296 		 * skipAttributes is an object with the attributes that must NOT be copied.
+1297 		 * @param {CKEDITOR.dom.element} dest The destination element.
+1298 		 * @param {Object} skipAttributes A dictionary of attributes to skip.
+1299 		 * @example
+1300 		 */
+1301 		copyAttributes : function( dest, skipAttributes )
+1302 		{
+1303 			var attributes = this.$.attributes;
+1304 			skipAttributes = skipAttributes || {};
+1305
+1306 			for ( var n = 0 ; n < attributes.length ; n++ )
+1307 			{
+1308 				var attribute = attributes[n];
+1309
+1310 				// IE BUG: value attribute is never specified even if it exists.
+1311 				if ( attribute.specified ||
+1312 				  ( CKEDITOR.env.ie && attribute.nodeValue && attribute.nodeName.toLowerCase() == 'value' ) )
+1313 				{
+1314 					var attrName = attribute.nodeName;
+1315 					// We can set the type only once, so do it with the proper value, not copying it.
+1316 					if ( attrName in skipAttributes )
+1317 						continue;
+1318
+1319 					var attrValue = this.getAttribute( attrName );
+1320 					if ( attrValue === null )
+1321 						attrValue = attribute.nodeValue;
+1322
+1323 					dest.setAttribute( attrName, attrValue );
+1324 				}
+1325 			}
+1326
+1327 			// The style:
+1328 			if ( this.$.style.cssText !== '' )
+1329 				dest.$.style.cssText = this.$.style.cssText;
+1330 		},
+1331
+1332 		/**
+1333 		 * Changes the tag name of the current element.
+1334 		 * @param {String} newTag The new tag for the element.
+1335 		 */
+1336 		renameNode : function( newTag )
+1337 		{
+1338 			// If it's already correct exit here.
+1339 			if ( this.getName() == newTag )
+1340 				return;
+1341
+1342 			var doc = this.getDocument();
+1343
+1344 			// Create the new node.
+1345 			var newNode = new CKEDITOR.dom.element( newTag, doc );
+1346
+1347 			// Copy all attributes.
+1348 			this.copyAttributes( newNode );
+1349
+1350 			// Move children to the new node.
+1351 			this.moveChildren( newNode );
+1352
+1353 			// Replace the node.
+1354 			this.$.parentNode.replaceChild( newNode.$, this.$ );
+1355 			newNode.$._cke_expando = this.$._cke_expando;
+1356 			this.$ = newNode.$;
+1357 		},
+1358
+1359 		/**
+1360 		 * Gets a DOM tree descendant under the current node.
+1361 		 * @param {Array|Number} indices The child index or array of child indices under the node.
+1362 		 * @returns {CKEDITOR.dom.node} The specified DOM child under the current node. Null if child does not exist.
+1363 		 * @example
+1364 		 * var strong = p.getChild(0);
+1365 		 */
+1366 		getChild : function( indices )
+1367 		{
+1368 			var rawNode = this.$;
+1369
+1370 			if ( !indices.slice )
+1371 				rawNode = rawNode.childNodes[ indices ];
+1372 			else
+1373 			{
+1374 				while ( indices.length > 0 && rawNode )
+1375 					rawNode = rawNode.childNodes[ indices.shift() ];
+1376 			}
+1377
+1378 			return rawNode ? new CKEDITOR.dom.node( rawNode ) : null;
+1379 		},
+1380
+1381 		getChildCount : function()
+1382 		{
+1383 			return this.$.childNodes.length;
+1384  		}
+1385 	});
+1386 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_elementpath.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_elementpath.js.html new file mode 100644 index 000000000..a5f801fd6 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_elementpath.js.html @@ -0,0 +1,112 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	// Elements that may be considered the "Block boundary" in an element path.
+  9 	var pathBlockElements = { address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,de:1 };
+ 10
+ 11 	// Elements that may be considered the "Block limit" in an element path.
+ 12 	var pathBlockLimitElements = { body:1,div:1,table:1,tbody:1,tr:1,td:1,th:1,caption:1,form:1 };
+ 13
+ 14 	// Check if an element contains any block element.
+ 15 	var checkHasBlock = function( element )
+ 16 	{
+ 17 		var childNodes = element.getChildren();
+ 18
+ 19 		for ( var i = 0, count = childNodes.count() ; i < count ; i++ )
+ 20 		{
+ 21 			var child = childNodes.getItem( i );
+ 22
+ 23 			if ( child.type == CKEDITOR.NODE_ELEMENT && CKEDITOR.dtd.$block[ child.getName() ] )
+ 24 				return true;
+ 25 		}
+ 26
+ 27 		return false;
+ 28 	};
+ 29
+ 30 	CKEDITOR.dom.elementPath = function( lastNode )
+ 31 	{
+ 32 		var block = null;
+ 33 		var blockLimit = null;
+ 34 		var elements = [];
+ 35
+ 36 		var e = lastNode;
+ 37
+ 38 		while ( e )
+ 39 		{
+ 40 			if ( e.type == CKEDITOR.NODE_ELEMENT )
+ 41 			{
+ 42 				if ( !this.lastElement )
+ 43 					this.lastElement = e;
+ 44
+ 45 				var elementName = e.getName();
+ 46 				if ( CKEDITOR.env.ie && e.$.scopeName != 'HTML' )
+ 47 					elementName = e.$.scopeName.toLowerCase() + ':' + elementName;
+ 48
+ 49 				if ( !blockLimit )
+ 50 				{
+ 51 					if ( !block && pathBlockElements[ elementName ] )
+ 52 						block = e;
+ 53
+ 54 					if ( pathBlockLimitElements[ elementName ] )
+ 55 					{
+ 56 						// DIV is considered the Block, if no block is available (#525)
+ 57 						// and if it doesn't contain other blocks.
+ 58 						if ( !block && elementName == 'div' && !checkHasBlock( e ) )
+ 59 							block = e;
+ 60 						else
+ 61 							blockLimit = e;
+ 62 					}
+ 63 				}
+ 64
+ 65 				elements.push( e );
+ 66
+ 67 				if ( elementName == 'body' )
+ 68 					break;
+ 69 			}
+ 70 			e = e.getParent();
+ 71 		}
+ 72
+ 73 		this.block = block;
+ 74 		this.blockLimit = blockLimit;
+ 75 		this.elements = elements;
+ 76 	};
+ 77 })();
+ 78
+ 79 CKEDITOR.dom.elementPath.prototype =
+ 80 {
+ 81 	/**
+ 82 	 * Compares this element path with another one.
+ 83 	 * @param {CKEDITOR.dom.elementPath} otherPath The elementPath object to be
+ 84 	 * compared with this one.
+ 85 	 * @returns {Boolean} "true" if the paths are equal, containing the same
+ 86 	 * number of elements and the same elements in the same order.
+ 87 	 */
+ 88 	compare : function( otherPath )
+ 89 	{
+ 90 		var thisElements = this.elements;
+ 91 		var otherElements = otherPath && otherPath.elements;
+ 92
+ 93 		if ( !otherElements || thisElements.length != otherElements.length )
+ 94 			return false;
+ 95
+ 96 		for ( var i = 0 ; i < thisElements.length ; i++ )
+ 97 		{
+ 98 			if ( !thisElements[ i ].equals( otherElements[ i ] ) )
+ 99 				return false;
+100 		}
+101
+102 		return true;
+103 	}
+104 };
+105 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_event.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_event.js.html new file mode 100644 index 000000000..a1b25da42 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_event.js.html @@ -0,0 +1,145 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.dom.event} class, which
+  8  *		represents the a native DOM event object.
+  9  */
+ 10
+ 11 /**
+ 12  * Represents a native DOM event object.
+ 13  * @constructor
+ 14  * @param {Object} domEvent A native DOM event object.
+ 15  * @example
+ 16  */
+ 17 CKEDITOR.dom.event = function( domEvent )
+ 18 {
+ 19 	/**
+ 20 	 * The native DOM event object represented by this class instance.
+ 21 	 * @type Object
+ 22 	 * @example
+ 23 	 */
+ 24 	this.$ = domEvent;
+ 25 };
+ 26
+ 27 CKEDITOR.dom.event.prototype =
+ 28 {
+ 29 	/**
+ 30 	 * Gets the key code associated to the event.
+ 31 	 * @returns {Number} The key code.
+ 32 	 * @example
+ 33 	 * alert( event.getKey() );  "65" is "a" has been pressed
+ 34 	 */
+ 35 	getKey : function()
+ 36 	{
+ 37 		return this.$.keyCode || this.$.which;
+ 38 	},
+ 39
+ 40 	/**
+ 41 	 * Gets a number represeting the combination of the keys pressed during the
+ 42 	 * event. It is the sum with the current key code and the {@link CKEDITOR.CTRL},
+ 43 	 * {@link CKEDITOR.SHIFT} and {@link CKEDITOR.ALT} constants.
+ 44 	 * @returns {Number} The number representing the keys combination.
+ 45 	 * @example
+ 46 	 * alert( event.getKeystroke() == 65 );                                   // "a" key
+ 47 	 * alert( event.getKeystroke() == CKEDITOR.CTRL + 65 );                   // CTRL + "a" key
+ 48 	 * alert( event.getKeystroke() == CKEDITOR.CTRL + CKEDITOR.SHIFT + 65 );  // CTRL + SHIFT + "a" key
+ 49 	 */
+ 50 	getKeystroke : function()
+ 51 	{
+ 52 		var keystroke = this.getKey();
+ 53
+ 54 		if ( this.$.ctrlKey || this.$.metaKey )
+ 55 			keystroke += CKEDITOR.CTRL;
+ 56
+ 57 		if ( this.$.shiftKey )
+ 58 			keystroke += CKEDITOR.SHIFT;
+ 59
+ 60 		if ( this.$.altKey )
+ 61 			keystroke += CKEDITOR.ALT;
+ 62
+ 63 		return keystroke;
+ 64 	},
+ 65
+ 66 	/**
+ 67 	 * Prevents the original behavior of the event to happen. It can optionally
+ 68 	 * stop propagating the event in the event chain.
+ 69 	 * @param {Boolean} [stopPropagation] Stop propagating this event in the
+ 70 	 *		event chain.
+ 71 	 * @example
+ 72 	 * var element = CKEDITOR.document.getById( 'myElement' );
+ 73 	 * element.on( 'click', function( ev )
+ 74 	 *     {
+ 75 	 *         // The DOM event object is passed by the "data" property.
+ 76 	 *         var domEvent = ev.data;
+ 77 	 *         // Prevent the click to chave any effect in the element.
+ 78 	 *         domEvent.preventDefault();
+ 79 	 *     });
+ 80 	 */
+ 81 	preventDefault : function( stopPropagation )
+ 82 	{
+ 83 		var $ = this.$;
+ 84 		if ( $.preventDefault )
+ 85 			$.preventDefault();
+ 86 		else
+ 87 			$.returnValue = false;
+ 88
+ 89 		if ( stopPropagation )
+ 90 		{
+ 91 			if ( $.stopPropagation )
+ 92 				$.stopPropagation();
+ 93 			else
+ 94 				$.cancelBubble = true;
+ 95 		}
+ 96 	},
+ 97 	/**
+ 98 	 * Returns the DOM node where the event was targeted to.
+ 99 	 * @returns {CKEDITOR.dom.node} The target DOM node.
+100 	 * @example
+101 	 * var element = CKEDITOR.document.getById( 'myElement' );
+102 	 * element.on( 'click', function( ev )
+103 	 *     {
+104 	 *         // The DOM event object is passed by the "data" property.
+105 	 *         var domEvent = ev.data;
+106 	 *         // Add a CSS class to the event target.
+107 	 *         domEvent.getTarget().addClass( 'clicked' );
+108 	 *     });
+109 	 */
+110
+111 	getTarget : function()
+112 	{
+113 		var rawNode = this.$.target || this.$.srcElement;
+114 		return rawNode ? new CKEDITOR.dom.node( rawNode ) : null;
+115 	}
+116 };
+117
+118 /**
+119  * CTRL key (1000).
+120  * @constant
+121  * @example
+122  */
+123 CKEDITOR.CTRL = 1000;
+124
+125 /**
+126  * SHIFT key (2000).
+127  * @constant
+128  * @example
+129  */
+130 CKEDITOR.SHIFT = 2000;
+131
+132 /**
+133  * ALT key (4000).
+134  * @constant
+135  * @example
+136  */
+137 CKEDITOR.ALT = 4000;
+138 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_node.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_node.js.html new file mode 100644 index 000000000..ca0f71679 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_node.js.html @@ -0,0 +1,654 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.dom.node} class, which is the base
+  8  *		class for classes that represent DOM nodes.
+  9  */
+ 10
+ 11 /**
+ 12  * Base class for classes representing DOM nodes. This constructor may return
+ 13  * and instance of classes that inherits this class, like
+ 14  * {@link CKEDITOR.dom.element} or {@link CKEDITOR.dom.text}.
+ 15  * @augments CKEDITOR.dom.domObject
+ 16  * @param {Object} domNode A native DOM node.
+ 17  * @constructor
+ 18  * @see CKEDITOR.dom.element
+ 19  * @see CKEDITOR.dom.text
+ 20  * @example
+ 21  */
+ 22 CKEDITOR.dom.node = function( domNode )
+ 23 {
+ 24 	if ( domNode )
+ 25 	{
+ 26 		switch ( domNode.nodeType )
+ 27 		{
+ 28 			case CKEDITOR.NODE_ELEMENT :
+ 29 				return new CKEDITOR.dom.element( domNode );
+ 30
+ 31 			case CKEDITOR.NODE_TEXT :
+ 32 				return new CKEDITOR.dom.text( domNode );
+ 33 		}
+ 34
+ 35 		// Call the base constructor.
+ 36 		CKEDITOR.dom.domObject.call( this, domNode );
+ 37 	}
+ 38
+ 39 	return this;
+ 40 };
+ 41
+ 42 CKEDITOR.dom.node.prototype = new CKEDITOR.dom.domObject();
+ 43
+ 44 /**
+ 45  * Element node type.
+ 46  * @constant
+ 47  * @example
+ 48  */
+ 49 CKEDITOR.NODE_ELEMENT = 1;
+ 50
+ 51 /**
+ 52  * Text node type.
+ 53  * @constant
+ 54  * @example
+ 55  */
+ 56 CKEDITOR.NODE_TEXT = 3;
+ 57
+ 58 /**
+ 59  * Comment node type.
+ 60  * @constant
+ 61  * @example
+ 62  */
+ 63 CKEDITOR.NODE_COMMENT = 8;
+ 64
+ 65 CKEDITOR.NODE_DOCUMENT_FRAGMENT = 11;
+ 66
+ 67 CKEDITOR.POSITION_IDENTICAL = 0;
+ 68 CKEDITOR.POSITION_DISCONNECTED = 1;
+ 69 CKEDITOR.POSITION_FOLLOWING = 2;
+ 70 CKEDITOR.POSITION_PRECEDING = 4;
+ 71 CKEDITOR.POSITION_IS_CONTAINED = 8;
+ 72 CKEDITOR.POSITION_CONTAINS = 16;
+ 73
+ 74 CKEDITOR.tools.extend( CKEDITOR.dom.node.prototype,
+ 75 	/** @lends CKEDITOR.dom.node.prototype */
+ 76 	{
+ 77 		/**
+ 78 		 * Makes this node child of another element.
+ 79 		 * @param {CKEDITOR.dom.element} element The target element to which append
+ 80 		 *		this node.
+ 81 		 * @returns {CKEDITOR.dom.element} The target element.
+ 82 		 * @example
+ 83 		 * var p = new CKEDITOR.dom.element( 'p' );
+ 84 		 * var strong = new CKEDITOR.dom.element( 'strong' );
+ 85 		 * strong.appendTo( p );
+ 86 		 *
+ 87 		 * // result: "<p><strong></strong></p>"
+ 88 		 */
+ 89 		appendTo : function( element, toStart )
+ 90 		{
+ 91 			element.append( this, toStart );
+ 92 			return element;
+ 93 		},
+ 94
+ 95 		clone : function( includeChildren, cloneId )
+ 96 		{
+ 97 			var $clone = this.$.cloneNode( includeChildren );
+ 98
+ 99 			if ( !cloneId )
+100 			{
+101 				var removeIds = function( node )
+102 				{
+103 					if ( node.nodeType != CKEDITOR.NODE_ELEMENT )
+104 						return;
+105
+106 					node.removeAttribute( 'id', false ) ;
+107 					node.removeAttribute( '_cke_expando', false ) ;
+108
+109 					var childs = node.childNodes;
+110 					for ( var i=0 ; i < childs.length ; i++ )
+111 						removeIds( childs[ i ] );
+112 				};
+113
+114 				// The "id" attribute should never be cloned to avoid duplication.
+115 				removeIds( $clone );
+116 			}
+117
+118 			return new CKEDITOR.dom.node( $clone );
+119 		},
+120
+121 		hasPrevious : function()
+122 		{
+123 			return !!this.$.previousSibling;
+124 		},
+125
+126 		hasNext : function()
+127 		{
+128 			return !!this.$.nextSibling;
+129 		},
+130
+131 		/**
+132 		 * Inserts this element after a node.
+133 		 * @param {CKEDITOR.dom.node} node The that will preceed this element.
+134 		 * @returns {CKEDITOR.dom.node} The node preceeding this one after
+135 		 *		insertion.
+136 		 * @example
+137 		 * var em = new CKEDITOR.dom.element( 'em' );
+138 		 * var strong = new CKEDITOR.dom.element( 'strong' );
+139 		 * strong.insertAfter( em );
+140 		 *
+141 		 * // result: "<em></em><strong></strong>"
+142 		 */
+143 		insertAfter : function( node )
+144 		{
+145 			node.$.parentNode.insertBefore( this.$, node.$.nextSibling );
+146 			return node;
+147 		},
+148
+149 		/**
+150 		 * Inserts this element before a node.
+151 		 * @param {CKEDITOR.dom.node} node The that will be after this element.
+152 		 * @returns {CKEDITOR.dom.node} The node being inserted.
+153 		 * @example
+154 		 * var em = new CKEDITOR.dom.element( 'em' );
+155 		 * var strong = new CKEDITOR.dom.element( 'strong' );
+156 		 * strong.insertBefore( em );
+157 		 *
+158 		 * // result: "<strong></strong><em></em>"
+159 		 */
+160 		insertBefore : function( node )
+161 		{
+162 			node.$.parentNode.insertBefore( this.$, node.$ );
+163 			return node;
+164 		},
+165
+166 		insertBeforeMe : function( node )
+167 		{
+168 			this.$.parentNode.insertBefore( node.$, this.$ );
+169 			return node;
+170 		},
+171
+172 		/**
+173 		 * Retrieves a uniquely identifiable tree address for this node.
+174 		 * The tree address returns is an array of integers, with each integer
+175 		 * indicating a child index of a DOM node, starting from
+176 		 * document.documentElement.
+177 		 *
+178 		 * For example, assuming <body> is the second child from <html> (<head>
+179 		 * being the first), and we'd like to address the third child under the
+180 		 * fourth child of body, the tree address returned would be:
+181 		 * [1, 3, 2]
+182 		 *
+183 		 * The tree address cannot be used for finding back the DOM tree node once
+184 		 * the DOM tree structure has been modified.
+185 		 */
+186 		getAddress : function( normalized )
+187 		{
+188 			var address = [];
+189 			var $documentElement = this.getDocument().$.documentElement;
+190 			var node = this.$;
+191
+192 			while ( node && node != $documentElement )
+193 			{
+194 				var parentNode = node.parentNode;
+195 				var currentIndex = -1;
+196
+197 				for ( var i = 0 ; i < parentNode.childNodes.length ; i++ )
+198 				{
+199 					var candidate = parentNode.childNodes[i];
+200
+201 					if ( normalized &&
+202 							candidate.nodeType == 3 &&
+203 							candidate.previousSibling &&
+204 							candidate.previousSibling.nodeType == 3 )
+205 					{
+206 						continue;
+207 					}
+208
+209 					currentIndex++;
+210
+211 					if ( candidate == node )
+212 						break;
+213 				}
+214
+215 				address.unshift( currentIndex );
+216
+217 				node = node.parentNode;
+218 			}
+219
+220 			return address;
+221 		},
+222
+223 		/**
+224 		 * Gets the document containing this element.
+225 		 * @returns {CKEDITOR.dom.document} The document.
+226 		 * @example
+227 		 * var element = CKEDITOR.document.getById( 'example' );
+228 		 * alert( <b>element.getDocument().equals( CKEDITOR.document )</b> );  // "true"
+229 		 */
+230 		getDocument : function()
+231 		{
+232 			var document = new CKEDITOR.dom.document( this.$.ownerDocument || this.$.parentNode.ownerDocument );
+233
+234 			return (
+235 			/** @ignore */
+236 			this.getDocument = function()
+237 				{
+238 					return document;
+239 				})();
+240 		},
+241
+242 		getIndex : function()
+243 		{
+244 			var $ = this.$;
+245
+246 			var currentNode = $.parentNode && $.parentNode.firstChild;
+247 			var currentIndex = -1;
+248
+249 			while ( currentNode )
+250 			{
+251 				currentIndex++;
+252
+253 				if ( currentNode == $ )
+254 					return currentIndex;
+255
+256 				currentNode = currentNode.nextSibling;
+257 			}
+258
+259 			return -1;
+260 		},
+261
+262 		getNextSourceNode : function( startFromSibling, nodeType, guard )
+263 		{
+264 			// If "guard" is a node, transform it in a function.
+265 			if ( guard && !guard.call )
+266 			{
+267 				var guardNode = guard;
+268 				guard = function( node )
+269 				{
+270 					return !node.equals( guardNode );
+271 				};
+272 			}
+273
+274 			var node = ( !startFromSibling && this.getFirst && this.getFirst() ),
+275 				parent;
+276
+277 			// Guarding when we're skipping the current element( no children or 'startFromSibling' ).
+278 			// send the 'moving out' signal even we don't actually dive into.
+279 			if ( !node )
+280 			{
+281 				if ( this.type == CKEDITOR.NODE_ELEMENT && guard && guard( this, true ) === false )
+282 					return null;
+283 				node = this.getNext();
+284 			}
+285
+286 			while ( !node && ( parent = ( parent || this ).getParent() ) )
+287 			{
+288 				// The guard check sends the "true" paramenter to indicate that
+289 				// we are moving "out" of the element.
+290 				if ( guard && guard( parent, true ) === false )
+291 					return null;
+292
+293 				node = parent.getNext();
+294 			}
+295
+296 			if ( !node )
+297 				return null;
+298
+299 			if ( guard && guard( node ) === false )
+300 				return null;
+301
+302 			if ( nodeType && nodeType != node.type )
+303 				return node.getNextSourceNode( false, nodeType, guard );
+304
+305 			return node;
+306 		},
+307
+308 		getPreviousSourceNode : function( startFromSibling, nodeType, guard )
+309 		{
+310 			if ( guard && !guard.call )
+311 			{
+312 				var guardNode = guard;
+313 				guard = function( node )
+314 				{
+315 					return !node.equals( guardNode );
+316 				};
+317 			}
+318
+319 			var node = ( !startFromSibling && this.getLast && this.getLast() ),
+320 				parent;
+321
+322 			// Guarding when we're skipping the current element( no children or 'startFromSibling' ).
+323 			// send the 'moving out' signal even we don't actually dive into.
+324 			if ( !node )
+325 			{
+326 				if ( this.type == CKEDITOR.NODE_ELEMENT && guard && guard( this, true ) === false )
+327 					return null;
+328 				node = this.getPrevious();
+329 			}
+330
+331 			while ( !node && ( parent = ( parent || this ).getParent() ) )
+332 			{
+333 				// The guard check sends the "true" paramenter to indicate that
+334 				// we are moving "out" of the element.
+335 				if ( guard && guard( parent, true ) === false )
+336 					return null;
+337
+338 				node = parent.getPrevious();
+339 			}
+340
+341 			if ( !node )
+342 				return null;
+343
+344 			if ( guard && guard( node ) === false )
+345 				return null;
+346
+347 			if ( nodeType && node.type != nodeType )
+348 				return node.getPreviousSourceNode( false, nodeType, guard );
+349
+350 			return node;
+351 		},
+352
+353 		getPrevious : function( ignoreSpaces )
+354 		{
+355 			var previous = this.$.previousSibling;
+356 			while ( ignoreSpaces && previous && ( previous.nodeType == CKEDITOR.NODE_TEXT )
+357 					&& !CKEDITOR.tools.trim( previous.nodeValue ) )
+358 				previous = previous.previousSibling;
+359
+360 			return previous ? new CKEDITOR.dom.node( previous ) : null;
+361 		},
+362
+363 		/**
+364 		 * Gets the node that follows this element in its parent's child list.
+365 		 * @param {Boolean} ignoreSpaces Whether should ignore empty text nodes.
+366 		 * @returns {CKEDITOR.dom.node} The next node or null if not
+367 		 *		available.
+368 		 * @example
+369 		 * var element = CKEDITOR.dom.element.createFromHtml( '<div><b>Example</b> <i>next</i></div>' );
+370 		 * var first = <b>element.getFirst().getNext()</b>;
+371 		 * alert( first.getName() );  // "i"
+372 		 */
+373 		getNext : function( ignoreSpaces )
+374 		{
+375 			var next = this.$.nextSibling;
+376 			while ( ignoreSpaces && next && ( next.nodeType == CKEDITOR.NODE_TEXT )
+377 				  && !CKEDITOR.tools.trim( next.nodeValue ) )
+378 				next = next.nextSibling;
+379
+380 			return next ? new CKEDITOR.dom.node( next ) : null;
+381 		},
+382
+383 		/**
+384 		 * Gets the parent element for this node.
+385 		 * @returns {CKEDITOR.dom.element} The parent element.
+386 		 * @example
+387 		 * var node = editor.document.getBody().getFirst();
+388 		 * var parent = node.<b>getParent()</b>;
+389 		 * alert( node.getName() );  // "body"
+390 		 */
+391 		getParent : function()
+392 		{
+393 			var parent = this.$.parentNode;
+394 			return ( parent && parent.nodeType == 1 ) ? new CKEDITOR.dom.node( parent ) : null;
+395 		},
+396
+397 		getParents : function()
+398 		{
+399 			var node = this;
+400 			var parents = [];
+401
+402 			do
+403 			{
+404 				parents.unshift( node );
+405 			}
+406 			while ( ( node = node.getParent() ) )
+407
+408 			return parents;
+409 		},
+410
+411 		getCommonAncestor : function( node )
+412 		{
+413 			if ( node.equals( this ) )
+414 				return this;
+415
+416 			if ( node.contains && node.contains( this ) )
+417 				return node;
+418
+419 			var start = this.contains ? this : this.getParent();
+420
+421 			do
+422 			{
+423 				if ( start.contains( node ) )
+424 					return start;
+425 			}
+426 			while ( ( start = start.getParent() ) );
+427
+428 			return null;
+429 		},
+430
+431 		getPosition : function( otherNode )
+432 		{
+433 			var $ = this.$;
+434 			var $other = otherNode.$;
+435
+436 			if ( $.compareDocumentPosition )
+437 				return $.compareDocumentPosition( $other );
+438
+439 			// IE and Safari have no support for compareDocumentPosition.
+440
+441 			if ( $ == $other )
+442 				return CKEDITOR.POSITION_IDENTICAL;
+443
+444 			// Only element nodes support contains and sourceIndex.
+445 			if ( this.type == CKEDITOR.NODE_ELEMENT && otherNode.type == CKEDITOR.NODE_ELEMENT )
+446 			{
+447 				if ( $.contains )
+448 				{
+449 					if ( $.contains( $other ) )
+450 						return CKEDITOR.POSITION_CONTAINS + CKEDITOR.POSITION_PRECEDING;
+451
+452 					if ( $other.contains( $ ) )
+453 						return CKEDITOR.POSITION_IS_CONTAINED + CKEDITOR.POSITION_FOLLOWING;
+454 				}
+455
+456 				if ( 'sourceIndex' in $ )
+457 				{
+458 					return ( $.sourceIndex < 0 || $other.sourceIndex < 0 ) ? CKEDITOR.POSITION_DISCONNECTED :
+459 						( $.sourceIndex < $other.sourceIndex ) ? CKEDITOR.POSITION_PRECEDING :
+460 						CKEDITOR.POSITION_FOLLOWING;
+461 				}
+462 			}
+463
+464 			// For nodes that don't support compareDocumentPosition, contains
+465 			// or sourceIndex, their "address" is compared.
+466
+467 			var addressOfThis = this.getAddress(),
+468 				addressOfOther = otherNode.getAddress(),
+469 				minLevel = Math.min( addressOfThis.length, addressOfOther.length );
+470
+471 				// Determinate preceed/follow relationship.
+472 				for ( var i = 0 ; i <= minLevel - 1 ; i++ )
+473  				{
+474 					if ( addressOfThis[ i ] != addressOfOther[ i ] )
+475 					{
+476 						if ( i < minLevel )
+477 						{
+478 							return addressOfThis[ i ] < addressOfOther[ i ] ?
+479 						            CKEDITOR.POSITION_PRECEDING : CKEDITOR.POSITION_FOLLOWING;
+480 						}
+481 						break;
+482 					}
+483  				}
+484
+485 				// Determinate contains/contained relationship.
+486 				return ( addressOfThis.length < addressOfOther.length ) ?
+487 							CKEDITOR.POSITION_CONTAINS + CKEDITOR.POSITION_PRECEDING :
+488 							CKEDITOR.POSITION_IS_CONTAINED + CKEDITOR.POSITION_FOLLOWING;
+489 		},
+490
+491 		/**
+492 		 * Gets the closes ancestor node of a specified node name.
+493 		 * @param {String} name Node name of ancestor node.
+494 		 * @param {Boolean} includeSelf (Optional) Whether to include the current
+495 		 * node in the calculation or not.
+496 		 * @returns {CKEDITOR.dom.node} Ancestor node.
+497 		 */
+498 		getAscendant : function( name, includeSelf )
+499 		{
+500 			var $ = this.$;
+501
+502 			if ( !includeSelf )
+503 				$ = $.parentNode;
+504
+505 			while ( $ )
+506 			{
+507 				if ( $.nodeName && $.nodeName.toLowerCase() == name )
+508 					return new CKEDITOR.dom.node( $ );
+509
+510 				$ = $.parentNode;
+511 			}
+512 			return null;
+513 		},
+514
+515 		hasAscendant : function( name, includeSelf )
+516 		{
+517 			var $ = this.$;
+518
+519 			if ( !includeSelf )
+520 				$ = $.parentNode;
+521
+522 			while ( $ )
+523 			{
+524 				if ( $.nodeName && $.nodeName.toLowerCase() == name )
+525 					return true;
+526
+527 				$ = $.parentNode;
+528 			}
+529 			return false;
+530 		},
+531
+532 		move : function( target, toStart )
+533 		{
+534 			target.append( this.remove(), toStart );
+535 		},
+536
+537 		/**
+538 		 * Removes this node from the document DOM.
+539 		 * @param {Boolean} [preserveChildren] Indicates that the children
+540 		 *		elements must remain in the document, removing only the outer
+541 		 *		tags.
+542 		 * @example
+543 		 * var element = CKEDITOR.dom.element.getById( 'MyElement' );
+544 		 * <b>element.remove()</b>;
+545 		 */
+546 		remove : function( preserveChildren )
+547 		{
+548 			var $ = this.$;
+549 			var parent = $.parentNode;
+550
+551 			if ( parent )
+552 			{
+553 				if ( preserveChildren )
+554 				{
+555 					// Move all children before the node.
+556 					for ( var child ; ( child = $.firstChild ) ; )
+557 					{
+558 						parent.insertBefore( $.removeChild( child ), $ );
+559 					}
+560 				}
+561
+562 				parent.removeChild( $ );
+563 			}
+564
+565 			return this;
+566 		},
+567
+568 		replace : function( nodeToReplace )
+569 		{
+570 			this.insertBefore( nodeToReplace );
+571 			nodeToReplace.remove();
+572 		},
+573
+574 		trim : function()
+575 		{
+576 			this.ltrim();
+577 			this.rtrim();
+578 		},
+579
+580 		ltrim : function()
+581 		{
+582 			var child;
+583 			while ( this.getFirst && ( child = this.getFirst() ) )
+584 			{
+585 				if ( child.type == CKEDITOR.NODE_TEXT )
+586 				{
+587 					var trimmed = CKEDITOR.tools.ltrim( child.getText() ),
+588 						originalLength = child.getLength();
+589
+590 					if ( !trimmed )
+591 					{
+592 						child.remove();
+593 						continue;
+594 					}
+595 					else if ( trimmed.length < originalLength )
+596 					{
+597 						child.split( originalLength - trimmed.length );
+598
+599 						// IE BUG: child.remove() may raise JavaScript errors here. (#81)
+600 						this.$.removeChild( this.$.firstChild );
+601 					}
+602 				}
+603 				break;
+604 			}
+605 		},
+606
+607 		rtrim : function()
+608 		{
+609 			var child;
+610 			while ( this.getLast && ( child = this.getLast() ) )
+611 			{
+612 				if ( child.type == CKEDITOR.NODE_TEXT )
+613 				{
+614 					var trimmed = CKEDITOR.tools.rtrim( child.getText() ),
+615 						originalLength = child.getLength();
+616
+617 					if ( !trimmed )
+618 					{
+619 						child.remove();
+620 						continue;
+621 					}
+622 					else if ( trimmed.length < originalLength )
+623 					{
+624 						child.split( trimmed.length );
+625
+626 						// IE BUG: child.getNext().remove() may raise JavaScript errors here.
+627 						// (#81)
+628 						this.$.lastChild.parentNode.removeChild( this.$.lastChild );
+629 					}
+630 				}
+631 				break;
+632 			}
+633
+634 			if ( !CKEDITOR.env.ie && !CKEDITOR.env.opera )
+635 			{
+636 				child = this.$.lastChild;
+637
+638 				if ( child && child.type == 1 && child.nodeName.toLowerCase() == 'br' )
+639 				{
+640 					// Use "eChildNode.parentNode" instead of "node" to avoid IE bug (#324).
+641 					child.parentNode.removeChild( child ) ;
+642 				}
+643 			}
+644 		}
+645 	}
+646 );
+647 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_nodelist.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_nodelist.js.html new file mode 100644 index 000000000..bee39085b --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_nodelist.js.html @@ -0,0 +1,31 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dom.nodeList = function( nativeList )
+  7 {
+  8 	this.$ = nativeList;
+  9 };
+ 10
+ 11 CKEDITOR.dom.nodeList.prototype =
+ 12 {
+ 13 	count : function()
+ 14 	{
+ 15 		return this.$.length;
+ 16 	},
+ 17
+ 18 	getItem : function( index )
+ 19 	{
+ 20 		var $node = this.$[ index ];
+ 21 		return $node ? new CKEDITOR.dom.node( $node ) : null;
+ 22 	}
+ 23 };
+ 24 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_range.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_range.js.html new file mode 100644 index 000000000..e3d24fb5b --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_range.js.html @@ -0,0 +1,1651 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dom.range = function( document )
+  7 {
+  8 	this.startContainer	= null;
+  9 	this.startOffset	= null;
+ 10 	this.endContainer	= null;
+ 11 	this.endOffset		= null;
+ 12 	this.collapsed		= true;
+ 13
+ 14 	this.document = document;
+ 15 };
+ 16
+ 17 (function()
+ 18 {
+ 19 	// Updates the "collapsed" property for the given range object.
+ 20 	var updateCollapsed = function( range )
+ 21 	{
+ 22 		range.collapsed = (
+ 23 			range.startContainer &&
+ 24 			range.endContainer &&
+ 25 			range.startContainer.equals( range.endContainer ) &&
+ 26 			range.startOffset == range.endOffset );
+ 27 	};
+ 28
+ 29 	// This is a shared function used to delete, extract and clone the range
+ 30 	// contents.
+ 31 	// V2
+ 32 	var execContentsAction = function( range, action, docFrag )
+ 33 	{
+ 34 		range.optimizeBookmark();
+ 35
+ 36 		var startNode	= range.startContainer;
+ 37 		var endNode		= range.endContainer;
+ 38
+ 39 		var startOffset	= range.startOffset;
+ 40 		var endOffset	= range.endOffset;
+ 41
+ 42 		var removeStartNode;
+ 43 		var removeEndNode;
+ 44
+ 45 		// For text containers, we must simply split the node and point to the
+ 46 		// second part. The removal will be handled by the rest of the code .
+ 47 		if ( endNode.type == CKEDITOR.NODE_TEXT )
+ 48 			endNode = endNode.split( endOffset );
+ 49 		else
+ 50 		{
+ 51 			// If the end container has children and the offset is pointing
+ 52 			// to a child, then we should start from it.
+ 53 			if ( endNode.getChildCount() > 0 )
+ 54 			{
+ 55 				// If the offset points after the last node.
+ 56 				if ( endOffset >= endNode.getChildCount() )
+ 57 				{
+ 58 					// Let's create a temporary node and mark it for removal.
+ 59 					endNode = endNode.append( range.document.createText( '' ) );
+ 60 					removeEndNode = true;
+ 61 				}
+ 62 				else
+ 63 					endNode = endNode.getChild( endOffset );
+ 64 			}
+ 65 		}
+ 66
+ 67 		// For text containers, we must simply split the node. The removal will
+ 68 		// be handled by the rest of the code .
+ 69 		if ( startNode.type == CKEDITOR.NODE_TEXT )
+ 70 		{
+ 71 			startNode.split( startOffset );
+ 72
+ 73 			// In cases the end node is the same as the start node, the above
+ 74 			// splitting will also split the end, so me must move the end to
+ 75 			// the second part of the split.
+ 76 			if ( startNode.equals( endNode ) )
+ 77 				endNode = startNode.getNext();
+ 78 		}
+ 79 		else
+ 80 		{
+ 81 			// If the start container has children and the offset is pointing
+ 82 			// to a child, then we should start from its previous sibling.
+ 83
+ 84 			// If the offset points to the first node, we don't have a
+ 85 			// sibling, so let's use the first one, but mark it for removal.
+ 86 			if ( !startOffset )
+ 87 			{
+ 88 				// Let's create a temporary node and mark it for removal.
+ 89 				startNode = startNode.getFirst().insertBeforeMe( range.document.createText( '' ) );
+ 90 				removeStartNode = true;
+ 91 			}
+ 92 			else if ( startOffset >= startNode.getChildCount() )
+ 93 			{
+ 94 				// Let's create a temporary node and mark it for removal.
+ 95 				startNode = startNode.append( range.document.createText( '' ) );
+ 96 				removeStartNode = true;
+ 97 			}
+ 98 			else
+ 99 				startNode = startNode.getChild( startOffset ).getPrevious();
+100 		}
+101
+102 		// Get the parent nodes tree for the start and end boundaries.
+103 		var startParents	= startNode.getParents();
+104 		var endParents		= endNode.getParents();
+105
+106 		// Compare them, to find the top most siblings.
+107 		var i, topStart, topEnd;
+108
+109 		for ( i = 0 ; i < startParents.length ; i++ )
+110 		{
+111 			topStart = startParents[ i ];
+112 			topEnd = endParents[ i ];
+113
+114 			// The compared nodes will match until we find the top most
+115 			// siblings (different nodes that have the same parent).
+116 			// "i" will hold the index in the parents array for the top
+117 			// most element.
+118 			if ( !topStart.equals( topEnd ) )
+119 				break;
+120 		}
+121
+122 		var clone = docFrag, levelStartNode, levelClone, currentNode, currentSibling;
+123
+124 		// Remove all successive sibling nodes for every node in the
+125 		// startParents tree.
+126 		for ( var j = i ; j < startParents.length ; j++ )
+127 		{
+128 			levelStartNode = startParents[j];
+129
+130 			// For Extract and Clone, we must clone this level.
+131 			if ( clone && !levelStartNode.equals( startNode ) )		// action = 0 = Delete
+132 				levelClone = clone.append( levelStartNode.clone() );
+133
+134 			currentNode = levelStartNode.getNext();
+135
+136 			while( currentNode )
+137 			{
+138 				// Stop processing when the current node matches a node in the
+139 				// endParents tree or if it is the endNode.
+140 				if ( currentNode.equals( endParents[ j ] ) || currentNode.equals( endNode ) )
+141 					break;
+142
+143 				// Cache the next sibling.
+144 				currentSibling = currentNode.getNext();
+145
+146 				// If cloning, just clone it.
+147 				if ( action == 2 )	// 2 = Clone
+148 					clone.append( currentNode.clone( true ) );
+149 				else
+150 				{
+151 					// Both Delete and Extract will remove the node.
+152 					currentNode.remove();
+153
+154 					// When Extracting, move the removed node to the docFrag.
+155 					if ( action == 1 )	// 1 = Extract
+156 						clone.append( currentNode );
+157 				}
+158
+159 				currentNode = currentSibling;
+160 			}
+161
+162 			if ( clone )
+163 				clone = levelClone;
+164 		}
+165
+166 		clone = docFrag;
+167
+168 		// Remove all previous sibling nodes for every node in the
+169 		// endParents tree.
+170 		for ( var k = i ; k < endParents.length ; k++ )
+171 		{
+172 			levelStartNode = endParents[ k ];
+173
+174 			// For Extract and Clone, we must clone this level.
+175 			if ( action > 0 && !levelStartNode.equals( endNode ) )		// action = 0 = Delete
+176 				levelClone = clone.append( levelStartNode.clone() );
+177
+178 			// The processing of siblings may have already been done by the parent.
+179 			if ( !startParents[ k ] || levelStartNode.$.parentNode != startParents[ k ].$.parentNode )
+180 			{
+181 				currentNode = levelStartNode.getPrevious();
+182
+183 				while( currentNode )
+184 				{
+185 					// Stop processing when the current node matches a node in the
+186 					// startParents tree or if it is the startNode.
+187 					if ( currentNode.equals( startParents[ k ] ) || currentNode.equals( startNode ) )
+188 						break;
+189
+190 					// Cache the next sibling.
+191 					currentSibling = currentNode.getPrevious();
+192
+193 					// If cloning, just clone it.
+194 					if ( action == 2 )	// 2 = Clone
+195 						clone.$.insertBefore( currentNode.$.cloneNode( true ), clone.$.firstChild ) ;
+196 					else
+197 					{
+198 						// Both Delete and Extract will remove the node.
+199 						currentNode.remove();
+200
+201 						// When Extracting, mode the removed node to the docFrag.
+202 						if ( action == 1 )	// 1 = Extract
+203 							clone.$.insertBefore( currentNode.$, clone.$.firstChild );
+204 					}
+205
+206 					currentNode = currentSibling;
+207 				}
+208 			}
+209
+210 			if ( clone )
+211 				clone = levelClone;
+212 		}
+213
+214 		if ( action == 2 )		// 2 = Clone.
+215 		{
+216 			// No changes in the DOM should be done, so fix the split text (if any).
+217
+218 			var startTextNode = range.startContainer;
+219 			if ( startTextNode.type == CKEDITOR.NODE_TEXT )
+220 			{
+221 				startTextNode.$.data += startTextNode.$.nextSibling.data;
+222 				startTextNode.$.parentNode.removeChild( startTextNode.$.nextSibling );
+223 			}
+224
+225 			var endTextNode = range.endContainer;
+226 			if ( endTextNode.type == CKEDITOR.NODE_TEXT && endTextNode.$.nextSibling )
+227 			{
+228 				endTextNode.$.data += endTextNode.$.nextSibling.data;
+229 				endTextNode.$.parentNode.removeChild( endTextNode.$.nextSibling );
+230 			}
+231 		}
+232 		else
+233 		{
+234 			// Collapse the range.
+235
+236 			// If a node has been partially selected, collapse the range between
+237 			// topStart and topEnd. Otherwise, simply collapse it to the start. (W3C specs).
+238 			if ( topStart && topEnd && ( startNode.$.parentNode != topStart.$.parentNode || endNode.$.parentNode != topEnd.$.parentNode ) )
+239 			{
+240 				var endIndex = topEnd.getIndex();
+241
+242 				// If the start node is to be removed, we must correct the
+243 				// index to reflect the removal.
+244 				if ( removeStartNode && topEnd.$.parentNode == startNode.$.parentNode )
+245 					endIndex--;
+246
+247 				range.setStart( topEnd.getParent(), endIndex );
+248 			}
+249
+250 			// Collapse it to the start.
+251 			range.collapse( true );
+252 		}
+253
+254 		// Cleanup any marked node.
+255 		if( removeStartNode )
+256 			startNode.remove();
+257
+258 		if( removeEndNode && endNode.$.parentNode )
+259 			endNode.remove();
+260 	};
+261
+262 	var inlineChildReqElements = { abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 };
+263
+264 	// Creates the appropriate node evaluator for the dom walker used inside
+265 	// check(Start|End)OfBlock.
+266 	function getCheckStartEndBlockEvalFunction( isStart )
+267 	{
+268 		var hadBr = false, bookmarkEvaluator = CKEDITOR.dom.walker.bookmark( true );
+269 		return function( node )
+270 		{
+271 			// First ignore bookmark nodes.
+272 			if ( bookmarkEvaluator( node ) )
+273 				return true;
+274
+275 			if ( node.type == CKEDITOR.NODE_TEXT )
+276 			{
+277 				// If there's any visible text, then we're not at the start.
+278 				if ( CKEDITOR.tools.trim( node.getText() ).length )
+279 					return false;
+280 				}
+281 			else
+282 			{
+283 				// If there are non-empty inline elements (e.g. <img />), then we're not
+284 				// at the start.
+285 				if ( !inlineChildReqElements[ node.getName() ] )
+286 				{
+287 					// If we're working at the end-of-block, forgive the first <br /> in non-IE
+288 					// browsers.
+289 					if ( !isStart && !CKEDITOR.env.ie && node.getName() == 'br' && !hadBr )
+290 						hadBr = true;
+291 					else
+292 						return false;
+293 				}
+294 			}
+295 			return true;
+296 		};
+297 	}
+298
+299 	// Evaluator for CKEDITOR.dom.element::checkBoundaryOfElement, reject any
+300 	// text node and non-empty elements unless it's being bookmark text.
+301 	function elementBoundaryEval( node )
+302 	{
+303 		// Reject any text node unless it's being bookmark.
+304 		return node.type != CKEDITOR.NODE_TEXT
+305 		       && node.getName() in CKEDITOR.dtd.$removeEmpty
+306 			   || node.getParent().hasAttribute( '_fck_bookmark' );
+307 	}
+308
+309 	CKEDITOR.dom.range.prototype =
+310 	{
+311 		clone : function()
+312 		{
+313 			var clone = new CKEDITOR.dom.range( this.document );
+314
+315 			clone.startContainer = this.startContainer;
+316 			clone.startOffset = this.startOffset;
+317 			clone.endContainer = this.endContainer;
+318 			clone.endOffset = this.endOffset;
+319 			clone.collapsed = this.collapsed;
+320
+321 			return clone;
+322 		},
+323
+324 		collapse : function( toStart )
+325 		{
+326 			if ( toStart )
+327 			{
+328 				this.endContainer	= this.startContainer;
+329 				this.endOffset		= this.startOffset;
+330 			}
+331 			else
+332 			{
+333 				this.startContainer	= this.endContainer;
+334 				this.startOffset	= this.endOffset;
+335 			}
+336
+337 			this.collapsed = true;
+338 		},
+339
+340 		// The selection may be lost when cloning (due to the splitText() call).
+341 		cloneContents : function()
+342 		{
+343 			var docFrag = new CKEDITOR.dom.documentFragment( this.document );
+344
+345 			if ( !this.collapsed )
+346 				execContentsAction( this, 2, docFrag );
+347
+348 			return docFrag;
+349 		},
+350
+351 		deleteContents : function()
+352 		{
+353 			if ( this.collapsed )
+354 				return;
+355
+356 			execContentsAction( this, 0 );
+357 		},
+358
+359 		extractContents : function()
+360 		{
+361 			var docFrag = new CKEDITOR.dom.documentFragment( this.document );
+362
+363 			if ( !this.collapsed )
+364 				execContentsAction( this, 1, docFrag );
+365
+366 			return docFrag;
+367 		},
+368
+369 		/**
+370 		 * Creates a bookmark object, which can be later used to restore the
+371 		 * range by using the moveToBookmark function.
+372 		 * This is an "intrusive" way to create a bookmark. It includes <span> tags
+373 		 * in the range boundaries. The advantage of it is that it is possible to
+374 		 * handle DOM mutations when moving back to the bookmark.
+375 		 * Attention: the inclusion of nodes in the DOM is a design choice and
+376 		 * should not be changed as there are other points in the code that may be
+377 		 * using those nodes to perform operations. See GetBookmarkNode.
+378 		 * @param {Boolean} [serializable] Indicates that the bookmark nodes
+379 		 *		must contain ids, which can be used to restore the range even
+380 		 *		when these nodes suffer mutations (like a clonation or innerHTML
+381 		 *		change).
+382 		 * @returns {Object} And object representing a bookmark.
+383 		 */
+384 		createBookmark : function( serializable )
+385 		{
+386 			var startNode, endNode;
+387 			var baseId;
+388 			var clone;
+389
+390 			startNode = this.document.createElement( 'span' );
+391 			startNode.setAttribute( '_fck_bookmark', 1 );
+392 			startNode.setStyle( 'display', 'none' );
+393
+394 			// For IE, it must have something inside, otherwise it may be
+395 			// removed during DOM operations.
+396 			startNode.setHtml( ' ' );
+397
+398 			if ( serializable )
+399 			{
+400 				baseId = 'cke_bm_' + CKEDITOR.tools.getNextNumber();
+401 				startNode.setAttribute( 'id', baseId + 'S' );
+402 			}
+403
+404 			// If collapsed, the endNode will not be created.
+405 			if ( !this.collapsed )
+406 			{
+407 				endNode = startNode.clone();
+408 				endNode.setHtml( ' ' );
+409
+410 				if ( serializable )
+411 					endNode.setAttribute( 'id', baseId + 'E' );
+412
+413 				clone = this.clone();
+414 				clone.collapse();
+415 				clone.insertNode( endNode );
+416 			}
+417
+418 			clone = this.clone();
+419 			clone.collapse( true );
+420 			clone.insertNode( startNode );
+421
+422 			// Update the range position.
+423 			if ( endNode )
+424 			{
+425 				this.setStartAfter( startNode );
+426 				this.setEndBefore( endNode );
+427 			}
+428 			else
+429 				this.moveToPosition( startNode, CKEDITOR.POSITION_AFTER_END );
+430
+431 			return {
+432 				startNode : serializable ? baseId + 'S' : startNode,
+433 				endNode : serializable ? baseId + 'E' : endNode,
+434 				serializable : serializable
+435 			};
+436 		},
+437
+438 		/**
+439 		 * Creates a "non intrusive" and "mutation sensible" bookmark. This
+440 		 * kind of bookmark should be used only when the DOM is supposed to
+441 		 * remain stable after its creation.
+442 		 * @param {Boolean} [normalized] Indicates that the bookmark must
+443 		 *		normalized. When normalized, the successive text nodes are
+444 		 *		considered a single node. To sucessful load a normalized
+445 		 *		bookmark, the DOM tree must be also normalized before calling
+446 		 *		moveToBookmark.
+447 		 * @returns {Object} An object representing the bookmark.
+448 		 */
+449 		createBookmark2 : function( normalized )
+450 		{
+451 			var startContainer	= this.startContainer,
+452 				endContainer	= this.endContainer;
+453
+454 			var startOffset	= this.startOffset,
+455 				endOffset	= this.endOffset;
+456
+457 			var child, previous;
+458
+459 			// If there is no range then get out of here.
+460 			// It happens on initial load in Safari #962 and if the editor it's
+461 			// hidden also in Firefox
+462 			if ( !startContainer || !endContainer )
+463 				return { start : 0, end : 0 };
+464
+465 			if ( normalized )
+466 			{
+467 				// Find out if the start is pointing to a text node that will
+468 				// be normalized.
+469 				if ( startContainer.type == CKEDITOR.NODE_ELEMENT )
+470 				{
+471 					child = startContainer.getChild( startOffset );
+472
+473 					// In this case, move the start information to that text
+474 					// node.
+475 					if ( child && child.type == CKEDITOR.NODE_TEXT
+476 							&& startOffset > 0 && child.getPrevious().type == CKEDITOR.NODE_TEXT )
+477 					{
+478 						startContainer = child;
+479 						startOffset = 0;
+480 					}
+481 				}
+482
+483 				// Normalize the start.
+484 				while ( startContainer.type == CKEDITOR.NODE_TEXT
+485 						&& ( previous = startContainer.getPrevious() )
+486 						&& previous.type == CKEDITOR.NODE_TEXT )
+487 				{
+488 					startContainer = previous;
+489 					startOffset += previous.getLength();
+490 				}
+491
+492 				// Process the end only if not normalized.
+493 				if ( !this.isCollapsed )
+494 				{
+495 					// Find out if the start is pointing to a text node that
+496 					// will be normalized.
+497 					if ( endContainer.type == CKEDITOR.NODE_ELEMENT )
+498 					{
+499 						child = endContainer.getChild( endOffset );
+500
+501 						// In this case, move the start information to that
+502 						// text node.
+503 						if ( child && child.type == CKEDITOR.NODE_TEXT
+504 								&& endOffset > 0 && child.getPrevious().type == CKEDITOR.NODE_TEXT )
+505 						{
+506 							endContainer = child;
+507 							endOffset = 0;
+508 						}
+509 					}
+510
+511 					// Normalize the end.
+512 					while ( endContainer.type == CKEDITOR.NODE_TEXT
+513 							&& ( previous = endContainer.getPrevious() )
+514 							&& previous.type == CKEDITOR.NODE_TEXT )
+515 					{
+516 						endContainer = previous;
+517 						endOffset += previous.getLength();
+518 					}
+519 				}
+520 			}
+521
+522 			return {
+523 				start		: startContainer.getAddress( normalized ),
+524 				end			: this.isCollapsed ? null : endContainer.getAddress( normalized ),
+525 				startOffset	: startOffset,
+526 				endOffset	: endOffset,
+527 				normalized	: normalized,
+528 				is2			: true		// It's a createBookmark2 bookmark.
+529 			};
+530 		},
+531
+532 		moveToBookmark : function( bookmark )
+533 		{
+534 			if ( bookmark.is2 )		// Created with createBookmark2().
+535 			{
+536 				// Get the start information.
+537 				var startContainer	= this.document.getByAddress( bookmark.start, bookmark.normalized ),
+538 					startOffset	= bookmark.startOffset;
+539
+540 				// Get the end information.
+541 				var endContainer	= bookmark.end && this.document.getByAddress( bookmark.end, bookmark.normalized ),
+542 					endOffset	= bookmark.endOffset;
+543
+544 				// Set the start boundary.
+545 				this.setStart( startContainer, startOffset );
+546
+547 				// Set the end boundary. If not available, collapse it.
+548 				if ( endContainer )
+549 					this.setEnd( endContainer, endOffset );
+550 				else
+551 					this.collapse( true );
+552 			}
+553 			else					// Created with createBookmark().
+554 			{
+555 				var serializable = bookmark.serializable,
+556 					startNode	= serializable ? this.document.getById( bookmark.startNode ) : bookmark.startNode,
+557 					endNode		= serializable ? this.document.getById( bookmark.endNode ) : bookmark.endNode;
+558
+559 				// Set the range start at the bookmark start node position.
+560 				this.setStartBefore( startNode );
+561
+562 				// Remove it, because it may interfere in the setEndBefore call.
+563 				startNode.remove();
+564
+565 				// Set the range end at the bookmark end node position, or simply
+566 				// collapse it if it is not available.
+567 				if ( endNode )
+568 				{
+569 					this.setEndBefore( endNode );
+570 					endNode.remove();
+571 				}
+572 				else
+573 					this.collapse( true );
+574 			}
+575 		},
+576
+577 		getBoundaryNodes : function()
+578 		{
+579 			var startNode = this.startContainer,
+580 				endNode = this.endContainer,
+581 				startOffset = this.startOffset,
+582 				endOffset = this.endOffset,
+583 				childCount;
+584
+585 			if ( startNode.type == CKEDITOR.NODE_ELEMENT )
+586 			{
+587 				childCount = startNode.getChildCount();
+588 				if ( childCount > startOffset )
+589 					startNode = startNode.getChild( startOffset );
+590 				else if ( childCount < 1 )
+591 					startNode = startNode.getPreviousSourceNode();
+592 				else		// startOffset > childCount but childCount is not 0
+593 				{
+594 					// Try to take the node just after the current position.
+595 					startNode = startNode.$;
+596 					while ( startNode.lastChild )
+597 						startNode = startNode.lastChild;
+598 					startNode = new CKEDITOR.dom.node( startNode );
+599
+600 					// Normally we should take the next node in DFS order. But it
+601 					// is also possible that we've already reached the end of
+602 					// document.
+603 					startNode = startNode.getNextSourceNode() || startNode;
+604 				}
+605 			}
+606 			if ( endNode.type == CKEDITOR.NODE_ELEMENT )
+607 			{
+608 				childCount = endNode.getChildCount();
+609 				if ( childCount > endOffset )
+610 					endNode = endNode.getChild( endOffset ).getPreviousSourceNode( true );
+611 				else if ( childCount < 1 )
+612 					endNode = endNode.getPreviousSourceNode();
+613 				else		// endOffset > childCount but childCount is not 0
+614 				{
+615 					// Try to take the node just before the current position.
+616 					endNode = endNode.$;
+617 					while ( endNode.lastChild )
+618 						endNode = endNode.lastChild;
+619 					endNode = new CKEDITOR.dom.node( endNode );
+620 				}
+621 			}
+622
+623 			// Sometimes the endNode will come right before startNode for collapsed
+624 			// ranges. Fix it. (#3780)
+625 			if ( startNode.getPosition( endNode ) & CKEDITOR.POSITION_FOLLOWING )
+626 				startNode = endNode;
+627
+628 			return { startNode : startNode, endNode : endNode };
+629 		},
+630
+631 		/**
+632 		 * Find the node which fully contains the range.
+633 		 * @param includeSelf
+634 		 * @param {Boolean} ignoreTextNode Whether ignore CKEDITOR.NODE_TEXT type.
+635 		 */
+636 		getCommonAncestor : function( includeSelf , ignoreTextNode )
+637 		{
+638 			var start = this.startContainer,
+639 				end = this.endContainer,
+640 				ancestor;
+641
+642 			if ( start.equals( end ) )
+643 			{
+644 				if ( includeSelf
+645 						&& start.type == CKEDITOR.NODE_ELEMENT
+646 						&& this.startOffset == this.endOffset - 1 )
+647 					ancestor = start.getChild( this.startOffset );
+648 				else
+649 					ancestor = start;
+650 			}
+651 			else
+652 				ancestor = start.getCommonAncestor( end );
+653
+654 			return ignoreTextNode && !ancestor.is ? ancestor.getParent() : ancestor;
+655 		},
+656
+657 		/**
+658 		 * Transforms the startContainer and endContainer properties from text
+659 		 * nodes to element nodes, whenever possible. This is actually possible
+660 		 * if either of the boundary containers point to a text node, and its
+661 		 * offset is set to zero, or after the last char in the node.
+662 		 */
+663 		optimize : function()
+664 		{
+665 			var container = this.startContainer;
+666 			var offset = this.startOffset;
+667
+668 			if ( container.type != CKEDITOR.NODE_ELEMENT )
+669 			{
+670 				if ( !offset )
+671 					this.setStartBefore( container );
+672 				else if ( offset >= container.getLength() )
+673 					this.setStartAfter( container );
+674 			}
+675
+676 			container = this.endContainer;
+677 			offset = this.endOffset;
+678
+679 			if ( container.type != CKEDITOR.NODE_ELEMENT )
+680 			{
+681 				if ( !offset )
+682 					this.setEndBefore( container );
+683 				else if ( offset >= container.getLength() )
+684 					this.setEndAfter( container );
+685 			}
+686 		},
+687
+688 		/**
+689 		 * Move the range out of bookmark nodes if they're been the container.
+690 		 */
+691 		optimizeBookmark: function()
+692 		{
+693 			var startNode = this.startContainer,
+694 				endNode = this.endContainer;
+695
+696 			if ( startNode.is && startNode.is( 'span' )
+697 				&& startNode.hasAttribute( '_fck_bookmark' ) )
+698 				this.setStartAt( startNode, CKEDITOR.POSITION_BEFORE_START );
+699 			if ( endNode && endNode.is && endNode.is( 'span' )
+700 				&& endNode.hasAttribute( '_fck_bookmark' ) )
+701 				this.setEndAt( endNode,  CKEDITOR.POSITION_AFTER_END );
+702 		},
+703
+704 		trim : function( ignoreStart, ignoreEnd )
+705 		{
+706 			var startContainer = this.startContainer,
+707 				startOffset = this.startOffset,
+708 				collapsed = this.collapsed;
+709 			if ( ( !ignoreStart || collapsed )
+710 				 && startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
+711 			{
+712 				// If the offset is zero, we just insert the new node before
+713 				// the start.
+714 				if ( !startOffset )
+715 				{
+716 					startOffset = startContainer.getIndex();
+717 					startContainer = startContainer.getParent();
+718 				}
+719 				// If the offset is at the end, we'll insert it after the text
+720 				// node.
+721 				else if ( startOffset >= startContainer.getLength() )
+722 				{
+723 					startOffset = startContainer.getIndex() + 1;
+724 					startContainer = startContainer.getParent();
+725 				}
+726 				// In other case, we split the text node and insert the new
+727 				// node at the split point.
+728 				else
+729 				{
+730 					var nextText = startContainer.split( startOffset );
+731
+732 					startOffset = startContainer.getIndex() + 1;
+733 					startContainer = startContainer.getParent();
+734 					// Check if it is necessary to update the end boundary.
+735 					if ( !collapsed && this.startContainer.equals( this.endContainer ) )
+736 						this.setEnd( nextText, this.endOffset - this.startOffset );
+737 				}
+738
+739 				this.setStart( startContainer, startOffset );
+740
+741 				if ( collapsed )
+742 					this.collapse( true );
+743 			}
+744
+745 			var endContainer = this.endContainer;
+746 			var endOffset = this.endOffset;
+747
+748 			if ( !( ignoreEnd || collapsed )
+749 				 && endContainer && endContainer.type == CKEDITOR.NODE_TEXT )
+750 			{
+751 				// If the offset is zero, we just insert the new node before
+752 				// the start.
+753 				if ( !endOffset )
+754 				{
+755 					endOffset = endContainer.getIndex();
+756 					endContainer = endContainer.getParent();
+757 				}
+758 				// If the offset is at the end, we'll insert it after the text
+759 				// node.
+760 				else if ( endOffset >= endContainer.getLength() )
+761 				{
+762 					endOffset = endContainer.getIndex() + 1;
+763 					endContainer = endContainer.getParent();
+764 				}
+765 				// In other case, we split the text node and insert the new
+766 				// node at the split point.
+767 				else
+768 				{
+769 					endContainer.split( endOffset );
+770
+771 					endOffset = endContainer.getIndex() + 1;
+772 					endContainer = endContainer.getParent();
+773 				}
+774
+775 				this.setEnd( endContainer, endOffset );
+776 			}
+777 		},
+778
+779 		enlarge : function( unit )
+780 		{
+781 			switch ( unit )
+782 			{
+783 				case CKEDITOR.ENLARGE_ELEMENT :
+784
+785 					if ( this.collapsed )
+786 						return;
+787
+788 					// Get the common ancestor.
+789 					var commonAncestor = this.getCommonAncestor();
+790
+791 					var body = this.document.getBody();
+792
+793 					// For each boundary
+794 					//		a. Depending on its position, find out the first node to be checked (a sibling) or, if not available, to be enlarge.
+795 					//		b. Go ahead checking siblings and enlarging the boundary as much as possible until the common ancestor is not reached. After reaching the common ancestor, just save the enlargeable node to be used later.
+796
+797 					var startTop, endTop;
+798
+799 					var enlargeable, sibling, commonReached;
+800
+801 					// Indicates that the node can be added only if whitespace
+802 					// is available before it.
+803 					var needsWhiteSpace = false;
+804 					var isWhiteSpace;
+805 					var siblingText;
+806
+807 					// Process the start boundary.
+808
+809 					var container = this.startContainer;
+810 					var offset = this.startOffset;
+811
+812 					if ( container.type == CKEDITOR.NODE_TEXT )
+813 					{
+814 						if ( offset )
+815 						{
+816 							// Check if there is any non-space text before the
+817 							// offset. Otherwise, container is null.
+818 							container = !CKEDITOR.tools.trim( container.substring( 0, offset ) ).length && container;
+819
+820 							// If we found only whitespace in the node, it
+821 							// means that we'll need more whitespace to be able
+822 							// to expand. For example, <i> can be expanded in
+823 							// "A <i> [B]</i>", but not in "A<i> [B]</i>".
+824 							needsWhiteSpace = !!container;
+825 						}
+826
+827 						if ( container )
+828 						{
+829 							if ( !( sibling = container.getPrevious() ) )
+830 								enlargeable = container.getParent();
+831 						}
+832 					}
+833 					else
+834 					{
+835 						// If we have offset, get the node preceeding it as the
+836 						// first sibling to be checked.
+837 						if ( offset )
+838 							sibling = container.getChild( offset - 1 ) || container.getLast();
+839
+840 						// If there is no sibling, mark the container to be
+841 						// enlarged.
+842 						if ( !sibling )
+843 							enlargeable = container;
+844 					}
+845
+846 					while ( enlargeable || sibling )
+847 					{
+848 						if ( enlargeable && !sibling )
+849 						{
+850 							// If we reached the common ancestor, mark the flag
+851 							// for it.
+852 							if ( !commonReached && enlargeable.equals( commonAncestor ) )
+853 								commonReached = true;
+854
+855 							if ( !body.contains( enlargeable ) )
+856 								break;
+857
+858 							// If we don't need space or this element breaks
+859 							// the line, then enlarge it.
+860 							if ( !needsWhiteSpace || enlargeable.getComputedStyle( 'display' ) != 'inline' )
+861 							{
+862 								needsWhiteSpace = false;
+863
+864 								// If the common ancestor has been reached,
+865 								// we'll not enlarge it immediately, but just
+866 								// mark it to be enlarged later if the end
+867 								// boundary also enlarges it.
+868 								if ( commonReached )
+869 									startTop = enlargeable;
+870 								else
+871 									this.setStartBefore( enlargeable );
+872 							}
+873
+874 							sibling = enlargeable.getPrevious();
+875 						}
+876
+877 						// Check all sibling nodes preceeding the enlargeable
+878 						// node. The node wil lbe enlarged only if none of them
+879 						// blocks it.
+880 						while ( sibling )
+881 						{
+882 							// This flag indicates that this node has
+883 							// whitespaces at the end.
+884 							isWhiteSpace = false;
+885
+886 							if ( sibling.type == CKEDITOR.NODE_TEXT )
+887 							{
+888 								siblingText = sibling.getText();
+889
+890 								if ( /[^\s\ufeff]/.test( siblingText ) )
+891 									sibling = null;
+892
+893 								isWhiteSpace = /[\s\ufeff]$/.test( siblingText );
+894 							}
+895 							else
+896 							{
+897 								// If this is a visible element.
+898 								// We need to check for the bookmark attribute because IE insists on
+899 								// rendering the display:none nodes we use for bookmarks. (#3363)
+900 								if ( sibling.$.offsetWidth > 0 && !sibling.getAttribute( '_fck_bookmark' ) )
+901 								{
+902 									// We'll accept it only if we need
+903 									// whitespace, and this is an inline
+904 									// element with whitespace only.
+905 									if ( needsWhiteSpace && CKEDITOR.dtd.$removeEmpty[ sibling.getName() ] )
+906 									{
+907 										// It must contains spaces and inline elements only.
+908
+909 										siblingText = sibling.getText();
+910
+911 										if ( !(/[^\s\ufeff]/).test( siblingText ) )	// Spaces + Zero Width No-Break Space (U+FEFF)
+912 											sibling = null;
+913 										else
+914 										{
+915 											var allChildren = sibling.$.all || sibling.$.getElementsByTagName( '*' );
+916 											for ( var i = 0, child ; child = allChildren[ i++ ] ; )
+917 											{
+918 												if ( !CKEDITOR.dtd.$removeEmpty[ child.nodeName.toLowerCase() ] )
+919 												{
+920 													sibling = null;
+921 													break;
+922 												}
+923 											}
+924 										}
+925
+926 										if ( sibling )
+927 											isWhiteSpace = !!siblingText.length;
+928 									}
+929 									else
+930 										sibling = null;
+931 								}
+932 							}
+933
+934 							// A node with whitespaces has been found.
+935 							if ( isWhiteSpace )
+936 							{
+937 								// Enlarge the last enlargeable node, if we
+938 								// were waiting for spaces.
+939 								if ( needsWhiteSpace )
+940 								{
+941 									if ( commonReached )
+942 										startTop = enlargeable;
+943 									else if ( enlargeable )
+944 										this.setStartBefore( enlargeable );
+945 								}
+946 								else
+947 									needsWhiteSpace = true;
+948 							}
+949
+950 							if ( sibling )
+951 							{
+952 								var next = sibling.getPrevious();
+953
+954 								if ( !enlargeable && !next )
+955 								{
+956 									// Set the sibling as enlargeable, so it's
+957 									// parent will be get later outside this while.
+958 									enlargeable = sibling;
+959 									sibling = null;
+960 									break;
+961 								}
+962
+963 								sibling = next;
+964 							}
+965 							else
+966 							{
+967 								// If sibling has been set to null, then we
+968 								// need to stop enlarging.
+969 								enlargeable = null;
+970 							}
+971 						}
+972
+973 						if ( enlargeable )
+974 							enlargeable = enlargeable.getParent();
+975 					}
+976
+977 					// Process the end boundary. This is basically the same
+978 					// code used for the start boundary, with small changes to
+979 					// make it work in the oposite side (to the right). This
+980 					// makes it difficult to reuse the code here. So, fixes to
+981 					// the above code are likely to be replicated here.
+982
+983 					container = this.endContainer;
+984 					offset = this.endOffset;
+985
+986 					// Reset the common variables.
+987 					enlargeable = sibling = null;
+988 					commonReached = needsWhiteSpace = false;
+989
+990 					if ( container.type == CKEDITOR.NODE_TEXT )
+991 					{
+992 						// Check if there is any non-space text after the
+993 						// offset. Otherwise, container is null.
+994 						container = !CKEDITOR.tools.trim( container.substring( offset ) ).length && container;
+995
+996 						// If we found only whitespace in the node, it
+997 						// means that we'll need more whitespace to be able
+998 						// to expand. For example, <i> can be expanded in
+999 						// "A <i> [B]</i>", but not in "A<i> [B]</i>".
+1000 						needsWhiteSpace = !( container && container.getLength() );
+1001
+1002 						if ( container )
+1003 						{
+1004 							if ( !( sibling = container.getNext() ) )
+1005 								enlargeable = container.getParent();
+1006 						}
+1007 					}
+1008 					else
+1009 					{
+1010 						// Get the node right after the boudary to be checked
+1011 						// first.
+1012 						sibling = container.getChild( offset );
+1013
+1014 						if ( !sibling )
+1015 							enlargeable = container;
+1016 					}
+1017
+1018 					while ( enlargeable || sibling )
+1019 					{
+1020 						if ( enlargeable && !sibling )
+1021 						{
+1022 							if ( !commonReached && enlargeable.equals( commonAncestor ) )
+1023 								commonReached = true;
+1024
+1025 							if ( !body.contains( enlargeable ) )
+1026 								break;
+1027
+1028 							if ( !needsWhiteSpace || enlargeable.getComputedStyle( 'display' ) != 'inline' )
+1029 							{
+1030 								needsWhiteSpace = false;
+1031
+1032 								if ( commonReached )
+1033 									endTop = enlargeable;
+1034 								else if ( enlargeable )
+1035 									this.setEndAfter( enlargeable );
+1036 							}
+1037
+1038 							sibling = enlargeable.getNext();
+1039 						}
+1040
+1041 						while ( sibling )
+1042 						{
+1043 							isWhiteSpace = false;
+1044
+1045 							if ( sibling.type == CKEDITOR.NODE_TEXT )
+1046 							{
+1047 								siblingText = sibling.getText();
+1048
+1049 								if ( /[^\s\ufeff]/.test( siblingText ) )
+1050 									sibling = null;
+1051
+1052 								isWhiteSpace = /^[\s\ufeff]/.test( siblingText );
+1053 							}
+1054 							else
+1055 							{
+1056 								// If this is a visible element.
+1057 								// We need to check for the bookmark attribute because IE insists on
+1058 								// rendering the display:none nodes we use for bookmarks. (#3363)
+1059 								if ( sibling.$.offsetWidth > 0 && !sibling.getAttribute( '_fck_bookmark' ) )
+1060 								{
+1061 									// We'll accept it only if we need
+1062 									// whitespace, and this is an inline
+1063 									// element with whitespace only.
+1064 									if ( needsWhiteSpace && CKEDITOR.dtd.$removeEmpty[ sibling.getName() ] )
+1065 									{
+1066 										// It must contains spaces and inline elements only.
+1067
+1068 										siblingText = sibling.getText();
+1069
+1070 										if ( !(/[^\s\ufeff]/).test( siblingText ) )
+1071 											sibling = null;
+1072 										else
+1073 										{
+1074 											allChildren = sibling.$.all || sibling.$.getElementsByTagName( '*' );
+1075 											for ( i = 0 ; child = allChildren[ i++ ] ; )
+1076 											{
+1077 												if ( !CKEDITOR.dtd.$removeEmpty[ child.nodeName.toLowerCase() ] )
+1078 												{
+1079 													sibling = null;
+1080 													break;
+1081 												}
+1082 											}
+1083 										}
+1084
+1085 										if ( sibling )
+1086 											isWhiteSpace = !!siblingText.length;
+1087 									}
+1088 									else
+1089 										sibling = null;
+1090 								}
+1091 							}
+1092
+1093 							if ( isWhiteSpace )
+1094 							{
+1095 								if ( needsWhiteSpace )
+1096 								{
+1097 									if ( commonReached )
+1098 										endTop = enlargeable;
+1099 									else
+1100 										this.setEndAfter( enlargeable );
+1101 								}
+1102 							}
+1103
+1104 							if ( sibling )
+1105 							{
+1106 								next = sibling.getNext();
+1107
+1108 								if ( !enlargeable && !next )
+1109 								{
+1110 									enlargeable = sibling;
+1111 									sibling = null;
+1112 									break;
+1113 								}
+1114
+1115 								sibling = next;
+1116 							}
+1117 							else
+1118 							{
+1119 								// If sibling has been set to null, then we
+1120 								// need to stop enlarging.
+1121 								enlargeable = null;
+1122 							}
+1123 						}
+1124
+1125 						if ( enlargeable )
+1126 							enlargeable = enlargeable.getParent();
+1127 					}
+1128
+1129 					// If the common ancestor can be enlarged by both boundaries, then include it also.
+1130 					if ( startTop && endTop )
+1131 					{
+1132 						commonAncestor = startTop.contains( endTop ) ? endTop : startTop;
+1133
+1134 						this.setStartBefore( commonAncestor );
+1135 						this.setEndAfter( commonAncestor );
+1136 					}
+1137 					break;
+1138
+1139 				case CKEDITOR.ENLARGE_BLOCK_CONTENTS:
+1140 				case CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:
+1141
+1142 					// Enlarging the start boundary.
+1143 					var walkerRange = new CKEDITOR.dom.range( this.document );
+1144
+1145 					body = this.document.getBody();
+1146
+1147 					walkerRange.setStartAt( body, CKEDITOR.POSITION_AFTER_START );
+1148 					walkerRange.setEnd( this.startContainer, this.startOffset );
+1149
+1150 					var walker = new CKEDITOR.dom.walker( walkerRange ),
+1151 					    blockBoundary,  // The node on which the enlarging should stop.
+1152 						tailBr, //
+1153 					    defaultGuard = CKEDITOR.dom.walker.blockBoundary(
+1154 								( unit == CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS ) ? { br : 1 } : null ),
+1155 						// Record the encountered 'blockBoundary' for later use.
+1156 						boundaryGuard = function( node )
+1157 						{
+1158 							var retval = defaultGuard( node );
+1159 							if ( !retval )
+1160 								blockBoundary = node;
+1161 							return retval;
+1162 						},
+1163 						// Record the encounted 'tailBr' for later use.
+1164 						tailBrGuard = function( node )
+1165 						{
+1166 							var retval = boundaryGuard( node );
+1167 							if ( !retval && node.is && node.is( 'br' ) )
+1168 								tailBr = node;
+1169 							return retval;
+1170 						};
+1171
+1172 					walker.guard = boundaryGuard;
+1173
+1174
+1175 					if ( ( enlargeable = walker.lastBackward() ) )
+1176 					{
+1177 						// It's the body which stop the enlaring if no block boundary found.
+1178 						blockBoundary = blockBoundary || body;
+1179
+1180 						// Start the range at different position by comparing
+1181 						// the document position of it with 'enlargeable' node.
+1182 						this.setStartAt(
+1183 								blockBoundary,
+1184 								blockBoundary.contains( enlargeable ) ?
+1185 									CKEDITOR.POSITION_AFTER_START :
+1186 									CKEDITOR.POSITION_AFTER_END );
+1187 					}
+1188
+1189 					// Enlarging the end boundary.
+1190 					walkerRange = this.clone();
+1191 					walkerRange.collapse();
+1192 					walkerRange.setEndAt( body, CKEDITOR.POSITION_BEFORE_END );
+1193 					walker = new CKEDITOR.dom.walker( walkerRange );
+1194
+1195 					// tailBrGuard only used for on range end.
+1196 					walker.guard = ( unit == CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS ) ?
+1197 						tailBrGuard : boundaryGuard;
+1198 					blockBoundary = null;
+1199 					// End the range right before the block boundary node.
+1200
+1201 					if ( ( enlargeable = walker.lastForward() ) )
+1202 					{
+1203 						// It's the body which stop the enlaring if no block boundary found.
+1204 						blockBoundary = blockBoundary || body;
+1205
+1206 						// Start the range at different position by comparing
+1207 						// the document position of it with 'enlargeable' node.
+1208 						this.setEndAt(
+1209 								blockBoundary,
+1210 								blockBoundary.contains( enlargeable ) ?
+1211 									CKEDITOR.POSITION_BEFORE_END :
+1212 									CKEDITOR.POSITION_BEFORE_START );
+1213 					}
+1214 					// We must include the <br> at the end of range if there's
+1215 					// one and we're expanding list item contents
+1216 					if ( tailBr )
+1217 						this.setEndAfter( tailBr );
+1218 			}
+1219 		},
+1220
+1221 		/**
+1222 		 * Inserts a node at the start of the range. The range will be expanded
+1223 		 * the contain the node.
+1224 		 */
+1225 		insertNode : function( node )
+1226 		{
+1227 			this.optimizeBookmark();
+1228 			this.trim( false, true );
+1229
+1230 			var startContainer = this.startContainer;
+1231 			var startOffset = this.startOffset;
+1232
+1233 			var nextNode = startContainer.getChild( startOffset );
+1234
+1235 			if ( nextNode )
+1236 				node.insertBefore( nextNode );
+1237 			else
+1238 				startContainer.append( node );
+1239
+1240 			// Check if we need to update the end boundary.
+1241 			if ( node.getParent().equals( this.endContainer ) )
+1242 				this.endOffset++;
+1243
+1244 			// Expand the range to embrace the new node.
+1245 			this.setStartBefore( node );
+1246 		},
+1247
+1248 		moveToPosition : function( node, position )
+1249 		{
+1250 			this.setStartAt( node, position );
+1251 			this.collapse( true );
+1252 		},
+1253
+1254 		selectNodeContents : function( node )
+1255 		{
+1256 			this.setStart( node, 0 );
+1257 			this.setEnd( node, node.type == CKEDITOR.NODE_TEXT ? node.getLength() : node.getChildCount() );
+1258 		},
+1259
+1260 		/**
+1261 		 * Sets the start position of a Range.
+1262 		 * @param {CKEDITOR.dom.node} startNode The node to start the range.
+1263 		 * @param {Number} startOffset An integer greater than or equal to zero
+1264 		 *		representing the offset for the start of the range from the start
+1265 		 *		of startNode.
+1266 		 */
+1267 		setStart : function( startNode, startOffset )
+1268 		{
+1269 			// W3C requires a check for the new position. If it is after the end
+1270 			// boundary, the range should be collapsed to the new start. It seams
+1271 			// we will not need this check for our use of this class so we can
+1272 			// ignore it for now.
+1273
+1274 			this.startContainer	= startNode;
+1275 			this.startOffset	= startOffset;
+1276
+1277 			if ( !this.endContainer )
+1278 			{
+1279 				this.endContainer	= startNode;
+1280 				this.endOffset		= startOffset;
+1281 			}
+1282
+1283 			updateCollapsed( this );
+1284 		},
+1285
+1286 		/**
+1287 		 * Sets the end position of a Range.
+1288 		 * @param {CKEDITOR.dom.node} endNode The node to end the range.
+1289 		 * @param {Number} endOffset An integer greater than or equal to zero
+1290 		 *		representing the offset for the end of the range from the start
+1291 		 *		of endNode.
+1292 		 */
+1293 		setEnd : function( endNode, endOffset )
+1294 		{
+1295 			// W3C requires a check for the new position. If it is before the start
+1296 			// boundary, the range should be collapsed to the new end. It seams we
+1297 			// will not need this check for our use of this class so we can ignore
+1298 			// it for now.
+1299
+1300 			this.endContainer	= endNode;
+1301 			this.endOffset		= endOffset;
+1302
+1303 			if ( !this.startContainer )
+1304 			{
+1305 				this.startContainer	= endNode;
+1306 				this.startOffset	= endOffset;
+1307 			}
+1308
+1309 			updateCollapsed( this );
+1310 		},
+1311
+1312 		setStartAfter : function( node )
+1313 		{
+1314 			this.setStart( node.getParent(), node.getIndex() + 1 );
+1315 		},
+1316
+1317 		setStartBefore : function( node )
+1318 		{
+1319 			this.setStart( node.getParent(), node.getIndex() );
+1320 		},
+1321
+1322 		setEndAfter : function( node )
+1323 		{
+1324 			this.setEnd( node.getParent(), node.getIndex() + 1 );
+1325 		},
+1326
+1327 		setEndBefore : function( node )
+1328 		{
+1329 			this.setEnd( node.getParent(), node.getIndex() );
+1330 		},
+1331
+1332 		setStartAt : function( node, position )
+1333 		{
+1334 			switch( position )
+1335 			{
+1336 				case CKEDITOR.POSITION_AFTER_START :
+1337 					this.setStart( node, 0 );
+1338 					break;
+1339
+1340 				case CKEDITOR.POSITION_BEFORE_END :
+1341 					if ( node.type == CKEDITOR.NODE_TEXT )
+1342 						this.setStart( node, node.getLength() );
+1343 					else
+1344 						this.setStart( node, node.getChildCount() );
+1345 					break;
+1346
+1347 				case CKEDITOR.POSITION_BEFORE_START :
+1348 					this.setStartBefore( node );
+1349 					break;
+1350
+1351 				case CKEDITOR.POSITION_AFTER_END :
+1352 					this.setStartAfter( node );
+1353 			}
+1354
+1355 			updateCollapsed( this );
+1356 		},
+1357
+1358 		setEndAt : function( node, position )
+1359 		{
+1360 			switch( position )
+1361 			{
+1362 				case CKEDITOR.POSITION_AFTER_START :
+1363 					this.setEnd( node, 0 );
+1364 					break;
+1365
+1366 				case CKEDITOR.POSITION_BEFORE_END :
+1367 					if ( node.type == CKEDITOR.NODE_TEXT )
+1368 						this.setEnd( node, node.getLength() );
+1369 					else
+1370 						this.setEnd( node, node.getChildCount() );
+1371 					break;
+1372
+1373 				case CKEDITOR.POSITION_BEFORE_START :
+1374 					this.setEndBefore( node );
+1375 					break;
+1376
+1377 				case CKEDITOR.POSITION_AFTER_END :
+1378 					this.setEndAfter( node );
+1379 			}
+1380
+1381 			updateCollapsed( this );
+1382 		},
+1383
+1384 		fixBlock : function( isStart, blockTag )
+1385 		{
+1386 			var bookmark = this.createBookmark(),
+1387 				fixedBlock = this.document.createElement( blockTag );
+1388
+1389 			this.collapse( isStart );
+1390
+1391 			this.enlarge( CKEDITOR.ENLARGE_BLOCK_CONTENTS );
+1392
+1393 			this.extractContents().appendTo( fixedBlock );
+1394 			fixedBlock.trim();
+1395
+1396 			if ( !CKEDITOR.env.ie )
+1397 				fixedBlock.appendBogus();
+1398
+1399 			this.insertNode( fixedBlock );
+1400
+1401 			this.moveToBookmark( bookmark );
+1402
+1403 			return fixedBlock;
+1404 		},
+1405
+1406 		splitBlock : function( blockTag )
+1407 		{
+1408 			var startPath	= new CKEDITOR.dom.elementPath( this.startContainer ),
+1409 				endPath		= new CKEDITOR.dom.elementPath( this.endContainer );
+1410
+1411 			var startBlockLimit	= startPath.blockLimit,
+1412 				endBlockLimit	= endPath.blockLimit;
+1413
+1414 			var startBlock	= startPath.block,
+1415 				endBlock	= endPath.block;
+1416
+1417 			var elementPath = null;
+1418 			// Do nothing if the boundaries are in different block limits.
+1419 			if ( !startBlockLimit.equals( endBlockLimit ) )
+1420 				return null;
+1421
+1422 			// Get or fix current blocks.
+1423 			if ( blockTag != 'br' )
+1424 			{
+1425 				if ( !startBlock )
+1426 				{
+1427 					startBlock = this.fixBlock( true, blockTag );
+1428 					endBlock = new CKEDITOR.dom.elementPath( this.endContainer ).block;
+1429 				}
+1430
+1431 				if ( !endBlock )
+1432 					endBlock = this.fixBlock( false, blockTag );
+1433 			}
+1434
+1435 			// Get the range position.
+1436 			var isStartOfBlock = startBlock && this.checkStartOfBlock(),
+1437 				isEndOfBlock = endBlock && this.checkEndOfBlock();
+1438
+1439 			// Delete the current contents.
+1440 			// TODO: Why is 2.x doing CheckIsEmpty()?
+1441 			this.deleteContents();
+1442
+1443 			if ( startBlock && startBlock.equals( endBlock ) )
+1444 			{
+1445 				if ( isEndOfBlock )
+1446 				{
+1447 					elementPath = new CKEDITOR.dom.elementPath( this.startContainer );
+1448 					this.moveToPosition( endBlock, CKEDITOR.POSITION_AFTER_END );
+1449 					endBlock = null;
+1450 				}
+1451 				else if ( isStartOfBlock )
+1452 				{
+1453 					elementPath = new CKEDITOR.dom.elementPath( this.startContainer );
+1454 					this.moveToPosition( startBlock, CKEDITOR.POSITION_BEFORE_START );
+1455 					startBlock = null;
+1456 				}
+1457 				else
+1458 				{
+1459 					// Extract the contents of the block from the selection point to the end
+1460 					// of its contents.
+1461 					this.setEndAt( startBlock, CKEDITOR.POSITION_BEFORE_END );
+1462 					var documentFragment = this.extractContents();
+1463
+1464 					// Duplicate the block element after it.
+1465 					endBlock = startBlock.clone( false );
+1466
+1467 					// Place the extracted contents into the duplicated block.
+1468 					documentFragment.appendTo( endBlock );
+1469 					endBlock.insertAfter( startBlock );
+1470 					this.moveToPosition( startBlock, CKEDITOR.POSITION_AFTER_END );
+1471
+1472 					// In Gecko, the last child node must be a bogus <br>.
+1473 					// Note: bogus <br> added under <ul> or <ol> would cause
+1474 					// lists to be incorrectly rendered.
+1475 					if ( !CKEDITOR.env.ie && !startBlock.is( 'ul', 'ol') )
+1476 						startBlock.appendBogus() ;
+1477 				}
+1478 			}
+1479
+1480 			return {
+1481 				previousBlock : startBlock,
+1482 				nextBlock : endBlock,
+1483 				wasStartOfBlock : isStartOfBlock,
+1484 				wasEndOfBlock : isEndOfBlock,
+1485 				elementPath : elementPath
+1486 			};
+1487 		},
+1488
+1489 		/**
+1490 		 * Check whether current range is on the inner edge of the specified element.
+1491 		 * @param {Number} checkType ( CKEDITOR.START | CKEDITOR.END ) The checking side.
+1492 		 * @param {CKEDITOR.dom.element} element The target element to check.
+1493 		 */
+1494 		checkBoundaryOfElement : function( element, checkType )
+1495 		{
+1496 			var walkerRange = this.clone();
+1497 			// Expand the range to element boundary.
+1498 			walkerRange[ checkType == CKEDITOR.START ?
+1499 			 'setStartAt' : 'setEndAt' ]
+1500 			 ( element, checkType == CKEDITOR.START ?
+1501 			   CKEDITOR.POSITION_AFTER_START
+1502 			   : CKEDITOR.POSITION_BEFORE_END );
+1503
+1504 			var walker = new CKEDITOR.dom.walker( walkerRange ),
+1505 			 retval = false;
+1506 			walker.evaluator = elementBoundaryEval;
+1507 			return walker[ checkType == CKEDITOR.START ?
+1508 				'checkBackward' : 'checkForward' ]();
+1509 		},
+1510 		// Calls to this function may produce changes to the DOM. The range may
+1511 		// be updated to reflect such changes.
+1512 		checkStartOfBlock : function()
+1513 		{
+1514 			var startContainer = this.startContainer,
+1515 				startOffset = this.startOffset;
+1516
+1517 			// If the starting node is a text node, and non-empty before the offset,
+1518 			// then we're surely not at the start of block.
+1519 			if ( startOffset && startContainer.type == CKEDITOR.NODE_TEXT )
+1520 			{
+1521 				var textBefore = CKEDITOR.tools.ltrim( startContainer.substring( 0, startOffset ) );
+1522 				if ( textBefore.length )
+1523 					return false;
+1524 			}
+1525
+1526 			// Antecipate the trim() call here, so the walker will not make
+1527 			// changes to the DOM, which would not get reflected into this
+1528 			// range otherwise.
+1529 			this.trim();
+1530
+1531 			// We need to grab the block element holding the start boundary, so
+1532 			// let's use an element path for it.
+1533 			var path = new CKEDITOR.dom.elementPath( this.startContainer );
+1534
+1535 			// Creates a range starting at the block start until the range start.
+1536 			var walkerRange = this.clone();
+1537 			walkerRange.collapse( true );
+1538 			walkerRange.setStartAt( path.block || path.blockLimit, CKEDITOR.POSITION_AFTER_START );
+1539
+1540 			var walker = new CKEDITOR.dom.walker( walkerRange );
+1541 			walker.evaluator = getCheckStartEndBlockEvalFunction( true );
+1542
+1543 			return walker.checkBackward();
+1544 		},
+1545
+1546 		checkEndOfBlock : function()
+1547 		{
+1548 			var endContainer = this.endContainer,
+1549 				endOffset = this.endOffset;
+1550
+1551 			// If the ending node is a text node, and non-empty after the offset,
+1552 			// then we're surely not at the end of block.
+1553 			if ( endContainer.type == CKEDITOR.NODE_TEXT )
+1554 			{
+1555 				var textAfter = CKEDITOR.tools.rtrim( endContainer.substring( endOffset ) );
+1556 				if ( textAfter.length )
+1557 					return false;
+1558 			}
+1559
+1560 			// Antecipate the trim() call here, so the walker will not make
+1561 			// changes to the DOM, which would not get reflected into this
+1562 			// range otherwise.
+1563 			this.trim();
+1564
+1565 			// We need to grab the block element holding the start boundary, so
+1566 			// let's use an element path for it.
+1567 			var path = new CKEDITOR.dom.elementPath( this.endContainer );
+1568
+1569 			// Creates a range starting at the block start until the range start.
+1570 			var walkerRange = this.clone();
+1571 			walkerRange.collapse( false );
+1572 			walkerRange.setEndAt( path.block || path.blockLimit, CKEDITOR.POSITION_BEFORE_END );
+1573
+1574 			var walker = new CKEDITOR.dom.walker( walkerRange );
+1575 			walker.evaluator = getCheckStartEndBlockEvalFunction( false );
+1576
+1577 			return walker.checkForward();
+1578 		},
+1579
+1580 		/**
+1581 		 * Moves the range boundaries to the first editing point inside an
+1582 		 * element. For example, in an element tree like
+1583 		 * "<p><b><i></i></b> Text</p>", the start editing point is
+1584 		 * "<p><b><i>^</i></b> Text</p>" (inside <i>).
+1585 		 * @param {CKEDITOR.dom.element} targetElement The element into which
+1586 		 *		look for the editing spot.
+1587 		 */
+1588 		moveToElementEditStart : function( targetElement )
+1589 		{
+1590 			var editableElement;
+1591
+1592 			while ( targetElement && targetElement.type == CKEDITOR.NODE_ELEMENT )
+1593 			{
+1594 				if ( targetElement.isEditable() )
+1595 					editableElement = targetElement;
+1596 				else if ( editableElement )
+1597 					break ;		// If we already found an editable element, stop the loop.
+1598
+1599 				targetElement = targetElement.getFirst();
+1600 			}
+1601
+1602 			if ( editableElement )
+1603 				this.moveToPosition( editableElement, CKEDITOR.POSITION_AFTER_START );
+1604 		},
+1605
+1606 		getTouchedStartNode : function()
+1607 		{
+1608 			var container = this.startContainer ;
+1609
+1610 			if ( this.collapsed || container.type != CKEDITOR.NODE_ELEMENT )
+1611 				return container ;
+1612
+1613 			return container.getChild( this.startOffset ) || container ;
+1614 		},
+1615
+1616 		getTouchedEndNode : function()
+1617 		{
+1618 			var container = this.endContainer ;
+1619
+1620 			if ( this.collapsed || container.type != CKEDITOR.NODE_ELEMENT )
+1621 				return container ;
+1622
+1623 			return container.getChild( this.endOffset - 1 ) || container ;
+1624 		}
+1625 	};
+1626 })();
+1627
+1628 CKEDITOR.POSITION_AFTER_START	= 1;	// <element>^contents</element>		"^text"
+1629 CKEDITOR.POSITION_BEFORE_END	= 2;	// <element>contents^</element>		"text^"
+1630 CKEDITOR.POSITION_BEFORE_START	= 3;	// ^<element>contents</element>		^"text"
+1631 CKEDITOR.POSITION_AFTER_END		= 4;	// <element>contents</element>^		"text"
+1632
+1633 CKEDITOR.ENLARGE_ELEMENT = 1;
+1634 CKEDITOR.ENLARGE_BLOCK_CONTENTS = 2;
+1635 CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS = 3;
+1636
+1637 /**
+1638  * Check boundary types.
+1639  * @see CKEDITOR.dom.range::checkBoundaryOfElement
+1640  */
+1641 CKEDITOR.START = 1;
+1642 CKEDITOR.END = 2;
+1643 CKEDITOR.STARTEND = 3;
+1644 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_text.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_text.js.html new file mode 100644 index 000000000..c777fb7c9 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_text.js.html @@ -0,0 +1,131 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.dom.text} class, which represents
+  8  *		a DOM text node.
+  9  */
+ 10
+ 11 /**
+ 12  * Represents a DOM text node.
+ 13  * @constructor
+ 14  * @augments CKEDITOR.dom.node
+ 15  * @param {Object|String} text A native DOM text node or a string containing
+ 16  *		the text to use to create a new text node.
+ 17  * @param {CKEDITOR.dom.document} [ownerDocument] The document that will contain
+ 18  *		the node in case of new node creation. Defaults to the current document.
+ 19  * @example
+ 20  * var nativeNode = document.createTextNode( 'Example' );
+ 21  * var text = CKEDITOR.dom.text( nativeNode );
+ 22  * @example
+ 23  * var text = CKEDITOR.dom.text( 'Example' );
+ 24  */
+ 25 CKEDITOR.dom.text = function( text, ownerDocument )
+ 26 {
+ 27 	if ( typeof text == 'string' )
+ 28 		text = ( ownerDocument ? ownerDocument.$ : document ).createTextNode( text );
+ 29
+ 30 	// Theoretically, we should call the base constructor here
+ 31 	// (not CKEDITOR.dom.node though). But, IE doesn't support expando
+ 32 	// properties on text node, so the features provided by domObject will not
+ 33 	// work for text nodes (which is not a big issue for us).
+ 34 	//
+ 35 	// CKEDITOR.dom.domObject.call( this, element );
+ 36
+ 37 	/**
+ 38 	 * The native DOM text node represented by this class instance.
+ 39 	 * @type Object
+ 40 	 * @example
+ 41 	 * var element = new CKEDITOR.dom.text( 'Example' );
+ 42 	 * alert( element.$.nodeType );  // "3"
+ 43 	 */
+ 44 	this.$ = text;
+ 45 };
+ 46
+ 47 CKEDITOR.dom.text.prototype = new CKEDITOR.dom.node();
+ 48
+ 49 CKEDITOR.tools.extend( CKEDITOR.dom.text.prototype,
+ 50 	/** @lends CKEDITOR.dom.text.prototype */
+ 51 	{
+ 52 		/**
+ 53 		 * The node type. This is a constant value set to
+ 54 		 * {@link CKEDITOR.NODE_TEXT}.
+ 55 		 * @type Number
+ 56 		 * @example
+ 57 		 */
+ 58 		type : CKEDITOR.NODE_TEXT,
+ 59
+ 60 		getLength : function()
+ 61 		{
+ 62 			return this.$.nodeValue.length;
+ 63 		},
+ 64
+ 65 		getText : function()
+ 66 		{
+ 67 			return this.$.nodeValue;
+ 68 		},
+ 69
+ 70 		/**
+ 71 		 * Breaks this text node into two nodes at the specified offset,
+ 72 		 * keeping both in the tree as siblings. This node then only contains
+ 73 		 * all the content up to the offset point. A new text node, which is
+ 74 		 * inserted as the next sibling of this node, contains all the content
+ 75 		 * at and after the offset point. When the offset is equal to the
+ 76 		 * length of this node, the new node has no data.
+ 77 		 * @param {Number} The position at which to split, starting from zero.
+ 78 		 * @returns {CKEDITOR.dom.text} The new text node.
+ 79 		 */
+ 80 		split : function( offset )
+ 81 		{
+ 82 			// If the offset is after the last char, IE creates the text node
+ 83 			// on split, but don't include it into the DOM. So, we have to do
+ 84 			// that manually here.
+ 85 			if ( CKEDITOR.env.ie && offset == this.getLength() )
+ 86 			{
+ 87 				var next = this.getDocument().createText( '' );
+ 88 				next.insertAfter( this );
+ 89 				return next;
+ 90 			}
+ 91
+ 92 			var doc = this.getDocument();
+ 93 			var retval = new CKEDITOR.dom.text( this.$.splitText( offset ), doc );
+ 94
+ 95 			// IE BUG: IE8 does not update the childNodes array in DOM after splitText(),
+ 96 			// we need to make some DOM changes to make it update. (#3436)
+ 97 			if ( CKEDITOR.env.ie8 )
+ 98 			{
+ 99 				var workaround = new CKEDITOR.dom.text( '', doc );
+100 				workaround.insertAfter( retval );
+101 				workaround.remove();
+102 			}
+103
+104 			return retval;
+105 		},
+106
+107 		/**
+108 		 * Extracts characters from indexA up to but not including indexB.
+109 		 * @param {Number} indexA An integer between 0 and one less than the
+110 		 *		length of the text.
+111 		 * @param {Number} [indexB] An integer between 0 and the length of the
+112 		 *		string. If omitted, extracts characters to the end of the text.
+113 		 */
+114 		substring : function( indexA, indexB )
+115 		{
+116 			// We need the following check due to a Firefox bug
+117 			// https://bugzilla.mozilla.org/show_bug.cgi?id=458886
+118 			if ( typeof indexB != 'number' )
+119 				return this.$.nodeValue.substr( indexA );
+120 			else
+121 				return this.$.nodeValue.substring( indexA, indexB );
+122 		}
+123 	});
+124 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_walker.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_walker.js.html new file mode 100644 index 000000000..4032cb800 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_walker.js.html @@ -0,0 +1,400 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	// This function is to be called under a "walker" instance scope.
+  9 	function iterate( rtl, breakOnFalse )
+ 10 	{
+ 11 		// Return null if we have reached the end.
+ 12 		if ( this._.end )
+ 13 			return null;
+ 14
+ 15 		var node,
+ 16 			range = this.range,
+ 17 			guard,
+ 18 			userGuard = this.guard,
+ 19 			type = this.type,
+ 20 			getSourceNodeFn = ( rtl ? 'getPreviousSourceNode' : 'getNextSourceNode' );
+ 21
+ 22 		// This is the first call. Initialize it.
+ 23 		if ( !this._.start )
+ 24 		{
+ 25 			this._.start = 1;
+ 26
+ 27 			// Trim text nodes and optmize the range boundaries. DOM changes
+ 28 			// may happen at this point.
+ 29 			range.trim();
+ 30
+ 31 			// A collapsed range must return null at first call.
+ 32 			if ( range.collapsed )
+ 33 			{
+ 34 				this.end();
+ 35 				return null;
+ 36 			}
+ 37 		}
+ 38
+ 39 		// Create the LTR guard function, if necessary.
+ 40 		if ( !rtl && !this._.guardLTR )
+ 41 		{
+ 42 			// Gets the node that stops the walker when going LTR.
+ 43 			var limitLTR = range.endContainer,
+ 44 				blockerLTR = limitLTR.getChild( range.endOffset );
+ 45
+ 46 			this._.guardLTR = function( node, movingOut )
+ 47 			{
+ 48 				return ( ( !movingOut || !limitLTR.equals( node ) )
+ 49 					&& ( !blockerLTR || !node.equals( blockerLTR ) )
+ 50 					&& ( node.type != CKEDITOR.NODE_ELEMENT || node.getName() != 'body' ) );
+ 51 			};
+ 52 		}
+ 53
+ 54 		// Create the RTL guard function, if necessary.
+ 55 		if ( rtl && !this._.guardRTL )
+ 56 		{
+ 57 			// Gets the node that stops the walker when going LTR.
+ 58 			var limitRTL = range.startContainer,
+ 59 				blockerRTL = ( range.startOffset > 0 ) && limitRTL.getChild( range.startOffset - 1 );
+ 60
+ 61 			this._.guardRTL = function( node, movingOut )
+ 62 			{
+ 63 				return ( ( !movingOut || !limitRTL.equals( node ) )
+ 64 					&& ( !blockerRTL || !node.equals( blockerRTL ) )
+ 65 					&& ( node.type != CKEDITOR.NODE_ELEMENT || node.getName() != 'body' ) );
+ 66 			};
+ 67 		}
+ 68
+ 69 		// Define which guard function to use.
+ 70 		var stopGuard = rtl ? this._.guardRTL : this._.guardLTR;
+ 71
+ 72 		// Make the user defined guard function participate in the process,
+ 73 		// otherwise simply use the boundary guard.
+ 74 		if ( userGuard )
+ 75 		{
+ 76 			guard = function( node, movingOut )
+ 77 			{
+ 78 				if ( stopGuard( node, movingOut ) === false )
+ 79 					return false;
+ 80
+ 81 				return userGuard( node );
+ 82 			};
+ 83 		}
+ 84 		else
+ 85 			guard = stopGuard;
+ 86
+ 87 		if ( this.current )
+ 88 			node = this.current[ getSourceNodeFn ]( false, type, guard );
+ 89 		else
+ 90 		{
+ 91 			// Get the first node to be returned.
+ 92
+ 93 			if ( rtl )
+ 94 			{
+ 95 				node = range.endContainer;
+ 96
+ 97 				if ( range.endOffset > 0 )
+ 98 				{
+ 99 					node = node.getChild( range.endOffset - 1 );
+100 					if ( guard( node ) === false )
+101 						node = null;
+102 				}
+103 				else
+104 					node = ( guard ( node ) === false ) ?
+105 						null : node.getPreviousSourceNode( true, type, guard );
+106 			}
+107 			else
+108 			{
+109 				node = range.startContainer;
+110 				node = node.getChild( range.startOffset );
+111
+112 				if ( node )
+113 				{
+114 					if ( guard( node ) === false )
+115 						node = null;
+116 				}
+117 				else
+118 					node = ( guard ( range.startContainer ) === false ) ?
+119 						null : range.startContainer.getNextSourceNode( true, type, guard ) ;
+120 			}
+121 		}
+122
+123 		while ( node && !this._.end )
+124 		{
+125 			this.current = node;
+126
+127 			if ( !this.evaluator || this.evaluator( node ) !== false )
+128 			{
+129 				if ( !breakOnFalse )
+130 					return node;
+131 			}
+132 			else if ( breakOnFalse && this.evaluator )
+133 				return false;
+134
+135 			node = node[ getSourceNodeFn ]( false, type, guard );
+136 		}
+137
+138 		this.end();
+139 		return this.current = null;
+140 	}
+141
+142 	function iterateToLast( rtl )
+143 	{
+144 		var node, last = null;
+145
+146 		while ( ( node = iterate.call( this, rtl ) ) )
+147 			last = node;
+148
+149 		return last;
+150 	}
+151
+152 	CKEDITOR.dom.walker = CKEDITOR.tools.createClass(
+153 	{
+154 		/**
+155 		 * Utility class to "walk" the DOM inside a range boundaries. If
+156 		 * necessary, partially included nodes (text nodes) are broken to
+157 		 * reflect the boundaries limits, so DOM and range changes may happen.
+158 		 * Outside changes to the range may break the walker.
+159 		 *
+160 		 * The walker may return nodes that are not totaly included into the
+161 		 * range boundaires. Let's take the following range representation,
+162 		 * where the square brackets indicate the boundaries:
+163 		 *
+164 		 * [<p>Some <b>sample] text</b>
+165 		 *
+166 		 * While walking forward into the above range, the following nodes are
+167 		 * returned: <p>, "Some ", <b> and "sample". Going
+168 		 * backwards instead we have: "sample" and "Some ". So note that the
+169 		 * walker always returns nodes when "entering" them, but not when
+170 		 * "leaving" them. The guard function is instead called both when
+171 		 * entering and leaving nodes.
+172 		 *
+173 		 * @constructor
+174 		 * @param {CKEDITOR.dom.range} range The range within which walk.
+175 		 */
+176 		$ : function( range )
+177 		{
+178 			this.range = range;
+179
+180 			/**
+181 			 * A function executed for every matched node, to check whether
+182 			 * it's to be considered into the walk or not. If not provided, all
+183 			 * matched nodes are considered good.
+184 			 * If the function returns "false" the node is ignored.
+185 			 * @name CKEDITOR.dom.walker.prototype.evaluator
+186 			 * @property
+187 			 * @type Function
+188 			 */
+189 			// this.evaluator = null;
+190
+191 			/**
+192 			 * A function executed for every node the walk pass by to check
+193 			 * whether the walk is to be finished. It's called when both
+194 			 * entering and exiting nodes, as well as for the matched nodes.
+195 			 * If this function returns "false", the walking ends and no more
+196 			 * nodes are evaluated.
+197 			 * @name CKEDITOR.dom.walker.prototype.guard
+198 			 * @property
+199 			 * @type Function
+200 			 */
+201 			// this.guard = null;
+202
+203 			/** @private */
+204 			this._ = {};
+205 		},
+206
+207 //		statics :
+208 //		{
+209 //			/* Creates a CKEDITOR.dom.walker instance to walk inside DOM boundaries set by nodes.
+210 //			 * @param {CKEDITOR.dom.node} startNode The node from wich the walk
+211 //			 *		will start.
+212 //			 * @param {CKEDITOR.dom.node} [endNode] The last node to be considered
+213 //			 *		in the walk. No more nodes are retrieved after touching or
+214 //			 *		passing it. If not provided, the walker stops at the
+215 //			 *		<body> closing boundary.
+216 //			 * @returns {CKEDITOR.dom.walker} A DOM walker for the nodes between the
+217 //			 *		provided nodes.
+218 //			 */
+219 //			createOnNodes : function( startNode, endNode, startInclusive, endInclusive )
+220 //			{
+221 //				var range = new CKEDITOR.dom.range();
+222 //				if ( startNode )
+223 //					range.setStartAt( startNode, startInclusive ? CKEDITOR.POSITION_BEFORE_START : CKEDITOR.POSITION_AFTER_END ) ;
+224 //				else
+225 //					range.setStartAt( startNode.getDocument().getBody(), CKEDITOR.POSITION_AFTER_START ) ;
+226 //
+227 //				if ( endNode )
+228 //					range.setEndAt( endNode, endInclusive ? CKEDITOR.POSITION_AFTER_END : CKEDITOR.POSITION_BEFORE_START ) ;
+229 //				else
+230 //					range.setEndAt( startNode.getDocument().getBody(), CKEDITOR.POSITION_BEFORE_END ) ;
+231 //
+232 //				return new CKEDITOR.dom.walker( range );
+233 //			}
+234 //		},
+235 //
+236 		proto :
+237 		{
+238 			/**
+239 			 * Stop walking. No more nodes are retrieved if this function gets
+240 			 * called.
+241 			 */
+242 			end : function()
+243 			{
+244 				this._.end = 1;
+245 			},
+246
+247 			/**
+248 			 * Retrieves the next node (at right).
+249 			 * @returns {CKEDITOR.dom.node} The next node or null if no more
+250 			 *		nodes are available.
+251 			 */
+252 			next : function()
+253 			{
+254 				return iterate.call( this );
+255 			},
+256
+257 			/**
+258 			 * Retrieves the previous node (at left).
+259 			 * @returns {CKEDITOR.dom.node} The previous node or null if no more
+260 			 *		nodes are available.
+261 			 */
+262 			previous : function()
+263 			{
+264 				return iterate.call( this, true );
+265 			},
+266
+267 			/**
+268 			 * Check all nodes at right, executing the evaluation fuction.
+269 			 * @returns {Boolean} "false" if the evaluator function returned
+270 			 *		"false" for any of the matched nodes. Otherwise "true".
+271 			 */
+272 			checkForward : function()
+273 			{
+274 				return iterate.call( this, false, true ) !== false;
+275 			},
+276
+277 			/**
+278 			 * Check all nodes at left, executing the evaluation fuction.
+279 			 * @returns {Boolean} "false" if the evaluator function returned
+280 			 *		"false" for any of the matched nodes. Otherwise "true".
+281 			 */
+282 			checkBackward : function()
+283 			{
+284 				return iterate.call( this, true, true ) !== false;
+285 			},
+286
+287 			/**
+288 			 * Executes a full walk forward (to the right), until no more nodes
+289 			 * are available, returning the last valid node.
+290 			 * @returns {CKEDITOR.dom.node} The last node at the right or null
+291 			 *		if no valid nodes are available.
+292 			 */
+293 			lastForward : function()
+294 			{
+295 				return iterateToLast.call( this );
+296 			},
+297
+298 			/**
+299 			 * Executes a full walk backwards (to the left), until no more nodes
+300 			 * are available, returning the last valid node.
+301 			 * @returns {CKEDITOR.dom.node} The last node at the left or null
+302 			 *		if no valid nodes are available.
+303 			 */
+304 			lastBackward : function()
+305 			{
+306 				return iterateToLast.call( this, true );
+307 			}
+308
+309 		}
+310 	});
+311
+312 	/*
+313 	 * Anything whose display computed style is block, list-item, table,
+314 	 * table-row-group, table-header-group, table-footer-group, table-row,
+315 	 * table-column-group, table-column, table-cell, table-caption, or whose node
+316 	 * name is hr, br (when enterMode is br only) is a block boundary.
+317 	 */
+318 	var blockBoundaryDisplayMatch =
+319 	{
+320 		block : 1,
+321 		'list-item' : 1,
+322 		table : 1,
+323 		'table-row-group' : 1,
+324 		'table-header-group' : 1,
+325 		'table-footer-group' : 1,
+326 		'table-row' : 1,
+327 		'table-column-group' : 1,
+328 		'table-column' : 1,
+329 		'table-cell' : 1,
+330 		'table-caption' : 1
+331 	},
+332 	blockBoundaryNodeNameMatch = { hr : 1 };
+333
+334 	CKEDITOR.dom.element.prototype.isBlockBoundary = function( customNodeNames )
+335 	{
+336 		var nodeNameMatches = CKEDITOR.tools.extend( {},
+337 													blockBoundaryNodeNameMatch, customNodeNames || {} );
+338
+339 		return blockBoundaryDisplayMatch[ this.getComputedStyle( 'display' ) ] ||
+340 			nodeNameMatches[ this.getName() ];
+341 	};
+342
+343 	CKEDITOR.dom.walker.blockBoundary = function( customNodeNames )
+344 	{
+345 		return function( node , type )
+346 		{
+347 			return ! ( node.type == CKEDITOR.NODE_ELEMENT
+348 						&& node.isBlockBoundary( customNodeNames ) );
+349 		};
+350 	};
+351
+352 	CKEDITOR.dom.walker.listItemBoundary = function()
+353 	{
+354 			return this.blockBoundary( { br : 1 } );
+355 	};
+356 	/**
+357 	 * Whether the node is a bookmark node's inner text node.
+358 	 */
+359 	CKEDITOR.dom.walker.bookmarkContents = function( node )
+360 	{
+361 	},
+362
+363 	/**
+364 	 * Whether the to-be-evaluated node is a bookmark node OR bookmark node
+365 	 * inner contents.
+366 	 * @param {Boolean} contentOnly Whether only test againt the text content of
+367 	 * bookmark node instead of the element itself(default).
+368 	 * @param {Boolean} isReject Whether should return 'false' for the bookmark
+369 	 * node instead of 'true'(default).
+370 	 */
+371 	CKEDITOR.dom.walker.bookmark = function( contentOnly, isReject )
+372 	{
+373 		function isBookmarkNode( node )
+374 		{
+375 			return ( node && node.getName
+376 					&& node.getName() == 'span'
+377 					&& node.hasAttribute('_fck_bookmark') );
+378 		}
+379
+380 		return function( node )
+381 		{
+382 			var retval, parent;
+383 			// Is bookmark inner text node?
+384 			retval = ( node && !node.getName && ( parent = node.getParent() )
+385 						&& isBookmarkNode( parent ) );
+386 			// Is bookmark node?
+387 			retval = contentOnly ? retval : retval || isBookmarkNode( node );
+388 			return isReject ? !retval : !!retval;
+389 		};
+390 	};
+391
+392 })();
+393 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_window.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_window.js.html new file mode 100644 index 000000000..79c1ded7b --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dom_window.js.html @@ -0,0 +1,101 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.dom.document} class, which
+  8  *		represents a DOM document.
+  9  */
+ 10
+ 11 /**
+ 12  * Represents a DOM window.
+ 13  * @constructor
+ 14  * @augments CKEDITOR.dom.domObject
+ 15  * @param {Object} domWindow A native DOM window.
+ 16  * @example
+ 17  * var document = new CKEDITOR.dom.window( window );
+ 18  */
+ 19 CKEDITOR.dom.window = function( domWindow )
+ 20 {
+ 21 	CKEDITOR.dom.domObject.call( this, domWindow );
+ 22 };
+ 23
+ 24 CKEDITOR.dom.window.prototype = new CKEDITOR.dom.domObject();
+ 25
+ 26 CKEDITOR.tools.extend( CKEDITOR.dom.window.prototype,
+ 27 	/** @lends CKEDITOR.dom.window.prototype */
+ 28 	{
+ 29 		/**
+ 30 		 * Moves the selection focus to this window.
+ 31 		 * @function
+ 32 		 * @example
+ 33 		 * var win = new CKEDITOR.dom.window( window );
+ 34 		 * <b>win.focus()</b>;
+ 35 		 */
+ 36 		focus : function()
+ 37 		{
+ 38 			this.$.focus();
+ 39 		},
+ 40
+ 41 		/**
+ 42 		 * Gets the width and height of this window's viewable area.
+ 43 		 * @function
+ 44 		 * @returns {Object} An object with the "width" and "height"
+ 45 		 *		properties containing the size.
+ 46 		 * @example
+ 47 		 * var win = new CKEDITOR.dom.window( window );
+ 48 		 * var size = <b>win.getViewPaneSize()</b>;
+ 49 		 * alert( size.width );
+ 50 		 * alert( size.height );
+ 51 		 */
+ 52 		getViewPaneSize : function()
+ 53 		{
+ 54 			var doc = this.$.document,
+ 55 				stdMode = doc.compatMode == 'CSS1Compat';
+ 56 			return {
+ 57 				width : ( stdMode ? doc.documentElement.clientWidth : doc.body.clientWidth ) || 0,
+ 58 				height : ( stdMode ? doc.documentElement.clientHeight : doc.body.clientHeight ) || 0
+ 59 			};
+ 60 		},
+ 61
+ 62 		/**
+ 63 		 * Gets the current position of the window's scroll.
+ 64 		 * @function
+ 65 		 * @returns {Object} An object with the "x" and "y" properties
+ 66 		 *		containing the scroll position.
+ 67 		 * @example
+ 68 		 * var win = new CKEDITOR.dom.window( window );
+ 69 		 * var pos = <b>win.getScrollPosition()</b>;
+ 70 		 * alert( pos.x );
+ 71 		 * alert( pos.y );
+ 72 		 */
+ 73 		getScrollPosition : function()
+ 74 		{
+ 75 			var $ = this.$;
+ 76
+ 77 			if ( 'pageXOffset' in $ )
+ 78 			{
+ 79 				return {
+ 80 					x : $.pageXOffset || 0,
+ 81 					y : $.pageYOffset || 0
+ 82 				};
+ 83 			}
+ 84 			else
+ 85 			{
+ 86 				var doc = $.document;
+ 87 				return {
+ 88 					x : doc.documentElement.scrollLeft || doc.body.scrollLeft || 0,
+ 89 					y : doc.documentElement.scrollTop || doc.body.scrollTop || 0
+ 90 				};
+ 91 			}
+ 92 		}
+ 93 	});
+ 94 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dtd.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dtd.js.html new file mode 100644 index 000000000..609eeb35d --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_dtd.js.html @@ -0,0 +1,208 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.dtd} object, which holds the DTD
+  8  *		mapping for XHTML 1.0 Transitional. This file was automatically
+  9  *		generated from the file: xhtml1-transitional.dtd.
+ 10  */
+ 11
+ 12 /**
+ 13  * Holds and object representation of the HTML DTD to be used by the editor in
+ 14  * its internal operations.
+ 15  *
+ 16  * Each element in the DTD is represented by a
+ 17  * property in this object. Each property contains the list of elements that
+ 18  * can be contained by the element. Text is represented by the "#" property.
+ 19  *
+ 20  * Several special grouping properties are also available. Their names start
+ 21  * with the "$" character.
+ 22  * @namespace
+ 23  * @example
+ 24  * // Check if "div" can be contained in a "p" element.
+ 25  * alert( !!CKEDITOR.dtd[ 'p' ][ 'div' ] );  "false"
+ 26  * @example
+ 27  * // Check if "p" can be contained in a "div" element.
+ 28  * alert( !!CKEDITOR.dtd[ 'div' ][ 'p' ] );  "true"
+ 29  * @example
+ 30  * // Check if "p" is a block element.
+ 31  * alert( !!CKEDITOR.dtd.$block[ 'p' ] );  "true"
+ 32  */
+ 33 CKEDITOR.dtd = (function()
+ 34 {
+ 35     var X = CKEDITOR.tools.extend,
+ 36
+ 37 		A = {isindex:1,fieldset:1},
+ 38 		B = {input:1,button:1,select:1,textarea:1,label:1},
+ 39 		C = X({a:1},B),
+ 40 		D = X({iframe:1},C),
+ 41 		E = {hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1},
+ 42 		F = {ins:1,del:1,script:1},
+ 43 		G = X({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1},F),
+ 44 		H = X({sub:1,img:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1},G),
+ 45 		I = X({p:1},H),
+ 46 		J = X({iframe:1},H,B),
+ 47 		K = {img:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1},
+ 48
+ 49 		L = X({a:1},J),
+ 50 		M = {tr:1},
+ 51 		N = {'#':1},
+ 52 		O = X({param:1},K),
+ 53 		P = X({form:1},A,D,E,I),
+ 54 		Q = {li:1};
+ 55
+ 56 	var block = {address:1,blockquote:1,center:1,dir:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,menu:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1};
+ 57
+ 58     return /** @lends CKEDITOR.dtd */ {
+ 59
+ 60 		// The "$" items have been added manually.
+ 61
+ 62 		/**
+ 63 		 * List of block elements, like "p" or "div".
+ 64 		 * @type Object
+ 65 		 * @example
+ 66 		 */
+ 67 		$block : block,
+ 68
+ 69 		$body : X({script:1}, block),
+ 70
+ 71 		$cdata : {script:1,style:1},
+ 72
+ 73 		/**
+ 74 		 * List of empty (self-closing) elements, like "br" or "img".
+ 75 		 * @type Object
+ 76 		 * @example
+ 77 		 */
+ 78 		$empty : {area:1,base:1,br:1,col:1,hr:1,img:1,input:1,link:1,meta:1,param:1},
+ 79
+ 80 		/**
+ 81 		 * List of list item elements, like "li" or "dd".
+ 82 		 * @type Object
+ 83 		 * @example
+ 84 		 */
+ 85 		$listItem : {dd:1,dt:1,li:1},
+ 86
+ 87 		/**
+ 88 		 * Elements that accept text nodes, but are not possible to edit into
+ 89 		 * the browser.
+ 90 		 * @type Object
+ 91 		 * @example
+ 92 		 */
+ 93 		$nonEditable : {applet:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,script:1,textarea:1},
+ 94
+ 95 		/**
+ 96 		 * List of elements that can be ignored if empty, like "b" or "span".
+ 97 		 * @type Object
+ 98 		 * @example
+ 99 		 */
+100 		$removeEmpty : {abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1},
+101
+102 		/**
+103 		 * List of elements that have tabindex set to zero by default.
+104 		 * @type Object
+105 		 * @example
+106 		 */
+107 		$tabIndex : {a:1,area:1,button:1,input:1,object:1,select:1,textarea:1},
+108
+109 		/**
+110 		 * List of elements used inside the "table" element, like "tbody" or "td".
+111 		 * @type Object
+112 		 * @example
+113 		 */
+114 		$tableContent : {caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1},
+115
+116         col : {},
+117         tr : {td:1,th:1},
+118         img : {},
+119         colgroup : {col:1},
+120         noscript : P,
+121         td : P,
+122         br : {},
+123         th : P,
+124         center : P,
+125         kbd : L,
+126         button : X(I,E),
+127         basefont : {},
+128         h5 : L,
+129         h4 : L,
+130         samp : L,
+131         h6 : L,
+132         ol : Q,
+133         h1 : L,
+134         h3 : L,
+135         option : N,
+136         h2 : L,
+137         form : X(A,D,E,I),
+138         select : {optgroup:1,option:1},
+139         font : L,
+140         ins : P,
+141         menu : Q,
+142         abbr : L,
+143         label : L,
+144         table : {thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1},
+145         code : L,
+146         script : N,
+147         tfoot : M,
+148         cite : L,
+149         li : P,
+150         input : {},
+151         iframe : P,
+152         strong : L,
+153         textarea : N,
+154         noframes : P,
+155         big : L,
+156         small : L,
+157         span : L,
+158         hr : {},
+159         dt : L,
+160         sub : L,
+161         optgroup : {option:1},
+162         param : {},
+163         bdo : L,
+164         'var' : L,
+165         div : P,
+166         object : O,
+167         sup : L,
+168         dd : P,
+169         strike : L,
+170         area : {},
+171         dir : Q,
+172         map : X({area:1,form:1,p:1},A,F,E),
+173         applet : O,
+174         dl : {dt:1,dd:1},
+175         del : P,
+176         isindex : {},
+177         fieldset : X({legend:1},K),
+178         thead : M,
+179         ul : Q,
+180         acronym : L,
+181         b : L,
+182         a : J,
+183         blockquote : P,
+184         caption : L,
+185         i : L,
+186         u : L,
+187         tbody : M,
+188         s : L,
+189         address : X(D,I),
+190         tt : L,
+191         legend : L,
+192         q : L,
+193         pre : X(G,C),
+194         p : L,
+195         em : L,
+196         dfn : L
+197     };
+198 })();
+199
+200 // PACKAGER_RENAME( CKEDITOR.dtd )
+201 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_editor.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_editor.js.html new file mode 100644 index 000000000..256460c1c --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_editor.js.html @@ -0,0 +1,647 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.editor} class, which represents an
+  8  *		editor instance.
+  9  */
+ 10
+ 11 (function()
+ 12 {
+ 13 	// The counter for automatic instance names.
+ 14 	var nameCounter = 0;
+ 15
+ 16 	var getNewName = function()
+ 17 	{
+ 18 		var name = 'editor' + ( ++nameCounter );
+ 19 		return ( CKEDITOR.instances && CKEDITOR.instances[ name ] ) ? getNewName() : name;
+ 20 	};
+ 21
+ 22 	// ##### START: Config Privates
+ 23
+ 24 	// These function loads custom configuration files and cache the
+ 25 	// CKEDITOR.editorConfig functions defined on them, so there is no need to
+ 26 	// download them more than once for several instances.
+ 27 	var loadConfigLoaded = {};
+ 28 	var loadConfig = function( editor )
+ 29 	{
+ 30 		var customConfig = editor.config.customConfig;
+ 31
+ 32 		// Check if there is a custom config to load.
+ 33 		if ( !customConfig )
+ 34 			return false;
+ 35
+ 36 		var loadedConfig = loadConfigLoaded[ customConfig ] || ( loadConfigLoaded[ customConfig ] = {} );
+ 37
+ 38 		// If the custom config has already been downloaded, reuse it.
+ 39 		if ( loadedConfig.fn )
+ 40 		{
+ 41 			// Call the cached CKEDITOR.editorConfig defined in the custom
+ 42 			// config file for the editor instance depending on it.
+ 43 			loadedConfig.fn.call( editor, editor.config );
+ 44
+ 45 			// If there is no other customConfig in the chain, fire the
+ 46 			// "configLoaded" event.
+ 47 			if ( editor.config.customConfig == customConfig || !loadConfig( editor ) )
+ 48 				editor.fireOnce( 'customConfigLoaded' );
+ 49 		}
+ 50 		else
+ 51 		{
+ 52 			// Load the custom configuration file.
+ 53 			CKEDITOR.scriptLoader.load( customConfig, function()
+ 54 				{
+ 55 					// If the CKEDITOR.editorConfig function has been properly
+ 56 					// defined in the custom configuration file, cache it.
+ 57 					if ( CKEDITOR.editorConfig )
+ 58 						loadedConfig.fn = CKEDITOR.editorConfig;
+ 59 					else
+ 60 						loadedConfig.fn = function(){};
+ 61
+ 62 					// Call the load config again. This time the custom
+ 63 					// config is already cached and so it will get loaded.
+ 64 					loadConfig( editor );
+ 65 				});
+ 66 		}
+ 67
+ 68 		return true;
+ 69 	};
+ 70
+ 71 	var initConfig = function( editor, instanceConfig )
+ 72 	{
+ 73 		// Setup the lister for the "customConfigLoaded" event.
+ 74 		editor.on( 'customConfigLoaded', function()
+ 75 			{
+ 76 				if ( instanceConfig )
+ 77 				{
+ 78 					// Register the events that may have been set at the instance
+ 79 					// configuration object.
+ 80 					if ( instanceConfig.on )
+ 81 					{
+ 82 						for ( var eventName in instanceConfig.on )
+ 83 						{
+ 84 							editor.on( eventName, instanceConfig.on[ eventName ] );
+ 85 						}
+ 86 					}
+ 87
+ 88 					// Overwrite the settings from the in-page config.
+ 89 					CKEDITOR.tools.extend( editor.config, instanceConfig, true );
+ 90
+ 91 					delete editor.config.on;
+ 92 				}
+ 93
+ 94 				onConfigLoaded( editor );
+ 95 			});
+ 96
+ 97 		// The instance config may override the customConfig setting to avoid
+ 98 		// loading the default ~/config.js file.
+ 99 		if ( instanceConfig && instanceConfig.customConfig != undefined )
+100 			editor.config.customConfig = instanceConfig.customConfig;
+101
+102 		// Load configs from the custom configuration files.
+103 		if ( !loadConfig( editor ) )
+104 			editor.fireOnce( 'customConfigLoaded' );
+105 	};
+106
+107 	// ##### END: Config Privates
+108
+109 	var onConfigLoaded = function( editor )
+110 	{
+111 		// Set config related properties.
+112
+113 		var skin = editor.config.skin.split( ',' ),
+114 			skinName = skin[ 0 ],
+115 			skinPath = CKEDITOR.getUrl( skin[ 1 ] || (
+117 				'skins/' + skinName + '/' ) );
+118
+119 		editor.skinName = skinName;
+120 		editor.skinPath = skinPath;
+121 		editor.skinClass = 'cke_skin_' + skinName;
+122
+123 		// Fire the "configLoaded" event.
+124 		editor.fireOnce( 'configLoaded' );
+125
+126 		// Load language file.
+127 		loadLang( editor );
+128 	};
+129
+130 	var loadLang = function( editor )
+131 	{
+132 		CKEDITOR.lang.load( editor.config.language, editor.config.defaultLanguage, function( languageCode, lang )
+133 			{
+134 				editor.langCode = languageCode;
+135
+136 				// As we'll be adding plugin specific entries that could come
+137 				// from different language code files, we need a copy of lang,
+138 				// not a direct reference to it.
+139 				editor.lang = CKEDITOR.tools.prototypedCopy( lang );
+140
+141 				// We're not able to support RTL in Firefox 2 at this time.
+142 				if ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 && editor.lang.dir == 'rtl' )
+143 					editor.lang.dir = 'ltr';
+144
+145 				loadPlugins( editor );
+146 			});
+147 	};
+148
+149 	var loadPlugins = function( editor )
+150 	{
+151 		var config			= editor.config,
+152 			plugins			= config.plugins,
+153 			extraPlugins	= config.extraPlugins,
+154 			removePlugins	= config.removePlugins;
+155
+156 		if ( extraPlugins )
+157 		{
+158 			// Remove them first to avoid duplications.
+159 			var removeRegex = new RegExp( '(?:^|,)(?:' + extraPlugins.replace( /\s*,\s*/g, '|' ) + ')(?=,|$)' , 'g' );
+160 			plugins = plugins.replace( removeRegex, '' );
+161
+162 			plugins += ',' + extraPlugins;
+163 		}
+164
+165 		if ( removePlugins )
+166 		{
+167 			removeRegex = new RegExp( '(?:^|,)(?:' + removePlugins.replace( /\s*,\s*/g, '|' ) + ')(?=,|$)' , 'g' );
+168 			plugins = plugins.replace( removeRegex, '' );
+169 		}
+170
+171 		// Load all plugins defined in the "plugins" setting.
+172 		CKEDITOR.plugins.load( plugins.split( ',' ), function( plugins )
+173 			{
+174 				// The list of plugins.
+175 				var pluginsArray = [];
+176
+177 				// The language code to get loaded for each plugin. Null
+178 				// entries will be appended for plugins with no language files.
+179 				var languageCodes = [];
+180
+181 				// The list of URLs to language files.
+182 				var languageFiles = [];
+183
+184 				// Cache the loaded plugin names.
+185 				editor.plugins = plugins;
+186
+187 				// Loop through all plugins, to build the list of language
+188 				// files to get loaded.
+189 				for ( var pluginName in plugins )
+190 				{
+191 					var plugin = plugins[ pluginName ],
+192 						pluginLangs = plugin.lang,
+193 						pluginPath = CKEDITOR.plugins.getPath( pluginName ),
+194 						lang = null;
+195
+196 					// Set the plugin path in the plugin.
+197 					plugin.path = pluginPath;
+198
+199 					// If the plugin has "lang".
+200 					if ( pluginLangs )
+201 					{
+202 						// Resolve the plugin language. If the current language
+203 						// is not available, get the first one (default one).
+204 						lang = ( CKEDITOR.tools.indexOf( pluginLangs, editor.langCode ) >= 0 ? editor.langCode : pluginLangs[ 0 ] );
+205
+206 						if ( !plugin.lang[ lang ] )
+207 						{
+208 							// Put the language file URL into the list of files to
+209 							// get downloaded.
+210 							languageFiles.push( CKEDITOR.getUrl( pluginPath + 'lang/' + lang + '.js' ) );
+211 						}
+212 						else
+213 						{
+214 							CKEDITOR.tools.extend( editor.lang, plugin.lang[ lang ] );
+215 							lang = null;
+216 						}
+217 					}
+218
+219 					// Save the language code, so we know later which
+220 					// language has been resolved to this plugin.
+221 					languageCodes.push( lang );
+222
+223 					pluginsArray.push( plugin );
+224 				}
+225
+226 				// Load all plugin specific language files in a row.
+227 				CKEDITOR.scriptLoader.load( languageFiles, function()
+228 					{
+229 						// Initialize all plugins that have the "beforeInit" and "init" methods defined.
+230 						var methods = [ 'beforeInit', 'init', 'afterInit' ];
+231 						for ( var m = 0 ; m < methods.length ; m++ )
+232 						{
+233 							for ( var i = 0 ; i < pluginsArray.length ; i++ )
+234 							{
+235 								var plugin = pluginsArray[ i ];
+236
+237 								// Uses the first loop to update the language entries also.
+238 								if ( m === 0 && languageCodes[ i ] && plugin.lang )
+239 									CKEDITOR.tools.extend( editor.lang, plugin.lang[ languageCodes[ i ] ] );
+240
+241 								// Call the plugin method (beforeInit and init).
+242 								if ( plugin[ methods[ m ] ] )
+243 									plugin[ methods[ m ] ]( editor );
+244 							}
+245 						}
+246
+247 						// Load the editor skin.
+248 						editor.fire( 'pluginsLoaded' );
+249 						loadSkin( editor );
+250 					});
+251 			});
+252 	};
+253
+254 	var loadSkin = function( editor )
+255 	{
+256 		CKEDITOR.skins.load( editor, 'editor', function()
+257 			{
+258 				loadTheme( editor );
+259 			});
+260 	};
+261
+262 	var loadTheme = function( editor )
+263 	{
+264 		var theme = editor.config.theme;
+265 		CKEDITOR.themes.load( theme, function()
+266 			{
+267 				var editorTheme = editor.theme = CKEDITOR.themes.get( theme );
+268 				editorTheme.path = CKEDITOR.themes.getPath( theme );
+269 				editorTheme.build( editor );
+270
+271 				if ( editor.config.autoUpdateElement )
+272 					attachToForm( editor );
+273 			});
+274 	};
+275
+276 	var attachToForm = function( editor )
+277 	{
+278 		var element = editor.element;
+279
+280 		// If are replacing a textarea, we must
+281 		if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_REPLACE && element.is( 'textarea' ) )
+282 		{
+283 			var form = element.$.form && new CKEDITOR.dom.element( element.$.form );
+284 			if ( form )
+285 			{
+286 				form.on( 'submit', function()
+287 					{
+288 						editor.updateElement();
+289 					});
+290
+291 				// Setup the submit function because it doesn't fire the
+292 				// "submit" event.
+293 				if ( !form.$.submit.nodeName )
+294 				{
+295 					form.$.submit = CKEDITOR.tools.override( form.$.submit, function( originalSubmit )
+296 						{
+297 							return function()
+298 								{
+299 									editor.updateElement();
+300
+301 									// For IE, the DOM submit function is not a
+302 									// function, so we need thid check.
+303 									if ( originalSubmit.apply )
+304 										originalSubmit.apply( this, arguments );
+305 									else
+306 										originalSubmit();
+307 								};
+308 						});
+309 				}
+310 			}
+311 		}
+312 	};
+313
+314 	function updateCommandsMode()
+315 	{
+316 		var command,
+317 			commands = this._.commands,
+318 			mode = this.mode;
+319
+320 		for ( var name in commands )
+321 		{
+322 			command = commands[ name ];
+323 			command[ command.modes[ mode ] ? 'enable' : 'disable' ]();
+324 		}
+325 	}
+326
+327 	/**
+328 	 * Initializes the editor instance. This function is called by the editor
+329 	 * contructor (editor_basic.js).
+330 	 * @private
+331 	 */
+332 	CKEDITOR.editor.prototype._init = function()
+333 		{
+334 			// Get the properties that have been saved in the editor_base
+335 			// implementation.
+336 			var element			= CKEDITOR.dom.element.get( this._.element ),
+337 				instanceConfig	= this._.instanceConfig;
+338 			delete this._.element;
+339 			delete this._.instanceConfig;
+340
+341 			this._.commands = {};
+342 			this._.styles = [];
+343
+344 			/**
+345 			 * The DOM element that has been replaced by this editor instance. This
+346 			 * element holds the editor data on load and post.
+347 			 * @name CKEDITOR.editor.prototype.element
+348 			 * @type CKEDITOR.dom.element
+349 			 * @example
+350 			 * var editor = CKEDITOR.instances.editor1;
+351 			 * alert( <b>editor.element</b>.getName() );  "textarea"
+352 			 */
+353 			this.element = element;
+354
+355 			/**
+356 			 * The editor instance name. It hay be the replaced element id, name or
+357 			 * a default name using a progressive counter (editor1, editor2, ...).
+358 			 * @name CKEDITOR.editor.prototype.name
+359 			 * @type String
+360 			 * @example
+361 			 * var editor = CKEDITOR.instances.editor1;
+362 			 * alert( <b>editor.name</b> );  "editor1"
+363 			 */
+364 			this.name = ( element && ( this.elementMode == CKEDITOR.ELEMENT_MODE_REPLACE )
+365 							&& ( element.getId() || element.getNameAtt() ) )
+366 						|| getNewName();
+367
+368 			/**
+369 			 * The configurations for this editor instance. It inherits all
+370 			 * settings defined in (@link CKEDITOR.config}, combined with settings
+371 			 * loaded from custom configuration files and those defined inline in
+372 			 * the page when creating the editor.
+373 			 * @name CKEDITOR.editor.prototype.config
+374 			 * @type Object
+375 			 * @example
+376 			 * var editor = CKEDITOR.instances.editor1;
+377 			 * alert( <b>editor.config.theme</b> );  "default" e.g.
+378 			 */
+379 			this.config = CKEDITOR.tools.prototypedCopy( CKEDITOR.config );
+380
+381 			/**
+382 			 * Namespace containing UI features related to this editor instance.
+383 			 * @name CKEDITOR.editor.prototype.ui
+384 			 * @type CKEDITOR.ui
+385 			 * @example
+386 			 */
+387 			this.ui = new CKEDITOR.ui( this );
+388
+389 			/**
+390 			 * Controls the focus state of this editor instance. This property
+391 			 * is rarely used for normal API operations. It is mainly
+392 			 * destinated to developer adding UI elements to the editor interface.
+393 			 * @name CKEDITOR.editor.prototype.focusManager
+394 			 * @type CKEDITOR.focusManager
+395 			 * @example
+396 			 */
+397 			this.focusManager = new CKEDITOR.focusManager( this );
+398
+399 			CKEDITOR.fire( 'instanceCreated', null, this );
+400
+401 			this.on( 'mode', updateCommandsMode, null, null, 1 );
+402
+403 			initConfig( this, instanceConfig );
+404 		};
+405 })();
+406
+407 CKEDITOR.tools.extend( CKEDITOR.editor.prototype,
+408 	/** @lends CKEDITOR.editor.prototype */
+409 	{
+410 		/**
+411 		 * Adds a command definition to the editor instance. Commands added with
+412 		 * this function can be later executed with {@link #execCommand}.
+413 		 * @param {String} commandName The indentifier name of the command.
+414 		 * @param {CKEDITOR.commandDefinition} commandDefinition The command definition.
+415 		 * @example
+416 		 * editorInstance.addCommand( 'sample',
+417 		 * {
+418 		 *     exec : function( editor )
+419 		 *     {
+420 		 *         alert( 'Executing a command for the editor name "' + editor.name + '"!' );
+421 		 *     }
+422 		 * });
+423 		 */
+424 		addCommand : function( commandName, commandDefinition )
+425 		{
+426 			return this._.commands[ commandName ] = new CKEDITOR.command( this, commandDefinition );
+427 		},
+428
+429 		addCss : function( css )
+430 		{
+431 			this._.styles.push( css );
+432 		},
+433
+434 		/**
+435 		 * Destroys the editor instance, releasing all resources used by it.
+436 		 * If the editor replaced an element, the element will be recovered.
+437 		 * @param {Boolean} [noUpdate] If the instance is replacing a DOM
+438 		 *		element, this parameter indicates whether or not to update the
+439 		 *		element with the instance contents.
+440 		 * @example
+441 		 * alert( CKEDITOR.instances.editor1 );  e.g "object"
+442 		 * <b>CKEDITOR.instances.editor1.destroy()</b>;
+443 		 * alert( CKEDITOR.instances.editor1 );  "undefined"
+444 		 */
+445 		destroy : function( noUpdate )
+446 		{
+447 			if ( !noUpdate )
+448 				this.updateElement();
+449
+450 			this.theme.destroy( this );
+451 			CKEDITOR.remove( this );
+452 		},
+453
+454 		/**
+455 		 * Executes a command.
+456 		 * @param {String} commandName The indentifier name of the command.
+457 		 * @param {Object} [data] Data to be passed to the command
+458 		 * @returns {Boolean} "true" if the command has been successfuly
+459 		 *		executed, otherwise "false".
+460 		 * @example
+461 		 * editorInstance.execCommand( 'Bold' );
+462 		 */
+463 		execCommand : function( commandName, data )
+464 		{
+465 			var command = this.getCommand( commandName );
+466
+467 			var eventData =
+468 			{
+469 				name: commandName,
+470 				commandData: data,
+471 				command: command
+472 			};
+473
+474 			if ( command && command.state != CKEDITOR.TRISTATE_DISABLED )
+475 			{
+476 				if ( this.fire( 'beforeCommandExec', eventData ) !== true )
+477 				{
+478 					eventData.returnValue = command.exec( eventData.commandData );
+479
+480 					// Fire the 'afterCommandExec' immediately if command is synchronous.
+481 					if ( !command.async && this.fire( 'afterCommandExec', eventData ) !== true )
+482 						return eventData.returnValue;
+483 				}
+484 			}
+485
+486 			// throw 'Unknown command name "' + commandName + '"';
+487 			return false;
+488 		},
+489
+490 		/**
+491 		 * Gets one of the registered commands. Note that, after registering a
+492 		 * command definition with addCommand, it is transformed internally
+493 		 * into an instance of {@link CKEDITOR.command}, which will be then
+494 		 * returned by this function.
+495 		 * @param {String} commandName The name of the command to be returned.
+496 		 * This is the same used to register the command with addCommand.
+497 		 * @returns {CKEDITOR.command} The command object identified by the
+498 		 * provided name.
+499 		 */
+500 		getCommand : function( commandName )
+501 		{
+502 			return this._.commands[ commandName ];
+503 		},
+504
+505 		/**
+506 		 * Gets the editor data. The data will be in raw format. It is the same
+507 		 * data that is posted by the editor.
+508 		 * @type String
+509 		 * @returns (String) The editor data.
+510 		 * @example
+511 		 * if ( CKEDITOR.instances.editor1.<b>getData()</b> == '' )
+512 		 *     alert( 'There is no data available' );
+513 		 */
+514 		getData : function()
+515 		{
+516 			this.fire( 'beforeGetData' );
+517
+518 			var eventData = this._.data;
+519
+520 			if ( typeof eventData != 'string' )
+521 			{
+522 				var element = this.element;
+523 				if ( element && this.elementMode == CKEDITOR.ELEMENT_MODE_REPLACE )
+524 					eventData = element.is( 'textarea' ) ? element.getValue() : element.getHtml();
+525 				else
+526 					eventData = '';
+527 			}
+528
+529 			eventData = { dataValue : eventData };
+530
+531 			// Fire "getData" so data manipulation may happen.
+532 			this.fire( 'getData', eventData );
+533
+534 			return eventData.dataValue;
+535 		},
+536
+537 		getSnapshot : function()
+538 		{
+539 			var data = this.fire( 'getSnapshot' );
+540
+541 			if ( typeof data != 'string' )
+542 			{
+543 				var element = this.element;
+544 				if ( element && this.elementMode == CKEDITOR.ELEMENT_MODE_REPLACE )
+545 					data = element.is( 'textarea' ) ? element.getValue() : element.getHtml();
+546 			}
+547
+548 			return data;
+549 		},
+550
+551 		loadSnapshot : function( snapshot )
+552 		{
+553 			this.fire( 'loadSnapshot', snapshot );
+554 		},
+555
+556 		/**
+557 		 * Sets the editor data. The data must be provided in raw format.
+558 		 * @param {String} data HTML code to replace the curent content in the editor.
+559 		 * @example
+560 		 * CKEDITOR.instances.editor1.<b>setData( '<p>This is the editor data.</p>' )</b>;
+561 		 */
+562 		setData : function( data )
+563 		{
+564 			// Fire "setData" so data manipulation may happen.
+565 			var eventData = { dataValue : data };
+566 			this.fire( 'setData', eventData );
+567
+568 			this._.data = eventData.dataValue;
+569
+570 			this.fire( 'afterSetData', eventData );
+571 		},
+572
+573 		/**
+574 		 * Inserts HTML into the currently selected position in the editor.
+575 		 * @param {String} data HTML code to be inserted into the editor.
+576 		 * @example
+577 		 * CKEDITOR.instances.editor1.<b>insertHtml( '<p>This is a new paragraph.</p>' )</b>;
+578 		 */
+579 		insertHtml : function( data )
+580 		{
+581 			this.fire( 'insertHtml', data );
+582 		},
+583
+584 		/**
+585 		 * Inserts an element into the currently selected position in the
+586 		 * editor.
+587 		 * @param {CKEDITOR.dom.element} element The element to be inserted
+588 		 *		into the editor.
+589 		 * @example
+590 		 * var element = CKEDITOR.dom.element.createFromHtml( '<img src="hello.png" border="0" title="Hello" />' );
+591 		 * CKEDITOR.instances.editor1.<b>insertElement( element )</b>;
+592 		 */
+593 		insertElement : function( element )
+594 		{
+595 			this.fire( 'insertElement', element );
+596 		},
+597
+598 		checkDirty : function()
+599 		{
+600 			return ( this.mayBeDirty && this._.previousValue !== this.getSnapshot() );
+601 		},
+602
+603 		resetDirty : function()
+604 		{
+605 			if ( this.mayBeDirty )
+606 				this._.previousValue = this.getSnapshot();
+607 		},
+608
+609 		/**
+610 		 * Updates the <textarea> element that has been replaced by the editor with
+611 		 * the current data available in the editor.
+612 		 * @example
+613 		 * CKEDITOR.instances.editor1.updateElement();
+614 		 * alert( document.getElementById( 'editor1' ).value );  // The current editor data.
+615 		 */
+616 		updateElement : function()
+617 		{
+618 			var element = this.element;
+619 			if ( element && this.elementMode == CKEDITOR.ELEMENT_MODE_REPLACE )
+620 			{
+621 				if ( element.is( 'textarea' ) )
+622 					element.setValue( this.getData() );
+623 				else
+624 					element.setHtml( this.getData() );
+625 			}
+626 		}
+627 	});
+628
+629 CKEDITOR.on( 'loaded', function()
+630 	{
+631 		// Run the full initialization for pending editors.
+632 		var pending = CKEDITOR.editor._pending;
+633 		if ( pending )
+634 		{
+635 			delete CKEDITOR.editor._pending;
+636
+637 			for ( var i = 0 ; i < pending.length ; i++ )
+638 				pending[ i ]._init();
+639 		}
+640 	});
+641 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_editor_basic.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_editor_basic.js.html new file mode 100644 index 000000000..5e5d2e9fa --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_editor_basic.js.html @@ -0,0 +1,186 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 if ( !CKEDITOR.editor )
+  7 {
+  8 	/**
+  9 	 * No element is linked to the editor instance.
+ 10 	 * @constant
+ 11 	 * @example
+ 12 	 */
+ 13 	CKEDITOR.ELEMENT_MODE_NONE = 0;
+ 14
+ 15 	/**
+ 16 	 * The element is to be replaced by the editor instance.
+ 17 	 * @constant
+ 18 	 * @example
+ 19 	 */
+ 20 	CKEDITOR.ELEMENT_MODE_REPLACE = 1;
+ 21
+ 22 	/**
+ 23 	 * The editor is to be created inside the element.
+ 24 	 * @constant
+ 25 	 * @example
+ 26 	 */
+ 27 	CKEDITOR.ELEMENT_MODE_APPENDTO = 2;
+ 28
+ 29 	/**
+ 30 	 * Represents an editor instance. This constructor should be rarely used,
+ 31 	 * being the {@link CKEDITOR} methods preferible.
+ 32 	 * @constructor
+ 33 	 * @param {Object} instanceConfig Configuration values for this specific
+ 34 	 *		instance.
+ 35 	 * @param {CKEDITOR.dom.element} [element] The element linked to this
+ 36 	 *		instance.
+ 37 	 * @param {Number} [mode] The mode in which the element is linked to this
+ 38 	 *		instance.
+ 39 	 * @augments CKEDITOR.event
+ 40 	 * @example
+ 41 	 */
+ 42 	CKEDITOR.editor = function( instanceConfig, element, mode )
+ 43 	{
+ 44 		this._ =
+ 45 		{
+ 46 			// Save the config to be processed later by the full core code.
+ 47 			instanceConfig : instanceConfig,
+ 48 			element : element
+ 49 		};
+ 50
+ 51 		/**
+ 52 		 * The mode in which the {@link #element} is linked to this editor
+ 53 		 * instance. It can be any of the following values:
+ 54 		 * <ul>
+ 55 		 * <li><b>CKEDITOR.ELEMENT_MODE_NONE</b>: No element is linked to the
+ 56 		 *		editor instance.</li>
+ 57 		 * <li><b>CKEDITOR.ELEMENT_MODE_REPLACE</b>: The element is to be
+ 58 		 *		replaced by the editor instance.</li>
+ 59 		 * <li><b>CKEDITOR.ELEMENT_MODE_APPENDTO</b>: The editor is to be
+ 60 		 *		created inside the element.</li>
+ 61 		 * </ul>
+ 62 		 * @name CKEDITOR.editor.prototype.elementMode
+ 63 		 * @type Number
+ 64 		 * @example
+ 65 		 * var editor = CKEDITOR.replace( 'editor1' );
+ 66 		 * alert( <b>editor.elementMode</b> );  "1"
+ 67 		 */
+ 68 		this.elementMode = mode || CKEDITOR.ELEMENT_MODE_NONE;
+ 69
+ 70 		// Call the CKEDITOR.event constructor to initialize this instance.
+ 71 		CKEDITOR.event.call( this );
+ 72
+ 73 		this._init();
+ 74 	};
+ 75
+ 76 	/**
+ 77 	 * Replaces a <textarea> or a DOM element (DIV) with a CKEditor
+ 78 	 * instance. For textareas, the initial value in the editor will be the
+ 79 	 * textarea value. For DOM elements, their innerHTML will be used
+ 80 	 * instead. We recommend using TEXTAREA and DIV elements only. Do not use
+ 81 	 * this function directly. Use {@link CKEDITOR.replace} instead.
+ 82 	 * @param {Object|String} elementOrIdOrName The DOM element (textarea), its
+ 83 	 *		ID or name.
+ 84 	 * @param {Object} [config] The specific configurations to apply to this
+ 85 	 *		editor instance. Configurations set here will override global CKEditor
+ 86 	 *		settings.
+ 87 	 * @returns {CKEDITOR.editor} The editor instance created.
+ 88 	 * @example
+ 89 	 */
+ 90 	CKEDITOR.editor.replace = function( elementOrIdOrName, config )
+ 91 	{
+ 92 		var element = elementOrIdOrName;
+ 93
+ 94 		if ( typeof element != 'object' )
+ 95 		{
+ 96 			// Look for the element by id. We accept any kind of element here.
+ 97 			element = document.getElementById( elementOrIdOrName );
+ 98
+ 99 			// If not found, look for elements by name. In this case we accept only
+100 			// textareas.
+101 			if ( !element )
+102 			{
+103 				var i = 0,
+104 					textareasByName	= document.getElementsByName( elementOrIdOrName );
+105
+106 				while ( ( element = textareasByName[ i++ ] ) && element.tagName.toLowerCase() != 'textarea' )
+107 				{ /*jsl:pass*/ }
+108 			}
+109
+110 			if ( !element )
+111 				throw '[CKEDITOR.editor.replace] The element with id or name "' + elementOrIdOrName + '" was not found.';
+112 		}
+113
+114 		// Do not replace the textarea right now, just hide it. The effective
+115 		// replacement will be done by the _init function.
+116 		element.style.visibility = 'hidden';
+117
+118 		// Create the editor instance.
+119 		return new CKEDITOR.editor( config, element, CKEDITOR.ELEMENT_MODE_REPLACE );
+120 	};
+121
+122 	/**
+123 	 * Creates a new editor instance inside a specific DOM element. Do not use
+124 	 * this function directly. Use {@link CKEDITOR.appendTo} instead.
+125 	 * @param {Object|String} elementOrId The DOM element or its ID.
+126 	 * @param {Object} [config] The specific configurations to apply to this
+127 	 *		editor instance. Configurations set here will override global CKEditor
+128 	 *		settings.
+129 	 * @returns {CKEDITOR.editor} The editor instance created.
+130 	 * @example
+131 	 */
+132 	CKEDITOR.editor.appendTo = function( elementOrId, config )
+133 	{
+134 		if ( typeof elementOrId != 'object' )
+135 		{
+136 			elementOrId = document.getElementById( elementOrId );
+137
+138 			if ( !elementOrId )
+139 				throw '[CKEDITOR.editor.appendTo] The element with id "' + elementOrId + '" was not found.';
+140 		}
+141
+142 		// Create the editor instance.
+143 		return new CKEDITOR.editor( config, elementOrId, CKEDITOR.ELEMENT_MODE_APPENDTO );
+144 	};
+145
+146 	CKEDITOR.editor.prototype =
+147 	{
+148 		/**
+149 		 * Initializes the editor instance. This function will be overriden by the
+150 		 * full CKEDITOR.editor implementation (editor.js).
+151 		 * @private
+152 		 */
+153 		_init : function()
+154 		{
+155 			var pending = CKEDITOR.editor._pending || ( CKEDITOR.editor._pending = [] );
+156 			pending.push( this );
+157 		},
+158
+159 		// Both fire and fireOnce will always pass this editor instance as the
+160 		// "editor" param in CKEDITOR.event.fire. So, we override it to do that
+161 		// automaticaly.
+162
+163 		/** @ignore */
+164 		fire : function( eventName, data )
+165 		{
+166 			return CKEDITOR.event.prototype.fire.call( this, eventName, data, this );
+167 		},
+168
+169 		/** @ignore */
+170 		fireOnce : function( eventName, data )
+171 		{
+172 			return CKEDITOR.event.prototype.fireOnce.call( this, eventName, data, this );
+173 		}
+174 	};
+175
+176 	// "Inherit" (copy actually) from CKEDITOR.event.
+177 	CKEDITOR.event.implementOn( CKEDITOR.editor.prototype, true );
+178 }
+179 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_env.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_env.js.html new file mode 100644 index 000000000..b94529b76 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_env.js.html @@ -0,0 +1,227 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.env} object, which constains
+  8  *		environment and browser information.
+  9  */
+ 10
+ 11 if ( !CKEDITOR.env )
+ 12 {
+ 13 	/**
+ 14 	 * Environment and browser information.
+ 15 	 * @namespace
+ 16 	 * @example
+ 17 	 */
+ 18 	CKEDITOR.env = (function()
+ 19 	{
+ 20 		var agent = navigator.userAgent.toLowerCase();
+ 21 		var opera = window.opera;
+ 22
+ 23 		var env =
+ 24 		/** @lends CKEDITOR.env */
+ 25 		{
+ 26 			/**
+ 27 			 * Indicates that CKEditor is running on Internet Explorer.
+ 28 			 * @type Boolean
+ 29 			 * @example
+ 30 			 * if ( CKEDITOR.env.ie )
+ 31 			 *     alert( "I'm on IE!" );
+ 32 			 */
+ 33 			ie		: /*@cc_on!@*/false,
+ 34
+ 35 			/**
+ 36 			 * Indicates that CKEditor is running on Opera.
+ 37 			 * @type Boolean
+ 38 			 * @example
+ 39 			 * if ( CKEDITOR.env.opera )
+ 40 			 *     alert( "I'm on Opera!" );
+ 41 			 */
+ 42 			opera	: ( !!opera && opera.version ),
+ 43
+ 44 			/**
+ 45 			 * Indicates that CKEditor is running on a WebKit based browser, like
+ 46 			 * Safari.
+ 47 			 * @type Boolean
+ 48 			 * @example
+ 49 			 * if ( CKEDITOR.env.webkit )
+ 50 			 *     alert( "I'm on WebKit!" );
+ 51 			 */
+ 52 			webkit	: ( agent.indexOf( ' applewebkit/' ) > -1 ),
+ 53
+ 54 			/**
+ 55 			 * Indicates that CKEditor is running on Adobe AIR.
+ 56 			 * @type Boolean
+ 57 			 * @example
+ 58 			 * if ( CKEDITOR.env.air )
+ 59 			 *     alert( "I'm on AIR!" );
+ 60 			 */
+ 61 			air		: ( agent.indexOf( ' adobeair/' ) > -1 ),
+ 62
+ 63 			/**
+ 64 			 * Indicates that CKEditor is running on Macintosh.
+ 65 			 * @type Boolean
+ 66 			 * @example
+ 67 			 * if ( CKEDITOR.env.mac )
+ 68 			 *     alert( "I love apples!" );
+ 69 			 */
+ 70 			mac	: ( agent.indexOf( 'macintosh' ) > -1 ),
+ 71
+ 72 			quirks : ( document.compatMode == 'BackCompat' ),
+ 73
+ 74 			isCustomDomain : function()
+ 75 			{
+ 76 				return this.ie && document.domain != window.location.hostname;
+ 77 			}
+ 78 		};
+ 79
+ 80 		/**
+ 81 		 * Indicates that CKEditor is running on a Gecko based browser, like
+ 82 		 * Firefox.
+ 83 		 * @name CKEDITOR.env.gecko
+ 84 		 * @type Boolean
+ 85 		 * @example
+ 86 		 * if ( CKEDITOR.env.gecko )
+ 87 		 *     alert( "I'm riding a gecko!" );
+ 88 		 */
+ 89 		env.gecko = ( navigator.product == 'Gecko' && !env.webkit && !env.opera );
+ 90
+ 91 		var version = 0;
+ 92
+ 93 		// Internet Explorer 6.0+
+ 94 		if ( env.ie )
+ 95 		{
+ 96 			version = parseFloat( agent.match( /msie (\d+)/ )[1] );
+ 97
+ 98 			/**
+ 99 			 *  Indicate IE8 browser.
+100 			 */
+101 			env.ie8 = !!document.documentMode;
+102
+103 			/**
+104 			 * Indicte IE8 document mode.
+105 			 */
+106 			env.ie8Compat = document.documentMode == 8;
+107
+108 			/**
+109 			 * Indicates that CKEditor is running on an IE7-like environment, which
+110 			 * includes IE7 itself and IE8's IE7 document mode.
+111 			 * @type Boolean
+112 			 */
+113 			env.ie7Compat = ( ( version == 7 && !document.documentMode )
+114 					|| document.documentMode == 7 );
+115
+116 			/**
+117 			 * Indicates that CKEditor is running on an IE6-like environment, which
+118 			 * includes IE6 itself and IE7 and IE8 quirks mode.
+119 			 * @type Boolean
+120 			 * @example
+121 			 * if ( CKEDITOR.env.ie6Compat )
+122 			 *     alert( "I'm on IE6 or quirks mode!" );
+123 			 */
+124 			env.ie6Compat = ( version < 7 || env.quirks );
+125
+126 		}
+127
+128 		// Gecko.
+129 		if ( env.gecko )
+130 		{
+131 			var geckoRelease = agent.match( /rv:([\d\.]+)/ );
+132 			if ( geckoRelease )
+133 			{
+134 				geckoRelease = geckoRelease[1].split( '.' );
+135 				version = geckoRelease[0] * 10000 + ( geckoRelease[1] || 0 ) * 100 + ( geckoRelease[2] || 0 ) * 1;
+136 			}
+137 		}
+138
+139 		// Opera 9.50+
+140 		if ( env.opera )
+141 			version = parseFloat( opera.version() );
+142
+143 		// Adobe AIR 1.0+
+144 		// Checked before Safari because AIR have the WebKit rich text editor
+145 		// features from Safari 3.0.4, but the version reported is 420.
+146 		if ( env.air )
+147 			version = parseFloat( agent.match( / adobeair\/(\d+)/ )[1] );
+148
+149 		// WebKit 522+ (Safari 3+)
+150 		if ( env.webkit )
+151 			version = parseFloat( agent.match( / applewebkit\/(\d+)/ )[1] );
+152
+153 		/**
+154 		 * Contains the browser version.
+155 		 *
+156 		 * For gecko based browsers (like Firefox) it contains the revision
+157 		 * number with first three parts concatenated with a padding zero
+158 		 * (e.g. for revision 1.9.0.2 we have 10900).
+159 		 *
+160 		 * For webkit based browser (like Safari and Chrome) it contains the
+161 		 * WebKit build version (e.g. 522).
+162 		 * @name CKEDITOR.env.version
+163 		 * @type Boolean
+164 		 * @example
+165 		 * if ( CKEDITOR.env.ie && <b>CKEDITOR.env.version</b> <= 6 )
+166 		 *     alert( "Ouch!" );
+167 		 */
+168 		env.version = version;
+169
+170 		/**
+171 		 * Indicates that CKEditor is running on a compatible browser.
+172 		 * @name CKEDITOR.env.isCompatible
+173 		 * @type Boolean
+174 		 * @example
+175 		 * if ( CKEDITOR.env.isCompatible )
+176 		 *     alert( "Your browser is pretty cool!" );
+177 		 */
+178 		env.isCompatible =
+179 			( env.ie && version >= 6 ) ||
+180 			( env.gecko && version >= 10801 ) ||
+181 			( env.opera && version >= 9.5 ) ||
+182 			( env.air && version >= 1 ) ||
+183 			( env.webkit && version >= 522 ) ||
+184 			false;
+185
+186 		// The CSS class to be appended on the main UI containers, making it
+187 		// easy to apply browser specific styles to it.
+188 		env.cssClass =
+189 			'cke_browser_' + (
+190 				env.ie ? 'ie' :
+191 				env.gecko ? 'gecko' :
+192 				env.opera ? 'opera' :
+193 				env.air ? 'air' :
+194 				env.webkit ? 'webkit' :
+195 				'unknown' );
+196
+197 		if ( env.quirks )
+198 			env.cssClass += ' cke_browser_quirks';
+199
+200 		if ( env.ie )
+201 		{
+202 			env.cssClass += ' cke_browser_ie' + (
+203 				env.version < 7 ? '6' :
+204 				env.version >= 8 ? '8' :
+205 				'7' );
+206
+207 			if ( env.quirks )
+208 				env.cssClass += ' cke_browser_iequirks';
+209 		}
+210
+211 		if ( env.gecko && version < 10900 )
+212 			env.cssClass += ' cke_browser_gecko18';
+213
+214 		return env;
+215 	})();
+216 }
+217
+218 // PACKAGER_RENAME( CKEDITOR.env )
+219 // PACKAGER_RENAME( CKEDITOR.env.ie )
+220 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_event.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_event.js.html new file mode 100644 index 000000000..4ae3f7f9f --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_event.js.html @@ -0,0 +1,343 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.event} class, which serves as the
+  8  *		base for classes and objects that require event handling features.
+  9  */
+ 10
+ 11 if ( !CKEDITOR.event )
+ 12 {
+ 13 	/**
+ 14 	 * This is a base class for classes and objects that require event handling
+ 15 	 * features.
+ 16 	 * @constructor
+ 17 	 * @example
+ 18 	 */
+ 19 	CKEDITOR.event = function()
+ 20 	{};
+ 21
+ 22 	/**
+ 23 	 * Implements the {@link CKEDITOR.event} features in an object.
+ 24 	 * @param {Object} targetObject The object in which implement the features.
+ 25 	 * @example
+ 26 	 * var myObject = { message : 'Example' };
+ 27 	 * <b>CKEDITOR.event.implementOn( myObject }</b>;
+ 28 	 * myObject.on( 'testEvent', function()
+ 29 	 *     {
+ 30 	 *         alert( this.message );  // "Example"
+ 31 	 *     });
+ 32 	 * myObject.fire( 'testEvent' );
+ 33 	 */
+ 34 	CKEDITOR.event.implementOn = function( targetObject, isTargetPrototype )
+ 35 	{
+ 36 		var eventProto = CKEDITOR.event.prototype;
+ 37
+ 38 		for ( var prop in eventProto )
+ 39 		{
+ 40 			if ( targetObject[ prop ] == undefined )
+ 41 				targetObject[ prop ] = eventProto[ prop ];
+ 42 		}
+ 43 	};
+ 44
+ 45 	CKEDITOR.event.prototype = (function()
+ 46 	{
+ 47 		// Returns the private events object for a given object.
+ 48 		var getPrivate = function( obj )
+ 49 		{
+ 50 			var _ = ( obj.getPrivate && obj.getPrivate() ) || obj._ || ( obj._ = {} );
+ 51 			return _.events || ( _.events = {} );
+ 52 		};
+ 53
+ 54 		var eventEntry = function( eventName )
+ 55 		{
+ 56 			this.name = eventName;
+ 57 			this.listeners = [];
+ 58 		};
+ 59
+ 60 		eventEntry.prototype =
+ 61 		{
+ 62 			// Get the listener index for a specified function.
+ 63 			// Returns -1 if not found.
+ 64 			getListenerIndex : function( listenerFunction )
+ 65 			{
+ 66 				for ( var i = 0, listeners = this.listeners ; i < listeners.length ; i++ )
+ 67 				{
+ 68 					if ( listeners[i].fn == listenerFunction )
+ 69 						return i;
+ 70 				}
+ 71 				return -1;
+ 72 			}
+ 73 		};
+ 74
+ 75 		return /** @lends CKEDITOR.event.prototype */ {
+ 76 			/**
+ 77 			 * Registers a listener to a specific event in the current object.
+ 78 			 * @param {String} eventName The event name to which listen.
+ 79 			 * @param {Function} listenerFunction The function listening to the
+ 80 			 *		event.
+ 81 			 * @param {Object} [scopeObj] The object used to scope the listener
+ 82 			 *		call (the this object. If omitted, the current object is used.
+ 83 			 * @param {Object} [listenerData] Data to be sent as the
+ 84 			 *		{@link CKEDITOR.eventInfo#listenerData} when calling the
+ 85 			 *		listener.
+ 86 			 * @param {Number} [priority] The listener priority. Lower priority
+ 87 			 *		listeners are called first. Listeners with the same priority
+ 88 			 *		value are called in registration order. Defaults to 10.
+ 89 			 * @example
+ 90 			 * someObject.on( 'someEvent', function()
+ 91 			 *     {
+ 92 			 *         alert( this == someObject );  // "true"
+ 93 			 *     });
+ 94 			 * @example
+ 95 			 * someObject.on( 'someEvent', function()
+ 96 			 *     {
+ 97 			 *         alert( this == anotherObject );  // "true"
+ 98 			 *     }
+ 99 			 *     , anotherObject );
+100 			 * @example
+101 			 * someObject.on( 'someEvent', function( event )
+102 			 *     {
+103 			 *         alert( event.listenerData );  // "Example"
+104 			 *     }
+105 			 *     , null, 'Example' );
+106 			 * @example
+107 			 * someObject.on( 'someEvent', function() { ... } );                   // 2nd called
+108 			 * someObject.on( 'someEvent', function() { ... }, null, null, 100 );  // 3rd called
+109 			 * someObject.on( 'someEvent', function() { ... }, null, null, 1 );    // 1st called
+110 			 */
+111 			on : function( eventName, listenerFunction, scopeObj, listenerData, priority )
+112 			{
+113 				// Get the event entry (create it if needed).
+114 				var events = getPrivate( this ),
+115 					event = events[ eventName ] || ( events[ eventName ] = new eventEntry( eventName ) );
+116
+117 				if ( event.getListenerIndex( listenerFunction ) < 0 )
+118 				{
+119 					// Get the listeners.
+120 					var listeners = event.listeners;
+121
+122 					// Fill the scope.
+123 					if ( !scopeObj )
+124 						scopeObj = this;
+125
+126 					// Default the priority, if needed.
+127 					if ( isNaN( priority ) )
+128 						priority = 10;
+129
+130 					var me = this;
+131
+132 					// Create the function to be fired for this listener.
+133 					var listenerFirer = function( editor, publisherData, stopFn, cancelFn )
+134 					{
+135 						var ev =
+136 						{
+137 							name : eventName,
+138 							sender : this,
+139 							editor : editor,
+140 							data : publisherData,
+141 							listenerData : listenerData,
+142 							stop : stopFn,
+143 							cancel : cancelFn,
+144 							removeListener : function()
+145 							{
+146 								me.removeListener( eventName, listenerFunction );
+147 							}
+148 						};
+149
+150 						listenerFunction.call( scopeObj, ev );
+151
+152 						return ev.data;
+153 					};
+154 					listenerFirer.fn = listenerFunction;
+155 					listenerFirer.priority = priority;
+156
+157 					// Search for the right position for this new listener, based on its
+158 					// priority.
+159 					for ( var i = listeners.length - 1 ; i >= 0 ; i-- )
+160 					{
+161 						// Find the item which should be before the new one.
+162 						if ( listeners[ i ].priority <= priority )
+163 						{
+164 							// Insert the listener in the array.
+165 							listeners.splice( i + 1, 0, listenerFirer );
+166 							return;
+167 						}
+168 					}
+169
+170 					// If no position has been found (or zero length), put it in
+171 					// the front of list.
+172 					listeners.unshift( listenerFirer );
+173 				}
+174 			},
+175
+176 			/**
+177 			 * Fires an specific event in the object. All registered listeners are
+178 			 * called at this point.
+179 			 * @function
+180 			 * @param {String} eventName The event name to fire.
+181 			 * @param {Object} [data] Data to be sent as the
+182 			 *		{@link CKEDITOR.eventInfo#data} when calling the
+183 			 *		listeners.
+184 			 * @param {CKEDITOR.editor} [editor] The editor instance to send as the
+185 			 *		{@link CKEDITOR.eventInfo#editor} when calling the
+186 			 *		listener.
+187 			 * @returns {Boolean|Object} A booloan indicating that the event is to be
+188 			 *		canceled, or data returned by one of the listeners.
+189 			 * @example
+190 			 * someObject.on( 'someEvent', function() { ... } );
+191 			 * someObject.on( 'someEvent', function() { ... } );
+192 			 * <b>someObject.fire( 'someEvent' )</b>;  // both listeners are called
+193 			 * @example
+194 			 * someObject.on( 'someEvent', function( event )
+195 			 *     {
+196 			 *         alert( event.data );  // "Example"
+197 			 *     });
+198 			 * <b>someObject.fire( 'someEvent', 'Example' )</b>;
+199 			 */
+200 			fire : (function()
+201 			{
+202 				// Create the function that marks the event as stopped.
+203 				var stopped = false;
+204 				var stopEvent = function()
+205 				{
+206 					stopped = true;
+207 				};
+208
+209 				// Create the function that marks the event as canceled.
+210 				var canceled = false;
+211 				var cancelEvent = function()
+212 				{
+213 					canceled = true;
+214 				};
+215
+216 				return function( eventName, data, editor )
+217 				{
+218 					// Get the event entry.
+219 					var event = getPrivate( this )[ eventName ];
+220
+221 					// Save the previous stopped and cancelled states. We may
+222 					// be nesting fire() calls.
+223 					var previousStopped = stopped,
+224 						previousCancelled = canceled;
+225
+226 					// Reset the stopped and canceled flags.
+227 					stopped = canceled = false;
+228
+229 					if ( event )
+230 					{
+231 						var listeners = event.listeners;
+232
+233 						if ( listeners.length )
+234 						{
+235 							// As some listeners may remove themselves from the
+236 							// event, the original array length is dinamic. So,
+237 							// let's make a copy of all listeners, so we are
+238 							// sure we'll call all of them.
+239 							listeners = listeners.slice( 0 );
+240
+241 							// Loop through all listeners.
+242 							for ( var i = 0 ; i < listeners.length ; i++ )
+243 							{
+244 								// Call the listener, passing the event data.
+245 								var retData = listeners[i].call( this, editor, data, stopEvent, cancelEvent );
+246
+247 								if ( typeof retData != 'undefined' )
+248 									data = retData;
+249
+250 								// No further calls is stopped or canceled.
+251 								if ( stopped || canceled )
+252 									break;
+253 							}
+254 						}
+255 					}
+256
+257 					var ret = canceled || ( typeof data == 'undefined' ? false : data );
+258
+259 					// Restore the previous stopped and canceled states.
+260 					stopped = previousStopped;
+261 					canceled = previousCancelled;
+262
+263 					return ret;
+264 				};
+265 			})(),
+266
+267 			/**
+268 			 * Fires an specific event in the object, releasing all listeners
+269 			 * registered to that event. The same listeners are not called again on
+270 			 * successive calls of it or of {@link #fire}.
+271 			 * @param {String} eventName The event name to fire.
+272 			 * @param {Object} [data] Data to be sent as the
+273 			 *		{@link CKEDITOR.eventInfo#data} when calling the
+274 			 *		listeners.
+275 			 * @param {CKEDITOR.editor} [editor] The editor instance to send as the
+276 			 *		{@link CKEDITOR.eventInfo#editor} when calling the
+277 			 *		listener.
+278 			 * @returns {Boolean|Object} A booloan indicating that the event is to be
+279 			 *		canceled, or data returned by one of the listeners.
+280 			 * @example
+281 			 * someObject.on( 'someEvent', function() { ... } );
+282 			 * someObject.fire( 'someEvent' );  // above listener called
+283 			 * <b>someObject.fireOnce( 'someEvent' )</b>;  // above listener called
+284 			 * someObject.fire( 'someEvent' );  // no listeners called
+285 			 */
+286 			fireOnce : function( eventName, data, editor )
+287 			{
+288 				var ret = this.fire( eventName, data, editor );
+289 				delete getPrivate( this )[ eventName ];
+290 				return ret;
+291 			},
+292
+293 			/**
+294 			 * Unregisters a listener function from being called at the specified
+295 			 *		event. No errors are thrown if the listener has not been
+296 			 *		registered previously.
+297 			 * @param {String} eventName The event name.
+298 			 * @param {Function} listenerFunction The listener function to unregister.
+299 			 * @example
+300 			 * var myListener = function() { ... };
+301 			 * someObject.on( 'someEvent', myListener );
+302 			 * someObject.fire( 'someEvent' );  // myListener called
+303 			 * <b>someObject.removeListener( 'someEvent', myListener )</b>;
+304 			 * someObject.fire( 'someEvent' );  // myListener not called
+305 			 */
+306 			removeListener : function( eventName, listenerFunction )
+307 			{
+308 				// Get the event entry.
+309 				var event = getPrivate( this )[ eventName ];
+310
+311 				if ( event )
+312 				{
+313 					var index = event.getListenerIndex( listenerFunction );
+314 					if ( index >= 0 )
+315 						event.listeners.splice( index, 1 );
+316 				}
+317 			},
+318
+319 			/**
+320 			 * Checks if there is any listener registered to a given event.
+321 			 * @param {String} eventName The event name.
+322 			 * @example
+323 			 * var myListener = function() { ... };
+324 			 * someObject.on( 'someEvent', myListener );
+325 			 * alert( someObject.<b>hasListeners( 'someEvent' )</b> );  // "true"
+326 			 * alert( someObject.<b>hasListeners( 'noEvent' )</b> );    // "false"
+327 			 */
+328 			hasListeners : function( eventName )
+329 			{
+330 				var event = getPrivate( this )[ eventName ];
+331 				return ( event && event.listeners.length > 0 ) ;
+332 			}
+333 		};
+334 	})();
+335 }
+336 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_eventInfo.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_eventInfo.js.html new file mode 100644 index 000000000..59ce24011 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_eventInfo.js.html @@ -0,0 +1,128 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the "virtual" {@link CKEDITOR.eventInfo} class, which
+  8  *		contains the defintions of the event object passed to event listeners.
+  9  *		This file is for documentation purposes only.
+ 10  */
+ 11
+ 12 /**
+ 13  * This class is not really part of the API. It just illustrates the features
+ 14  * of the event object passed to event listeners by a {@link CKEDITOR.event}
+ 15  * based object.
+ 16  * @name CKEDITOR.eventInfo
+ 17  * @constructor
+ 18  * @example
+ 19  * // Do not do this.
+ 20  * var myEvent = new CKEDITOR.eventInfo();  // Error: CKEDITOR.eventInfo is undefined
+ 21  */
+ 22
+ 23 /**
+ 24  * The event name.
+ 25  * @name CKEDITOR.eventInfo.prototype.name
+ 26  * @field
+ 27  * @type String
+ 28  * @example
+ 29  * someObject.on( 'someEvent', function( event )
+ 30  *     {
+ 31  *         alert( <b>event.name</b> );  // "someEvent"
+ 32  *     });
+ 33  * someObject.fire( 'someEvent' );
+ 34  */
+ 35
+ 36 /**
+ 37  * The object that publishes (sends) the event.
+ 38  * @name CKEDITOR.eventInfo.prototype.sender
+ 39  * @field
+ 40  * @type Object
+ 41  * @example
+ 42  * someObject.on( 'someEvent', function( event )
+ 43  *     {
+ 44  *         alert( <b>event.sender</b> == someObject );  // "true"
+ 45  *     });
+ 46  * someObject.fire( 'someEvent' );
+ 47  */
+ 48
+ 49 /**
+ 50  * The editor instance that holds the sender. May be the same as sender. May be
+ 51  * null if the sender is not part of an editor instance, like a component
+ 52  * running in standalone mode.
+ 53  * @name CKEDITOR.eventInfo.prototype.editor
+ 54  * @field
+ 55  * @type CKEDITOR.editor
+ 56  * @example
+ 57  * myButton.on( 'someEvent', function( event )
+ 58  *     {
+ 59  *         alert( <b>event.editor</b> == myEditor );  // "true"
+ 60  *     });
+ 61  * myButton.fire( 'someEvent', null, <b>myEditor</b> );
+ 62  */
+ 63
+ 64 /**
+ 65  * Any kind of additional data. Its format and usage is event dependent.
+ 66  * @name CKEDITOR.eventInfo.prototype.data
+ 67  * @field
+ 68  * @type Object
+ 69  * @example
+ 70  * someObject.on( 'someEvent', function( event )
+ 71  *     {
+ 72  *         alert( <b>event.data</b> );  // "Example"
+ 73  *     });
+ 74  * someObject.fire( 'someEvent', <b>'Example'</b> );
+ 75  */
+ 76
+ 77 /**
+ 78  * Any extra data appended during the listener registration.
+ 79  * @name CKEDITOR.eventInfo.prototype.listenerData
+ 80  * @field
+ 81  * @type Object
+ 82  * @example
+ 83  * someObject.on( 'someEvent', function( event )
+ 84  *     {
+ 85  *         alert( <b>event.listenerData</b> );  // "Example"
+ 86  *     }
+ 87  *     , null, <b>'Example'</b> );
+ 88  */
+ 89
+ 90 /**
+ 91  * Indicates that no further listeners are to be called.
+ 92  * @name CKEDITOR.eventInfo.prototype.stop
+ 93  * @function
+ 94  * @example
+ 95  * someObject.on( 'someEvent', function( event )
+ 96  *     {
+ 97  *         <b>event.stop()</b>;
+ 98  *     });
+ 99  * someObject.on( 'someEvent', function( event )
+100  *     {
+101  *         // This one will not be called.
+102  *     });
+103  * alert( someObject.fire( 'someEvent' ) );  // "false"
+104  */
+105
+106 /**
+107  * Indicates that the event is to be cancelled (if cancelable).
+108  * @name CKEDITOR.eventInfo.prototype.cancel
+109  * @function
+110  * @example
+111  * someObject.on( 'someEvent', function( event )
+112  *     {
+113  *         <b>event.cancel()</b>;
+114  *     });
+115  * someObject.on( 'someEvent', function( event )
+116  *     {
+117  *         // This one will not be called.
+118  *     });
+119  * alert( someObject.fire( 'someEvent' ) );  // "true"
+120  */
+121 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_focusmanager.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_focusmanager.js.html new file mode 100644 index 000000000..f5f61abf5 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_focusmanager.js.html @@ -0,0 +1,131 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.focusManager} class, which is used
+  8  *		to handle the focus on editor instances..
+  9  */
+ 10
+ 11 /**
+ 12  * Manages the focus activity in an editor instance. This class is to be used
+ 13  * mainly by UI elements coders when adding interface elements to CKEditor.
+ 14  * @constructor
+ 15  * @param {CKEDITOR.editor} editor The editor instance.
+ 16  * @example
+ 17  */
+ 18 CKEDITOR.focusManager = function( editor )
+ 19 {
+ 20 	if ( editor.focusManager )
+ 21 		return editor.focusManager;
+ 22
+ 23 	/**
+ 24 	 * Indicates that the editor instance has focus.
+ 25 	 * @type Boolean
+ 26 	 * @example
+ 27 	 * alert( CKEDITOR.instances.editor1.focusManager.hasFocus );  // e.g "true"
+ 28 	 */
+ 29 	this.hasFocus = false;
+ 30
+ 31 	/**
+ 32 	 * Object used to hold private stuff.
+ 33 	 * @private
+ 34 	 */
+ 35 	this._ =
+ 36 	{
+ 37 		editor : editor
+ 38 	};
+ 39
+ 40 	return this;
+ 41 };
+ 42
+ 43 CKEDITOR.focusManager.prototype =
+ 44 {
+ 45 	/**
+ 46 	 * Indicates that the editor instance has the focus.
+ 47 	 *
+ 48 	 * This function is not used to set the focus in the editor. Use
+ 49 	 * {@link CKEDITOR.editor#focus} for it instead.
+ 50 	 * @example
+ 51 	 * var editor = CKEDITOR.instances.editor1;
+ 52 	 * <b>editor.focusManager.focus()</b>;
+ 53 	 */
+ 54 	focus : function()
+ 55 	{
+ 56 		if ( this._.timer )
+ 57 			clearTimeout( this._.timer );
+ 58
+ 59 		if ( !this.hasFocus )
+ 60 		{
+ 61 			// If another editor has the current focus, we first "blur" it. In
+ 62 			// this way the events happen in a more logical sequence, like:
+ 63 			//		"focus 1" > "blur 1" > "focus 2"
+ 64 			// ... instead of:
+ 65 			//		"focus 1" > "focus 2" > "blur 1"
+ 66 			if ( CKEDITOR.currentInstance )
+ 67 				CKEDITOR.currentInstance.focusManager.forceBlur();
+ 68
+ 69 			var editor = this._.editor;
+ 70
+ 71 			editor.container.getFirst().addClass( 'cke_focus' );
+ 72
+ 73 			this.hasFocus = true;
+ 74 			editor.fire( 'focus' );
+ 75 		}
+ 76 	},
+ 77
+ 78 	/**
+ 79 	 * Indicates that the editor instance has lost the focus. Note that this
+ 80 	 * functions acts asynchronously with a delay of 100ms to avoid subsequent
+ 81 	 * blur/focus effects. If you want the "blur" to happen immediately, use
+ 82 	 * the {@link #forceBlur} function instead.
+ 83 	 * @example
+ 84 	 * var editor = CKEDITOR.instances.editor1;
+ 85 	 * <b>editor.focusManager.blur()</b>;
+ 86 	 */
+ 87 	blur : function()
+ 88 	{
+ 89 		var focusManager = this;
+ 90
+ 91 		if ( focusManager._.timer )
+ 92 			clearTimeout( focusManager._.timer );
+ 93
+ 94 		focusManager._.timer = setTimeout(
+ 95 			function()
+ 96 			{
+ 97 				delete focusManager._.timer;
+ 98 				focusManager.forceBlur();
+ 99 			}
+100 			, 100 );
+101 	},
+102
+103 	/**
+104 	 * Indicates that the editor instance has lost the focus. Unlike
+105 	 * {@link #blur}, this function is synchronous, marking the instance as
+106 	 * "blured" immediately.
+107 	 * @example
+108 	 * var editor = CKEDITOR.instances.editor1;
+109 	 * <b>editor.focusManager.forceBlur()</b>;
+110 	 */
+111 	forceBlur : function()
+112 	{
+113 		if ( this.hasFocus )
+114 		{
+115 			var editor = this._.editor;
+116
+117 			editor.container.getFirst().removeClass( 'cke_focus' );
+118
+119 			this.hasFocus = false;
+120 			editor.fire( 'blur' );
+121 		}
+122 	}
+123 };
+124 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser.js.html new file mode 100644 index 000000000..886c06114 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser.js.html @@ -0,0 +1,220 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * HTML text parser.
+  8  * @constructor
+  9  * @example
+ 10  */
+ 11 CKEDITOR.htmlParser = function()
+ 12 {
+ 13 	this._ =
+ 14 	{
+ 15 		htmlPartsRegex : new RegExp( '<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)-->)|(?:([^\\s>]+)\\s*((?:(?:[^"\'>]+)|(?:"[^"]*")|(?:\'[^\']*\'))*)\\/?>))', 'g' )
+ 16 	};
+ 17 };
+ 18
+ 19 (function()
+ 20 {
+ 21 	var attribsRegex	= /([\w:]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,
+ 22 		emptyAttribs	= {checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};
+ 23
+ 24 	CKEDITOR.htmlParser.prototype =
+ 25 	{
+ 26 		/**
+ 27 		 * Function to be fired when a tag opener is found. This function
+ 28 		 * should be overriden when using this class.
+ 29 		 * @param {String} tagName The tag name. The name is guarantted to be
+ 30 		 *		lowercased.
+ 31 		 * @param {Object} attributes An object containing all tag attributes. Each
+ 32 		 *		property in this object represent and attribute name and its
+ 33 		 *		value is the attribute value.
+ 34 		 * @param {Boolean} selfClosing true if the tag closes itself, false if the
+ 35 		 * 		tag doesn't.
+ 36 		 * @example
+ 37 		 * var parser = new CKEDITOR.htmlParser();
+ 38 		 * parser.onTagOpen = function( tagName, attributes, selfClosing )
+ 39 		 *     {
+ 40 		 *         alert( tagName );  // e.g. "b"
+ 41 		 *     });
+ 42 		 * parser.parse( "<!-- Example --><b>Hello</b>" );
+ 43 		 */
+ 44 		onTagOpen	: function() {},
+ 45
+ 46 		/**
+ 47 		 * Function to be fired when a tag closer is found. This function
+ 48 		 * should be overriden when using this class.
+ 49 		 * @param {String} tagName The tag name. The name is guarantted to be
+ 50 		 *		lowercased.
+ 51 		 * @example
+ 52 		 * var parser = new CKEDITOR.htmlParser();
+ 53 		 * parser.onTagClose = function( tagName )
+ 54 		 *     {
+ 55 		 *         alert( tagName );  // e.g. "b"
+ 56 		 *     });
+ 57 		 * parser.parse( "<!-- Example --><b>Hello</b>" );
+ 58 		 */
+ 59 		onTagClose	: function() {},
+ 60
+ 61 		/**
+ 62 		 * Function to be fired when text is found. This function
+ 63 		 * should be overriden when using this class.
+ 64 		 * @param {String} text The text found.
+ 65 		 * @example
+ 66 		 * var parser = new CKEDITOR.htmlParser();
+ 67 		 * parser.onText = function( text )
+ 68 		 *     {
+ 69 		 *         alert( text );  // e.g. "Hello"
+ 70 		 *     });
+ 71 		 * parser.parse( "<!-- Example --><b>Hello</b>" );
+ 72 		 */
+ 73 		onText		: function() {},
+ 74
+ 75 		/**
+ 76 		 * Function to be fired when CDATA section is found. This function
+ 77 		 * should be overriden when using this class.
+ 78 		 * @param {String} cdata The CDATA been found.
+ 79 		 * @example
+ 80 		 * var parser = new CKEDITOR.htmlParser();
+ 81 		 * parser.onCDATA = function( cdata )
+ 82 		 *     {
+ 83 		 *         alert( cdata );  // e.g. "var hello;"
+ 84 		 *     });
+ 85 		 * parser.parse( "<script>var hello;</script>" );
+ 86 		 */
+ 87 		onCDATA		: function() {},
+ 88
+ 89 		/**
+ 90 		 * Function to be fired when a commend is found. This function
+ 91 		 * should be overriden when using this class.
+ 92 		 * @param {String} comment The comment text.
+ 93 		 * @example
+ 94 		 * var parser = new CKEDITOR.htmlParser();
+ 95 		 * parser.onText = function( comment )
+ 96 		 *     {
+ 97 		 *         alert( comment );  // e.g. " Example "
+ 98 		 *     });
+ 99 		 * parser.parse( "<!-- Example --><b>Hello</b>" );
+100 		 */
+101 		onComment	: function() {},
+102
+103 		/**
+104 		 * Parses text, looking for HTML tokens, like tag openers or closers,
+105 		 * or comments. This function fires the onTagOpen, onTagClose, onText
+106 		 * and onComment function during its execution.
+107 		 * @param {String} html The HTML to be parsed.
+108 		 * @example
+109 		 * var parser = new CKEDITOR.htmlParser();
+110 		 * // The onTagOpen, onTagClose, onText and onComment should be overriden
+111 		 * // at this point.
+112 		 * parser.parse( "<!-- Example --><b>Hello</b>" );
+113 		 */
+114 		parse : function( html )
+115 		{
+116 			var parts,
+117 				tagName,
+118 				nextIndex = 0,
+119 				cdata;	// The collected data inside a CDATA section.
+120
+121 			while ( ( parts = this._.htmlPartsRegex.exec( html ) ) )
+122 			{
+123 				var tagIndex = parts.index;
+124 				if ( tagIndex > nextIndex )
+125 				{
+126 					var text = html.substring( nextIndex, tagIndex );
+127
+128 					if ( cdata )
+129 						cdata.push( text );
+130 					else
+131 						this.onText( text );
+132 				}
+133
+134 				nextIndex = this._.htmlPartsRegex.lastIndex;
+135
+136 				/*
+137 				 "parts" is an array with the following items:
+138 					0 : The entire match for opening/closing tags and comments.
+139 					1 : Group filled with the tag name for closing tags.
+140 					2 : Group filled with the comment text.
+141 					3 : Group filled with the tag name for opening tags.
+142 					4 : Group filled with the attributes part of opening tags.
+143 				 */
+144
+145 				// Closing tag
+146 				if ( ( tagName = parts[ 1 ] ) )
+147 				{
+148 					tagName = tagName.toLowerCase();
+149
+150 					if ( cdata && CKEDITOR.dtd.$cdata[ tagName ] )
+151 					{
+152 						// Send the CDATA data.
+153 						this.onCDATA( cdata.join('') );
+154 						cdata = null;
+155 					}
+156
+157 					if ( !cdata )
+158 					{
+159 						this.onTagClose( tagName );
+160 						continue;
+161 					}
+162 				}
+163
+164 				// If CDATA is enabled, just save the raw match.
+165 				if ( cdata )
+166 				{
+167 					cdata.push( parts[ 0 ] );
+168 					continue;
+169 				}
+170
+171 				// Opening tag
+172 				if ( ( tagName = parts[ 3 ] ) )
+173 				{
+174 					tagName = tagName.toLowerCase();
+175 					var attribs = {},
+176 						attribMatch,
+177 						attribsPart = parts[ 4 ],
+178 						selfClosing = !!( attribsPart && attribsPart.charAt( attribsPart.length - 1 ) == '/' );
+179
+180 					if ( attribsPart )
+181 					{
+182 						while ( ( attribMatch = attribsRegex.exec( attribsPart ) ) )
+183 						{
+184 							var attName = attribMatch[1].toLowerCase(),
+185 								attValue = attribMatch[2] || attribMatch[3] || attribMatch[4] || '';
+186
+187 							if ( !attValue && emptyAttribs[ attName ] )
+188 								attribs[ attName ] = attName;
+189 							else
+190 								attribs[ attName ] = attValue;
+191 						}
+192 					}
+193
+194 					this.onTagOpen( tagName, attribs, selfClosing );
+195
+196 					// Open CDATA mode when finding the appropriate tags.
+197 					if ( !cdata && CKEDITOR.dtd.$cdata[ tagName ] )
+198 						cdata = [];
+199
+200 					continue;
+201 				}
+202
+203 				// Comment
+204 				if( ( tagName = parts[ 2 ] ) )
+205 					this.onComment( tagName );
+206 			}
+207
+208 			if ( html.length > nextIndex )
+209 				this.onText( html.substring( nextIndex, html.length ) );
+210 		}
+211 	};
+212 })();
+213 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_basicwriter.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_basicwriter.js.html new file mode 100644 index 000000000..3f0ab58c9 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_basicwriter.js.html @@ -0,0 +1,148 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.htmlParser.basicWriter = CKEDITOR.tools.createClass(
+  7 {
+  8 	$ : function()
+  9 	{
+ 10 		this._ =
+ 11 		{
+ 12 			output : []
+ 13 		};
+ 14 	},
+ 15
+ 16 	proto :
+ 17 	{
+ 18 		/**
+ 19 		 * Writes the tag opening part for a opener tag.
+ 20 		 * @param {String} tagName The element name for this tag.
+ 21 		 * @param {Object} attributes The attributes defined for this tag. The
+ 22 		 *		attributes could be used to inspect the tag.
+ 23 		 * @example
+ 24 		 * // Writes "<p".
+ 25 		 * writer.openTag( 'p', { class : 'MyClass', id : 'MyId' } );
+ 26 		 */
+ 27 		openTag : function( tagName, attributes )
+ 28 		{
+ 29 			this._.output.push( '<', tagName );
+ 30 		},
+ 31
+ 32 		/**
+ 33 		 * Writes the tag closing part for a opener tag.
+ 34 		 * @param {String} tagName The element name for this tag.
+ 35 		 * @param {Boolean} isSelfClose Indicates that this is a self-closing tag,
+ 36 		 *		like "br" or "img".
+ 37 		 * @example
+ 38 		 * // Writes ">".
+ 39 		 * writer.openTagClose( 'p', false );
+ 40 		 * @example
+ 41 		 * // Writes " />".
+ 42 		 * writer.openTagClose( 'br', true );
+ 43 		 */
+ 44 		openTagClose : function( tagName, isSelfClose )
+ 45 		{
+ 46 			if ( isSelfClose )
+ 47 				this._.output.push( ' />' );
+ 48 			else
+ 49 				this._.output.push( '>' );
+ 50 		},
+ 51
+ 52 		/**
+ 53 		 * Writes an attribute. This function should be called after opening the
+ 54 		 * tag with {@link #openTagClose}.
+ 55 		 * @param {String} attName The attribute name.
+ 56 		 * @param {String} attValue The attribute value.
+ 57 		 * @example
+ 58 		 * // Writes ' class="MyClass"'.
+ 59 		 * writer.attribute( 'class', 'MyClass' );
+ 60 		 */
+ 61 		attribute : function( attName, attValue )
+ 62 		{
+ 63 			this._.output.push( ' ', attName, '="', attValue, '"' );
+ 64 		},
+ 65
+ 66 		/**
+ 67 		 * Writes a closer tag.
+ 68 		 * @param {String} tagName The element name for this tag.
+ 69 		 * @example
+ 70 		 * // Writes "</p>".
+ 71 		 * writer.closeTag( 'p' );
+ 72 		 */
+ 73 		closeTag : function( tagName )
+ 74 		{
+ 75 			this._.output.push( '</', tagName, '>' );
+ 76 		},
+ 77
+ 78 		/**
+ 79 		 * Writes text.
+ 80 		 * @param {String} text The text value
+ 81 		 * @example
+ 82 		 * // Writes "Hello Word".
+ 83 		 * writer.text( 'Hello Word' );
+ 84 		 */
+ 85 		text : function( text )
+ 86 		{
+ 87 			this._.output.push( text );
+ 88 		},
+ 89
+ 90 		/**
+ 91 		 * Writes a comment.
+ 92 		 * @param {String} comment The comment text.
+ 93 		 * @example
+ 94 		 * // Writes "<!-- My comment -->".
+ 95 		 * writer.comment( ' My comment ' );
+ 96 		 */
+ 97 		comment : function( comment )
+ 98 		{
+ 99 			this._.output.push( '<!--', comment, '-->' );
+100 		},
+101
+102 		/**
+103 		 * Writes any kind of data to the ouput.
+104 		 * @example
+105 		 * writer.write( 'This is an <b>example</b>.' );
+106 		 */
+107 		write : function( data )
+108 		{
+109 			this._.output.push( data );
+110 		},
+111
+112 		/**
+113 		 * Empties the current output buffer.
+114 		 * @example
+115 		 * writer.reset();
+116 		 */
+117 		reset : function()
+118 		{
+119 			this._.output = [];
+120 		},
+121
+122 		/**
+123 		 * Empties the current output buffer.
+124 		 * @param {Boolean} reset Indicates that the {@link reset} function is to
+125 		 *		be automatically called after retrieving the HTML.
+126 		 * @returns {String} The HTML written to the writer so far.
+127 		 * @example
+128 		 * var html = writer.getHtml();
+129 		 */
+130 		getHtml : function( reset )
+131 		{
+132 			var html = this._.output.join( '' );
+133
+134 			if ( reset )
+135 				this.reset();
+136
+137 			return html;
+138 		}
+139 	}
+140 });
+141 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_cdata.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_cdata.js.html new file mode 100644 index 000000000..45d9b6ac8 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_cdata.js.html @@ -0,0 +1,52 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8
+  9 	/**
+ 10 	 * A lightweight representation of HTML text.
+ 11 	 * @constructor
+ 12 	 * @example
+ 13 	 */
+ 14 	CKEDITOR.htmlParser.cdata = function( value )
+ 15 	{
+ 16 		/**
+ 17 		 * The CDATA value.
+ 18 		 * @type String
+ 19 		 * @example
+ 20 		 */
+ 21 		this.value = value;
+ 22
+ 23 	};
+ 24
+ 25 	CKEDITOR.htmlParser.cdata.prototype =
+ 26 	{
+ 27 		/**
+ 28 		 * CDATA has the same type as {@link CKEDITOR.htmlParser.text} This is
+ 29 		 * a constant value set to {@link CKEDITOR.NODE_TEXT}.
+ 30 		 * @type Number
+ 31 		 * @example
+ 32 		 */
+ 33 		type : CKEDITOR.NODE_TEXT,
+ 34
+ 35 		/**
+ 36 		 * Writes write the CDATA with no special manipulations.
+ 37 		 * @param {CKEDITOR.htmlWriter} writer The writer to which write the HTML.
+ 38 		 */
+ 39 		writeHtml : function( writer )
+ 40 		{
+ 41 			writer.write( this.value );
+ 42 		}
+ 43 	};
+ 44 })();
+ 45 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_comment.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_comment.js.html new file mode 100644 index 000000000..78dbde2c6 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_comment.js.html @@ -0,0 +1,67 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * A lightweight representation of an HTML comment.
+  8  * @constructor
+  9  * @example
+ 10  */
+ 11 CKEDITOR.htmlParser.comment = function( value )
+ 12 {
+ 13 	/**
+ 14 	 * The comment text.
+ 15 	 * @type String
+ 16 	 * @example
+ 17 	 */
+ 18 	this.value = value;
+ 19
+ 20 	/** @private */
+ 21 	this._ =
+ 22 	{
+ 23 		isBlockLike : false
+ 24 	};
+ 25 };
+ 26
+ 27 CKEDITOR.htmlParser.comment.prototype =
+ 28 {
+ 29 	/**
+ 30 	 * The node type. This is a constant value set to {@link CKEDITOR.NODE_COMMENT}.
+ 31 	 * @type Number
+ 32 	 * @example
+ 33 	 */
+ 34 	type : CKEDITOR.NODE_COMMENT,
+ 35
+ 36 	/**
+ 37 	 * Writes the HTML representation of this comment to a CKEDITOR.htmlWriter.
+ 38 	 * @param {CKEDITOR.htmlWriter} writer The writer to which write the HTML.
+ 39 	 * @example
+ 40 	 */
+ 41 	writeHtml : function( writer, filter )
+ 42 	{
+ 43 		var comment = this.value;
+ 44
+ 45 		if ( filter )
+ 46 		{
+ 47 			if ( !( comment = filter.onComment( comment ) ) )
+ 48 				return;
+ 49
+ 50 			if ( typeof comment != 'string' )
+ 51 			{
+ 52 				comment.writeHtml( writer, filter );
+ 53 				return;
+ 54 			}
+ 55 		}
+ 56
+ 57 		writer.comment( comment );
+ 58 	}
+ 59 };
+ 60 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_element.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_element.js.html new file mode 100644 index 000000000..b4e25892e --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_element.js.html @@ -0,0 +1,204 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * A lightweight representation of an HTML element.
+  8  * @param {String} name The element name.
+  9  * @param {Object} attributes And object holding all attributes defined for
+ 10  *		this element.
+ 11  * @constructor
+ 12  * @example
+ 13  */
+ 14 CKEDITOR.htmlParser.element = function( name, attributes )
+ 15 {
+ 16 	/**
+ 17 	 * The element name.
+ 18 	 * @type String
+ 19 	 * @example
+ 20 	 */
+ 21 	this.name = name;
+ 22
+ 23 	/**
+ 24 	 * Holds the attributes defined for this element.
+ 25 	 * @type Object
+ 26 	 * @example
+ 27 	 */
+ 28 	this.attributes = attributes;
+ 29
+ 30 	/**
+ 31 	 * The nodes that are direct children of this element.
+ 32 	 * @type Array
+ 33 	 * @example
+ 34 	 */
+ 35 	this.children = [];
+ 36
+ 37 	var dtd			= CKEDITOR.dtd,
+ 38 		isBlockLike	= !!( dtd.$block[ name ] || dtd.$listItem[ name ] || dtd.$tableContent[ name ] ),
+ 39 		isEmpty		= !!dtd.$empty[ name ];
+ 40
+ 41 	this.isEmpty	= isEmpty;
+ 42 	this.isUnknown	= !dtd[ name ];
+ 43
+ 44 	/** @private */
+ 45 	this._ =
+ 46 	{
+ 47 		isBlockLike : isBlockLike,
+ 48 		hasInlineStarted : isEmpty || !isBlockLike
+ 49 	};
+ 50 };
+ 51
+ 52 (function()
+ 53 {
+ 54 	// Used to sort attribute entries in an array, where the first element of
+ 55 	// each object is the attribute name.
+ 56 	var sortAttribs = function( a, b )
+ 57 	{
+ 58 		a = a[0];
+ 59 		b = b[0];
+ 60 		return a < b ? -1 : a > b ? 1 : 0;
+ 61 	};
+ 62
+ 63 	CKEDITOR.htmlParser.element.prototype =
+ 64 	{
+ 65 		/**
+ 66 		 * The node type. This is a constant value set to {@link CKEDITOR.NODE_ELEMENT}.
+ 67 		 * @type Number
+ 68 		 * @example
+ 69 		 */
+ 70 		type : CKEDITOR.NODE_ELEMENT,
+ 71
+ 72 		/**
+ 73 		 * Adds a node to the element children list.
+ 74 		 * @param {Object} node The node to be added. It can be any of of the
+ 75 		 *		following types: {@link CKEDITOR.htmlParser.element},
+ 76 		 *		{@link CKEDITOR.htmlParser.text} and
+ 77 		 *		{@link CKEDITOR.htmlParser.comment}.
+ 78 		 * @function
+ 79 		 * @example
+ 80 		 */
+ 81 		add : CKEDITOR.htmlParser.fragment.prototype.add,
+ 82
+ 83 		/**
+ 84 		 * Clone this element.
+ 85 		 * @returns {CKEDITOR.htmlParser.element} The element clone.
+ 86 		 * @example
+ 87 		 */
+ 88 		clone : function()
+ 89 		{
+ 90 			return new CKEDITOR.htmlParser.element( this.name, this.attributes );
+ 91 		},
+ 92
+ 93 		/**
+ 94 		 * Writes the element HTML to a CKEDITOR.htmlWriter.
+ 95 		 * @param {CKEDITOR.htmlWriter} writer The writer to which write the HTML.
+ 96 		 * @example
+ 97 		 */
+ 98 		writeHtml : function( writer, filter )
+ 99 		{
+100 			var attributes = this.attributes;
+101
+102 			// The "_cke_replacedata" indicates that this element is replacing
+103 			// a data snippet, which should be outputted as is.
+104 			if ( attributes._cke_replacedata )
+105 			{
+106 				writer.write( attributes._cke_replacedata );
+107 				return;
+108 			}
+109
+110 			// Ignore cke: prefixes when writing HTML.
+111 			var element = this,
+112 				writeName = element.name,
+113 				a, value;
+114
+115 			if ( filter )
+116 			{
+117 				while ( true )
+118 				{
+119 					if ( !( writeName = filter.onElementName( writeName ) ) )
+120 						return;
+121
+122 					element.name = writeName;
+123
+124 					if ( !( element = filter.onElement( element ) ) )
+125 						return;
+126
+127 					if ( element.name == writeName )
+128 						break;
+129
+130 					writeName = element.name;
+131 					if ( !writeName )	// Send children.
+132 					{
+133 						CKEDITOR.htmlParser.fragment.prototype.writeHtml.apply( element, arguments );
+134 						return;
+135 					}
+136 				}
+137
+138 				// The element may have been changed, so update the local
+139 				// references.
+140 				attributes = element.attributes;
+141 			}
+142
+143 			// Open element tag.
+144 			writer.openTag( writeName, attributes );
+145
+146 			if ( writer.sortAttributes )
+147 			{
+148 				// Copy all attributes to an array.
+149 				var attribsArray = [];
+150 				for ( a in attributes )
+151 				{
+152 					value = attributes[ a ];
+153
+154 					if ( filter && ( !( a = filter.onAttributeName( a ) ) || ( value = filter.onAttribute( element, a, value ) ) === false ) )
+155 						continue;
+156
+157 					attribsArray.push( [ a, value ] );
+158 				}
+159
+160 				// Sort the attributes by name.
+161 				attribsArray.sort( sortAttribs );
+162
+163 				// Send the attributes.
+164 				for ( var i = 0, len = attribsArray.length ; i < len ; i++ )
+165 				{
+166 					var attrib = attribsArray[ i ];
+167 					writer.attribute( attrib[0], attrib[1] );
+168 				}
+169 			}
+170 			else
+171 			{
+172 				for ( a in attributes )
+173 				{
+174 					value = attributes[ a ];
+175
+176 					if ( filter && ( !( a = filter.onAttributeName( a ) ) || ( value = filter.onAttribute( element, a, value ) ) === false ) )
+177 						continue;
+178
+179 					writer.attribute( a, value );
+180 				}
+181 			}
+182
+183 			// Close the tag.
+184 			writer.openTagClose( writeName, element.isEmpty );
+185
+186 			if ( !element.isEmpty )
+187 			{
+188 				// Send children.
+189 				CKEDITOR.htmlParser.fragment.prototype.writeHtml.apply( element, arguments );
+190
+191 				// Close the element.
+192 				writer.closeTag( writeName );
+193 			}
+194 		}
+195 	};
+196 })();
+197 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_filter.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_filter.js.html new file mode 100644 index 000000000..3d3319467 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_filter.js.html @@ -0,0 +1,241 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	CKEDITOR.htmlParser.filter = CKEDITOR.tools.createClass(
+  9 	{
+ 10 		$ : function( rules )
+ 11 		{
+ 12 			this._ =
+ 13 			{
+ 14 				elementNames : [],
+ 15 				attributeNames : [],
+ 16 				elements : { $length : 0 },
+ 17 				attributes : { $length : 0 }
+ 18 			};
+ 19
+ 20 			if ( rules )
+ 21 				this.addRules( rules, 10 );
+ 22 		},
+ 23
+ 24 		proto :
+ 25 		{
+ 26 			addRules : function( rules, priority )
+ 27 			{
+ 28 				if ( typeof priority != 'number' )
+ 29 					priority = 10;
+ 30
+ 31 				// Add the elementNames.
+ 32 				addItemsToList( this._.elementNames, rules.elementNames, priority );
+ 33
+ 34 				// Add the attributeNames.
+ 35 				addItemsToList( this._.attributeNames, rules.attributeNames, priority );
+ 36
+ 37 				// Add the elements.
+ 38 				addNamedItems( this._.elements, rules.elements, priority );
+ 39
+ 40 				// Add the attributes.
+ 41 				addNamedItems( this._.attributes, rules.attributes, priority );
+ 42
+ 43 				// Add the text.
+ 44 				this._.text = transformNamedItem( this._.text, rules.text, priority ) || this._.text;
+ 45
+ 46 				// Add the comment.
+ 47 				this._.comment = transformNamedItem( this._.comment, rules.comment, priority ) || this._.comment;
+ 48 			},
+ 49
+ 50 			onElementName : function( name )
+ 51 			{
+ 52 				return filterName( name, this._.elementNames );
+ 53 			},
+ 54
+ 55 			onAttributeName : function( name )
+ 56 			{
+ 57 				return filterName( name, this._.attributeNames );
+ 58 			},
+ 59
+ 60 			onText : function( text )
+ 61 			{
+ 62 				var textFilter = this._.text;
+ 63 				return textFilter ? textFilter.filter( text ) : text;
+ 64 			},
+ 65
+ 66 			onComment : function( commentText )
+ 67 			{
+ 68 				var textFilter = this._.comment;
+ 69 				return textFilter ? textFilter.filter( commentText ) : commentText;
+ 70 			},
+ 71
+ 72 			onElement : function( element )
+ 73 			{
+ 74 				// We must apply filters set to the specific element name as
+ 75 				// well as those set to the generic $ name. So, add both to an
+ 76 				// array and process them in a small loop.
+ 77 				var filters = [ this._.elements[ element.name ], this._.elements.$ ],
+ 78 					filter, ret;
+ 79
+ 80 				for ( var i = 0 ; i < 2 ; i++ )
+ 81 				{
+ 82 					filter = filters[ i ];
+ 83 					if ( filter )
+ 84 					{
+ 85 						ret = filter.filter( element, this );
+ 86
+ 87 						if ( ret === false )
+ 88 							return null;
+ 89
+ 90 						if ( ret && ret != element )
+ 91 							return this.onElement( ret );
+ 92 					}
+ 93 				}
+ 94
+ 95 				return element;
+ 96 			},
+ 97
+ 98 			onAttribute : function( element, name, value )
+ 99 			{
+100 				var filter = this._.attributes[ name ];
+101
+102 				if ( filter )
+103 				{
+104 					var ret = filter.filter( value, element, this );
+105
+106 					if ( ret === false )
+107 						return false;
+108
+109 					if ( typeof ret != 'undefined' )
+110 						return ret;
+111 				}
+112
+113 				return value;
+114 			}
+115 		}
+116 	});
+117
+118 	function filterName( name, filters )
+119 	{
+120 		for ( var i = 0 ; name && i < filters.length ; i++ )
+121 		{
+122 			var filter = filters[ i ];
+123 			name = name.replace( filter[ 0 ], filter[ 1 ] );
+124 		}
+125 		return name;
+126 	}
+127
+128 	function addItemsToList( list, items, priority )
+129 	{
+130 		var i, j,
+131 			listLength = list.length,
+132 			itemsLength = items && items.length;
+133
+134 		if ( itemsLength )
+135 		{
+136 			// Find the index to insert the items at.
+137 			for ( i = 0 ; i < listLength && list[ i ].pri < priority ; i++ )
+138 			{ /*jsl:pass*/ }
+139
+140 			// Add all new items to the list at the specific index.
+141 			for ( j = itemsLength - 1 ; j >= 0 ; j-- )
+142 			{
+143 				var item = items[ j ];
+144 				item.pri = priority;
+145 				list.splice( i, 0, item );
+146 			}
+147 		}
+148 	}
+149
+150 	function addNamedItems( hashTable, items, priority )
+151 	{
+152 		if ( items )
+153 		{
+154 			for ( var name in items )
+155 			{
+156 				var current = hashTable[ name ];
+157
+158 				hashTable[ name ] =
+159 					transformNamedItem(
+160 						current,
+161 						items[ name ],
+162 						priority );
+163
+164 				if ( !current )
+165 					hashTable.$length++;
+166 			}
+167 		}
+168 	}
+169
+170 	function transformNamedItem( current, item, priority )
+171 	{
+172 		if ( item )
+173 		{
+174 			item.pri = priority;
+175
+176 			if ( current )
+177 			{
+178 				// If the current item is not an Array, transform it.
+179 				if ( !current.splice )
+180 				{
+181 					if ( current.pri > priority )
+182 						current = [ item, current ];
+183 					else
+184 						current = [ current, item ];
+185
+186 					current.filter = callItems;
+187 				}
+188 				else
+189 					addItemsToList( current, item, priority );
+190
+191 				return current;
+192 			}
+193 			else
+194 			{
+195 				item.filter = item;
+196 				return item;
+197 			}
+198 		}
+199 	}
+200
+201 	function callItems( currentEntry )
+202 	{
+203 		var isObject = ( typeof currentEntry == 'object' );
+204
+205 		for ( var i = 0 ; i < this.length ; i++ )
+206 		{
+207 			var item = this[ i ],
+208 				ret = item.apply( window, arguments );
+209
+210 			if ( typeof ret != 'undefined' )
+211 			{
+212 				if ( ret === false )
+213 					return false;
+214
+215 				if ( isObject && ret != currentEntry )
+216 					return ret;
+217 			}
+218 		}
+219
+220 		return null;
+221 	}
+222 })();
+223
+224 // "entities" plugin
+225 /*
+226 {
+227 	text : function( text )
+228 	{
+229 		// TODO : Process entities.
+230 		return text.toUpperCase();
+231 	}
+232 };
+233 */
+234 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_fragment.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_fragment.js.html new file mode 100644 index 000000000..9c2618238 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_fragment.js.html @@ -0,0 +1,425 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * A lightweight representation of an HTML DOM structure.
+  8  * @constructor
+  9  * @example
+ 10  */
+ 11 CKEDITOR.htmlParser.fragment = function()
+ 12 {
+ 13 	/**
+ 14 	 * The nodes contained in the root of this fragment.
+ 15 	 * @type Array
+ 16 	 * @example
+ 17 	 * var fragment = CKEDITOR.htmlParser.fragment.fromHtml( '<b>Sample</b> Text' );
+ 18 	 * alert( fragment.children.length );  "2"
+ 19 	 */
+ 20 	this.children = [];
+ 21
+ 22 	/**
+ 23 	 * Get the fragment parent. Should always be null.
+ 24 	 * @type Object
+ 25 	 * @default null
+ 26 	 * @example
+ 27 	 */
+ 28 	this.parent = null;
+ 29
+ 30 	/** @private */
+ 31 	this._ =
+ 32 	{
+ 33 		isBlockLike : true,
+ 34 		hasInlineStarted : false
+ 35 	};
+ 36 };
+ 37
+ 38 (function()
+ 39 {
+ 40 	// Elements which the end tag is marked as optional in the HTML 4.01 DTD
+ 41 	// (expect empty elements).
+ 42 	var optionalClose = {colgroup:1,dd:1,dt:1,li:1,option:1,p:1,td:1,tfoot:1,th:1,thead:1,tr:1};
+ 43
+ 44 	// Block-level elements whose internal structure should be respected during
+ 45 	// parser fixing.
+ 46 	var nonBreakingBlocks = CKEDITOR.tools.extend(
+ 47 			{table:1,ul:1,ol:1,dl:1},
+ 48 			CKEDITOR.dtd.table, CKEDITOR.dtd.ul, CKEDITOR.dtd.ol, CKEDITOR.dtd.dl );
+ 49
+ 50 	/**
+ 51 	 * Creates a {@link CKEDITOR.htmlParser.fragment} from an HTML string.
+ 52 	 * @param {String} fragmentHtml The HTML to be parsed, filling the fragment.
+ 53 	 * @param {Number} [fixForBody=false] Wrap body with specified element if needed.
+ 54 	 * @returns CKEDITOR.htmlParser.fragment The fragment created.
+ 55 	 * @example
+ 56 	 * var fragment = CKEDITOR.htmlParser.fragment.fromHtml( '<b>Sample</b> Text' );
+ 57 	 * alert( fragment.children[0].name );  "b"
+ 58 	 * alert( fragment.children[1].value );  " Text"
+ 59 	 */
+ 60 	CKEDITOR.htmlParser.fragment.fromHtml = function( fragmentHtml, fixForBody )
+ 61 	{
+ 62 		var parser = new CKEDITOR.htmlParser(),
+ 63 			html = [],
+ 64 			fragment = new CKEDITOR.htmlParser.fragment(),
+ 65 			pendingInline = [],
+ 66 			currentNode = fragment,
+ 67 		    // Indicate we're inside a <pre> element, spaces should be touched differently.
+ 68 			inPre = false,
+ 69 			returnPoint;
+ 70
+ 71 		function checkPending( newTagName )
+ 72 		{
+ 73 			if ( pendingInline.length > 0 )
+ 74 			{
+ 75 				for ( var i = 0 ; i < pendingInline.length ; i++ )
+ 76 				{
+ 77 					var pendingElement = pendingInline[ i ],
+ 78 						pendingName = pendingElement.name,
+ 79 						pendingDtd = CKEDITOR.dtd[ pendingName ],
+ 80 						currentDtd = currentNode.name && CKEDITOR.dtd[ currentNode.name ];
+ 81
+ 82 					if ( ( !currentDtd || currentDtd[ pendingName ] ) && ( !newTagName || !pendingDtd || pendingDtd[ newTagName ] || !CKEDITOR.dtd[ newTagName ] ) )
+ 83 					{
+ 84 						// Get a clone for the pending element.
+ 85 						pendingElement = pendingElement.clone();
+ 86
+ 87 						// Add it to the current node and make it the current,
+ 88 						// so the new element will be added inside of it.
+ 89 						pendingElement.parent = currentNode;
+ 90 						currentNode = pendingElement;
+ 91
+ 92 						// Remove the pending element (back the index by one
+ 93 						// to properly process the next entry).
+ 94 						pendingInline.splice( i, 1 );
+ 95 						i--;
+ 96 					}
+ 97 				}
+ 98 			}
+ 99 		}
+100
+101 		function addElement( element, target, enforceCurrent )
+102 		{
+103 			target = target || currentNode || fragment;
+104
+105 			// If the target is the fragment and this element can't go inside
+106 			// body (if fixForBody).
+107 			if ( fixForBody && !target.type && !CKEDITOR.dtd.$body[ element.name ] )
+108 			{
+109 				var savedCurrent = currentNode;
+110
+111 				// Create a <p> in the fragment.
+112 				currentNode = target;
+113 				parser.onTagOpen( fixForBody, {} );
+114
+115 				// The new target now is the <p>.
+116 				target = currentNode;
+117
+118 				if ( enforceCurrent )
+119 					currentNode = savedCurrent;
+120 			}
+121
+122 			// Rtrim empty spaces on block end boundary. (#3585)
+123 			if ( element._.isBlockLike
+124 				 && !inPre )
+125 			{
+126
+127 				var length = element.children.length,
+128 					lastChild = element.children[ length - 1 ],
+129 					text;
+130 				if ( lastChild && lastChild.type == CKEDITOR.NODE_TEXT )
+131 				{
+132 					if ( !( text = CKEDITOR.tools.rtrim( lastChild.value ) ) )
+133 						element.children.length = length -1;
+134 					else
+135 						lastChild.value = text;
+136 				}
+137 			}
+138
+139 			target.add( element );
+140
+141 			if ( element.returnPoint )
+142 			{
+143 				currentNode = element.returnPoint;
+144 				delete element.returnPoint;
+145 			}
+146 		}
+147
+148 		parser.onTagOpen = function( tagName, attributes, selfClosing )
+149 		{
+150 			var element = new CKEDITOR.htmlParser.element( tagName, attributes );
+151
+152 			// "isEmpty" will be always "false" for unknown elements, so we
+153 			// must force it if the parser has identified it as a selfClosing tag.
+154 			if ( element.isUnknown && selfClosing )
+155 				element.isEmpty = true;
+156
+157 			// This is a tag to be removed if empty, so do not add it immediately.
+158 			if ( CKEDITOR.dtd.$removeEmpty[ tagName ] )
+159 			{
+160 				pendingInline.push( element );
+161 				return;
+162 			}
+163 			else if ( tagName == 'pre' )
+164 				inPre = true;
+165 			else if ( tagName == 'br' && inPre )
+166 			{
+167 				currentNode.add( new CKEDITOR.htmlParser.text( '\n' ) );
+168 				return;
+169 			}
+170
+171 			var currentName = currentNode.name,
+172 				currentDtd = ( currentName && CKEDITOR.dtd[ currentName ] ) || ( currentNode._.isBlockLike ? CKEDITOR.dtd.div : CKEDITOR.dtd.span );
+173
+174 			// If the element cannot be child of the current element.
+175 			if ( !element.isUnknown && !currentNode.isUnknown && !currentDtd[ tagName ] )
+176 			{
+177 				// If this is the fragment node, just ignore this tag and add
+178 				// its children.
+179 				if ( !currentName )
+180 					return;
+181
+182 				var reApply = false;
+183
+184 				// If the element name is the same as the current element name,
+185 				// then just close the current one and append the new one to the
+186 				// parent. This situation usually happens with <p>, <li>, <dt> and
+187 				// <dd>, specially in IE. Do not enter in this if block in this case.
+188 				if ( tagName == currentName )
+189 				{
+190 					addElement( currentNode, currentNode.parent );
+191 				}
+192 				else
+193 				{
+194 					if ( nonBreakingBlocks[ currentName ] )
+195 					{
+196 						if ( !returnPoint )
+197 							returnPoint = currentNode;
+198 					}
+199 					else
+200 					{
+201 						addElement( currentNode, currentNode.parent, true );
+202
+203 						if ( !optionalClose[ currentName ] )
+204 						{
+205 							// The current element is an inline element, which
+206 							// cannot hold the new one. Put it in the pending list,
+207 							// and try adding the new one after it.
+208 							pendingInline.unshift( currentNode );
+209 						}
+210 					}
+211
+212 					reApply = true;
+213 				}
+214
+215 				// In any of the above cases, we'll be adding, or trying to
+216 				// add it to the parent.
+217 				currentNode = currentNode.returnPoint || currentNode.parent;
+218
+219 				if ( reApply )
+220 				{
+221 					parser.onTagOpen.apply( this, arguments );
+222 					return;
+223 				}
+224 			}
+225
+226 			checkPending( tagName );
+227
+228 			element.parent = currentNode;
+229 			element.returnPoint = returnPoint;
+230 			returnPoint = 0;
+231
+232 			if ( element.isEmpty )
+233 				addElement( element );
+234 			else
+235 				currentNode = element;
+236 		};
+237
+238 		parser.onTagClose = function( tagName )
+239 		{
+240 			var index = 0,
+241 				pendingAdd = [],
+242 				candidate = currentNode;
+243
+244 			while ( candidate.type && candidate.name != tagName )
+245 			{
+246 				// If this is an inline element, add it to the pending list, so
+247 				// it will continue after the closing tag.
+248 				if ( !candidate._.isBlockLike )
+249 				{
+250 					pendingInline.unshift( candidate );
+251
+252 					// Increase the index, so it will not get checked again in
+253 					// the pending list check that follows.
+254 					index++;
+255 				}
+256
+257 				// This node should be added to it's parent at this point. But,
+258 				// it should happen only if the closing tag is really closing
+259 				// one of the nodes. So, for now, we just cache it.
+260 				pendingAdd.push( candidate );
+261
+262 				candidate = candidate.parent;
+263 			}
+264
+265 			if ( candidate.type )
+266 			{
+267 				// Add all elements that have been found in the above loop.
+268 				for ( var i = 0 ; i < pendingAdd.length ; i++ )
+269 				{
+270 					var node = pendingAdd[ i ];
+271 					addElement( node, node.parent );
+272 				}
+273
+274 				currentNode = candidate;
+275
+276 				if( currentNode.name == 'pre' )
+277 					inPre = false;
+278
+279 				addElement( candidate, candidate.parent );
+280
+281 				// The parent should start receiving new nodes now, except if
+282 				// addElement changed the currentNode.
+283 				if ( candidate == currentNode )
+284 					currentNode = currentNode.parent;
+285 			}
+286
+287 			// Check if there is any pending tag to be closed.
+288 			for ( ; index < pendingInline.length ; index++ )
+289 			{
+290 				// If found, just remove it from the list.
+291 				if ( tagName == pendingInline[ index ].name )
+292 				{
+293 					pendingInline.splice( index, 1 );
+294
+295 					// Decrease the index so we continue from the next one.
+296 					index--;
+297 				}
+298 			}
+299 		};
+300
+301 		parser.onText = function( text )
+302 		{
+303 			// Trim empty spaces at beginning of element contents except <pre>.
+304 			if ( !currentNode._.hasInlineStarted && !inPre )
+305 			{
+306 				text = CKEDITOR.tools.ltrim( text );
+307
+308 				if ( text.length === 0 )
+309 					return;
+310 			}
+311
+312 			checkPending();
+313
+314 			if ( fixForBody && !currentNode.type )
+315 				this.onTagOpen( fixForBody, {} );
+316
+317 			// Shrinking consequential spaces into one single for all elements
+318 			// text contents.
+319 			if ( !inPre )
+320 				text = text.replace( /[\t\r\n ]{2,}|[\t\r\n]/g, ' ' );
+321
+322 			currentNode.add( new CKEDITOR.htmlParser.text( text ) );
+323 		};
+324
+325 		parser.onCDATA = function( cdata )
+326 		{
+327 			currentNode.add( new CKEDITOR.htmlParser.cdata( cdata ) );
+328 		};
+329
+330 		parser.onComment = function( comment )
+331 		{
+332 			currentNode.add( new CKEDITOR.htmlParser.comment( comment ) );
+333 		};
+334
+335 		// Parse it.
+336 		parser.parse( fragmentHtml );
+337
+338 		// Close all pending nodes.
+339 		while ( currentNode.type )
+340 		{
+341 			var parent = currentNode.parent,
+342 				node = currentNode;
+343
+344 			if ( fixForBody && !parent.type && !CKEDITOR.dtd.$body[ node.name ] )
+345 			{
+346 				currentNode = parent;
+347 				parser.onTagOpen( fixForBody, {} );
+348 				parent = currentNode;
+349 			}
+350
+351 			parent.add( node );
+352 			currentNode = parent;
+353 		}
+354
+355 		return fragment;
+356 	};
+357
+358 	CKEDITOR.htmlParser.fragment.prototype =
+359 	{
+360 		/**
+361 		 * Adds a node to this fragment.
+362 		 * @param {Object} node The node to be added. It can be any of of the
+363 		 *		following types: {@link CKEDITOR.htmlParser.element},
+364 		 *		{@link CKEDITOR.htmlParser.text} and
+365 		 *		{@link CKEDITOR.htmlParser.comment}.
+366 		 * @example
+367 		 */
+368 		add : function( node )
+369 		{
+370 			var len = this.children.length,
+371 				previous = len > 0 && this.children[ len - 1 ] || null;
+372
+373 			if ( previous )
+374 			{
+375 				// If the block to be appended is following text, trim spaces at
+376 				// the right of it.
+377 				if ( node._.isBlockLike && previous.type == CKEDITOR.NODE_TEXT )
+378 				{
+379 					previous.value = CKEDITOR.tools.rtrim( previous.value );
+380
+381 					// If we have completely cleared the previous node.
+382 					if ( previous.value.length === 0 )
+383 					{
+384 						// Remove it from the list and add the node again.
+385 						this.children.pop();
+386 						this.add( node );
+387 						return;
+388 					}
+389 				}
+390
+391 				previous.next = node;
+392 			}
+393
+394 			node.previous = previous;
+395 			node.parent = this;
+396
+397 			this.children.push( node );
+398
+399 			this._.hasInlineStarted = node.type == CKEDITOR.NODE_TEXT || ( node.type == CKEDITOR.NODE_ELEMENT && !node._.isBlockLike );
+400 		},
+401
+402 		/**
+403 		 * Writes the fragment HTML to a CKEDITOR.htmlWriter.
+404 		 * @param {CKEDITOR.htmlWriter} writer The writer to which write the HTML.
+405 		 * @example
+406 		 * var writer = new CKEDITOR.htmlWriter();
+407 		 * var fragment = CKEDITOR.htmlParser.fragment.fromHtml( '<P><B>Example' );
+408 		 * fragment.writeHtml( writer )
+409 		 * alert( writer.getHtml() );  "<p><b>Example</b></p>"
+410 		 */
+411 		writeHtml : function( writer, filter )
+412 		{
+413 			for ( var i = 0, len = this.children.length ; i < len ; i++ )
+414 				this.children[i].writeHtml( writer, filter );
+415 		}
+416 	};
+417 })();
+418 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_text.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_text.js.html new file mode 100644 index 000000000..25a80e2b5 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_htmlparser_text.js.html @@ -0,0 +1,63 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	var spacesRegex = /[\t\r\n ]{2,}|[\t\r\n]/g;
+  9
+ 10 	/**
+ 11 	 * A lightweight representation of HTML text.
+ 12 	 * @constructor
+ 13 	 * @example
+ 14 	 */
+ 15  	CKEDITOR.htmlParser.text = function( value )
+ 16 	{
+ 17 		/**
+ 18 		 * The text value.
+ 19 		 * @type String
+ 20 		 * @example
+ 21 		 */
+ 22 		this.value = value;
+ 23
+ 24 		/** @private */
+ 25 		this._ =
+ 26 		{
+ 27 			isBlockLike : false
+ 28 		};
+ 29 	};
+ 30
+ 31 	CKEDITOR.htmlParser.text.prototype =
+ 32 	{
+ 33 		/**
+ 34 		 * The node type. This is a constant value set to {@link CKEDITOR.NODE_TEXT}.
+ 35 		 * @type Number
+ 36 		 * @example
+ 37 		 */
+ 38 		type : CKEDITOR.NODE_TEXT,
+ 39
+ 40 		/**
+ 41 		 * Writes the HTML representation of this text to a CKEDITOR.htmlWriter.
+ 42 		 * @param {CKEDITOR.htmlWriter} writer The writer to which write the HTML.
+ 43 		 * @example
+ 44 		 */
+ 45 		writeHtml : function( writer, filter )
+ 46 		{
+ 47 			var text = this.value;
+ 48
+ 49 			if ( filter && !( text = filter.onText( text, this ) ) )
+ 50 				return;
+ 51
+ 52 			writer.text( text );
+ 53 		}
+ 54 	};
+ 55 })();
+ 56 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_imagecacher.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_imagecacher.js.html new file mode 100644 index 000000000..baddc5668 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_imagecacher.js.html @@ -0,0 +1,66 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	var loaded = {};
+  9
+ 10 	var loadImage = function( image, callback )
+ 11 	{
+ 12 		var doCallback = function()
+ 13 			{
+ 14 				loaded[ image ] = 1;
+ 15 				callback();
+ 16 			};
+ 17
+ 18 		var img = new CKEDITOR.dom.element( 'img' );
+ 19 		img.on( 'load', doCallback );
+ 20 		img.on( 'error', doCallback );
+ 21 		img.setAttribute( 'src', image );
+ 22 	};
+ 23
+ 24 	/**
+ 25 	 * Load images into the browser cache.
+ 26 	 * @namespace
+ 27 	 * @example
+ 28 	 */
+ 29  	CKEDITOR.imageCacher =
+ 30 	{
+ 31 		/**
+ 32 		 * Loads one or more images.
+ 33 		 * @param {Array} images The URLs for the images to be loaded.
+ 34 		 * @param {Function} callback The function to be called once all images
+ 35 		 *		are loaded.
+ 36 		 */
+ 37 		load : function( images, callback )
+ 38 		{
+ 39 			var pendingCount = images.length;
+ 40
+ 41 			var checkPending = function()
+ 42 			{
+ 43 				if ( --pendingCount === 0 )
+ 44 					callback();
+ 45 			};
+ 46
+ 47 			for ( var i = 0 ; i < images.length ; i++ )
+ 48 			{
+ 49 				var image = images[ i ];
+ 50
+ 51 				if ( loaded[ image ] )
+ 52 					checkPending();
+ 53 				else
+ 54 					loadImage( image, checkPending );
+ 55 			}
+ 56 		}
+ 57 	};
+ 58 })();
+ 59 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_lang.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_lang.js.html new file mode 100644 index 000000000..a143210a2 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_lang.js.html @@ -0,0 +1,155 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	var loadedLangs = {};
+  9
+ 10 	CKEDITOR.lang =
+ 11 	{
+ 12 		/**
+ 13 		 * The list of languages available in the editor core.
+ 14 		 * @type Object
+ 15 		 * @example
+ 16 		 * alert( CKEDITOR.lang.en );  // "true"
+ 17 		 */
+ 18 		languages :
+ 19 		{
+ 20 			'af'	: 1,
+ 21 			'ar'	: 1,
+ 22 			'bg'	: 1,
+ 23 			'bn'	: 1,
+ 24 			'bs'	: 1,
+ 25 			'ca'	: 1,
+ 26 			'cs'	: 1,
+ 27 			'da'	: 1,
+ 28 			'de'	: 1,
+ 29 			'el'	: 1,
+ 30 			'en-au'	: 1,
+ 31 			'en-ca'	: 1,
+ 32 			'en-uk'	: 1,
+ 33 			'en'	: 1,
+ 34 			'eo'	: 1,
+ 35 			'es'	: 1,
+ 36 			'et'	: 1,
+ 37 			'eu'	: 1,
+ 38 			'fa'	: 1,
+ 39 			'fi'	: 1,
+ 40 			'fo'	: 1,
+ 41 			'fr-ca'	: 1,
+ 42 			'fr'	: 1,
+ 43 			'gl'	: 1,
+ 44 			'gu'	: 1,
+ 45 			'he'	: 1,
+ 46 			'hi'	: 1,
+ 47 			'hr'	: 1,
+ 48 			'hu'	: 1,
+ 49 			'is'	: 1,
+ 50 			'it'	: 1,
+ 51 			'ja'	: 1,
+ 52 			'km'	: 1,
+ 53 			'ko'	: 1,
+ 54 			'lt'	: 1,
+ 55 			'lv'	: 1,
+ 56 			'mn'	: 1,
+ 57 			'ms'	: 1,
+ 58 			'nb'	: 1,
+ 59 			'nl'	: 1,
+ 60 			'no'	: 1,
+ 61 			'pl'	: 1,
+ 62 			'pt-br'	: 1,
+ 63 			'pt'	: 1,
+ 64 			'ro'	: 1,
+ 65 			'ru'	: 1,
+ 66 			'sk'	: 1,
+ 67 			'sl'	: 1,
+ 68 			'sr-latn'	: 1,
+ 69 			'sr'	: 1,
+ 70 			'sv'	: 1,
+ 71 			'th'	: 1,
+ 72 			'tr'	: 1,
+ 73 			'uk'	: 1,
+ 74 			'vi'	: 1,
+ 75 			'zh-cn'	: 1,
+ 76 			'zh'	: 1
+ 77 		},
+ 78
+ 79 		/**
+ 80 		 * Loads a specific language file, or auto detect it. A callback is
+ 81 		 * then called when the file gets loaded.
+ 82 		 * @param {String} languageCode The code of the language file to be
+ 83 		 *		loaded. If "autoDetect" is set to true, this language will be
+ 84 		 *		used as the default one, if the detect language is not
+ 85 		 *		available in the core.
+ 86 		 * @param {Boolean} autoDetect Indicates that the function must try to
+ 87 		 *		detect the user language and load it instead.
+ 88 		 * @param {Function} callback The function to be called once the
+ 89 		 *		language file is loaded. Two parameters are passed to this
+ 90 		 *		function: the language code and the loaded language entries.
+ 91 		 * @example
+ 92 		 */
+ 93 		load : function( languageCode, defaultLanguage, callback )
+ 94 		{
+ 95 			if ( !languageCode )
+ 96 				languageCode = this.detect( defaultLanguage );
+ 97
+ 98 			if ( !this[ languageCode ] )
+ 99 			{
+100 				CKEDITOR.scriptLoader.load( CKEDITOR.getUrl(
+102 					'lang/' + languageCode + '.js' ),
+103 					function()
+104 						{
+105 							callback( languageCode, this[ languageCode ] );
+106 						}
+107 						, this );
+108 			}
+109 			else
+110 				callback( languageCode, this[ languageCode ] );
+111 		},
+112
+113 		/**
+114 		 * Returns the language that best fit the user language. For example,
+115 		 * suppose that the user language is "pt-br". If this language is
+116 		 * supported by the editor, it is returned. Otherwise, if only "pt" is
+117 		 * supported, it is returned instead. If none of the previous are
+118 		 * supported, a default language is then returned.
+119 		 * @param {String} defaultLanguage The default language to be returned
+120 		 *		if the user language is not supported.
+121 		 * @returns {String} The detected language code.
+122 		 * @example
+123 		 * alert( CKEDITOR.lang.detect( 'en' ) );  // e.g., in a German browser: "de"
+124 		 */
+125 		detect : function( defaultLanguage )
+126 		{
+127 			var languages = this.languages;
+128
+129 			var parts = ( navigator.userLanguage || navigator.language )
+130 					.toLowerCase()
+131 					.match( /([a-z]+)(?:-([a-z]+))?/ ),
+132 				lang = parts[1],
+133 				locale = parts[2];
+134
+135 			if ( languages[ lang + '-' + locale ] )
+136 				lang = lang + '-' + locale;
+137 			else if ( !languages[ lang ] )
+138 				lang = null;
+139
+140 			CKEDITOR.lang.detect = lang ?
+141 				function() { return lang; } :
+142 				function( defaultLanguage ) { return defaultLanguage; };
+143
+144 			return lang || defaultLanguage;
+145 		}
+146 	};
+147
+148 })();
+149 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_loader.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_loader.js.html new file mode 100644 index 000000000..d64d7ed27 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_loader.js.html @@ -0,0 +1,193 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.loader} objects, which is used to
+  8  *		load core scripts and their dependencies from _source.
+  9  */
+ 10
+ 11 if ( typeof CKEDITOR == 'undefined' )
+ 12 	CKEDITOR = {};
+ 13
+ 14 if ( !CKEDITOR.loader )
+ 15 {
+ 16 	/**
+ 17 	 * Load core scripts and their dependencies from _source.
+ 18 	 * @namespace
+ 19 	 * @example
+ 20 	 */
+ 21 	CKEDITOR.loader = (function()
+ 22 	{
+ 23 		// Table of script names and their dependencies.
+ 24 		var scripts =
+ 25 		{
+ 26 			'core/_bootstrap'		: [ 'core/config', 'core/ckeditor', 'core/plugins', 'core/scriptloader', 'core/tools', /* The following are entries that we want to force loading at the end to avoid dependence recursion */ 'core/dom/elementpath', 'core/dom/text', 'core/dom/range' ],
+ 27 			'core/ajax'				: [ 'core/xml' ],
+ 28 			'core/ckeditor'			: [ 'core/ckeditor_basic', 'core/dom', 'core/dtd', 'core/dom/document', 'core/dom/element', 'core/editor', 'core/event', 'core/htmlparser', 'core/htmlparser/element', 'core/htmlparser/fragment', 'core/htmlparser/filter', 'core/htmlparser/basicwriter', 'core/tools' ],
+ 29 			'core/ckeditor_base'	: [],
+ 30 			'core/ckeditor_basic'	: [ 'core/editor_basic', 'core/env', 'core/event' ],
+ 31 			'core/command'			: [],
+ 32 			'core/config'			: [ 'core/ckeditor_base' ],
+ 33 			'core/dom'				: [],
+ 34 			'core/dom/document'		: [ 'core/dom', 'core/dom/domobject', 'core/dom/window' ],
+ 35 			'core/dom/documentfragment'	: [ 'core/dom/element' ],
+ 36 			'core/dom/element'		: [ 'core/dom', 'core/dom/document', 'core/dom/domobject', 'core/dom/node', 'core/dom/nodelist', 'core/tools' ],
+ 37 			'core/dom/elementpath'	: [ 'core/dom/element' ],
+ 38 			'core/dom/event'		: [],
+ 39 			'core/dom/node'			: [ 'core/dom/domobject', 'core/tools' ],
+ 40 			'core/dom/nodelist'		: [ 'core/dom/node' ],
+ 41 			'core/dom/domobject'	: [ 'core/dom/event' ],
+ 42 			'core/dom/domwalker'	: [ 'core/dom/node', 'core/dom/element', 'core/dom/document' ],
+ 43 			'core/dom/range'		: [ 'core/dom/document', 'core/dom/documentfragment', 'core/dom/element', 'core/dom/domwalker', 'core/dom/walker' ],
+ 44 			'core/dom/text'			: [ 'core/dom/node', 'core/dom/domobject' ],
+ 45 			'core/dom/walker'		: [ 'core/dom/node' ],
+ 46 			'core/dom/window'		: [ 'core/dom/domobject' ],
+ 47 			'core/dtd'				: [ 'core/tools' ],
+ 48 			'core/editor'			: [ 'core/command', 'core/config', 'core/editor_basic', 'core/focusmanager', 'core/lang', 'core/plugins', 'core/skins', 'core/themes', 'core/tools', 'core/ui' ],
+ 49 			'core/editor_basic'		: [ 'core/event' ],
+ 50 			'core/env'				: [],
+ 51 			'core/event'			: [],
+ 52 			'core/focusmanager'		: [],
+ 53 			'core/htmlparser'		: [],
+ 54 			'core/htmlparser/comment'	: [ 'core/htmlparser' ],
+ 55 			'core/htmlparser/element'	: [ 'core/htmlparser', 'core/htmlparser/fragment' ],
+ 56 			'core/htmlparser/fragment'	: [ 'core/htmlparser', 'core/htmlparser/comment', 'core/htmlparser/text', 'core/htmlparser/cdata' ],
+ 57 			'core/htmlparser/text'		: [ 'core/htmlparser' ],
+ 58 			'core/htmlparser/cdata'		: [ 'core/htmlparser' ],
+ 59 			'core/htmlparser/filter'	: [ 'core/htmlparser' ],
+ 60 			'core/htmlparser/basicwriter': [ 'core/htmlparser' ],
+ 61 			'core/imagecacher'		: [ 'core/dom/element' ],
+ 62 			'core/lang'				: [],
+ 63 			'core/plugins'			: [ 'core/resourcemanager' ],
+ 64 			'core/resourcemanager'	: [ 'core/scriptloader', 'core/tools' ],
+ 65 			'core/scriptloader'		: [ 'core/dom/element', 'core/env' ],
+ 66 			'core/skins'			: [ 'core/imagecacher', 'core/scriptloader' ],
+ 67 			'core/themes'			: [ 'core/resourcemanager' ],
+ 68 			'core/tools'			: [ 'core/env' ],
+ 69 			'core/ui'				: [],
+ 70 			'core/xml'				: [ 'core/env' ]
+ 71 		};
+ 72
+ 73 		var basePath = (function()
+ 74 		{
+ 75 			// This is a copy of CKEDITOR.basePath, but requires the script having
+ 76 			// "_source/core/loader.js".
+ 77 			if ( CKEDITOR && CKEDITOR.basePath )
+ 78 				return CKEDITOR.basePath;
+ 79
+ 80 			// Find out the editor directory path, based on its <script> tag.
+ 81 			var path = '';
+ 82 			var scripts = document.getElementsByTagName( 'script' );
+ 83
+ 84 			for ( var i = 0 ; i < scripts.length ; i++ )
+ 85 			{
+ 86 				var match = scripts[i].src.match( /(^|.*[\\\/])core\/loader.js(?:\?.*)?$/i );
+ 87
+ 88 				if ( match )
+ 89 				{
+ 90 					path = match[1];
+ 91 					break;
+ 92 				}
+ 93 			}
+ 94
+ 95 			// In IE (only) the script.src string is the raw valued entered in the
+ 96 			// HTML. Other browsers return the full resolved URL instead.
+ 97 			if ( path.indexOf('://') == -1 )
+ 98 			{
+ 99 				// Absolute path.
+100 				if ( path.indexOf( '/' ) === 0 )
+101 					path = location.href.match( /^.*?:\/\/[^\/]*/ )[0] + path;
+102 				// Relative path.
+103 				else
+104 					path = location.href.match( /^[^\?]*\// )[0] + path;
+105 			}
+106
+107 			return path;
+108 		})();
+109
+114 		var timestamp = '95MI';
+116
+117 		var getUrl = function( resource )
+118 		{
+119 			if ( CKEDITOR && CKEDITOR.getUrl )
+120 				return CKEDITOR.getUrl( resource );
+121
+122 			return basePath + resource +
+123 				( resource.indexOf( '?' ) >= 0 ? '&' : '?' ) +
+124 				't=' + timestamp;
+125 		};
+126
+127 		/** @lends CKEDITOR.loader */
+128 		return {
+129 			/**
+130 			 * The list of loaded scripts in their loading order.
+131 			 * @type Array
+132 			 * @example
+133 			 * // Alert the loaded script names.
+134 			 * alert( <b>CKEDITOR.loader.loadedScripts</b> );
+135 			 */
+136 			loadedScripts : [],
+137
+138 			/**
+139 			 * Loads a specific script, including its dependencies. This is not a
+140 			 * synchronous loading, which means that the code the be loaded will
+141 			 * not necessarily be available after this call.
+142 			 * @example
+143 			 * CKEDITOR.loader.load( 'core/dom/element' );
+144 			 */
+145 			load : function( scriptName )
+146 			{
+147 				// Check if the script has already been loaded.
+148 				if ( scriptName in this.loadedScripts )
+149 					return;
+150
+151 				// Get the script dependencies list.
+152 				var dependencies = scripts[ scriptName ];
+153 				if ( !dependencies )
+154 					throw 'The script name"' + scriptName + '" is not defined.';
+155
+156 				// Mark the script as loaded, even before really loading it, to
+157 				// avoid cross references recursion.
+158 				this.loadedScripts[ scriptName ] = true;
+159
+160 				// Load all dependencies first.
+161 				for ( var i = 0 ; i < dependencies.length ; i++ )
+162 					this.load( dependencies[ i ] );
+163
+164 				// Append this script to the list of loaded scripts.
+165 				this.loadedScripts.push( scriptName );
+166
+167 				var scriptSrc = getUrl( '_source/' + scriptName + '.js' );
+168
+169 				// Append the <script> element to the DOM.
+170 				if ( document.body )
+171 				{
+172 					var script = document.createElement( 'script' );
+173 					script.type = 'text/javascript';
+174 					script.src = scriptSrc;
+175
+176 					document.body.appendChild( script );
+177 				}
+178 				else
+179 					document.write( '<script src="' + scriptSrc + '" type="text/javascript"><\/script>' );
+180 			}
+181 		};
+182 	})();
+183 }
+184
+185 // Check if any script has been defined for autoload.
+186 if ( CKEDITOR._autoLoad )
+187 {
+188 	CKEDITOR.loader.load( CKEDITOR._autoLoad );
+189 	delete CKEDITOR._autoLoad;
+190 }
+191 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_plugindefinition.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_plugindefinition.js.html new file mode 100644 index 000000000..ed7c6805d --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_plugindefinition.js.html @@ -0,0 +1,74 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the "virtual" {@link CKEDITOR.pluginDefinition} class, which
+  8  *		contains the defintion of a plugin. This file is for documentation
+  9  *		purposes only.
+ 10  */
+ 11
+ 12 /**
+ 13  * (Virtual Class) Do not call this constructor. This class is not really part
+ 14  *		of the API. It just illustrates the features of plugin objects to be
+ 15  *		passed to the {@link CKEDITOR.plugins.add} function.
+ 16  * @name CKEDITOR.pluginDefinition
+ 17  * @constructor
+ 18  * @example
+ 19  */
+ 20
+ 21 /**
+ 22  * A list of plugins that are required by this plugin. Note that this property
+ 23  * doesn't guarantee the loading order of the plugins.
+ 24  * @name CKEDITOR.pluginDefinition.prototype.requires
+ 25  * @type Array
+ 26  * @example
+ 27  * CKEDITOR.plugins.add( 'sample',
+ 28  * {
+ 29  *     requires : [ 'button', 'selection' ]
+ 30  * });
+ 31  */
+ 32
+ 33  /**
+ 34  * Function called on initialization of every editor instance created in the
+ 35  * page before the init() call task. The beforeInit function will be called for
+ 36  * all plugins, after that the init function is called for all of them. This
+ 37  * feature makes it possible to initialize things that could be used in the
+ 38  * init function of other plugins.
+ 39  * @name CKEDITOR.pluginDefinition.prototype.beforeInit
+ 40  * @function
+ 41  * @param {CKEDITOR.editor} editor The editor instance being initialized.
+ 42  * @example
+ 43  * CKEDITOR.plugins.add( 'sample',
+ 44  * {
+ 45  *     beforeInit : function( editor )
+ 46  *     {
+ 47  *         alert( 'Editor "' + editor.name + '" is to be initialized!' );
+ 48  *     }
+ 49  * });
+ 50  */
+ 51
+ 52  /**
+ 53  * Function called on initialization of every editor instance created in the
+ 54  * page.
+ 55  * @name CKEDITOR.pluginDefinition.prototype.init
+ 56  * @function
+ 57  * @param {CKEDITOR.editor} editor The editor instance being initialized.
+ 58  * @example
+ 59  * CKEDITOR.plugins.add( 'sample',
+ 60  * {
+ 61  *     init : function( editor )
+ 62  *     {
+ 63  *         alert( 'Editor "' + editor.name + '" is being initialized!' );
+ 64  *     }
+ 65  * });
+ 66  */
+ 67 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_plugins.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_plugins.js.html new file mode 100644 index 000000000..7984c19cc --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_plugins.js.html @@ -0,0 +1,90 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.plugins} object, which is used to
+  8  *		manage plugins registration and loading.
+  9  */
+ 10
+ 11 /**
+ 12  * Manages plugins registration and loading.
+ 13  * @namespace
+ 14  * @augments CKEDITOR.resourceManager
+ 15  * @example
+ 16  */
+ 17 CKEDITOR.plugins = new CKEDITOR.resourceManager(
+ 19 	'plugins/', 'plugin' );
+ 20
+ 21 // PACKAGER_RENAME( CKEDITOR.plugins )
+ 22
+ 23 CKEDITOR.plugins.load = CKEDITOR.tools.override( CKEDITOR.plugins.load, function( originalLoad )
+ 24 	{
+ 25 		return function( name, callback, scope )
+ 26 		{
+ 27 			var allPlugins = {};
+ 28
+ 29 			var loadPlugins = function( names )
+ 30 			{
+ 31 				originalLoad.call( this, names, function( plugins )
+ 32 					{
+ 33 						CKEDITOR.tools.extend( allPlugins, plugins );
+ 34
+ 35 						var requiredPlugins = [];
+ 36 						for ( var pluginName in plugins )
+ 37 						{
+ 38 							var plugin = plugins[ pluginName ],
+ 39 								requires = plugin && plugin.requires;
+ 40
+ 41 							if ( requires )
+ 42 							{
+ 43 								for ( var i = 0 ; i < requires.length ; i++ )
+ 44 								{
+ 45 									if ( !allPlugins[ requires[ i ] ] )
+ 46 										requiredPlugins.push( requires[ i ] );
+ 47 								}
+ 48 							}
+ 49 						}
+ 50
+ 51 						if ( requiredPlugins.length )
+ 52 							loadPlugins.call( this, requiredPlugins );
+ 53 						else
+ 54 						{
+ 55 							// Call the "onLoad" function for all plugins.
+ 56 							for ( pluginName in allPlugins )
+ 57 							{
+ 58 								plugin = allPlugins[ pluginName ];
+ 59 								if ( plugin.onLoad && !plugin.onLoad._called )
+ 60 								{
+ 61 									plugin.onLoad();
+ 62 									plugin.onLoad._called = 1;
+ 63 								}
+ 64 							}
+ 65
+ 66 							// Call the callback.
+ 67 							if ( callback )
+ 68 								callback.call( scope || window, allPlugins );
+ 69 						}
+ 70 					}
+ 71 					, this);
+ 72
+ 73 			};
+ 74
+ 75 			loadPlugins.call( this, name );
+ 76 		};
+ 77 	});
+ 78
+ 79 CKEDITOR.plugins.setLang = function( pluginName, languageCode, languageEntries )
+ 80 {
+ 81 	var plugin = this.get( pluginName );
+ 82 	plugin.lang[ languageCode ] = languageEntries;
+ 83 };
+ 84 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_resourcemanager.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_resourcemanager.js.html new file mode 100644 index 000000000..41f481d82 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_resourcemanager.js.html @@ -0,0 +1,241 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.resourceManager} class, which is
+  8  *		the base for resource managers, like plugins and themes.
+  9  */
+ 10
+ 11  /**
+ 12  * Base class for resource managers, like plugins and themes. This class is not
+ 13  * intended to be used out of the CKEditor core code.
+ 14  * @param {String} basePath The path for the resources folder.
+ 15  * @param {String} fileName The name used for resource files.
+ 16  * @namespace
+ 17  * @example
+ 18  */
+ 19 CKEDITOR.resourceManager = function( basePath, fileName )
+ 20 {
+ 21 	/**
+ 22 	 * The base directory containing all resources.
+ 23 	 * @name CKEDITOR.resourceManager.prototype.basePath
+ 24 	 * @type String
+ 25 	 * @example
+ 26 	 */
+ 27 	this.basePath = basePath;
+ 28
+ 29 	/**
+ 30 	 * The name used for resource files.
+ 31 	 * @name CKEDITOR.resourceManager.prototype.fileName
+ 32 	 * @type String
+ 33 	 * @example
+ 34 	 */
+ 35 	this.fileName = fileName;
+ 36
+ 37 	/**
+ 38 	 * Contains references to all resources that have already been registered
+ 39 	 * with {@link #add}.
+ 40 	 * @name CKEDITOR.resourceManager.prototype.registered
+ 41 	 * @type Object
+ 42 	 * @example
+ 43 	 */
+ 44 	this.registered = {};
+ 45
+ 46 	/**
+ 47 	 * Contains references to all resources that have already been loaded
+ 48 	 * with {@link #load}.
+ 49 	 * @name CKEDITOR.resourceManager.prototype.loaded
+ 50 	 * @type Object
+ 51 	 * @example
+ 52 	 */
+ 53 	this.loaded = {};
+ 54
+ 55 	/**
+ 56 	 * Contains references to all resources that have already been registered
+ 57 	 * with {@link #addExternal}.
+ 58 	 * @name CKEDITOR.resourceManager.prototype.externals
+ 59 	 * @type Object
+ 60 	 * @example
+ 61 	 */
+ 62 	this.externals = {};
+ 63
+ 64 	/**
+ 65 	 * @private
+ 66 	 */
+ 67 	this._ =
+ 68 	{
+ 69 		// List of callbacks waiting for plugins to be loaded.
+ 70 		waitingList : {}
+ 71 	};
+ 72 };
+ 73
+ 74 CKEDITOR.resourceManager.prototype =
+ 75 {
+ 76 	/**
+ 77 	 * Registers a resource.
+ 78 	 * @param {String} name The resource name.
+ 79 	 * @param {Object} [definition] The resource definition.
+ 80 	 * @example
+ 81 	 * CKEDITOR.plugins.add( 'sample', { ... plugin definition ... } );
+ 82 	 * @see CKEDITOR.pluginDefinition
+ 83 	 */
+ 84 	add : function( name, definition )
+ 85 	{
+ 86 		if ( this.registered[ name ] )
+ 87 			throw '[CKEDITOR.resourceManager.add] The resource name "' + name + '" is already registered.';
+ 88
+ 89 		this.registered[ name ] = definition || {};
+ 90 	},
+ 91
+ 92 	/**
+ 93 	 * Gets the definition of a specific resource.
+ 94 	 * @param {String} name The resource name.
+ 95 	 * @type Object
+ 96 	 * @example
+ 97 	 * var definition = <b>CKEDITOR.plugins.get( 'sample' )</b>;
+ 98 	 */
+ 99 	get : function( name )
+100 	{
+101 		return this.registered[ name ] || null;
+102 	},
+103
+104 	/**
+105 	 * Get the folder path for a specific loaded resource.
+106 	 * @param {String} name The resource name.
+107 	 * @type String
+108 	 * @example
+109 	 * alert( <b>CKEDITOR.plugins.getPath( 'sample' )</b> );  // "<editor path>/plugins/sample/"
+110 	 */
+111 	getPath : function( name )
+112 	{
+113 		var external = this.externals[ name ];
+114 		return CKEDITOR.getUrl( ( external && external.dir ) || this.basePath + name + '/' );
+115 	},
+116
+117 	/**
+118 	 * Get the file path for a specific loaded resource.
+119 	 * @param {String} name The resource name.
+120 	 * @type String
+121 	 * @example
+122 	 * alert( <b>CKEDITOR.plugins.getFilePath( 'sample' )</b> );  // "<editor path>/plugins/sample/plugin.js"
+123 	 */
+124 	getFilePath : function( name )
+125 	{
+126 		var external = this.externals[ name ];
+127 		return CKEDITOR.getUrl(
+128 				this.getPath( name ) +
+129 				( ( external && external.file ) || ( this.fileName + '.js' ) ) );
+130 	},
+131
+132 	/**
+133 	 * Registers one or more resources to be loaded from an external path
+134 	 * instead of the core base path.
+135 	 * @param {String} names The resource names, separated by commas.
+136 	 * @param {String} path The path of the folder containing the resource.
+137 	 * @param {String} [fileName] The resource file name. If not provided, the
+138 	 *		default name is used.
+139 	 * @example
+140 	 * // Loads a plugin from '/myplugin/samples/plugin.js'.
+141 	 * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/' );
+142 	 * @example
+143 	 * // Loads a plugin from '/myplugin/samples/my_plugin.js'.
+144 	 * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/', 'my_plugin.js' );
+145 	 */
+146 	addExternal : function( names, path, fileName )
+147 	{
+148 		names = names.split( ',' );
+149 		for ( var i = 0 ; i < names.length ; i++ )
+150 		{
+151 			var name = names[ i ];
+152
+153 			this.externals[ name ] =
+154 			{
+155 				dir : path,
+156 				file : fileName
+157 			};
+158 		}
+159 	},
+160
+161 	/**
+162 	 * Loads one or more resources.
+163 	 * @param {String|Array} name The name of the resource to load. It may be a
+164 	 *		string with a single resource name, or an array with several names.
+165 	 * @param {Function} callback A function to be called when all resources
+166 	 *		are loaded. The callback will receive an array containing all
+167 	 *		loaded names.
+168 	 * @param {Object} [scope] The scope object to be used for the callback
+169 	 *		call.
+170 	 * @example
+171 	 * <b>CKEDITOR.plugins.load</b>( 'myplugin', function( plugins )
+172 	 *     {
+173 	 *         alert( plugins['myplugin'] );  // "object"
+174 	 *     });
+175 	 */
+176 	load : function( names, callback, scope )
+177 	{
+178 		// Ensure that we have an array of names.
+179 		if ( !CKEDITOR.tools.isArray( names ) )
+180 			names = names ? [ names ] : [];
+181
+182 		var loaded = this.loaded,
+183 			registered = this.registered,
+184 			urls = [],
+185 			urlsNames = {},
+186 			resources = {};
+187
+188 		// Loop through all names.
+189 		for ( var i = 0 ; i < names.length ; i++ )
+190 		{
+191 			var name = names[ i ];
+192
+193 			if ( !name )
+194 				continue;
+195
+196 			// If not available yet.
+197 			if ( !loaded[ name ] && !registered[ name ] )
+198 			{
+199 				var url = this.getFilePath( name );
+200 				urls.push( url );
+201 				if ( !( url in urlsNames ) )
+202 					urlsNames[ url ] = [];
+203 				urlsNames[ url ].push( name );
+204 			}
+205 			else
+206 				resources[ name ] = this.get( name );
+207 		}
+208
+209 		CKEDITOR.scriptLoader.load( urls, function( completed, failed )
+210 			{
+211 				if ( failed.length )
+212 				{
+213 					throw '[CKEDITOR.resourceManager.load] Resource name "' + urlsNames[ failed[ 0 ] ].join( ',' )
+214 						+ '" was not found at "' + failed[ 0 ] + '".';
+215 				}
+216
+217 				for ( var i = 0 ; i < completed.length ; i++ )
+218 				{
+219 					var nameList = urlsNames[ completed[ i ] ];
+220 					for ( var j = 0 ; j < nameList.length ; j++ )
+221 					{
+222 						var name = nameList[ j ];
+223 						resources[ name ] = this.get( name );
+224
+225 						loaded[ name ] = 1;
+226 					}
+227 				}
+228
+229 				callback.call( scope, resources );
+230 			}
+231 			, this);
+232 	}
+233 };
+234 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_scriptloader.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_scriptloader.js.html new file mode 100644 index 000000000..f0261ba5d --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_scriptloader.js.html @@ -0,0 +1,202 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.scriptLoader} object, used to load scripts
+  8  *		asynchronously.
+  9  */
+ 10
+ 11 /**
+ 12  * Load scripts asynchronously.
+ 13  * @namespace
+ 14  * @example
+ 15  */
+ 16 CKEDITOR.scriptLoader = (function()
+ 17 {
+ 18 	var uniqueScripts = {};
+ 19 	var waitingList = {};
+ 20
+ 21 	return /** @lends CKEDITOR.scriptLoader */ {
+ 22 		/**
+ 23 		 * Loads one or more external script checking if not already loaded
+ 24 		 * previously by this function.
+ 25 		 * @param {String|Array} scriptUrl One or more URLs pointing to the
+ 26 		 *		scripts to be loaded.
+ 27 		 * @param {Function} [callback] A function to be called when the script
+ 28 		 *		is loaded and executed. If a string is passed to "scriptUrl", a
+ 29 		 *		boolean parameter is passed to the callback, indicating the
+ 30 		 *		success of the load. If an array is passed instead, two array
+ 31 		 *		parameters are passed to the callback; the first contains the
+ 32 		 *		URLs that have been properly loaded, and the second the failed
+ 33 		 *		ones.
+ 34 		 * @param {Object} [scope] The scope ("this" reference) to be used for
+ 35 		 *		the callback call. Default to {@link CKEDITOR}.
+ 36 		 * @param {Boolean} [noCheck] Indicates that the script must be loaded
+ 37 		 *		anyway, not checking if it has already loaded.
+ 38 		 * @example
+ 39 		 * CKEDITOR.scriptLoader.load( '/myscript.js' );
+ 40 		 * @example
+ 41 		 * CKEDITOR.scriptLoader.load( '/myscript.js', function( success )
+ 42 		 *     {
+ 43 		 *         // Alerts "true" if the script has been properly loaded.
+ 44 		 *         // HTTP error 404 should return "false".
+ 45 		 *         alert( success );
+ 46 		 *     });
+ 47 		 * @example
+ 48 		 * CKEDITOR.scriptLoader.load( [ '/myscript1.js', '/myscript2.js' ], function( completed, failed )
+ 49 		 *     {
+ 50 		 *         alert( 'Number of scripts loaded: ' + completed.length );
+ 51 		 *         alert( 'Number of failures: ' + failed.length );
+ 52 		 *     });
+ 53 		 */
+ 54 		load : function( scriptUrl, callback, scope, noCheck )
+ 55 		{
+ 56 			var isString = ( typeof scriptUrl == 'string' );
+ 57
+ 58 			if ( isString )
+ 59 				scriptUrl = [ scriptUrl ];
+ 60
+ 61 			if ( !scope )
+ 62 				scope = CKEDITOR;
+ 63
+ 64 			var scriptCount = scriptUrl.length,
+ 65 				completed = [],
+ 66 				failed = [];
+ 67
+ 68 			var doCallback = function( success )
+ 69 			{
+ 70 				if ( callback )
+ 71 				{
+ 72 					if ( isString )
+ 73 						callback.call( scope, success );
+ 74 					else
+ 75 						callback.call( scope, completed, failed );
+ 76 				}
+ 77 			};
+ 78
+ 79 			if ( scriptCount === 0 )
+ 80 			{
+ 81 				doCallback( true );
+ 82 				return;
+ 83 			}
+ 84
+ 85 			var checkLoaded = function( url, success )
+ 86 			{
+ 87 				( success ? completed : failed ).push( url );
+ 88
+ 89 				if ( --scriptCount <= 0 )
+ 90 					doCallback( success );
+ 91 			};
+ 92
+ 93 			var onLoad = function( url, success )
+ 94 			{
+ 95 				// Mark this script as loaded.
+ 96 				uniqueScripts[ url ] = 1;
+ 97
+ 98 				// Get the list of callback checks waiting for this file.
+ 99 				var waitingInfo = waitingList[ url ];
+100 				delete waitingList[ url ];
+101
+102 				// Check all callbacks waiting for this file.
+103 				for ( var i = 0 ; i < waitingInfo.length ; i++ )
+104 					waitingInfo[ i ]( url, success );
+105 			};
+106
+107 			var loadScript = function( url )
+108 			{
+109 				if ( noCheck !== true && uniqueScripts[ url ] )
+110 				{
+111 					checkLoaded( url, true );
+112 					return;
+113 				}
+114
+115 				var waitingInfo = waitingList[ url ] || ( waitingList[ url ] = [] );
+116 				waitingInfo.push( checkLoaded );
+117
+118 				// Load it only for the first request.
+119 				if ( waitingInfo.length > 1 )
+120 					return;
+121
+122 				// Create the <script> element.
+123 				var script = new CKEDITOR.dom.element( 'script' );
+124 				script.setAttributes( {
+125 					type : 'text/javascript',
+126 					src : url } );
+127
+128 				if ( callback )
+129 				{
+130 					if ( CKEDITOR.env.ie )
+131 					{
+132 						// FIXME: For IE, we are not able to return false on error (like 404).
+133
+134 						/** @ignore */
+135 						script.$.onreadystatechange = function ()
+136 						{
+137 							if ( script.$.readyState == 'loaded' || script.$.readyState == 'complete' )
+138 							{
+139 								script.$.onreadystatechange = null;
+140 								onLoad( url, true );
+141 							}
+142 						};
+143 					}
+144 					else
+145 					{
+146 						/** @ignore */
+147 						script.$.onload = function()
+148 						{
+149 							// Some browsers, such as Safari, may call the onLoad function
+150 							// immediately. Which will break the loading sequence. (#3661)
+151 							setTimeout( function() { onLoad( url, true ); }, 0 );
+152 						};
+153
+154 						// FIXME: Opera and Safari will not fire onerror.
+155
+156 						/** @ignore */
+157 						script.$.onerror = function()
+158 						{
+159 							onLoad( url, false );
+160 						};
+161 					}
+162 				}
+163
+164 				// Append it to <head>.
+165 				script.appendTo( CKEDITOR.document.getHead() );
+166
+167 				CKEDITOR.fire( 'download', url );		// @Packager.RemoveLine
+168 			};
+169
+170 			for ( var i = 0 ; i < scriptCount ; i++ )
+171 			{
+172 				loadScript( scriptUrl[ i ] );
+173 			}
+174 		},
+175
+176 		/**
+177 		 * Executes a JavaScript code into the current document.
+178 		 * @param {String} code The code to be executed.
+179 		 * @example
+180 		 * CKEDITOR.scriptLoader.loadCode( 'var x = 10;' );
+181 		 * alert( x );  // "10"
+182 		 */
+183 		loadCode : function( code )
+184 		{
+185 			// Create the <script> element.
+186 			var script = new CKEDITOR.dom.element( 'script' );
+187 			script.setAttribute( 'type', 'text/javascript' );
+188 			script.appendText( code );
+189
+190 			// Append it to <head>.
+191 			script.appendTo( CKEDITOR.document.getHead() );
+192 		}
+193 	};
+194 })();
+195 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_skins.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_skins.js.html new file mode 100644 index 000000000..a05508829 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_skins.js.html @@ -0,0 +1,193 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.skins} object, which is used to
+  8  *		manage skins loading.
+  9  */
+ 10
+ 11 /**
+ 12  * Manages skins loading.
+ 13  * @namespace
+ 14  * @example
+ 15  */
+ 16 CKEDITOR.skins = (function()
+ 17 {
+ 18 	// Holds the list of loaded skins.
+ 19 	var loaded = {};
+ 20 	var preloaded = {};
+ 21 	var paths = {};
+ 22
+ 23 	var loadedPart = function( skinName, part, callback )
+ 24 	{
+ 25 		// Get the skin definition.
+ 26 		var skinDefinition = loaded[ skinName ];
+ 27
+ 28 		var appendSkinPath = function( fileNames )
+ 29 		{
+ 30 			for ( var n = 0 ; n < fileNames.length ; n++ )
+ 31 			{
+ 32 				fileNames[ n ] = CKEDITOR.getUrl( paths[ skinName ] + fileNames[ n ] );
+ 33 			}
+ 34 		};
+ 35
+ 36 		// Check if we need to preload images from it.
+ 37 		if ( !preloaded[ skinName ] )
+ 38 		{
+ 39 			var preload = skinDefinition.preload;
+ 40 			if ( preload && preload.length > 0 )
+ 41 			{
+ 42 				appendSkinPath( preload );
+ 43 				CKEDITOR.imageCacher.load( preload, function()
+ 44 					{
+ 45 						preloaded[ skinName ] = 1;
+ 46 						loadedPart( skinName, part, callback );
+ 47 					} );
+ 48 				return;
+ 49 			}
+ 50
+ 51 			// Mark it as preloaded.
+ 52 			preloaded[ skinName ] = 1;
+ 53 		}
+ 54
+ 55 		// Get the part definition.
+ 56 		part = skinDefinition[ part ];
+ 57 		var partIsLoaded = !part || !!part._isLoaded;
+ 58
+ 59 		// Call the callback immediately if already loaded.
+ 60 		if ( partIsLoaded )
+ 61 			callback && callback();
+ 62 		else
+ 63 		{
+ 64 			// Put the callback in a queue.
+ 65 			var pending = part._pending || ( part._pending = [] );
+ 66 			pending.push( callback );
+ 67
+ 68 			// We may have more than one skin part load request. Just the first
+ 69 			// one must do the loading job.
+ 70 			if ( pending.length > 1 )
+ 71 				return;
+ 72
+ 73 			// Check whether the "css" and "js" properties have been defined
+ 74 			// for that part.
+ 75 			var cssIsLoaded = !part.css || !part.css.length;
+ 76 			var jsIsLoaded = !part.js || !part.js.length;
+ 77
+ 78 			// This is the function that will trigger the callback calls on
+ 79 			// load.
+ 80 			var checkIsLoaded = function()
+ 81 			{
+ 82 				if ( cssIsLoaded && jsIsLoaded )
+ 83 				{
+ 84 					// Mark the part as loaded.
+ 85 					part._isLoaded = 1;
+ 86
+ 87 					// Call all pending callbacks.
+ 88 					for ( var i = 0 ; i < pending.length ; i++ )
+ 89 					{
+ 90 						if ( pending[ i ] )
+ 91 							pending[ i ]();
+ 92 					}
+ 93 				}
+ 94 			};
+ 95
+ 96 			// Load the "css" pieces.
+ 97 			if ( !cssIsLoaded )
+ 98 			{
+ 99 				appendSkinPath( part.css );
+100
+101 				for ( var c = 0 ; c < part.css.length ; c++ )
+102 					CKEDITOR.document.appendStyleSheet( part.css[ c ] );
+103
+104 				cssIsLoaded = 1;
+105 			}
+106
+107 			// Load the "js" pieces.
+108 			if ( !jsIsLoaded )
+109 			{
+110 				appendSkinPath( part.js );
+111 				CKEDITOR.scriptLoader.load( part.js, function()
+112 					{
+113 						jsIsLoaded = 1;
+114 						checkIsLoaded();
+115 					});
+116 			}
+117
+118 			// We may have nothing to load, so check it immediately.
+119 			checkIsLoaded();
+120 		}
+121 	};
+122
+123 	return /** @lends CKEDITOR.skins */ {
+124
+125 		/**
+126 		 * Registers a skin definition.
+127 		 * @param {String} skinName The skin name.
+128 		 * @param {Object} skinDefinition The skin definition.
+129 		 * @example
+130 		 */
+131 		add : function( skinName, skinDefinition )
+132 		{
+133 			loaded[ skinName ] = skinDefinition;
+134
+135 			skinDefinition.skinPath = paths[ skinName ]
+136 				|| ( paths[ skinName ] =
+137 						CKEDITOR.getUrl(
+139 							'skins/' + skinName + '/' ) );
+140 		},
+141
+142 		/**
+143 		 * Loads a skin part. Skins are defined in parts, which are basically
+144 		 * separated CSS files. This function is mainly used by the core code and
+145 		 * should not have much use out of it.
+146 		 * @param {String} skinName The name of the skin to be loaded.
+147 		 * @param {String} skinPart The skin part to be loaded. Common skin parts
+148 		 *		are "editor" and "dialog".
+149 		 * @param {Function} [callback] A function to be called once the skin
+150 		 *		part files are loaded.
+151 		 * @example
+152 		 */
+153 		load : function( editor, skinPart, callback )
+154 		{
+155 			var skinName = editor.skinName,
+156 				skinPath = editor.skinPath;
+157
+158 			if ( loaded[ skinName ] )
+159 			{
+160 				loadedPart( skinName, skinPart, callback );
+161
+162 				// Get the skin definition.
+163 				var skinDefinition = loaded[ skinName ];
+164
+165 				// Trigger init function if any.
+166 				if ( skinDefinition.init )
+167 					skinDefinition.init( editor );
+168 			}
+169 			else
+170 			{
+171 				paths[ skinName ] = skinPath;
+172 				CKEDITOR.scriptLoader.load( skinPath + 'skin.js', function()
+173 						{
+174 							loadedPart( skinName, skinPart, callback );
+175
+176 							// Get the skin definition.
+177 							var skinDefinition = loaded[ skinName ];
+178
+179 							// Trigger init function if any.
+180 							if ( skinDefinition.init )
+181 								skinDefinition.init( editor );
+182 						});
+183 			}
+184 		}
+185 	};
+186 })();
+187 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_test.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_test.js.html new file mode 100644 index 000000000..e12b651f6 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_test.js.html @@ -0,0 +1,132 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.test} object, which contains
+  8  *		functions used at our testing environment.
+  9  */
+ 10
+ 11 /*jsl:import ../tests/yuitest.js*/
+ 12
+ 13 /**
+ 14  * Contains functions used at our testing environment. Currently,
+ 15  * our testing system is based on the
+ 16  * <a href="http://developer.yahoo.com/yui/yuitest/">YUI Test</a>.
+ 17  * @namespace
+ 18  * @example
+ 19  */
+ 20 CKEDITOR.test =
+ 21 {
+ 22 	/**
+ 23 	 * The assertion namespace, containing all assertion functions. Currently,
+ 24 	 * this is an alias for
+ 25 	 * <a href="http://developer.yahoo.com/yui/docs/YAHOO.util.Assert.html">YAHOO.util.Assert</a>.
+ 26 	 * @example
+ 27 	 * <b>CKEDITOR.test.assert</b>.areEqual( '10', 10 );        // "true"
+ 28 	 * <b>CKEDITOR.test.assert</b>.areSame( '10', 10 );         // "false"
+ 29 	 * <b>CKEDITOR.test.assert</b>.isUndefined( window.test );  // "true"
+ 30 	 */
+ 31 	assert : YAHOO.util.Assert,
+ 32
+ 33 	/**
+ 34 	 * Adds a test case to the test runner.
+ 35 	 * @param {Object} testCase The test case object. See other tests for
+ 36 	 *		examples.
+ 37 	 * @example
+ 38 	 * <b>CKEDITOR.test.addTestCase</b>((function()
+ 39 	 * {
+ 40 	 *     // Local reference to the "assert" object.
+ 41 	 *     var assert = CKEDITOR.test.assert;
+ 42 	 *
+ 43 	 *     return {
+ 44 	 *         test_example : function()
+ 45 	 *         {
+ 46 	 *             assert.areSame( '10', 10 );  // FAIL
+ 47 	 *         }
+ 48 	 *      };
+ 49 	 * })());
+ 50 	 */
+ 51 	addTestCase : function( testCase )
+ 52 	{
+ 53 		YAHOO.tool.TestRunner.add( new YAHOO.tool.TestCase( testCase ) );
+ 54 	},
+ 55
+ 56 	/**
+ 57 	 * Gets the inner HTML of an element, for testing purposes.
+ 58 	 */
+ 59 	getInnerHtml : function( elementOrId )
+ 60 	{
+ 61 		var html;
+ 62
+ 63 		if ( typeof elementOrId == 'string' )
+ 64 			html = document.getElementById( elementOrId ).innerHTML;
+ 65 		else if ( elementOrId.getHtml )
+ 66 			html = elementOrId.getHtml();
+ 67 		else
+ 68 			html = elementOrId.innerHTML || '';
+ 69
+ 70 		html = html.toLowerCase();
+ 71 		html = html.replace( /[\n\r]/g, '' );
+ 72
+ 73 		html = html.replace( /<\w[^>]*/g, function( match )
+ 74 			{
+ 75 				var attribs = [];
+ 76 				var hasClass;
+ 77
+ 78 				match = match.replace( /\s([^\s=]+)=((?:"[^"]*")|(?:'[^']*')|(?:[^\s]+))/g, function( match, attName, attValue )
+ 79 					{
+ 80 						if ( attName == 'style' )
+ 81 						{
+ 82 							// Safari adds some extra space to the end.
+ 83 							attValue = attValue.replace( /\s+/g, '' );
+ 84
+ 85 							// IE doesn't add the final ";"
+ 86 							attValue = attValue.replace( /([^"';\s])\s*(["']?)$/, '$1;$2' );
+ 87 						}
+ 88
+ 89 						// IE may have 'class' more than once.
+ 90 						if ( attName == 'class' )
+ 91 						{
+ 92 							if ( hasClass )
+ 93 								return '';
+ 94
+ 95 							hasClass = true;
+ 96 						}
+ 97
+ 98 						if ( attName != '_cke_expando' )
+ 99 							attribs.push( [ attName, attValue ] );
+100
+101 						return '';
+102 					} );
+103
+104 				attribs.sort( function( a, b )
+105 					{
+106 						var nameA = a[ 0 ];
+107 						var nameB = b[ 0 ];
+108 						return nameA < nameB ? -1 : nameA > nameB ? 1 : 0;
+109 					} );
+110
+111 				var ret = match.replace( /\s{2,}/g, ' ' );
+112
+113 				for ( var i = 0 ; i < attribs.length ; i++ )
+114 				{
+115 					ret += ' ' + attribs[i][0] + '=';
+116 					ret += (/^["']/).test( attribs[i][1] ) ? attribs[i][1] : '"' + attribs[i][1] + '"';
+117 				}
+118
+119 				return ret;
+120 			} );
+121
+122 		return html;
+123 	}
+124 };
+125 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_themes.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_themes.js.html new file mode 100644 index 000000000..d206d4d68 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_themes.js.html @@ -0,0 +1,26 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.themes} object, which is used to
+  8  *		manage themes registration and loading.
+  9  */
+ 10
+ 11 /**
+ 12  * Manages themes registration and loading.
+ 13  * @namespace
+ 14  * @augments CKEDITOR.resourceManager
+ 15  * @example
+ 16  */
+ 17 CKEDITOR.themes = new CKEDITOR.resourceManager(
+ 19 	'themes/', 'theme' );
+ 20 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_tools.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_tools.js.html new file mode 100644 index 000000000..45aaf5826 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_tools.js.html @@ -0,0 +1,516 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.tools} object, which contains
+  8  *		utility functions.
+  9  */
+ 10
+ 11 (function()
+ 12 {
+ 13 	var functions = [];
+ 14
+ 15 	/**
+ 16 	 * Utility functions.
+ 17 	 * @namespace
+ 18 	 * @example
+ 19 	 */
+ 20 	CKEDITOR.tools =
+ 21 	{
+ 22 		arrayCompare : function( arrayA, arrayB )
+ 23 		{
+ 24 			if ( !arrayA && !arrayB )
+ 25 				return true;
+ 26
+ 27 			if ( !arrayA || !arrayB || arrayA.length != arrayB.length )
+ 28 				return false;
+ 29
+ 30 			for ( var i = 0 ; i < arrayA.length ; i++ )
+ 31 			{
+ 32 				if ( arrayA[ i ] != arrayB[ i ] )
+ 33 					return false;
+ 34 			}
+ 35
+ 36 			return true;
+ 37 		},
+ 38
+ 39 		/**
+ 40 		 * Creates a deep copy of an object.
+ 41 		 * Attention: there is no support for recursive references.
+ 42 		 * @param {Object} object The object to be cloned.
+ 43 		 * @returns {Object} The object clone.
+ 44 		 * @example
+ 45 		 * var obj =
+ 46 		 *     {
+ 47 		 *         name : 'John',
+ 48 		 *         cars :
+ 49 		 *             {
+ 50 		 *                 Mercedes : { color : 'blue' },
+ 51 		 *                 Porsche : { color : 'red' }
+ 52 		 *             }
+ 53 		 *     };
+ 54 		 * var clone = CKEDITOR.tools.clone( obj );
+ 55 		 * clone.name = 'Paul';
+ 56 		 * clone.cars.Porsche.color = 'silver';
+ 57 		 * alert( obj.name );	// John
+ 58 		 * alert( clone.name );	// Paul
+ 59 		 * alert( obj.cars.Porsche.color );	// red
+ 60 		 * alert( clone.cars.Porsche.color );	// silver
+ 61 		 */
+ 62 		clone : function( obj )
+ 63 		{
+ 64 			var clone;
+ 65
+ 66 			// Array.
+ 67 			if ( obj && ( obj instanceof Array ) )
+ 68 			{
+ 69 				clone = [];
+ 70
+ 71 				for ( var i = 0 ; i < obj.length ; i++ )
+ 72 					clone[ i ] = this.clone( obj[ i ] );
+ 73
+ 74 				return clone;
+ 75 			}
+ 76
+ 77 			// "Static" types.
+ 78 			if ( obj === null
+ 79 				|| ( typeof( obj ) != 'object' )
+ 80 				|| ( obj instanceof String )
+ 81 				|| ( obj instanceof Number )
+ 82 				|| ( obj instanceof Boolean )
+ 83 				|| ( obj instanceof Date ) )
+ 84 			{
+ 85 				return obj;
+ 86 			}
+ 87
+ 88 			// Objects.
+ 89 			clone = new obj.constructor();
+ 90
+ 91 			for ( var propertyName in obj )
+ 92 			{
+ 93 				var property = obj[ propertyName ];
+ 94 				clone[ propertyName ] = this.clone( property );
+ 95 			}
+ 96
+ 97 			return clone;
+ 98 		},
+ 99
+100 		/**
+101 		 * Copy the properties from one object to another. By default, properties
+102 		 * already present in the target object <strong>are not</strong> overwritten.
+103 		 * @param {Object} target The object to be extended.
+104 		 * @param {Object} source[,souce(n)] The objects from which copy
+105 		 *		properties. Any number of objects can be passed to this function.
+106 		 * @param {Boolean} [overwrite] If 'true' is specified it indicates that
+107 		 *            properties already present in the target object could be
+108 		 *            overwritten by subsequent objects.
+109 		 * @param {Object} [properties] Only properties within the specified names
+110 		 *            list will be received from the source object.
+111 		 * @returns {Object} the extended object (target).
+112 		 * @example
+113 		 * // Create the sample object.
+114 		 * var myObject =
+115 		 * {
+116 		 *     prop1 : true
+117 		 * };
+118 		 *
+119 		 * // Extend the above object with two properties.
+120 		 * CKEDITOR.tools.extend( myObject,
+121 		 *     {
+122 		 *         prop2 : true,
+123 		 *         prop3 : true
+124 		 *     } );
+125 		 *
+126 		 * // Alert "prop1", "prop2" and "prop3".
+127 		 * for ( var p in myObject )
+128 		 *     alert( p );
+129 		 */
+130 		extend : function( target )
+131 		{
+132 			var argsLength = arguments.length,
+133 				overwrite, propertiesList;
+134
+135 			if ( typeof ( overwrite = arguments[ argsLength - 1 ] ) == 'boolean')
+136 				argsLength--;
+137 			else if ( typeof ( overwrite = arguments[ argsLength - 2 ] ) == 'boolean' )
+138 			{
+139 				propertiesList = arguments [ argsLength -1 ];
+140 				argsLength-=2;
+141 			}
+142 			for ( var i = 1 ; i < argsLength ; i++ )
+143 			{
+144 				var source = arguments[ i ];
+145 				for ( var propertyName in source )
+146 				{
+147 					// Only copy existed fields if in overwrite mode.
+148 					if ( overwrite === true || target[ propertyName ] == undefined )
+149 					{
+150 						// Only copy  specified fields if list is provided.
+151 						if ( !propertiesList || ( propertyName in propertiesList ) )
+152 							target[ propertyName ] = source[ propertyName ];
+153
+154 					}
+155 				}
+156 			}
+157
+158 			return target;
+159 		},
+160
+161 		/**
+162 		 * Creates an object which is an instance of a class which prototype is a
+163 		 * predefined object. All properties defined in the source object are
+164 		 * automatically inherited by the resulting object, including future
+165 		 * changes to it.
+166 		 * @param {Object} source The source object to be used as the prototype for
+167 		 *		the final object.
+168 		 * @returns {Object} The resulting copy.
+169 		 */
+170 		prototypedCopy : function( source )
+171 		{
+172 			var copy = function()
+173 			{};
+174 			copy.prototype = source;
+175 			return new copy();
+176 		},
+177
+178 		/**
+179 		 * Checks if an object is an Array.
+180 		 * @param {Object} object The object to be checked.
+181 		 * @type Boolean
+182 		 * @returns <i>true</i> if the object is an Array, otherwise <i>false</i>.
+183 		 * @example
+184 		 * alert( CKEDITOR.tools.isArray( [] ) );      // "true"
+185 		 * alert( CKEDITOR.tools.isArray( 'Test' ) );  // "false"
+186 		 */
+187 		isArray : function( object )
+188 		{
+189 			return ( !!object && object instanceof Array );
+190 		},
+191
+192 		/**
+193 		 * Transforms a CSS property name to its relative DOM style name.
+194 		 * @param {String} cssName The CSS property name.
+195 		 * @returns {String} The transformed name.
+196 		 * @example
+197 		 * alert( CKEDITOR.tools.cssStyleToDomStyle( 'background-color' ) );  // "backgroundColor"
+198 		 * alert( CKEDITOR.tools.cssStyleToDomStyle( 'float' ) );             // "cssFloat"
+199 		 */
+200 		cssStyleToDomStyle : function( cssName )
+201 		{
+202 			if ( cssName == 'float' )
+203 				return 'cssFloat';
+204 			else
+205 			{
+206 				return cssName.replace( /-./g, function( match )
+207 					{
+208 						return match.substr( 1 ).toUpperCase();
+209 					});
+210 			}
+211 		},
+212
+213 		/**
+214 		 * Replace special HTML characters in a string with their relative HTML
+215 		 * entity values.
+216 		 * @param {String} text The string to be encoded.
+217 		 * @returns {String} The encode string.
+218 		 * @example
+219 		 * alert( CKEDITOR.tools.htmlEncode( 'A > B & C < D' ) );  // "A &gt; B &amp; C &lt; D"
+220 		 */
+221 		htmlEncode : function( text )
+222 		{
+223 			var standard = function( text )
+224 			{
+225 				var span = new CKEDITOR.dom.element( 'span' );
+226 				span.setText( text );
+227 				return span.getHtml();
+228 			};
+229
+230 			this.htmlEncode = ( standard( '>' ) == '>' ) ?
+231 				function( text )
+232 				{
+233 					// WebKit does't encode the ">" character, which makes sense, but
+234 					// it's different than other browsers.
+235 					return standard( text ).replace( />/g, '>' );
+236 				} :
+237 				standard;
+238
+239 			return this.htmlEncode( text );
+240 		},
+241
+242 		/**
+243 		 * Gets a unique number for this CKEDITOR execution session. It returns
+244 		 * progressive numbers starting at 1.
+245 		 * @function
+246 		 * @returns {Number} A unique number.
+247 		 * @example
+248 		 * alert( CKEDITOR.tools.<b>getNextNumber()</b> );  // "1" (e.g.)
+249 		 * alert( CKEDITOR.tools.<b>getNextNumber()</b> );  // "2"
+250 		 */
+251 		getNextNumber : (function()
+252 		{
+253 			var last = 0;
+254 			return function()
+255 			{
+256 				return ++last;
+257 			};
+258 		})(),
+259
+260 		/**
+261 		 * Creates a function override.
+262 		 * @param {Function} originalFunction The function to be overridden.
+263 		 * @param {Function} functionBuilder A function that returns the new
+264 		 *		function. The original function reference will be passed to this
+265 		 *		function.
+266 		 * @returns {Function} The new function.
+267 		 * @example
+268 		 * var example =
+269 		 * {
+270 		 *     myFunction : function( name )
+271 		 *     {
+272 		 *         alert( 'Name: ' + name );
+273 		 *     }
+274 		 * };
+275 		 *
+276 		 * example.myFunction = CKEDITOR.tools.override( example.myFunction, function( myFunctionOriginal )
+277 		 *     {
+278 		 *         return function( name )
+279 		 *             {
+280 		 *                 alert( 'Override Name: ' + name );
+281 		 *                 myFunctionOriginal.call( this, name );
+282 		 *             };
+283 		 *     });
+284 		 */
+285 		override : function( originalFunction, functionBuilder )
+286 		{
+287 			return functionBuilder( originalFunction );
+288 		},
+289
+290 		/**
+291 		 * Executes a function after specified delay.
+292 		 * @param {Function} func The function to be executed.
+293 		 * @param {Number} [milliseconds] The amount of time (millisecods) to wait
+294 		 *		to fire the function execution. Defaults to zero.
+295 		 * @param {Object} [scope] The object to hold the function execution scope
+296 		 *		(the "this" object). By default the "window" object.
+297 		 * @param {Object|Array} [args] A single object, or an array of objects, to
+298 		 *		pass as arguments to the function.
+299 		 * @param {Object} [ownerWindow] The window that will be used to set the
+300 		 *		timeout. By default the current "window".
+301 		 * @returns {Object} A value that can be used to cancel the function execution.
+302 		 * @example
+303 		 * CKEDITOR.tools.<b>setTimeout(
+304 		 *     function()
+305 		 *     {
+306 		 *         alert( 'Executed after 2 seconds' );
+307 		 *     },
+308 		 *     2000 )</b>;
+309 		 */
+310 		setTimeout : function( func, milliseconds, scope, args, ownerWindow )
+311 		{
+312 			if ( !ownerWindow )
+313 				ownerWindow = window;
+314
+315 			if ( !scope )
+316 				scope = ownerWindow;
+317
+318 			return ownerWindow.setTimeout(
+319 				function()
+320 				{
+321 					if ( args )
+322 						func.apply( scope, [].concat( args ) ) ;
+323 					else
+324 						func.apply( scope ) ;
+325 				},
+326 				milliseconds || 0 );
+327 		},
+328
+329 		/**
+330 		 * Remove spaces from the start and the end of a string. The following
+331 		 * characters are removed: space, tab, line break, line feed.
+332 		 * @function
+333 		 * @param {String} str The text from which remove the spaces.
+334 		 * @returns {String} The modified string without the boundary spaces.
+335 		 * @example
+336 		 * alert( CKEDITOR.tools.trim( '  example ' );  // "example"
+337 		 */
+338 		trim : (function()
+339 		{
+340 			// We are not using \s because we don't want "non-breaking spaces" to be caught.
+341 			var trimRegex = /(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;
+342 			return function( str )
+343 			{
+344 				return str.replace( trimRegex, '' ) ;
+345 			};
+346 		})(),
+347
+348 		/**
+349 		 * Remove spaces from the start (left) of a string. The following
+350 		 * characters are removed: space, tab, line break, line feed.
+351 		 * @function
+352 		 * @param {String} str The text from which remove the spaces.
+353 		 * @returns {String} The modified string excluding the removed spaces.
+354 		 * @example
+355 		 * alert( CKEDITOR.tools.ltrim( '  example ' );  // "example "
+356 		 */
+357 		ltrim : (function()
+358 		{
+359 			// We are not using \s because we don't want "non-breaking spaces" to be caught.
+360 			var trimRegex = /^[ \t\n\r]+/g;
+361 			return function( str )
+362 			{
+363 				return str.replace( trimRegex, '' ) ;
+364 			};
+365 		})(),
+366
+367 		/**
+368 		 * Remove spaces from the end (right) of a string. The following
+369 		 * characters are removed: space, tab, line break, line feed.
+370 		 * @function
+371 		 * @param {String} str The text from which remove the spaces.
+372 		 * @returns {String} The modified string excluding the removed spaces.
+373 		 * @example
+374 		 * alert( CKEDITOR.tools.ltrim( '  example ' );  // "  example"
+375 		 */
+376 		rtrim : (function()
+377 		{
+378 			// We are not using \s because we don't want "non-breaking spaces" to be caught.
+379 			var trimRegex = /[ \t\n\r]+$/g;
+380 			return function( str )
+381 			{
+382 				return str.replace( trimRegex, '' ) ;
+383 			};
+384 		})(),
+385
+386 		/**
+387 		 * Returns the index of an element in an array.
+388 		 * @param {Array} array The array to be searched.
+389 		 * @param {Object} entry The element to be found.
+390 		 * @returns {Number} The (zero based) index of the first entry that matches
+391 		 *		the entry, or -1 if not found.
+392 		 * @example
+393 		 * var letters = [ 'a', 'b', 0, 'c', false ];
+394 		 * alert( CKEDITOR.tools.indexOf( letters, '0' ) );  "-1" because 0 !== '0'
+395 		 * alert( CKEDITOR.tools.indexOf( letters, false ) );  "4" because 0 !== false
+396 		 */
+397 		indexOf :
+398 			// #2514: We should try to use Array.indexOf if it does exist.
+399 			( Array.prototype.indexOf ) ?
+400 				function( array, entry )
+401 					{
+402 						return array.indexOf( entry );
+403 					}
+404 			:
+405 				function( array, entry )
+406 				{
+407 					for ( var i = 0, len = array.length ; i < len ; i++ )
+408 					{
+409 						if ( array[ i ] === entry )
+410 							return i;
+411 					}
+412 					return -1;
+413 				},
+414
+415 		bind : function( func, obj )
+416 		{
+417 			return function() { return func.apply( obj, arguments ); };
+418 		},
+419
+420 		/**
+421 		 * Class creation based on prototype inheritance, with supports of the
+422 		 * following features:
+423 		 * <ul>
+424 		 * <li> Static fields </li>
+425 		 * <li> Private fields </li>
+426 		 * <li> Public(prototype) fields </li>
+427 		 * <li> Chainable base class constructor </li>
+428 		 * </ul>
+429 		 *
+430 		 * @param {Object} definiton (Optional)The class definiton object.
+431 		 */
+432 		createClass : function( definition )
+433 		{
+434 			var $ = definition.$,
+435 				baseClass = definition.base,
+436 				privates = definition.privates || definition._,
+437 				proto = definition.proto,
+438 				statics = definition.statics;
+439
+440 			if ( privates )
+441 			{
+442 				var originalConstructor = $;
+443 				$ = function()
+444 				{
+445 					// Create (and get) the private namespace.
+446 					var _ = this._ || ( this._ = {} );
+447
+448 					// Make some magic so "this" will refer to the main
+449 					// instance when coding private functions.
+450 					for ( var privateName in privates )
+451 					{
+452 						var priv = privates[ privateName ];
+453
+454 						_[ privateName ] =
+455 							( typeof priv == 'function' ) ? CKEDITOR.tools.bind( priv, this ) : priv;
+456 					}
+457
+458 					originalConstructor.apply( this, arguments );
+459 				};
+460 			}
+461
+462 			if ( baseClass )
+463 			{
+464 				$.prototype = this.prototypedCopy( baseClass.prototype );
+465 				$.prototype.constructor = $;
+466 				$.prototype.base = function()
+467 				{
+468 					this.base = baseClass.prototype.base;
+469 					baseClass.apply( this, arguments );
+470 					this.base = arguments.callee;
+471 				};
+472 			}
+473
+474 			if ( proto )
+475 				this.extend( $.prototype, proto, true );
+476
+477 			if ( statics )
+478 				this.extend( $, statics, true );
+479
+480 			return $;
+481 		},
+482
+483 		addFunction : function( fn, scope )
+484 		{
+485 			return functions.push( function()
+486 				{
+487 					fn.apply( scope || this, arguments );
+488 				}) - 1;
+489 		},
+490
+491 		callFunction : function( index )
+492 		{
+493 			var fn = functions[ index ];
+494 			return fn.apply( window, Array.prototype.slice.call( arguments, 1 ) );
+495 		},
+496
+497 		cssLength : (function()
+498 		{
+499 			var decimalRegex = /^\d+(?:\.\d+)?$/;
+500 			return function( length )
+501 			{
+502 				return length + ( decimalRegex.test( length ) ? 'px' : '' );
+503 			};
+504 		})()
+505 	};
+506 })();
+507
+508 // PACKAGER_RENAME( CKEDITOR.tools )
+509 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ui.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ui.js.html new file mode 100644 index 000000000..25ae657a1 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_ui.js.html @@ -0,0 +1,114 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * Contains UI features related to an editor instance.
+  8  * @constructor
+  9  * @param {CKEDITOR.editor} editor The editor instance.
+ 10  * @example
+ 11  */
+ 12 CKEDITOR.ui = function( editor )
+ 13 {
+ 14 	if ( editor.ui )
+ 15 		return editor.ui;
+ 16
+ 17 	/**
+ 18 	 * Object used to hold private stuff.
+ 19 	 * @private
+ 20 	 */
+ 21 	this._ =
+ 22 	{
+ 23 		handlers : {},
+ 24 		items : {}
+ 25 	};
+ 26
+ 27 	return this;
+ 28 };
+ 29
+ 30 // PACKAGER_RENAME( CKEDITOR.ui )
+ 31
+ 32 CKEDITOR.ui.prototype =
+ 33 {
+ 34 	/**
+ 35 	 * Adds a UI item to the items collection. These items can be later used in
+ 36 	 * the interface.
+ 37 	 * @param {String} name The UI item name.
+ 38 	 * @param {Object} type The item type.
+ 39 	 * @param {Object} definition The item definition. The properties of this
+ 40 	 *		object depend on the item type.
+ 41 	 * @example
+ 42 	 * // Add a new button named "MyBold".
+ 43 	 * editorInstance.ui.add( 'MyBold', CKEDITOR.UI_BUTTON,
+ 44 	 *     {
+ 45 	 *         label : 'My Bold',
+ 46 	 *         command : 'bold'
+ 47 	 *     });
+ 48 	 */
+ 49 	add : function( name, type, definition )
+ 50 	{
+ 51 		this._.items[ name ] =
+ 52 		{
+ 53 			type : type,
+ 54 			args : Array.prototype.slice.call( arguments, 2 )
+ 55 		};
+ 56 	},
+ 57
+ 58 	/**
+ 59 	 * Gets a UI object.
+ 60 	 * @param {String} name The UI item hame.
+ 61 	 * @example
+ 62 	 */
+ 63 	create : function( name )
+ 64 	{
+ 65 		var item	= this._.items[ name ],
+ 66 			handler	= item && this._.handlers[ item.type ];
+ 67
+ 68 		return handler && handler.create.apply( this, item.args );
+ 69 	},
+ 70
+ 71 	/**
+ 72 	 * Adds a handler for a UI item type. The handler is responsible for
+ 73 	 * transforming UI item definitions in UI objects.
+ 74 	 * @param {Object} type The item type.
+ 75 	 * @param {Object} handler The handler definition.
+ 76 	 * @example
+ 77 	 */
+ 78 	addHandler : function( type, handler )
+ 79 	{
+ 80 		this._.handlers[ type ] = handler;
+ 81 	}
+ 82 };
+ 83
+ 84 /**
+ 85  * (Virtual Class) Do not call this constructor. This class is not really part
+ 86  *		of the API. It just illustrates the features of hanlder objects to be
+ 87  *		passed to the {@link CKEDITOR.ui.prototype.addHandler} function.
+ 88  * @name CKEDITOR.ui.handlerDefinition
+ 89  * @constructor
+ 90  * @example
+ 91  */
+ 92
+ 93  /**
+ 94  * Transforms an item definition into an UI item object.
+ 95  * @name CKEDITOR.handlerDefinition.prototype.create
+ 96  * @function
+ 97  * @param {Object} definition The item definition.
+ 98  * @example
+ 99  * editorInstance.ui.addHandler( CKEDITOR.UI_BUTTON,
+100  *     {
+101  *         create : function( definition )
+102  *         {
+103  *             return new CKEDITOR.ui.button( definition );
+104  *         }
+105  *     });
+106  */
+107 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_xml.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_xml.js.html new file mode 100644 index 000000000..21346b5b6 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/core_xml.js.html @@ -0,0 +1,173 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.xml} class, which represents a
+  8  *		loaded XML document.
+  9  */
+ 10
+ 11 /**
+ 12  * Represents a loaded XML document.
+ 13  * @constructor
+ 14  * @param {object|string} xmlObjectOrData A native XML (DOM document) object or
+ 15  *		a string containing the XML definition to be loaded.
+ 16  * @example
+ 17  * var xml = <b>new CKEDITOR.xml( '<books><book title="My Book" /></books>' )</b>;
+ 18  */
+ 19 CKEDITOR.xml = function( xmlObjectOrData )
+ 20 {
+ 21 	var baseXml = null;
+ 22
+ 23 	if ( typeof xmlObjectOrData == 'object' )
+ 24 		baseXml = xmlObjectOrData;
+ 25 	else
+ 26 	{
+ 27 		var data = ( xmlObjectOrData || '' ).replace( / /g, '\xA0' );
+ 28 		if ( window.DOMParser )
+ 29 			baseXml = (new DOMParser()).parseFromString( data, 'text/xml' );
+ 30 		else if ( window.ActiveXObject )
+ 31 		{
+ 32 			try { baseXml = new ActiveXObject( 'MSXML2.DOMDocument' ); }
+ 33 			catch(e)
+ 34 			{
+ 35 				try { baseXml = new ActiveXObject( 'Microsoft.XmlDom' ); } catch(e) {}
+ 36 			}
+ 37
+ 38 			if ( baseXml )
+ 39 			{
+ 40 				baseXml.async = false;
+ 41 				baseXml.resolveExternals = false;
+ 42 				baseXml.validateOnParse = false;
+ 43 				baseXml.loadXML( data );
+ 44 			}
+ 45 		}
+ 46 	}
+ 47
+ 48 	/**
+ 49 	 * The native XML (DOM document) used by the class instance.
+ 50 	 * @type object
+ 51 	 * @example
+ 52 	 */
+ 53 	this.baseXml = baseXml;
+ 54 };
+ 55
+ 56 CKEDITOR.xml.prototype =
+ 57 {
+ 58 	/**
+ 59 	 * Get a single node from the XML document, based on a XPath query.
+ 60 	 * @param {String} xpath The XPath query to execute.
+ 61 	 * @param {Object} [contextNode] The XML DOM node to be used as the context
+ 62 	 *		for the XPath query. The document root is used by default.
+ 63 	 * @returns {Object} A XML node element or null if the query has no results.
+ 64 	 * @example
+ 65 	 * // Create the XML instance.
+ 66 	 * var xml = new CKEDITOR.xml( '<list><item id="test1" /><item id="test2" /></list>' );
+ 67 	 * // Get the first <item> node.
+ 68 	 * var itemNode = <b>xml.selectSingleNode( 'list/item' )</b>;
+ 69 	 * // Alert "item".
+ 70 	 * alert( itemNode.nodeName );
+ 71 	 */
+ 72 	selectSingleNode : function( xpath, contextNode )
+ 73 	{
+ 74 		var baseXml = this.baseXml;
+ 75
+ 76 		if ( contextNode || ( contextNode = baseXml ) )
+ 77 		{
+ 78 			if ( CKEDITOR.env.ie || contextNode.selectSingleNode )	// IE
+ 79 				return contextNode.selectSingleNode( xpath );
+ 80 			else if ( baseXml.evaluate )							// Others
+ 81 			{
+ 82 				var result = baseXml.evaluate( xpath, contextNode, null, 9, null);
+ 83 				return ( result && result.singleNodeValue ) || null;
+ 84 			}
+ 85 		}
+ 86
+ 87 		return null;
+ 88 	},
+ 89
+ 90 	/**
+ 91 	 * Gets a list node from the XML document, based on a XPath query.
+ 92 	 * @param {String} xpath The XPath query to execute.
+ 93 	 * @param {Object} [contextNode] The XML DOM node to be used as the context
+ 94 	 *		for the XPath query. The document root is used by default.
+ 95 	 * @returns {ArrayLike} An array containing all matched nodes. The array will
+ 96 	 *		be empty if the query has no results.
+ 97 	 * @example
+ 98 	 * // Create the XML instance.
+ 99 	 * var xml = new CKEDITOR.xml( '<list><item id="test1" /><item id="test2" /></list>' );
+100 	 * // Get the first <item> node.
+101 	 * var itemNodes = xml.selectSingleNode( 'list/item' );
+102 	 * // Alert "item" twice, one for each <item>.
+103 	 * for ( var i = 0 ; i < itemNodes.length ; i++ )
+104 	 *     alert( itemNodes[i].nodeName );
+105 	 */
+106 	selectNodes : function( xpath, contextNode )
+107 	{
+108 		var baseXml = this.baseXml,
+109 			nodes = [];
+110
+111 		if ( contextNode || ( contextNode = baseXml ) )
+112 		{
+113 			if ( CKEDITOR.env.ie || contextNode.selectNodes )		// IE
+114 				return contextNode.selectNodes( xpath );
+115 			else if ( baseXml.evaluate )							// Others
+116 			{
+117 				var result = baseXml.evaluate( xpath, contextNode, null, 5, null);
+118
+119 				if ( result )
+120 				{
+121 					var node;
+122 					while( ( node = result.iterateNext() ) )
+123 						nodes.push( node );
+124 				}
+125 			}
+126 		}
+127
+128 		return nodes;
+129 	},
+130
+131 	/**
+132 	 * Gets the string representation of hte inner contents of a XML node,
+133 	 * based on a XPath query.
+134 	 * @param {String} xpath The XPath query to execute.
+135 	 * @param {Object} [contextNode] The XML DOM node to be used as the context
+136 	 *		for the XPath query. The document root is used by default.
+137 	 * @returns {String} The textual representation of the inner contents of
+138 	 *		the node or null if the query has no results.
+139 	 * @example
+140 	 * // Create the XML instance.
+141 	 * var xml = new CKEDITOR.xml( '<list><item id="test1" /><item id="test2" /></list>' );
+142 	 * // Alert "<item id="test1" /><item id="test2" />".
+143 	 * alert( xml.getInnerXml( 'list' ) );
+144 	 */
+145 	getInnerXml : function( xpath, contextNode )
+146 	{
+147 		var node = this.selectSingleNode( xpath, contextNode ),
+148 			xml = [];
+149 		if ( node )
+150 		{
+151 			node = node.firstChild;
+152 			while ( node )
+153 			{
+154 				if ( node.xml )				// IE
+155 					xml.push( node.xml );
+156 				else if ( window.XMLSerializer )	// Others
+157 					xml.push( ( new XMLSerializer() ).serializeToString( node ) );
+158
+159 				node = node.nextSibling;
+160 			}
+161 		}
+162
+163 		return xml.length ? xml.join( '' ) : null;
+164 	}
+165 };
+166 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/lang_en.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/lang_en.js.html new file mode 100644 index 000000000..0398ea4e4 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/lang_en.js.html @@ -0,0 +1,681 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the {@link CKEDITOR.lang} object, for the English
+  8  *		language. This is the base file for all translations.
+  9  */
+ 10
+ 11 /**#@+
+ 12    @type String
+ 13    @example
+ 14 */
+ 15
+ 16 /**
+ 17  * Constains the dictionary of language entries.
+ 18  * @namespace
+ 19  */
+ 20 CKEDITOR.lang['en'] =
+ 21 {
+ 22 	/**
+ 23 	 * The language reading direction. Possible values are "rtl" for
+ 24 	 * Right-To-Left languages (like Arabic) and "ltr" for Left-To-Right
+ 25 	 * languages (like English).
+ 26 	 * @default 'ltr'
+ 27 	 */
+ 28 	dir : 'ltr',
+ 29
+ 30 	/*
+ 31 	 * Screenreader titles. Please note that screenreaders are not always capable
+ 32 	 * of reading non-English words. So be careful while translating it.
+ 33 	 */
+ 34 	editorTitle		: 'Rich text editor, %1',
+ 35
+ 36 	// Toolbar buttons without dialogs.
+ 37 	source			: 'Source',
+ 38 	newPage			: 'New Page',
+ 39 	save			: 'Save',
+ 40 	preview			: 'Preview',
+ 41 	cut				: 'Cut',
+ 42 	copy			: 'Copy',
+ 43 	paste			: 'Paste',
+ 44 	print			: 'Print',
+ 45 	underline		: 'Underline',
+ 46 	bold			: 'Bold',
+ 47 	italic			: 'Italic',
+ 48 	selectAll		: 'Select All',
+ 49 	removeFormat	: 'Remove Format',
+ 50 	strike			: 'Strike Through',
+ 51 	subscript		: 'Subscript',
+ 52 	superscript		: 'Superscript',
+ 53 	horizontalrule	: 'Insert Horizontal Line',
+ 54 	pagebreak		: 'Insert Page Break for Printing',
+ 55 	unlink			: 'Unlink',
+ 56 	undo			: 'Undo',
+ 57 	redo			: 'Redo',
+ 58
+ 59 	// Common messages and labels.
+ 60 	common :
+ 61 	{
+ 62 		browseServer	: 'Browse Server',
+ 63 		url				: 'URL',
+ 64 		protocol		: 'Protocol',
+ 65 		upload			: 'Upload',
+ 66 		uploadSubmit	: 'Send it to the Server',
+ 67 		image			: 'Image',
+ 68 		flash			: 'Flash',
+ 69 		form			: 'Form',
+ 70 		checkbox		: 'Checkbox',
+ 71 		radio		: 'Radio Button',
+ 72 		textField		: 'Text Field',
+ 73 		textarea		: 'Textarea',
+ 74 		hiddenField		: 'Hidden Field',
+ 75 		button			: 'Button',
+ 76 		select	: 'Selection Field',
+ 77 		imageButton		: 'Image Button',
+ 78 		notSet			: '<not set>',
+ 79 		id				: 'Id',
+ 80 		name			: 'Name',
+ 81 		langDir			: 'Language Direction',
+ 82 		langDirLtr		: 'Left to Right (LTR)',
+ 83 		langDirRtl		: 'Right to Left (RTL)',
+ 84 		langCode		: 'Language Code',
+ 85 		longDescr		: 'Long Description URL',
+ 86 		cssClass		: 'Stylesheet Classes',
+ 87 		advisoryTitle	: 'Advisory Title',
+ 88 		cssStyle		: 'Style',
+ 89 		ok				: 'OK',
+ 90 		cancel			: 'Cancel',
+ 91 		generalTab		: 'General',
+ 92 		advancedTab		: 'Advanced',
+ 93 		validateNumberFailed	: 'This value is not a number.',
+ 94 		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',
+ 95 		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?',
+ 96
+ 97 		// Put the voice-only part of the label in the span.
+ 98 		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>'
+ 99 	},
+100
+101 	// Special char dialog.
+102 	specialChar		:
+103 	{
+104 		toolbar		: 'Insert Special Character',
+105 		title		: 'Select Special Character'
+106 	},
+107
+108 	// Link dialog.
+109 	link :
+110 	{
+111 		toolbar		: 'Link',
+112 		menu		: 'Edit Link',
+113 		title		: 'Link',
+114 		info		: 'Link Info',
+115 		target		: 'Target',
+116 		upload		: 'Upload',
+117 		advanced	: 'Advanced',
+118 		type		: 'Link Type',
+119 		toAnchor	: 'Link to anchor in the text',
+120 		toEmail		: 'E-mail',
+121 		target		: 'Target',
+122 		targetNotSet	: '<not set>',
+123 		targetFrame	: '<frame>',
+124 		targetPopup	: '<popup window>',
+125 		targetNew	: 'New Window (_blank)',
+126 		targetTop	: 'Topmost Window (_top)',
+127 		targetSelf	: 'Same Window (_self)',
+128 		targetParent	: 'Parent Window (_parent)',
+129 		targetFrameName	: 'Target Frame Name',
+130 		targetPopupName	: 'Popup Window Name',
+131 		popupFeatures	: 'Popup Window Features',
+132 		popupResizable	: 'Resizable',
+133 		popupStatusBar	: 'Status Bar',
+134 		popupLocationBar	: 'Location Bar',
+135 		popupToolbar	: 'Toolbar',
+136 		popupMenuBar	: 'Menu Bar',
+137 		popupFullScreen	: 'Full Screen (IE)',
+138 		popupScrollBars	: 'Scroll Bars',
+139 		popupDependent	: 'Dependent (Netscape)',
+140 		popupWidth		: 'Width',
+141 		popupLeft		: 'Left Position',
+142 		popupHeight		: 'Height',
+143 		popupTop		: 'Top Position',
+144 		id				: 'Id',
+145 		langDir			: 'Language Direction',
+146 		langDirNotSet	: '<not set>',
+147 		langDirLTR		: 'Left to Right (LTR)',
+148 		langDirRTL		: 'Right to Left (RTL)',
+149 		acccessKey		: 'Access Key',
+150 		name			: 'Name',
+151 		langCode		: 'Language Code',
+152 		tabIndex		: 'Tab Index',
+153 		advisoryTitle	: 'Advisory Title',
+154 		advisoryContentType	: 'Advisory Content Type',
+155 		cssClasses		: 'Stylesheet Classes',
+156 		charset			: 'Linked Resource Charset',
+157 		styles			: 'Style',
+158 		selectAnchor	: 'Select an Anchor',
+159 		anchorName		: 'By Anchor Name',
+160 		anchorId		: 'By Element Id',
+161 		emailAddress	: 'E-Mail Address',
+162 		emailSubject	: 'Message Subject',
+163 		emailBody		: 'Message Body',
+164 		noAnchors		: '(No anchors available in the document)',
+165 		noUrl			: 'Please type the link URL',
+166 		noEmail			: 'Please type the e-mail address'
+167 	},
+168
+169 	// Anchor dialog
+170 	anchor :
+171 	{
+172 		toolbar		: 'Anchor',
+173 		menu		: 'Edit Anchor',
+174 		title		: 'Anchor Properties',
+175 		name		: 'Anchor Name',
+176 		errorName	: 'Please type the anchor name'
+177 	},
+178
+179 	// Find And Replace Dialog
+180 	findAndReplace :
+181 	{
+182 		title				: 'Find and Replace',
+183 		find				: 'Find',
+184 		replace				: 'Replace',
+185 		findWhat			: 'Find what:',
+186 		replaceWith			: 'Replace with:',
+187 		notFoundMsg			: 'The specified text was not found.',
+188 		matchCase			: 'Match case',
+189 		matchWord			: 'Match whole word',
+190 		matchCyclic			: 'Match cyclic',
+191 		replaceAll			: 'Replace All',
+192 		replaceSuccessMsg	: '%1 occurrence(s) replaced.'
+193 	},
+194
+195 	// Table Dialog
+196 	table :
+197 	{
+198 		toolbar		: 'Table',
+199 		title		: 'Table Properties',
+200 		menu		: 'Table Properties',
+201 		deleteTable	: 'Delete Table',
+202 		rows		: 'Rows',
+203 		columns		: 'Columns',
+204 		border		: 'Border size',
+205 		align		: 'Alignment',
+206 		alignNotSet	: '<Not set>',
+207 		alignLeft	: 'Left',
+208 		alignCenter	: 'Center',
+209 		alignRight	: 'Right',
+210 		width		: 'Width',
+211 		widthPx		: 'pixels',
+212 		widthPc		: 'percent',
+213 		height		: 'Height',
+214 		cellSpace	: 'Cell spacing',
+215 		cellPad		: 'Cell padding',
+216 		caption		: 'Caption',
+217 		summary		: 'Summary',
+218 		headers		: 'Headers',
+219 		headersNone		: 'None',
+220 		headersColumn	: 'First column',
+221 		headersRow		: 'First Row',
+222 		headersBoth		: 'Both',
+223 		invalidRows		: 'Number of rows must be a number greater than 0.',
+224 		invalidCols		: 'Number of columns must be a number greater than 0.',
+225 		invalidBorder	: 'Border size must be a number.',
+226 		invalidWidth	: 'Table width must be a number.',
+227 		invalidHeight	: 'Table height must be a number.',
+228 		invalidCellSpacing	: 'Cell spacing must be a number.',
+229 		invalidCellPadding	: 'Cell padding must be a number.',
+230
+231 		cell :
+232 		{
+233 			menu			: 'Cell',
+234 			insertBefore	: 'Insert Cell Before',
+235 			insertAfter		: 'Insert Cell After',
+236 			deleteCell		: 'Delete Cells',
+237 			merge			: 'Merge Cells',
+238 			mergeRight		: 'Merge Right',
+239 			mergeDown		: 'Merge Down',
+240 			splitHorizontal	: 'Split Cell Horizontally',
+241 			splitVertical	: 'Split Cell Vertically',
+242 			title			: 'Cell Properties',
+243 			cellType		: 'Cell Type',
+244 			rowSpan			: 'Rows Span',
+245 			colSpan			: 'Columns Span',
+246 			wordWrap		: 'Word Wrap',
+247 			hAlign			: 'Horizontal Alignment',
+248 			vAlign			: 'Vertical Alignment',
+249 			alignTop		: 'Top',
+250 			alignMiddle		: 'Middle',
+251 			alignBottom		: 'Bottom',
+252 			alignBaseline	: 'Baseline',
+253 			bgColor			: 'Background Color',
+254 			borderColor		: 'Border Color',
+255 			data			: 'Data',
+256 			header			: 'Header',
+257 			yes				: 'Yes',
+258 			no				: 'No',
+259 			invalidWidth	: 'Cell width must be a number.',
+260 			invalidHeight	: 'Cell height must be a number.',
+261 			invalidRowSpan	: 'Rows span must be a whole number.',
+262 			invalidColSpan	: 'Columns span must be a whole number.'
+263 		},
+264
+265 		row :
+266 		{
+267 			menu			: 'Row',
+268 			insertBefore	: 'Insert Row Before',
+269 			insertAfter		: 'Insert Row After',
+270 			deleteRow		: 'Delete Rows'
+271 		},
+272
+273 		column :
+274 		{
+275 			menu			: 'Column',
+276 			insertBefore	: 'Insert Column Before',
+277 			insertAfter		: 'Insert Column After',
+278 			deleteColumn	: 'Delete Columns'
+279 		}
+280 	},
+281
+282 	// Button Dialog.
+283 	button :
+284 	{
+285 		title		: 'Button Properties',
+286 		text		: 'Text (Value)',
+287 		type		: 'Type',
+288 		typeBtn		: 'Button',
+289 		typeSbm		: 'Submit',
+290 		typeRst		: 'Reset'
+291 	},
+292
+293 	// Checkbox and Radio Button Dialogs.
+294 	checkboxAndRadio :
+295 	{
+296 		checkboxTitle : 'Checkbox Properties',
+297 		radioTitle	: 'Radio Button Properties',
+298 		value		: 'Value',
+299 		selected	: 'Selected'
+300 	},
+301
+302 	// Form Dialog.
+303 	form :
+304 	{
+305 		title		: 'Form Properties',
+306 		menu		: 'Form Properties',
+307 		action		: 'Action',
+308 		method		: 'Method',
+309 		encoding	: 'Encoding',
+310 		target		: 'Target',
+311 		targetNotSet	: '<not set>',
+312 		targetNew	: 'New Window (_blank)',
+313 		targetTop	: 'Topmost Window (_top)',
+314 		targetSelf	: 'Same Window (_self)',
+315 		targetParent	: 'Parent Window (_parent)'
+316 	},
+317
+318 	// Select Field Dialog.
+319 	select :
+320 	{
+321 		title		: 'Selection Field Properties',
+322 		selectInfo	: 'Select Info',
+323 		opAvail		: 'Available Options',
+324 		value		: 'Value',
+325 		size		: 'Size',
+326 		lines		: 'lines',
+327 		chkMulti	: 'Allow multiple selections',
+328 		opText		: 'Text',
+329 		opValue		: 'Value',
+330 		btnAdd		: 'Add',
+331 		btnModify	: 'Modify',
+332 		btnUp		: 'Up',
+333 		btnDown		: 'Down',
+334 		btnSetValue : 'Set as selected value',
+335 		btnDelete	: 'Delete'
+336 	},
+337
+338 	// Textarea Dialog.
+339 	textarea :
+340 	{
+341 		title		: 'Textarea Properties',
+342 		cols		: 'Columns',
+343 		rows		: 'Rows'
+344 	},
+345
+346 	// Text Field Dialog.
+347 	textfield :
+348 	{
+349 		title		: 'Text Field Properties',
+350 		name		: 'Name',
+351 		value		: 'Value',
+352 		charWidth	: 'Character Width',
+353 		maxChars	: 'Maximum Characters',
+354 		type		: 'Type',
+355 		typeText	: 'Text',
+356 		typePass	: 'Password'
+357 	},
+358
+359 	// Hidden Field Dialog.
+360 	hidden :
+361 	{
+362 		title	: 'Hidden Field Properties',
+363 		name	: 'Name',
+364 		value	: 'Value'
+365 	},
+366
+367 	// Image Dialog.
+368 	image :
+369 	{
+370 		title		: 'Image Properties',
+371 		titleButton	: 'Image Button Properties',
+372 		menu		: 'Image Properties',
+373 		infoTab	: 'Image Info',
+374 		btnUpload	: 'Send it to the Server',
+375 		url		: 'URL',
+376 		upload	: 'Upload',
+377 		alt		: 'Alternative Text',
+378 		width		: 'Width',
+379 		height	: 'Height',
+380 		lockRatio	: 'Lock Ratio',
+381 		resetSize	: 'Reset Size',
+382 		border	: 'Border',
+383 		hSpace	: 'HSpace',
+384 		vSpace	: 'VSpace',
+385 		align		: 'Align',
+386 		alignLeft	: 'Left',
+387 		alignAbsBottom: 'Abs Bottom',
+388 		alignAbsMiddle: 'Abs Middle',
+389 		alignBaseline	: 'Baseline',
+390 		alignBottom	: 'Bottom',
+391 		alignMiddle	: 'Middle',
+392 		alignRight	: 'Right',
+393 		alignTextTop	: 'Text Top',
+394 		alignTop	: 'Top',
+395 		preview	: 'Preview',
+396 		alertUrl	: 'Please type the image URL',
+397 		linkTab	: 'Link',
+398 		button2Img	: 'Do you want to transform the selected image button on a simple image?',
+399 		img2Button	: 'Do you want to transform the selected image on a image button?'
+400 	},
+401
+402 	// Flash Dialog
+403 	flash :
+404 	{
+405 		properties		: 'Flash Properties',
+406 		propertiesTab	: 'Properties',
+407 		title		: 'Flash Properties',
+408 		chkPlay		: 'Auto Play',
+409 		chkLoop		: 'Loop',
+410 		chkMenu		: 'Enable Flash Menu',
+411 		chkFull		: 'Allow Fullscreen',
+412  		scale		: 'Scale',
+413 		scaleAll		: 'Show all',
+414 		scaleNoBorder	: 'No Border',
+415 		scaleFit		: 'Exact Fit',
+416 		access			: 'Script Access',
+417 		accessAlways	: 'Always',
+418 		accessSameDomain	: 'Same domain',
+419 		accessNever	: 'Never',
+420 		align		: 'Align',
+421 		alignLeft	: 'Left',
+422 		alignAbsBottom: 'Abs Bottom',
+423 		alignAbsMiddle: 'Abs Middle',
+424 		alignBaseline	: 'Baseline',
+425 		alignBottom	: 'Bottom',
+426 		alignMiddle	: 'Middle',
+427 		alignRight	: 'Right',
+428 		alignTextTop	: 'Text Top',
+429 		alignTop	: 'Top',
+430 		quality		: 'Quality',
+431 		qualityBest		 : 'Best',
+432 		qualityHigh		 : 'High',
+433 		qualityAutoHigh	 : 'Auto High',
+434 		qualityMedium	 : 'Medium',
+435 		qualityAutoLow	 : 'Auto Low',
+436 		qualityLow		 : 'Low',
+437 		windowModeWindow	 : 'Window',
+438 		windowModeOpaque	 : 'Opaque',
+439 		windowModeTransparent	 : 'Transparent',
+440 		windowMode	: 'Window mode',
+441 		flashvars	: 'Variables for Flash',
+442 		bgcolor	: 'Background color',
+443 		width	: 'Width',
+444 		height	: 'Height',
+445 		hSpace	: 'HSpace',
+446 		vSpace	: 'VSpace',
+447 		validateSrc : 'URL must not be empty.',
+448 		validateWidth : 'Width must be a number.',
+449 		validateHeight : 'Height must be a number.',
+450 		validateHSpace : 'HSpace must be a number.',
+451 		validateVSpace : 'VSpace must be a number.'
+452 	},
+453
+454 	// Speller Pages Dialog
+455 	spellCheck :
+456 	{
+457 		toolbar			: 'Check Spelling',
+458 		title			: 'Spell Check',
+459 		notAvailable	: 'Sorry, but service is unavailable now.',
+460 		errorLoading	: 'Error loading application service host: %s.',
+461 		notInDic		: 'Not in dictionary',
+462 		changeTo		: 'Change to',
+463 		btnIgnore		: 'Ignore',
+464 		btnIgnoreAll	: 'Ignore All',
+465 		btnReplace		: 'Replace',
+466 		btnReplaceAll	: 'Replace All',
+467 		btnUndo			: 'Undo',
+468 		noSuggestions	: '- No suggestions -',
+469 		progress		: 'Spell check in progress...',
+470 		noMispell		: 'Spell check complete: No misspellings found',
+471 		noChanges		: 'Spell check complete: No words changed',
+472 		oneChange		: 'Spell check complete: One word changed',
+473 		manyChanges		: 'Spell check complete: %1 words changed',
+474 		ieSpellDownload	: 'Spell checker not installed. Do you want to download it now?'
+475 	},
+476
+477 	smiley :
+478 	{
+479 		toolbar	: 'Smiley',
+480 		title	: 'Insert a Smiley'
+481 	},
+482
+483 	elementsPath :
+484 	{
+485 		eleTitle : '%1 element'
+486 	},
+487
+488 	numberedlist : 'Insert/Remove Numbered List',
+489 	bulletedlist : 'Insert/Remove Bulleted List',
+490 	indent : 'Increase Indent',
+491 	outdent : 'Decrease Indent',
+492
+493 	justify :
+494 	{
+495 		left : 'Left Justify',
+496 		center : 'Center Justify',
+497 		right : 'Right Justify',
+498 		block : 'Block Justify'
+499 	},
+500
+501 	blockquote : 'Blockquote',
+502
+503 	clipboard :
+504 	{
+505 		title		: 'Paste',
+506 		cutError	: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl+X).',
+507 		copyError	: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl+C).',
+508 		pasteMsg	: 'Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit OK',
+509 		securityMsg	: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.'
+510 	},
+511
+512 	pastefromword :
+513 	{
+514 		toolbar : 'Paste from Word',
+515 		title : 'Paste from Word',
+516 		advice : 'Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit <strong>OK</strong>.',
+517 		ignoreFontFace : 'Ignore Font Face definitions',
+518 		removeStyle : 'Remove Styles definitions'
+519 	},
+520
+521 	pasteText :
+522 	{
+523 		button : 'Paste as plain text',
+524 		title : 'Paste as Plain Text'
+525 	},
+526
+527 	templates :
+528 	{
+529 		button : 'Templates',
+530 		title : 'Content Templates',
+531 		insertOption: 'Replace actual contents',
+532 		selectPromptMsg: 'Please select the template to open in the editor',
+533 		emptyListMsg : '(No templates defined)'
+534 	},
+535
+536 	showBlocks : 'Show Blocks',
+537
+538 	stylesCombo :
+539 	{
+540 		label : 'Styles',
+541 		voiceLabel : 'Styles',
+542 		panelVoiceLabel : 'Select a style',
+543 		panelTitle1 : 'Block Styles',
+544 		panelTitle2 : 'Inline Styles',
+545 		panelTitle3 : 'Object Styles'
+546 	},
+547
+548 	format :
+549 	{
+550 		label : 'Format',
+551 		voiceLabel : 'Format',
+552 		panelTitle : 'Paragraph Format',
+553 		panelVoiceLabel : 'Select a paragraph format',
+554
+555 		tag_p : 'Normal',
+556 		tag_pre : 'Formatted',
+557 		tag_address : 'Address',
+558 		tag_h1 : 'Heading 1',
+559 		tag_h2 : 'Heading 2',
+560 		tag_h3 : 'Heading 3',
+561 		tag_h4 : 'Heading 4',
+562 		tag_h5 : 'Heading 5',
+563 		tag_h6 : 'Heading 6',
+564 		tag_div : 'Normal (DIV)'
+565 	},
+566
+567 	font :
+568 	{
+569 		label : 'Font',
+570 		voiceLabel : 'Font',
+571 		panelTitle : 'Font Name',
+572 		panelVoiceLabel : 'Select a font'
+573 	},
+574
+575 	fontSize :
+576 	{
+577 		label : 'Size',
+578 		voiceLabel : 'Font Size',
+579 		panelTitle : 'Font Size',
+580 		panelVoiceLabel : 'Select a font size'
+581 	},
+582
+583 	colorButton :
+584 	{
+585 		textColorTitle : 'Text Color',
+586 		bgColorTitle : 'Background Color',
+587 		auto : 'Automatic',
+588 		more : 'More Colors...'
+589 	},
+590
+591 	colors :
+592 	{
+593 		'000' : 'Black',
+594 		'800000' : 'Maroon',
+595 		'8B4513' : 'Saddle Brown',
+596 		'2F4F4F' : 'Dark Slate Gray',
+597 		'008080' : 'Teal',
+598 		'000080' : 'Navy',
+599 		'4B0082' : 'Indigo',
+600 		'696969' : 'Dim Gray',
+601 		'B22222' : 'Fire Brick',
+602 		'A52A2A' : 'Brown',
+603 		'DAA520' : 'Golden Rod',
+604 		'006400' : 'Dark Green',
+605 		'40E0D0' : 'Turquoise',
+606 		'0000CD' : 'Medium Blue',
+607 		'800080' : 'Purple',
+608 		'808080' : 'Gray',
+609 		'F00' : 'Red',
+610 		'FF8C00' : 'Dark Orange',
+611 		'FFD700' : 'Gold',
+612 		'008000' : 'Green',
+613 		'0FF' : 'Cyan',
+614 		'00F' : 'Blue',
+615 		'EE82EE' : 'Violet',
+616 		'A9A9A9' : 'Dark Gray',
+617 		'FFA07A' : 'Light Salmon',
+618 		'FFA500' : 'Orange',
+619 		'FFFF00' : 'Yellow',
+620 		'00FF00' : 'Lime',
+621 		'AFEEEE' : 'Pale Turquoise',
+622 		'ADD8E6' : 'Light Blue',
+623 		'DDA0DD' : 'Plum',
+624 		'D3D3D3' : 'Light Grey',
+625 		'FFF0F5' : 'Lavender Blush',
+626 		'FAEBD7' : 'Antique White',
+627 		'FFFFE0' : 'Light Yellow',
+628 		'F0FFF0' : 'Honeydew',
+629 		'F0FFFF' : 'Azure',
+630 		'F0F8FF' : 'Alice Blue',
+631 		'E6E6FA' : 'Lavender',
+632 		'FFF' : 'White'
+633 	},
+634
+635 	scayt :
+636 	{
+637 		title : 'Spell Check As You Type',
+638 		enable : 'Enable SCAYT',
+639 		disable : 'Disable SCAYT',
+640 		about : 'About SCAYT',
+641 		toggle : 'Toggle SCAYT',
+642 		options : 'Options',
+643 		langs : 'Languages',
+644 		moreSuggestions : 'More suggestions',
+645 		ignore : 'Ignore',
+646 		ignoreAll : 'Ignore All',
+647 		addWord : 'Add Word',
+648 		emptyDic : 'Dictionary name should not be empty.',
+649 		optionsTab : 'Options',
+650 		languagesTab : 'Languages',
+651 		dictionariesTab : 'Dictionaries',
+652 		aboutTab : 'About'
+653 	},
+654
+655 	about :
+656 	{
+657 		title : 'About CKEditor',
+658 		moreInfo : 'For licensing information please visit our web site:',
+659 		copy : 'Copyright © $1. All rights reserved.'
+660 	},
+661
+662 	maximize : 'Maximize',
+663
+664 	fakeobjects :
+665 	{
+666 		anchor : 'Anchor',
+667 		flash : 'Flash Animation',
+668 		div : 'Page Break',
+669 		unknown : 'Unknown Object'
+670 	},
+671
+672 	resize : 'Drag to resize'
+673 };
+674 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_about_dialogs_about.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_about_dialogs_about.js.html new file mode 100644 index 000000000..ae771ba61 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_about_dialogs_about.js.html @@ -0,0 +1,81 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dialog.add( 'about', function( editor )
+  7 {
+  8 	var lang = editor.lang.about;
+  9
+ 10 	return {
+ 11 		title : lang.title,
+ 12 		minWidth : 390,
+ 13 		minHeight : 230,
+ 14 		contents : [
+ 15 			{
+ 16 				id : 'tab1',
+ 17 				label : '',
+ 18 				title : '',
+ 19 				expand : true,
+ 20 				padding : 0,
+ 21 				elements :
+ 22 				[
+ 23 					{
+ 24 						type : 'html',
+ 25 						html :
+ 26 							'<style type="text/css">' +
+ 27 								'.cke_about_container' +
+ 28 								'{' +
+ 29 									'color:#000 !important;' +
+ 30 									'padding:10px 10px 0;' +
+ 31 									'margin-top:5px' +
+ 32 								'}' +
+ 33 								'.cke_about_container p' +
+ 34 								'{' +
+ 35 									'margin: 0 0 10px;' +
+ 36 								'}' +
+ 37 								'.cke_about_container .cke_about_logo' +
+ 38 								'{' +
+ 39 									'height:81px;' +
+ 40 									'background-color:#fff;' +
+ 41 									'background-image:url(' + CKEDITOR.plugins.get( 'about' ).path + 'dialogs/logo_ckeditor.png);' +
+ 42 									'background-position:center; ' +
+ 43 									'background-repeat:no-repeat;' +
+ 44 									'margin-bottom:10px;' +
+ 45 								'}' +
+ 46 								'.cke_about_container a' +
+ 47 								'{' +
+ 48 									'cursor:pointer !important;' +
+ 49 									'color:blue !important;' +
+ 50 									'text-decoration:underline !important;' +
+ 51 								'}' +
+ 52 							'</style>' +
+ 53 							'<div class="cke_about_container">' +
+ 54 								'<div class="cke_about_logo"></div>' +
+ 55 								'<p>' +
+ 56 									'CKEditor ' + CKEDITOR.version + ' (revision ' + CKEDITOR.revision + ')<br>' +
+ 57 									'<a href="http://ckeditor.com/">http://ckeditor.com</a>' +
+ 58 								'</p>' +
+ 59 								'<p>' +
+ 60 									lang.moreInfo + '<br>' +
+ 61 									'<a href="http://ckeditor.com/license">http://ckeditor.com/license</a>' +
+ 62 								'</p>' +
+ 63 								'<p>' +
+ 64 									lang.copy.replace( '$1', '<a href="http://cksource.com/">CKSource</a> - Frederico Knabben' ) +
+ 65 								'</p>' +
+ 66 							'</div>'
+ 67 					}
+ 68 				]
+ 69 			}
+ 70 		],
+ 71 		buttons : [ CKEDITOR.dialog.cancelButton ]
+ 72 	};
+ 73 } );
+ 74 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_about_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_about_plugin.js.html new file mode 100644 index 000000000..a1accc1fe --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_about_plugin.js.html @@ -0,0 +1,30 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'about',
+  7 {
+  8 	init : function( editor )
+  9 	{
+ 10 		var command = editor.addCommand( 'about', new CKEDITOR.dialogCommand( 'about' ) );
+ 11 		command.modes = { wysiwyg:1, source:1 };
+ 12 		command.canUndo = false;
+ 13
+ 14 		editor.ui.addButton( 'About',
+ 15 			{
+ 16 				label : editor.lang.about.title,
+ 17 				command : 'about'
+ 18 			});
+ 19
+ 20 		CKEDITOR.dialog.add( 'about', this.path + 'dialogs/about.js' );
+ 21 	}
+ 22 });
+ 23 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_basicstyles_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_basicstyles_plugin.js.html new file mode 100644 index 000000000..839ad5bae --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_basicstyles_plugin.js.html @@ -0,0 +1,58 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'basicstyles',
+  7 {
+  8 	requires : [ 'styles', 'button' ],
+  9
+ 10 	init : function( editor )
+ 11 	{
+ 12 		// All buttons use the same code to register. So, to avoid
+ 13 		// duplications, let's use this tool function.
+ 14 		var addButtonCommand = function( buttonName, buttonLabel, commandName, styleDefiniton )
+ 15 		{
+ 16 			var style = new CKEDITOR.style( styleDefiniton );
+ 17
+ 18 			editor.attachStyleStateChange( style, function( state )
+ 19 				{
+ 20 					editor.getCommand( commandName ).setState( state );
+ 21 				});
+ 22
+ 23 			editor.addCommand( commandName, new CKEDITOR.styleCommand( style ) );
+ 24
+ 25 			editor.ui.addButton( buttonName,
+ 26 				{
+ 27 					label : buttonLabel,
+ 28 					command : commandName
+ 29 				});
+ 30 		};
+ 31
+ 32 		var config = editor.config;
+ 33 		var lang = editor.lang;
+ 34
+ 35 		addButtonCommand( 'Bold'		, lang.bold			, 'bold'		, config.coreStyles_bold );
+ 36 		addButtonCommand( 'Italic'		, lang.italic		, 'italic'		, config.coreStyles_italic );
+ 37 		addButtonCommand( 'Underline'	, lang.underline	, 'underline'	, config.coreStyles_underline );
+ 38 		addButtonCommand( 'Strike'		, lang.strike		, 'strike'		, config.coreStyles_strike );
+ 39 		addButtonCommand( 'Subscript'	, lang.subscript	, 'subscript'	, config.coreStyles_subscript );
+ 40 		addButtonCommand( 'Superscript'	, lang.superscript	, 'superscript'	, config.coreStyles_superscript );
+ 41 	}
+ 42 });
+ 43
+ 44 // Basic Inline Styles.
+ 45 CKEDITOR.config.coreStyles_bold			= { element : 'strong', overrides : 'b' };
+ 46 CKEDITOR.config.coreStyles_italic		= { element : 'em', overrides : 'i' };
+ 47 CKEDITOR.config.coreStyles_underline	= { element : 'u' };
+ 48 CKEDITOR.config.coreStyles_strike		= { element : 'strike' };
+ 49 CKEDITOR.config.coreStyles_subscript	= { element : 'sub' };
+ 50 CKEDITOR.config.coreStyles_superscript	= { element : 'sup' };
+ 51 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_blockquote_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_blockquote_plugin.js.html new file mode 100644 index 000000000..c9f915ba5 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_blockquote_plugin.js.html @@ -0,0 +1,309 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Blockquote.
+  8  */
+  9
+ 10 (function()
+ 11 {
+ 12 	function getState( editor, path )
+ 13 	{
+ 14 		var firstBlock = path.block || path.blockLimit;
+ 15
+ 16 		if ( !firstBlock || firstBlock.getName() == 'body' )
+ 17 			return CKEDITOR.TRISTATE_OFF;
+ 18
+ 19 		// See if the first block has a blockquote parent.
+ 20 		if ( firstBlock.getAscendant( 'blockquote', true ) )
+ 21 			return CKEDITOR.TRISTATE_ON;
+ 22
+ 23 		return CKEDITOR.TRISTATE_OFF;
+ 24 	}
+ 25
+ 26 	function onSelectionChange( evt )
+ 27 	{
+ 28 		var editor = evt.editor,
+ 29 			command = editor.getCommand( 'blockquote' );
+ 30 		command.state = getState( editor, evt.data.path );
+ 31 		command.fire( 'state' );
+ 32 	}
+ 33
+ 34 	function noBlockLeft( bqBlock )
+ 35 	{
+ 36 		for ( var i = 0, length = bqBlock.getChildCount(), child ; i < length && ( child = bqBlock.getChild( i ) ) ; i++ )
+ 37 		{
+ 38 			if ( child.type == CKEDITOR.NODE_ELEMENT && child.isBlockBoundary() )
+ 39 				return false;
+ 40 		}
+ 41 		return true;
+ 42 	}
+ 43
+ 44 	var commandObject =
+ 45 	{
+ 46 		exec : function( editor )
+ 47 		{
+ 48 			var state = editor.getCommand( 'blockquote' ).state,
+ 49 				selection = editor.getSelection(),
+ 50 				range = selection && selection.getRanges()[0];
+ 51
+ 52 			if ( !range )
+ 53 				return;
+ 54
+ 55 			var bookmarks = selection.createBookmarks();
+ 56
+ 57 			// Kludge for #1592: if the bookmark nodes are in the beginning of
+ 58 			// blockquote, then move them to the nearest block element in the
+ 59 			// blockquote.
+ 60 			if ( CKEDITOR.env.ie )
+ 61 			{
+ 62 				var bookmarkStart = bookmarks[0].startNode,
+ 63 					bookmarkEnd = bookmarks[0].endNode,
+ 64 					cursor;
+ 65
+ 66 				if ( bookmarkStart && bookmarkStart.getParent().getName() == 'blockquote' )
+ 67 				{
+ 68 					cursor = bookmarkStart;
+ 69 					while ( ( cursor = cursor.getNext() ) )
+ 70 					{
+ 71 						if ( cursor.type == CKEDITOR.NODE_ELEMENT &&
+ 72 								cursor.isBlockBoundary() )
+ 73 						{
+ 74 							bookmarkStart.move( cursor, true );
+ 75 							break;
+ 76 						}
+ 77 					}
+ 78 				}
+ 79
+ 80 				if ( bookmarkEnd
+ 81 						&& bookmarkEnd.getParent().getName() == 'blockquote' )
+ 82 				{
+ 83 					cursor = bookmarkEnd;
+ 84 					while ( ( cursor = cursor.getPrevious() ) )
+ 85 					{
+ 86 						if ( cursor.type == CKEDITOR.NODE_ELEMENT &&
+ 87 								cursor.isBlockBoundary() )
+ 88 						{
+ 89 							bookmarkEnd.move( cursor );
+ 90 							break;
+ 91 						}
+ 92 					}
+ 93 				}
+ 94 			}
+ 95
+ 96 			var iterator = range.createIterator(),
+ 97 				block;
+ 98
+ 99 			if ( state == CKEDITOR.TRISTATE_OFF )
+100 			{
+101 				var paragraphs = [];
+102 				while ( ( block = iterator.getNextParagraph() ) )
+103 					paragraphs.push( block );
+104
+105 				// If no paragraphs, create one from the current selection position.
+106 				if ( paragraphs.length < 1 )
+107 				{
+108 					var para = editor.document.createElement( editor.config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ),
+109 						firstBookmark = bookmarks.shift();
+110 					range.insertNode( para );
+111 					para.append( new CKEDITOR.dom.text( '\ufeff', editor.document ) );
+112 					range.moveToBookmark( firstBookmark );
+113 					range.selectNodeContents( para );
+114 					range.collapse( true );
+115 					firstBookmark = range.createBookmark();
+116 					paragraphs.push( para );
+117 					bookmarks.unshift( firstBookmark );
+118 				}
+119
+120 				// Make sure all paragraphs have the same parent.
+121 				var commonParent = paragraphs[0].getParent(),
+122 					tmp = [];
+123 				for ( var i = 0 ; i < paragraphs.length ; i++ )
+124 				{
+125 					block = paragraphs[i];
+126 					commonParent = commonParent.getCommonAncestor( block.getParent() );
+127 				}
+128
+129 				// The common parent must not be the following tags: table, tbody, tr, ol, ul.
+130 				var denyTags = { table : 1, tbody : 1, tr : 1, ol : 1, ul : 1 };
+131 				while ( denyTags[ commonParent.getName() ] )
+132 					commonParent = commonParent.getParent();
+133
+134 				// Reconstruct the block list to be processed such that all resulting blocks
+135 				// satisfy parentNode.equals( commonParent ).
+136 				var lastBlock = null;
+137 				while ( paragraphs.length > 0 )
+138 				{
+139 					block = paragraphs.shift();
+140 					while ( !block.getParent().equals( commonParent ) )
+141 						block = block.getParent();
+142 					if ( !block.equals( lastBlock ) )
+143 						tmp.push( block );
+144 					lastBlock = block;
+145 				}
+146
+147 				// If any of the selected blocks is a blockquote, remove it to prevent
+148 				// nested blockquotes.
+149 				while ( tmp.length > 0 )
+150 				{
+151 					block = tmp.shift();
+152 					if ( block.getName() == 'blockquote' )
+153 					{
+154 						var docFrag = new CKEDITOR.dom.documentFragment( editor.document );
+155 						while ( block.getFirst() )
+156 						{
+157 							docFrag.append( block.getFirst().remove() );
+158 							paragraphs.push( docFrag.getLast() );
+159 						}
+160
+161 						docFrag.replace( block );
+162 					}
+163 					else
+164 						paragraphs.push( block );
+165 				}
+166
+167 				// Now we have all the blocks to be included in a new blockquote node.
+168 				var bqBlock = editor.document.createElement( 'blockquote' );
+169 				bqBlock.insertBefore( paragraphs[0] );
+170 				while ( paragraphs.length > 0 )
+171 				{
+172 					block = paragraphs.shift();
+173 					bqBlock.append( block );
+174 				}
+175 			}
+176 			else if ( state == CKEDITOR.TRISTATE_ON )
+177 			{
+178 				var moveOutNodes = [],
+179 					database = {};
+180
+181 				while ( ( block = iterator.getNextParagraph() ) )
+182 				{
+183 					var bqParent = null,
+184 						bqChild = null;
+185 					while ( block.getParent() )
+186 					{
+187 						if ( block.getParent().getName() == 'blockquote' )
+188 						{
+189 							bqParent = block.getParent();
+190 							bqChild = block;
+191 							break;
+192 						}
+193 						block = block.getParent();
+194 					}
+195
+196 					// Remember the blocks that were recorded down in the moveOutNodes array
+197 					// to prevent duplicates.
+198 					if ( bqParent && bqChild && !bqChild.getCustomData( 'blockquote_moveout' ) )
+199 					{
+200 						moveOutNodes.push( bqChild );
+201 						CKEDITOR.dom.element.setMarker( database, bqChild, 'blockquote_moveout', true );
+202 					}
+203 				}
+204
+205 				CKEDITOR.dom.element.clearAllMarkers( database );
+206
+207 				var movedNodes = [],
+208 					processedBlockquoteBlocks = [];
+209
+210 				database = {};
+211 				while ( moveOutNodes.length > 0 )
+212 				{
+213 					var node = moveOutNodes.shift();
+214 					bqBlock = node.getParent();
+215
+216 					// If the node is located at the beginning or the end, just take it out
+217 					// without splitting. Otherwise, split the blockquote node and move the
+218 					// paragraph in between the two blockquote nodes.
+219 					if ( !node.getPrevious() )
+220 						node.remove().insertBefore( bqBlock );
+221 					else if ( !node.getNext() )
+222 						node.remove().insertAfter( bqBlock );
+223 					else
+224 					{
+225 						node.breakParent( node.getParent() );
+226 						processedBlockquoteBlocks.push( node.getNext() );
+227 					}
+228
+229 					// Remember the blockquote node so we can clear it later (if it becomes empty).
+230 					if ( !bqBlock.getCustomData( 'blockquote_processed' ) )
+231 					{
+232 						processedBlockquoteBlocks.push( bqBlock );
+233 						CKEDITOR.dom.element.setMarker( database, bqBlock, 'blockquote_processed', true );
+234 					}
+235
+236 					movedNodes.push( node );
+237 				}
+238
+239 				CKEDITOR.dom.element.clearAllMarkers( database );
+240
+241 				// Clear blockquote nodes that have become empty.
+242 				for ( i = processedBlockquoteBlocks.length - 1 ; i >= 0 ; i-- )
+243 				{
+244 					bqBlock = processedBlockquoteBlocks[i];
+245 					if ( noBlockLeft( bqBlock ) )
+246 						bqBlock.remove();
+247 				}
+248
+249 				if ( editor.config.enterMode == CKEDITOR.ENTER_BR )
+250 				{
+251 					var firstTime = true;
+252 					while ( movedNodes.length )
+253 					{
+254 						node = movedNodes.shift();
+255
+256 						if ( node.getName() == 'div' )
+257 						{
+258 							docFrag = new CKEDITOR.dom.documentFragment( editor.document );
+259 							var needBeginBr = firstTime && node.getPrevious() &&
+260 									!( node.getPrevious().type == CKEDITOR.NODE_ELEMENT && node.getPrevious().isBlockBoundary() );
+261 							if ( needBeginBr )
+262 								docFrag.append( editor.document.createElement( 'br' ) );
+263
+264 							var needEndBr = node.getNext() &&
+265 								!( node.getNext().type == CKEDITOR.NODE_ELEMENT && node.getNext().isBlockBoundary() );
+266 							while ( node.getFirst() )
+267 								node.getFirst().remove().appendTo( docFrag );
+268
+269 							if ( needEndBr )
+270 								docFrag.append( editor.document.createElement( 'br' ) );
+271
+272 							docFrag.replace( node );
+273 							firstTime = false;
+274 						}
+275 					}
+276 				}
+277 			}
+278
+279 			selection.selectBookmarks( bookmarks );
+280 			editor.focus();
+281 		}
+282 	};
+283
+284 	CKEDITOR.plugins.add( 'blockquote',
+285 	{
+286 		init : function( editor )
+287 		{
+288 			editor.addCommand( 'blockquote', commandObject );
+289
+290 			editor.ui.addButton( 'Blockquote',
+291 				{
+292 					label : editor.lang.blockquote,
+293 					command : 'blockquote'
+294 				} );
+295
+296 			editor.on( 'selectionChange', onSelectionChange );
+297 		},
+298
+299 		requires : [ 'domiterator' ]
+300 	} );
+301 })();
+302 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_button_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_button_plugin.js.html new file mode 100644 index 000000000..2ab91d2f1 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_button_plugin.js.html @@ -0,0 +1,266 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'button',
+  7 {
+  8 	beforeInit : function( editor )
+  9 	{
+ 10 		editor.ui.addHandler( CKEDITOR.UI_BUTTON, CKEDITOR.ui.button.handler );
+ 11 	}
+ 12 });
+ 13
+ 14 /**
+ 15  * Button UI element.
+ 16  * @constant
+ 17  * @example
+ 18  */
+ 19 CKEDITOR.UI_BUTTON = 1;
+ 20
+ 21 /**
+ 22  * Represents a button UI element. This class should not be called directly. To
+ 23  * create new buttons use {@link CKEDITOR.ui.prototype.addButton} instead.
+ 24  * @constructor
+ 25  * @param {Object} definition The button definition.
+ 26  * @example
+ 27  */
+ 28 CKEDITOR.ui.button = function( definition )
+ 29 {
+ 30 	// Copy all definition properties to this object.
+ 31 	CKEDITOR.tools.extend( this, definition,
+ 32 		// Set defaults.
+ 33 		{
+ 34 			title		: definition.label,
+ 35 			className	: definition.className || ( definition.command && 'cke_button_' + definition.command ) || '',
+ 36 			click		: definition.click || function( editor )
+ 37 				{
+ 38 					editor.execCommand( definition.command );
+ 39 				}
+ 40 		});
+ 41
+ 42 	this._ = {};
+ 43 };
+ 44
+ 45 /**
+ 46  * Transforms a button definition in a {@link CKEDITOR.ui.button} instance.
+ 47  * @type Object
+ 48  * @example
+ 49  */
+ 50 CKEDITOR.ui.button.handler =
+ 51 {
+ 52 	create : function( definition )
+ 53 	{
+ 54 		return new CKEDITOR.ui.button( definition );
+ 55 	}
+ 56 };
+ 57
+ 58 CKEDITOR.ui.button.prototype =
+ 59 {
+ 60 	canGroup : true,
+ 61
+ 62 	/**
+ 63 	 * Renders the button.
+ 64 	 * @param {CKEDITOR.editor} editor The editor instance which this button is
+ 65 	 *		to be used by.
+ 66 	 * @param {Array} output The output array to which append the HTML relative
+ 67 	 *		to this button.
+ 68 	 * @example
+ 69 	 */
+ 70 	render : function( editor, output )
+ 71 	{
+ 72 		var env = CKEDITOR.env;
+ 73
+ 74 		var id = this._.id = 'cke_' + CKEDITOR.tools.getNextNumber();
+ 75 		this._.editor = editor;
+ 76
+ 77 		var instance =
+ 78 		{
+ 79 			id : id,
+ 80 			button : this,
+ 81 			editor : editor,
+ 82 			focus : function()
+ 83 			{
+ 84 				var element = CKEDITOR.document.getById( id );
+ 85 				element.focus();
+ 86 			},
+ 87 			execute : function()
+ 88 			{
+ 89 				this.button.click( editor );
+ 90 			}
+ 91 		};
+ 92
+ 93 		var clickFn = CKEDITOR.tools.addFunction( instance.execute, instance );
+ 94
+ 95 		var index = CKEDITOR.ui.button._.instances.push( instance ) - 1;
+ 96
+ 97 		var classes = '';
+ 98
+ 99 		// Get the command name.
+100 		var command = this.command;
+101
+102 		if ( command )
+103 		{
+104 			// Get the command instance.
+105 			command = editor.getCommand( command );
+106
+107 			if ( command )
+108 			{
+109 				command.on( 'state', function()
+110 					{
+111 						this.setState( command.state );
+112 					}, this);
+113
+114 				classes += 'cke_' + (
+115 					command.state == CKEDITOR.TRISTATE_ON ? 'on' :
+116 					command.state == CKEDITOR.TRISTATE_DISABLED ? 'disabled' :
+117 					'off' );
+118 			}
+119 		}
+120
+121 		if ( !command )
+122 			classes	+= 'cke_off';
+123
+124 		if ( this.className )
+125 			classes += ' ' + this.className;
+126
+127 		output.push(
+128 			'<span class="cke_button">',
+129 			'<a id="', id, '"' +
+130 				' class="', classes, '" href="javascript:void(\'', ( this.title || '' ).replace( "'", '' ), '\')"' +
+131 				' title="', this.title, '"' +
+132 				' tabindex="-1"' +
+133 				' role="button"' +
+134 				' hidefocus="true"' );
+135
+136 		// Some browsers don't cancel key events in the keydown but in the
+137 		// keypress.
+138 		// TODO: Check if really needed for Gecko+Mac.
+139 		if ( env.opera || ( env.gecko && env.mac ) )
+140 		{
+141 			output.push(
+142 				' onkeypress="return false;"' );
+143 		}
+144
+145 		// With Firefox, we need to force the button to redraw, otherwise it
+146 		// will remain in the focus state.
+147 		if ( env.gecko )
+148 		{
+149 			output.push(
+150 				' onblur="this.style.cssText = this.style.cssText;"' );
+151 		}
+152
+153 		output.push(
+154 				' onkeydown="return CKEDITOR.ui.button._.keydown(', index, ', event);"' +
+155 				' onfocus="return CKEDITOR.ui.button._.focus(', index, ', event);"' +
+156 				' onclick="CKEDITOR.tools.callFunction(', clickFn, ', this); return false;">' +
+157 					'<span class="cke_icon"' );
+158
+159 		if ( this.icon )
+160 		{
+161 			var offset = ( this.iconOffset || 0 ) * -16;
+162 			output.push( ' style="background-image:url(', CKEDITOR.getUrl( this.icon ), ');background-position:0 ' + offset + 'px;"' );
+163 		}
+164
+165 		output.push(
+166 					'></span>' +
+167 					'<span class="cke_label">', this.label, '</span>' );
+168
+169 		if ( this.hasArrow )
+170 		{
+171 			output.push(
+172 					'<span class="cke_buttonarrow"></span>' );
+173 		}
+174
+175 		output.push(
+176 			'</a>',
+177 			'</span>' );
+178
+179 		if ( this.onRender )
+180 			this.onRender();
+181
+182 		return instance;
+183 	},
+184
+185 	setState : function( state )
+186 	{
+187 		if ( this._.state == state )
+188 			return;
+189
+190 		var element = CKEDITOR.document.getById( this._.id );
+191
+192 		if ( element )
+193 		{
+194 			element.setState( state );
+195
+196 			var htmlTitle = this.title,
+197 				unavailable = this._.editor.lang.common.unavailable,
+198 				labelElement = element.getChild( 1 );
+199
+200 			if ( state == CKEDITOR.TRISTATE_DISABLED )
+201 				htmlTitle = unavailable.replace( '%1', this.title );
+202
+203 			labelElement.setHtml( htmlTitle );
+204 		}
+205
+206 		this._.state = state;
+207 	}
+208 };
+209
+210 /**
+211  * Handles a button click.
+212  * @private
+213  */
+214 CKEDITOR.ui.button._ =
+215 {
+216 	instances : [],
+217
+218 	keydown : function( index, ev )
+219 	{
+220 		var instance = CKEDITOR.ui.button._.instances[ index ];
+221
+222 		if ( instance.onkey )
+223 		{
+224 			ev = new CKEDITOR.dom.event( ev );
+225 			return ( instance.onkey( instance, ev.getKeystroke() ) !== false );
+226 		}
+227 	},
+228
+229 	focus : function( index, ev )
+230 	{
+231 		var instance = CKEDITOR.ui.button._.instances[ index ],
+232 			retVal;
+233
+234 		if ( instance.onfocus )
+235 			retVal = ( instance.onfocus( instance, new CKEDITOR.dom.event( ev ) ) !== false );
+236
+237 		// FF2: prevent focus event been bubbled up to editor container, which caused unexpected editor focus.
+238 		if ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 )
+239 			ev.preventBubble();
+240 		return retVal;
+241 	}
+242 };
+243
+244 /**
+245  * Adds a button definition to the UI elements list.
+246  * @param {String} The button name.
+247  * @param {Object} The button definition.
+248  * @example
+249  * editorInstance.ui.addButton( 'MyBold',
+250  *     {
+251  *         label : 'My Bold',
+252  *         command : 'bold'
+253  *     });
+254  */
+255 CKEDITOR.ui.prototype.addButton = function( name, definition )
+256 {
+257 	this.add( name, CKEDITOR.UI_BUTTON, definition );
+258 };
+259 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_clipboard_dialogs_paste.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_clipboard_dialogs_paste.js.html new file mode 100644 index 000000000..0ec284ec2 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_clipboard_dialogs_paste.js.html @@ -0,0 +1,162 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dialog.add( 'paste', function( editor )
+  7 {
+  8 	var isCustomDomain = CKEDITOR.env.ie && document.domain != window.location.hostname;
+  9
+ 10 	return {
+ 11 		title : editor.lang.clipboard.title,
+ 12
+ 13 		minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350,
+ 14 		minHeight : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 250 : 240,
+ 15 		htmlToLoad : '<!doctype html><script type="text/javascript">'
+ 16 				+ 'window.onload = function()'
+ 17 				+ '{'
+ 18 					+ 'if ( ' + CKEDITOR.env.ie + ' ) '
+ 19 						+ 'document.body.contentEditable = "true";'
+ 20 					+ 'else '
+ 21 						+ 'document.designMode = "on";'
+ 22 					+ 'var iframe = new window.parent.CKEDITOR.dom.element( frameElement );'
+ 23 					+ 'var dialog = iframe.getCustomData( "dialog" );'
+ 24 					+ 'dialog.fire( "iframeAdded", { iframe : iframe } );'
+ 25 				+ '};'
+ 26 				+ '</script><style>body { margin: 3px; height: 95%; } </style><body></body>',
+ 27
+ 28 		onShow : function()
+ 29 		{
+ 30 			if ( CKEDITOR.env.ie )
+ 31 				this.getParentEditor().document.getBody().$.contentEditable = 'false';
+ 32
+ 33 			// FIREFOX BUG: Force the browser to render the dialog to make the to-be-
+ 34 			// inserted iframe editable. (#3366)
+ 35 			this.parts.dialog.$.offsetHeight;
+ 36
+ 37 			var container = this.getContentElement( 'general', 'editing_area' ).getElement(),
+ 38 				iframe = CKEDITOR.dom.element.createFromHtml( '<iframe src="javascript:void(0)" frameborder="0" allowtransparency="1"></iframe>' );
+ 39
+ 40 			var lang = this.getParentEditor().lang;
+ 41
+ 42 			iframe.setStyles(
+ 43 				{
+ 44 					width : '346px',
+ 45 					height : '130px',
+ 46 					'background-color' : 'white',
+ 47 					border : '1px solid black'
+ 48 				} );
+ 49 			iframe.setCustomData( 'dialog', this );
+ 50
+ 51 			var accTitle = lang.editorTitle.replace( '%1', lang.clipboard.title );
+ 52
+ 53 			if ( CKEDITOR.env.ie )
+ 54 				container.setHtml( '<legend style="position:absolute;top:-1000000px;left:-1000000px;">'
+ 55 						+ CKEDITOR.tools.htmlEncode( accTitle )
+ 56 						+ '</legend>' );
+ 57 			else
+ 58 			{
+ 59 				container.setHtml( '' );
+ 60 				container.setAttributes(
+ 61 					{
+ 62 						role : 'region',
+ 63 						title : accTitle
+ 64 					} );
+ 65 				iframe.setAttributes(
+ 66 					{
+ 67 						role : 'region',
+ 68 						title : ' '
+ 69 					} );
+ 70 			}
+ 71 			container.append( iframe );
+ 72 			if ( CKEDITOR.env.ie )
+ 73 				container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' );
+ 74
+ 75 			if ( isCustomDomain )
+ 76 			{
+ 77 				CKEDITOR._cke_htmlToLoad = this.definition.htmlToLoad;
+ 78 				iframe.setAttribute( 'src',
+ 79 					'javascript:void( (function(){' +
+ 80 						   'document.open();' +
+ 81 						   'document.domain="' + document.domain + '";' +
+ 82 						   'document.write( window.parent.CKEDITOR._cke_htmlToLoad );' +
+ 83 						   'delete window.parent.CKEDITOR._cke_htmlToLoad;' +
+ 84 						   'document.close();' +
+ 85 					'})() )' );
+ 86 			}
+ 87 			else
+ 88 			{
+ 89 				var doc = iframe.$.contentWindow.document;
+ 90 				doc.open();
+ 91 				doc.write( this.definition.htmlToLoad );
+ 92 				doc.close();
+ 93 			}
+ 94 		},
+ 95
+ 96 		onHide : function()
+ 97 		{
+ 98 			if ( CKEDITOR.env.ie )
+ 99 				this.getParentEditor().document.getBody().$.contentEditable = 'true';
+100 		},
+101
+102 		onOk : function()
+103 		{
+104 			var container = this.getContentElement( 'general', 'editing_area' ).getElement(),
+105 				iframe = container.getElementsByTag( 'iframe' ).getItem( 0 ),
+106 				editor = this.getParentEditor(),
+107 				html = iframe.$.contentWindow.document.body.innerHTML;
+108
+109 			editor.insertHtml( html );
+110
+111 		},
+112
+113 		contents : [
+114 			{
+115 				id : 'general',
+116 				label : editor.lang.common.generalTab,
+117 				elements : [
+118 					{
+119 						type : 'html',
+120 						id : 'securityMsg',
+121 						html : '<div style="white-space:normal;width:340px;">' + editor.lang.clipboard.securityMsg + '</div>'
+122 					},
+123 					{
+124 						type : 'html',
+125 						id : 'pasteMsg',
+126 						html : '<div style="white-space:normal;width:340px;">'+editor.lang.clipboard.pasteMsg +'</div>'
+127 					},
+128 					{
+129 						type : 'html',
+130 						id : 'editing_area',
+131 						style : 'width: 100%; height: 100%;',
+132 						html : '<fieldset></fieldset>',
+133 						focus : function()
+134 						{
+135 							var div = this.getElement();
+136 							var iframe = div.getElementsByTag( 'iframe' );
+137 							if ( iframe.count() < 1 )
+138 								return;
+139 							iframe = iframe.getItem( 0 );
+140
+141 							// #3291 : JAWS needs the 500ms delay to detect that the editor iframe
+142 							// iframe is no longer editable. So that it will put the focus into the
+143 							// Paste from Word dialog's editable area instead.
+144 							setTimeout( function()
+145 							{
+146 								iframe.$.contentWindow.focus();
+147 							}, 500 );
+148 						}
+149 					}
+150 				]
+151 			}
+152 		]
+153 	};
+154 });
+155 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_clipboard_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_clipboard_plugin.js.html new file mode 100644 index 000000000..c74435378 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_clipboard_plugin.js.html @@ -0,0 +1,216 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Clipboard support
+  8  */
+  9
+ 10 (function()
+ 11 {
+ 12 	// Tries to execute any of the paste, cut or copy commands in IE. Returns a
+ 13 	// boolean indicating that the operation succeeded.
+ 14 	var execIECommand = function( editor, command )
+ 15 	{
+ 16 		var doc = editor.document,
+ 17 			body = doc.getBody();
+ 18
+ 19 		var	enabled = false;
+ 20 		var onExec = function()
+ 21 		{
+ 22 			enabled = true;
+ 23 		};
+ 24
+ 25 		// The following seems to be the only reliable way to detect that
+ 26 		// clipboard commands are enabled in IE. It will fire the
+ 27 		// onpaste/oncut/oncopy events only if the security settings allowed
+ 28 		// the command to execute.
+ 29 		body.on( command, onExec );
+ 30
+ 31 		doc.$.execCommand( command );
+ 32
+ 33 		body.removeListener( command, onExec );
+ 34
+ 35 		return enabled;
+ 36 	};
+ 37
+ 38 	// Attempts to execute the Cut and Copy operations.
+ 39 	var tryToCutCopy =
+ 40 		CKEDITOR.env.ie ?
+ 41 			function( editor, type )
+ 42 			{
+ 43 				return execIECommand( editor, type );
+ 44 			}
+ 45 		:		// !IE.
+ 46 			function( editor, type )
+ 47 			{
+ 48 				try
+ 49 				{
+ 50 					// Other browsers throw an error if the command is disabled.
+ 51 					return editor.document.$.execCommand( type );
+ 52 				}
+ 53 				catch( e )
+ 54 				{
+ 55 					return false;
+ 56 				}
+ 57 			};
+ 58
+ 59 	// A class that represents one of the cut or copy commands.
+ 60 	var cutCopyCmd = function( type )
+ 61 	{
+ 62 		this.type = type;
+ 63 		this.canUndo = ( this.type == 'cut' );		// We can't undo copy to clipboard.
+ 64 	};
+ 65
+ 66 	cutCopyCmd.prototype =
+ 67 	{
+ 68 		exec : function( editor, data )
+ 69 		{
+ 70 			var success = tryToCutCopy( editor, this.type );
+ 71
+ 72 			if ( !success )
+ 73 				alert( editor.lang.clipboard[ this.type + 'Error' ] );		// Show cutError or copyError.
+ 74
+ 75 			return success;
+ 76 		}
+ 77 	};
+ 78
+ 79 	// Paste command.
+ 80 	var pasteCmd =
+ 81 		CKEDITOR.env.ie ?
+ 82 			{
+ 83 				exec : function( editor, data )
+ 84 				{
+ 85 					// Prevent IE from pasting at the begining of the document.
+ 86 					editor.focus();
+ 87
+ 88 					if ( !editor.fire( 'beforePaste' )
+ 89 						&& !execIECommand( editor, 'paste' ) )
+ 90 					{
+ 91 							editor.openDialog( 'paste' );
+ 92 					}
+ 93 				}
+ 94 			}
+ 95 		:
+ 96 			{
+ 97 				exec : function( editor )
+ 98 				{
+ 99 					try
+100 					{
+101 						if ( !editor.fire( 'beforePaste' )
+102 							&& !editor.document.$.execCommand( 'Paste', false, null ) )
+103 						{
+104 							throw 0;
+105 						}
+106 					}
+107 					catch ( e )
+108 					{
+109 						// Open the paste dialog.
+110 						editor.openDialog( 'paste' );
+111 					}
+112 				}
+113 			};
+114
+115 	// Listens for some clipboard related keystrokes, so they get customized.
+116 	var onKey = function( event )
+117 	{
+118 		switch ( event.data.keyCode )
+119 		{
+120 			// Paste
+121 			case CKEDITOR.CTRL + 86 :		// CTRL+V
+122 			case CKEDITOR.SHIFT + 45 :		// SHIFT+INS
+123
+124 				var editor = this;
+125 				editor.fire( 'saveSnapshot' );		// Save before paste
+126
+127 				if ( editor.fire( 'beforePaste' ) )
+128 					event.cancel();
+129
+130 				setTimeout( function()
+131 					{
+132 						editor.fire( 'saveSnapshot' );		// Save after paste
+133 					}, 0 );
+134 				return;
+135
+136 			// Cut
+137 			case CKEDITOR.CTRL + 88 :		// CTRL+X
+138 			case CKEDITOR.SHIFT + 46 :		// SHIFT+DEL
+139
+140 				// Save Undo snapshot.
+141 				editor = this;
+142 				editor.fire( 'saveSnapshot' );		// Save before paste
+143 				setTimeout( function()
+144 					{
+145 						editor.fire( 'saveSnapshot' );		// Save after paste
+146 					}, 0 );
+147 		}
+148 	};
+149
+150 	// Register the plugin.
+151 	CKEDITOR.plugins.add( 'clipboard',
+152 		{
+153 			init : function( editor )
+154 			{
+155 				function addButtonCommand( buttonName, commandName, command, ctxMenuOrder )
+156 				{
+157 					var lang = editor.lang[ commandName ];
+158
+159 					editor.addCommand( commandName, command );
+160 					editor.ui.addButton( buttonName,
+161 						{
+162 							label : lang,
+163 							command : commandName
+164 						});
+165
+166 					// If the "menu" plugin is loaded, register the menu item.
+167 					if ( editor.addMenuItems )
+168 					{
+169 						editor.addMenuItem( commandName,
+170 							{
+171 								label : lang,
+172 								command : commandName,
+173 								group : 'clipboard',
+174 								order : ctxMenuOrder
+175 							});
+176 					}
+177 				}
+178
+179 				addButtonCommand( 'Cut', 'cut', new cutCopyCmd( 'cut' ), 1 );
+180 				addButtonCommand( 'Copy', 'copy', new cutCopyCmd( 'copy' ), 4 );
+181 				addButtonCommand( 'Paste', 'paste', pasteCmd, 8 );
+182
+183 				CKEDITOR.dialog.add( 'paste', CKEDITOR.getUrl( this.path + 'dialogs/paste.js' ) );
+184
+185 				editor.on( 'key', onKey, editor );
+186
+187 				// If the "contextmenu" plugin is loaded, register the listeners.
+188 				if ( editor.contextMenu )
+189 				{
+190 					function stateFromNamedCommand( command )
+191 					{
+192 						return editor.document.$.queryCommandEnabled( command ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED;
+193 					}
+194
+195 					editor.contextMenu.addListener( function()
+196 						{
+197 							return {
+198 								cut : stateFromNamedCommand( 'Cut' ),
+199
+200 								// Browser bug: 'Cut' has the correct states for both Copy and Cut.
+201 								copy : stateFromNamedCommand( 'Cut' ),
+202 								paste : CKEDITOR.env.webkit ? CKEDITOR.TRISTATE_OFF : stateFromNamedCommand( 'Paste' )
+203 							};
+204 						});
+205 				}
+206 			}
+207 		});
+208 })();
+209 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_colorbutton_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_colorbutton_plugin.js.html new file mode 100644 index 000000000..f822b7693 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_colorbutton_plugin.js.html @@ -0,0 +1,169 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'colorbutton',
+  7 {
+  8 	requires : [ 'panelbutton', 'floatpanel', 'styles' ],
+  9
+ 10 	init : function( editor )
+ 11 	{
+ 12 		var config = editor.config,
+ 13 			lang = editor.lang.colorButton;
+ 14
+ 15 		var clickFn;
+ 16
+ 17 		if ( !CKEDITOR.env.hc )
+ 18 		{
+ 19 			addButton( 'TextColor', 'fore', lang.textColorTitle );
+ 20 			addButton( 'BGColor', 'back', lang.bgColorTitle );
+ 21 		}
+ 22
+ 23 		function addButton( name, type, title )
+ 24 		{
+ 25 			editor.ui.add( name, CKEDITOR.UI_PANELBUTTON,
+ 26 				{
+ 27 					label : title,
+ 28 					title : title,
+ 29 					className : 'cke_button_' + name.toLowerCase(),
+ 30
+ 31 					panel :
+ 32 					{
+ 33 						css : [ CKEDITOR.getUrl( editor.skinPath + 'editor.css' ) ]
+ 34 					},
+ 35
+ 36 					onBlock : function( panel, blockName )
+ 37 					{
+ 38 						var block = panel.addBlock( blockName );
+ 39 						block.autoSize = true;
+ 40 						block.element.addClass( 'cke_colorblock' );
+ 41 						block.element.setHtml( renderColors( panel, type ) );
+ 42
+ 43 						var keys = block.keys;
+ 44 						keys[ 39 ]	= 'next';					// ARROW-RIGHT
+ 45 						keys[ 9 ]	= 'next';					// TAB
+ 46 						keys[ 37 ]	= 'prev';					// ARROW-LEFT
+ 47 						keys[ CKEDITOR.SHIFT + 9 ]	= 'prev';	// SHIFT + TAB
+ 48 						keys[ 32 ]	= 'click';					// SPACE
+ 49 					}
+ 50 				});
+ 51 		}
+ 52
+ 53
+ 54 		function renderColors( panel, type )
+ 55 		{
+ 56 			var output = [],
+ 57 				colors = CKEDITOR.config.colorButton_colors.split( ',' );
+ 58
+ 59 			var clickFn = CKEDITOR.tools.addFunction( function( color, type )
+ 60 				{
+ 61 					if ( color == '?' )
+ 62 					{
+ 63 						// TODO : Implement the colors dialog.
+ 64 						// editor.openDialog( '' );
+ 65 						return;
+ 66 					}
+ 67
+ 68 					editor.focus();
+ 69
+ 70 					panel.hide();
+ 71
+ 72 					var style = new CKEDITOR.style( config['colorButton_' + type + 'Style'], color && { color : color } );
+ 73
+ 74 					editor.fire( 'saveSnapshot' );
+ 75 					if ( color )
+ 76 						style.apply( editor.document );
+ 77 					else
+ 78 						style.remove( editor.document );
+ 79 				});
+ 80
+ 81 			// Render the "Automatic" button.
+ 82 			output.push(
+ 83 				'<a class="cke_colorauto" _cke_focus=1 hidefocus=true' +
+ 84 					' title="', lang.auto, '"' +
+ 85 					' onclick="CKEDITOR.tools.callFunction(', clickFn, ',null,\'', type, '\');return false;"' +
+ 86 					' href="javascript:void(\'', lang.auto, '\')">' +
+ 87 					'<table cellspacing=0 cellpadding=0 width="100%">' +
+ 88 						'<tr>' +
+ 89 							'<td>' +
+ 90 								'<span class="cke_colorbox" style="background-color:#000"></span>' +
+ 91 							'</td>' +
+ 92 							'<td colspan=7 align=center>',
+ 93 								lang.auto,
+ 94 							'</td>' +
+ 95 						'</tr>' +
+ 96 					'</table>' +
+ 97 				'</a>' +
+ 98 				'<table cellspacing=0 cellpadding=0 width="100%">' );
+ 99
+100 			// Render the color boxes.
+101 			for ( var i = 0 ; i < colors.length ; i++ )
+102 			{
+103 				if ( ( i % 8 ) === 0 )
+104 					output.push( '</tr><tr>' );
+105
+106 				var colorCode = colors[ i ];
+107 				var colorLabel = editor.lang.colors[ colorCode ] || colorCode;
+108 				output.push(
+109 					'<td>' +
+110 						'<a class="cke_colorbox" _cke_focus=1 hidefocus=true' +
+111 							' title="', colorLabel, '"' +
+112 							' onclick="CKEDITOR.tools.callFunction(', clickFn, ',\'#', colorCode, '\',\'', type, '\'); return false;"' +
+113 							' href="javascript:void(\'', colorLabel, '\')">' +
+114 							'<span class="cke_colorbox" style="background-color:#', colorCode, '"></span>' +
+115 						'</a>' +
+116 					'</td>' );
+117 			}
+118
+119 			// Render the "More Colors" button.
+120 			if ( config.colorButton_enableMore )
+121 			{
+122 				output.push(
+123 					'</tr>' +
+124 					'<tr>' +
+125 						'<td colspan=8 align=center>' +
+126 							'<a class="cke_colormore" _cke_focus=1 hidefocus=true' +
+127 								' title="', lang.more, '"' +
+128 								' onclick="CKEDITOR.tools.callFunction(', clickFn, ',\'?\',\'', type, '\');return false;"' +
+129 								' href="javascript:void(\'', lang.more, '\')">',
+130 								lang.more,
+131 							'</a>' +
+132 						'</td>' );	// It is later in the code.
+133 			}
+134
+135 			output.push( '</tr></table>' );
+136
+137 			return output.join( '' );
+138 		}
+139 	}
+140 });
+141
+142 CKEDITOR.config.colorButton_enableMore = false;
+143 CKEDITOR.config.colorButton_colors =
+144 	'000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,' +
+145 	'B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,' +
+146 	'F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,' +
+147 	'FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,' +
+148 	'FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF';
+149
+150 CKEDITOR.config.colorButton_foreStyle =
+151 	{
+152 		element		: 'span',
+153 		styles		: { 'color' : '#(color)' },
+154 		overrides	: [ { element : 'font', attributes : { 'color' : null } } ]
+155 	};
+156
+157 CKEDITOR.config.colorButton_backStyle =
+158 	{
+159 		element		: 'span',
+160 		styles		: { 'background-color' : '#(color)' }
+161 	};
+162 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_contextmenu_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_contextmenu_plugin.js.html new file mode 100644 index 000000000..bc3159416 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_contextmenu_plugin.js.html @@ -0,0 +1,186 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'contextmenu',
+  7 {
+  8 	requires : [ 'menu' ],
+  9
+ 10 	beforeInit : function( editor )
+ 11 	{
+ 12 		editor.contextMenu = new CKEDITOR.plugins.contextMenu( editor );
+ 13
+ 14 		editor.addCommand( 'contextMenu',
+ 15 			{
+ 16 				exec : function()
+ 17 					{
+ 18 						editor.contextMenu.show();
+ 19 					}
+ 20 			});
+ 21 	}
+ 22 });
+ 23
+ 24 CKEDITOR.plugins.contextMenu = CKEDITOR.tools.createClass(
+ 25 {
+ 26 	$ : function( editor )
+ 27 	{
+ 28 		this.id = 'cke_' + CKEDITOR.tools.getNextNumber();
+ 29 		this.editor = editor;
+ 30 		this._.listeners = [];
+ 31 		this._.functionId = CKEDITOR.tools.addFunction( function( commandName )
+ 32 			{
+ 33 				this._.panel.hide();
+ 34 				editor.focus();
+ 35 				editor.execCommand( commandName );
+ 36 			},
+ 37 			this);
+ 38 	},
+ 39
+ 40 	_ :
+ 41 	{
+ 42 		onMenu : function( offsetParent, corner, offsetX, offsetY )
+ 43 		{
+ 44 			var menu = this._.menu,
+ 45 				editor = this.editor;
+ 46
+ 47 			if ( menu )
+ 48 			{
+ 49 				menu.hide();
+ 50 				menu.removeAll();
+ 51 			}
+ 52 			else
+ 53 			{
+ 54 				menu = this._.menu = new CKEDITOR.menu( editor );
+ 55 				menu.onClick = CKEDITOR.tools.bind( function( item )
+ 56 				{
+ 57 					var noUnlock = true;
+ 58 					menu.hide();
+ 59
+ 60 					if ( CKEDITOR.env.ie )
+ 61 						menu.onEscape();
+ 62
+ 63 					if ( item.onClick )
+ 64 						item.onClick();
+ 65 					else if ( item.command )
+ 66 						editor.execCommand( item.command );
+ 67
+ 68 					noUnlock = false;
+ 69 				}, this );
+ 70
+ 71 				menu.onEscape = function()
+ 72 				{
+ 73 					editor.focus();
+ 74
+ 75 					if ( CKEDITOR.env.ie )
+ 76 						editor.getSelection().unlock( true );
+ 77 				};
+ 78 			}
+ 79
+ 80 			var listeners = this._.listeners,
+ 81 				includedItems = [];
+ 82
+ 83 			var selection = this.editor.getSelection(),
+ 84 				element = selection && selection.getStartElement();
+ 85
+ 86 			// Lock the selection in IE, so it can be restored when closing the
+ 87 			// menu.
+ 88 			if ( CKEDITOR.env.ie )
+ 89 				selection.lock();
+ 90
+ 91 			menu.onHide = CKEDITOR.tools.bind( function()
+ 92 				{
+ 93 					menu.onHide = null;
+ 94
+ 95 					if ( CKEDITOR.env.ie )
+ 96 						editor.getSelection().unlock();
+ 97
+ 98 					this.onHide && this.onHide();
+ 99 				},
+100 				this );
+101
+102 			// Call all listeners, filling the list of items to be displayed.
+103 			for ( var i = 0 ; i < listeners.length ; i++ )
+104 			{
+105 				var listenerItems = listeners[ i ]( element, selection );
+106
+107 				if ( listenerItems )
+108 				{
+109 					for ( var itemName in listenerItems )
+110 					{
+111 						var item = this.editor.getMenuItem( itemName );
+112
+113 						if ( item )
+114 						{
+115 							item.state = listenerItems[ itemName ];
+116 							menu.add( item );
+117 						}
+118 					}
+119 				}
+120 			}
+121
+122 			menu.show( offsetParent, corner || ( editor.lang.dir == 'rtl' ? 2 : 1 ), offsetX, offsetY );
+123 		}
+124 	},
+125
+126 	proto :
+127 	{
+128 		addTarget : function( element )
+129 		{
+130 			element.on( 'contextmenu', function( event )
+131 				{
+132 					var domEvent = event.data;
+133
+134 					// Cancel the browser context menu.
+135 					domEvent.preventDefault();
+136
+137 					var offsetParent = domEvent.getTarget().getDocument().getDocumentElement(),
+138 						offsetX = domEvent.$.clientX,
+139 						offsetY = domEvent.$.clientY;
+140
+141 					CKEDITOR.tools.setTimeout( function()
+142 						{
+143 							this._.onMenu( offsetParent, null, offsetX, offsetY );
+144 						},
+145 						0, this );
+146 				},
+147 				this );
+148 		},
+149
+150 		addListener : function( listenerFn )
+151 		{
+152 			this._.listeners.push( listenerFn );
+153 		},
+154
+155 		show : function( offsetParent, corner, offsetX, offsetY )
+156 		{
+157 			this.editor.focus();
+158 			this._.onMenu( offsetParent || CKEDITOR.document.getDocumentElement(), corner, offsetX || 0, offsetY || 0 );
+159 		}
+160 	}
+161 });
+162
+163 // Fix the "contextmenu" event for DOM elements.
+164 // We may do this if we identify browsers that don't support the context meny
+165 // event on element directly. Leaving here for reference.
+166 //if ( <specific browsers> )
+167 //{
+168 //	CKEDITOR.dom.element.prototype.on = CKEDITOR.tools.override( CKEDITOR.dom.element.prototype.on, function( originalOn )
+169 //		{
+170 //			return function( eventName )
+171 //				{
+172 //					if ( eventName != 'contextmenu' )
+173 //						return originalOn.apply( this, arguments );
+174 //
+175 //					// TODO : Implement the fix.
+176 //				};
+177 //		});
+178 //}
+179 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialog_dialogDefinition.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialog_dialogDefinition.js.html new file mode 100644 index 000000000..c94a0a376 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialog_dialogDefinition.js.html @@ -0,0 +1,323 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Defines the "virtual" dialog, dialog content and dialog button
+  8  * definition classes.
+  9  */
+ 10
+ 11 /**
+ 12  * This class is not really part of the API. It just illustrates the properties
+ 13  * that developers can use to define and create dialogs.
+ 14  * @name CKEDITOR.dialog.dialogDefinition
+ 15  * @constructor
+ 16  * @example
+ 17  * // There is no constructor for this class, the user just has to define an
+ 18  * // object with the appropriate properties.
+ 19  *
+ 20  * CKEDITOR.dialog.add( 'testOnly', function( editor )
+ 21  *       {
+ 22  *           return {
+ 23  *               title : 'Test Dialog',
+ 24  *               resizable : CKEDITOR.DIALOG_RESIZE_BOTH,
+ 25  *               minWidth : 500,
+ 26  *               minHeight : 400,
+ 27  *               contents : [
+ 28  *                   {
+ 29  *                       id : 'tab1',
+ 30  *                       label : 'First Tab',
+ 31  *                       title : 'First Tab Title',
+ 32  *                       accessKey : 'Q',
+ 33  *                       elements : [
+ 34  *                           {
+ 35  *                               type : 'text',
+ 36  *                               label : 'Test Text 1',
+ 37  *                               id : 'testText1',
+ 38  *                               'default' : 'hello world!'
+ 39  *                           }
+ 40  *                       ]
+ 41  *                    }
+ 42  *               ]
+ 43  *           };
+ 44  *       });
+ 45  */
+ 46
+ 47 /**
+ 48  * The dialog title, displayed in the dialog's header. Required.
+ 49  * @name CKEDITOR.dialog.dialogDefinition.prototype.title
+ 50  * @field
+ 51  * @type String
+ 52  * @example
+ 53  */
+ 54
+ 55 /**
+ 56  * How the dialog can be resized, must be one of the four contents defined below.
+ 57  * <br /><br />
+ 58  * <strong>CKEDITOR.DIALOG_RESIZE_NONE</strong><br />
+ 59  * <strong>CKEDITOR.DIALOG_RESIZE_WIDTH</strong><br />
+ 60  * <strong>CKEDITOR.DIALOG_RESIZE_HEIGHT</strong><br />
+ 61  * <strong>CKEDITOR.DIALOG_RESIZE_BOTH</strong><br />
+ 62  * @name CKEDITOR.dialog.dialogDefinition.prototype.resizable
+ 63  * @field
+ 64  * @type Number
+ 65  * @default CKEDITOR.DIALOG_RESIZE_NONE
+ 66  * @example
+ 67  */
+ 68
+ 69 /**
+ 70  * The minimum width of the dialog, in pixels.
+ 71  * @name CKEDITOR.dialog.dialogDefinition.prototype.minWidth
+ 72  * @field
+ 73  * @type Number
+ 74  * @default 600
+ 75  * @example
+ 76  */
+ 77
+ 78 /**
+ 79  * The minimum height of the dialog, in pixels.
+ 80  * @name CKEDITOR.dialog.dialogDefinition.prototype.minHeight
+ 81  * @field
+ 82  * @type Number
+ 83  * @default 400
+ 84  * @example
+ 85  */
+ 86
+ 87 /**
+ 88  * The buttons in the dialog, defined as an array of
+ 89  * {@link CKEDITOR.dialog.buttonDefinition} objects.
+ 90  * @name CKEDITOR.dialog.dialogDefinition.prototype.buttons
+ 91  * @field
+ 92  * @type Array
+ 93  * @default [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ]
+ 94  * @example
+ 95  */
+ 96
+ 97 /**
+ 98  * The contents in the dialog, defined as an array of
+ 99  * {@link CKEDITOR.dialog.contentDefinition} objects. Required.
+100  * @name CKEDITOR.dialog.dialogDefinition.prototype.contents
+101  * @field
+102  * @type Array
+103  * @example
+104  */
+105
+106 /**
+107  * The function to execute when OK is pressed.
+108  * @name CKEDITOR.dialog.dialogDefinition.prototype.onOk
+109  * @field
+110  * @type Function
+111  * @example
+112  */
+113
+114 /**
+115  * The function to execute when Cancel is pressed.
+116  * @name CKEDITOR.dialog.dialogDefinition.prototype.onCancel
+117  * @field
+118  * @type Function
+119  * @example
+120  */
+121
+122 /**
+123  * The function to execute when the dialog is displayed for the first time.
+124  * @name CKEDITOR.dialog.dialogDefinition.prototype.onLoad
+125  * @field
+126  * @type Function
+127  * @example
+128  */
+129
+130 /**
+131  * This class is not really part of the API. It just illustrates the properties
+132  * that developers can use to define and create dialog content pages.
+133  * @name CKEDITOR.dialog.contentDefinition
+134  * @constructor
+135  * @example
+136  * // There is no constructor for this class, the user just has to define an
+137  * // object with the appropriate properties.
+138  */
+139
+140 /**
+141  * The id of the content page.
+142  * @name CKEDITOR.dialog.contentDefinition.prototype.id
+143  * @field
+144  * @type String
+145  * @example
+146  */
+147
+148 /**
+149  * The tab label of the content page.
+150  * @name CKEDITOR.dialog.contentDefinition.prototype.label
+151  * @field
+152  * @type String
+153  * @example
+154  */
+155
+156 /**
+157  * The popup message of the tab label.
+158  * @name CKEDITOR.dialog.contentDefinition.prototype.title
+159  * @field
+160  * @type String
+161  * @example
+162  */
+163
+164 /**
+165  * The CTRL hotkey for switching to the tab.
+166  * @name CKEDITOR.dialog.contentDefinition.prototype.accessKey
+167  * @field
+168  * @type String
+169  * @example
+170  * contentDefinition.accessKey = 'Q';	// Switch to this page when CTRL-Q is pressed.
+171  */
+172
+173 /**
+174  * The UI elements contained in this content page, defined as an array of
+175  * {@link CKEDITOR.dialog.uiElementDefinition} objects.
+176  * @name CKEDITOR.dialog.contentDefinition.prototype.elements
+177  * @field
+178  * @type Array
+179  * @example
+180  */
+181
+182 /**
+183  * This class is not really part of the API. It just illustrates the properties
+184  * that developers can use to define and create dialog buttons.
+185  * @name CKEDITOR.dialog.buttonDefinition
+186  * @constructor
+187  * @example
+188  * // There is no constructor for this class, the user just has to define an
+189  * // object with the appropriate properties.
+190  */
+191
+192 /**
+193  * The id of the dialog button. Required.
+194  * @name CKEDITOR.dialog.buttonDefinition.prototype.id
+195  * @type String
+196  * @field
+197  * @example
+198  */
+199
+200 /**
+201  * The label of the dialog button. Required.
+202  * @name CKEDITOR.dialog.buttonDefinition.prototype.label
+203  * @type String
+204  * @field
+205  * @example
+206  */
+207
+208 /**
+209  * The popup message of the dialog button.
+210  * @name CKEDITOR.dialog.buttonDefinition.prototype.title
+211  * @type String
+212  * @field
+213  * @example
+214  */
+215
+216 /**
+217  * The CTRL hotkey for the button.
+218  * @name CKEDITOR.dialog.buttonDefinition.prototype.accessKey
+219  * @type String
+220  * @field
+221  * @example
+222  * exitButton.accessKey = 'X';		// Button will be pressed when user presses CTRL-X
+223  */
+224
+225 /**
+226  * Whether the button is disabled.
+227  * @name CKEDITOR.dialog.buttonDefinition.prototype.disabled
+228  * @type Boolean
+229  * @field
+230  * @default false
+231  * @example
+232  */
+233
+234 /**
+235  * The function to execute when the button is clicked.
+236  * @name CKEDITOR.dialog.buttonDefinition.prototype.onClick
+237  * @type Function
+238  * @field
+239  * @example
+240  */
+241
+242 /**
+243  * This class is not really part of the API. It just illustrates the properties
+244  * that developers can use to define and create dialog UI elements.
+245  * @name CKEDITOR.dialog.uiElementDefinition
+246  * @constructor
+247  * @see CKEDITOR.ui.dialog.uiElement
+248  * @example
+249  * // There is no constructor for this class, the user just has to define an
+250  * // object with the appropriate properties.
+251  */
+252
+253 /**
+254  * The id of the UI element.
+255  * @name CKEDITOR.dialog.uiElementDefinition.prototype.id
+256  * @field
+257  * @type String
+258  * @example
+259  */
+260
+261 /**
+262  * The type of the UI element. Required.
+263  * @name CKEDITOR.dialog.uiElementDefinition.prototype.type
+264  * @field
+265  * @type String
+266  * @example
+267  */
+268
+269 /**
+270  * The popup label of the UI element.
+271  * @name CKEDITOR.dialog.uiElementDefinition.prototype.title
+272  * @field
+273  * @type String
+274  * @example
+275  */
+276
+277 /**
+278  * CSS class names to append to the UI element.
+279  * @name CKEDITOR.dialog.uiElementDefinition.prototype.className
+280  * @field
+281  * @type String
+282  * @example
+283  */
+284
+285 /**
+286  * Inline CSS classes to append to the UI element.
+287  * @name CKEDITOR.dialog.uiElementDefinition.prototype.style
+288  * @field
+289  * @type String
+290  * @example
+291  */
+292
+293 /**
+294  * Function to execute the first time the UI element is displayed.
+295  * @name CKEDITOR.dialog.uiElementDefinition.prototype.onLoad
+296  * @field
+297  * @type Function
+298  * @example
+299  */
+300
+301 /**
+302  * Function to execute whenever the UI element's parent dialog is displayed.
+303  * @name CKEDITOR.dialog.uiElementDefinition.prototype.onShow
+304  * @field
+305  * @type Function
+306  * @example
+307  */
+308
+309 /**
+310  * Function to execute whenever the UI element's parent dialog is closed.
+311  * @name CKEDITOR.dialog.uiElementDefinition.prototype.onHide
+312  * @field
+313  * @type Function
+314  * @example
+315  */
+316 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialog_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialog_plugin.js.html new file mode 100644 index 000000000..8e43a590c --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialog_plugin.js.html @@ -0,0 +1,2697 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview The floating dialog plugin.
+  8  */
+  9
+ 10 CKEDITOR.plugins.add( 'dialog',
+ 11 	{
+ 12 		requires : [ 'dialogui' ]
+ 13 	});
+ 14
+ 15 /**
+ 16  * No resize for this dialog.
+ 17  * @constant
+ 18  */
+ 19 CKEDITOR.DIALOG_RESIZE_NONE = 0;
+ 20
+ 21 /**
+ 22  * Only allow horizontal resizing for this dialog, disable vertical resizing.
+ 23  * @constant
+ 24  */
+ 25 CKEDITOR.DIALOG_RESIZE_WIDTH = 1;
+ 26
+ 27 /**
+ 28  * Only allow vertical resizing for this dialog, disable horizontal resizing.
+ 29  * @constant
+ 30  */
+ 31 CKEDITOR.DIALOG_RESIZE_HEIGHT = 2;
+ 32
+ 33 /*
+ 34  * Allow the dialog to be resized in both directions.
+ 35  * @constant
+ 36  */
+ 37 CKEDITOR.DIALOG_RESIZE_BOTH = 3;
+ 38
+ 39 (function()
+ 40 {
+ 41 	function isTabVisible( tabId )
+ 42 	{
+ 43 		return !!this._.tabs[ tabId ][ 0 ].$.offsetHeight;
+ 44 	}
+ 45
+ 46 	function getPreviousVisibleTab()
+ 47 	{
+ 48 		var tabId = this._.currentTabId,
+ 49 			length = this._.tabIdList.length,
+ 50 			tabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, tabId ) + length;
+ 51
+ 52 		for ( var i = tabIndex - 1 ; i > tabIndex - length ; i-- )
+ 53 		{
+ 54 			if ( isTabVisible.call( this, this._.tabIdList[ i % length ] ) )
+ 55 				return this._.tabIdList[ i % length ];
+ 56 		}
+ 57
+ 58 		return null;
+ 59 	}
+ 60
+ 61 	function getNextVisibleTab()
+ 62 	{
+ 63 		var tabId = this._.currentTabId,
+ 64 			length = this._.tabIdList.length,
+ 65 			tabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, tabId );
+ 66
+ 67 		for ( var i = tabIndex + 1 ; i < tabIndex + length ; i++ )
+ 68 		{
+ 69 			if ( isTabVisible.call( this, this._.tabIdList[ i % length ] ) )
+ 70 				return this._.tabIdList[ i % length ];
+ 71 		}
+ 72
+ 73 		return null;
+ 74 	}
+ 75
+ 76 	// Stores dialog related data from skin definitions. e.g. margin sizes.
+ 77 	var skinData = {};
+ 78
+ 79 	/**
+ 80 	 * This is the base class for runtime dialog objects. An instance of this
+ 81 	 * class represents a single named dialog for a single editor instance.
+ 82 	 * @param {Object} editor The editor which created the dialog.
+ 83 	 * @param {String} dialogName The dialog's registered name.
+ 84 	 * @constructor
+ 85 	 * @example
+ 86 	 * var dialogObj = new CKEDITOR.dialog( editor, 'smiley' );
+ 87 	 */
+ 88 	CKEDITOR.dialog = function( editor, dialogName )
+ 89 	{
+ 90 		// Load the dialog definition.
+ 91 		var definition = CKEDITOR.dialog._.dialogDefinitions[ dialogName ];
+ 92 		if ( !definition )
+ 93 		{
+ 94 			console.log( 'Error: The dialog "' + dialogName + '" is not defined.' );
+ 95 			return;
+ 96 		}
+ 97
+ 98 		// Completes the definition with the default values.
+ 99 		definition = CKEDITOR.tools.extend( definition( editor ), defaultDialogDefinition );
+100
+101 		// Clone a functionally independent copy for this dialog.
+102 		definition = CKEDITOR.tools.clone( definition );
+103
+104 		// Create a complex definition object, extending it with the API
+105 		// functions.
+106 		definition = new definitionObject( this, definition );
+107
+108 		// Fire the "dialogDefinition" event, making it possible to customize
+109 		// the dialog definition.
+110 		this.definition = definition = CKEDITOR.fire( 'dialogDefinition',
+111 			{
+112 				name : dialogName,
+113 				definition : definition
+114 			}
+115 			, editor ).definition;
+116
+117 		var doc = CKEDITOR.document;
+118
+119 		var themeBuilt = editor.theme.buildDialog( editor );
+120
+121 		// Initialize some basic parameters.
+122 		this._ =
+123 		{
+124 			editor : editor,
+125 			element : themeBuilt.element,
+126 			name : dialogName,
+127 			contentSize : { width : 0, height : 0 },
+128 			size : { width : 0, height : 0 },
+129 			updateSize : false,
+130 			contents : {},
+131 			buttons : {},
+132 			accessKeyMap : {},
+133
+134 			// Initialize the tab and page map.
+135 			tabs : {},
+136 			tabIdList : [],
+137 			currentTabId : null,
+138 			currentTabIndex : null,
+139 			pageCount : 0,
+140 			lastTab : null,
+141 			tabBarMode : false,
+142
+143 			// Initialize the tab order array for input widgets.
+144 			focusList : [],
+145 			currentFocusIndex : 0,
+146 			hasFocus : false
+147 		};
+148
+149 		this.parts = themeBuilt.parts;
+150
+151 		// Set the startup styles for the dialog, avoiding it enlarging the
+152 		// page size on the dialog creation.
+153 		this.parts.dialog.setStyles(
+154 			{
+155 				position : CKEDITOR.env.ie6Compat ? 'absolute' : 'fixed',
+156 				top : 0,
+157 				left: 0,
+158 				visibility : 'hidden'
+159 			});
+160
+161 		// Call the CKEDITOR.event constructor to initialize this instance.
+162 		CKEDITOR.event.call( this );
+163
+164 		// Initialize load, show, hide, ok and cancel events.
+165 		if ( definition.onLoad )
+166 			this.on( 'load', definition.onLoad );
+167
+168 		if ( definition.onShow )
+169 			this.on( 'show', definition.onShow );
+170
+171 		if ( definition.onHide )
+172 			this.on( 'hide', definition.onHide );
+173
+174 		if ( definition.onOk )
+175 		{
+176 			this.on( 'ok', function( evt )
+177 				{
+178 					if ( definition.onOk.call( this, evt ) === false )
+179 						evt.data.hide = false;
+180 				});
+181 		}
+182
+183 		if ( definition.onCancel )
+184 		{
+185 			this.on( 'cancel', function( evt )
+186 				{
+187 					if ( definition.onCancel.call( this, evt ) === false )
+188 						evt.data.hide = false;
+189 				});
+190 		}
+191
+192 		var me = this;
+193
+194 		// Iterates over all items inside all content in the dialog, calling a
+195 		// function for each of them.
+196 		var iterContents = function( func )
+197 		{
+198 			var contents = me._.contents,
+199 				stop = false;
+200
+201 			for ( var i in contents )
+202 			{
+203 				for ( var j in contents[i] )
+204 				{
+205 					stop = func.call( this, contents[i][j] );
+206 					if ( stop )
+207 						return;
+208 				}
+209 			}
+210 		};
+211
+212 		this.on( 'ok', function( evt )
+213 			{
+214 				iterContents( function( item )
+215 					{
+216 						if ( item.validate )
+217 						{
+218 							var isValid = item.validate( this );
+219
+220 							if ( typeof isValid == 'string' )
+221 							{
+222 								alert( isValid );
+223 								isValid = false;
+224 							}
+225
+226 							if ( isValid === false )
+227 							{
+228 								if ( item.select )
+229 									item.select();
+230 								else
+231 									item.focus();
+232
+233 								evt.data.hide = false;
+234 								evt.stop();
+235 								return true;
+236 							}
+237 						}
+238 					});
+239 			}, this, null, 0 );
+240
+241 		this.on( 'cancel', function( evt )
+242 			{
+243 				iterContents( function( item )
+244 					{
+245 						if ( item.isChanged() )
+246 						{
+247 							if ( !confirm( editor.lang.common.confirmCancel ) )
+248 								evt.data.hide = false;
+249 							return true;
+250 						}
+251 					});
+252 			}, this, null, 0 );
+253
+254 		this.parts.close.on( 'click', function( evt )
+255 				{
+256 					if ( this.fire( 'cancel', { hide : true } ).hide !== false )
+257 						this.hide();
+258 				}, this );
+259
+260 		function changeFocus( forward )
+261 		{
+262 			var focusList = me._.focusList,
+263 				offset = forward ? 1 : -1;
+264 			if ( focusList.length < 1 )
+265 				return;
+266
+267 			var currentIndex = ( me._.currentFocusIndex + offset + focusList.length ) % focusList.length;
+268 			while ( !focusList[ currentIndex ].isFocusable() )
+269 			{
+270 				currentIndex = ( currentIndex + offset + focusList.length ) % focusList.length;
+271 				if ( currentIndex == me._.currentFocusIndex )
+272 					break;
+273 			}
+274 			focusList[ currentIndex ].focus();
+275 		}
+276
+277 		function focusKeydownHandler( evt )
+278 		{
+279 			// If I'm not the top dialog, ignore.
+280 			if ( me != CKEDITOR.dialog._.currentTop )
+281 				return;
+282
+283 			var keystroke = evt.data.getKeystroke(),
+284 				processed = false;
+285 			if ( keystroke == 9 || keystroke == CKEDITOR.SHIFT + 9 )
+286 			{
+287 				var shiftPressed = ( keystroke == CKEDITOR.SHIFT + 9 );
+288
+289 				// Handling Tab and Shift-Tab.
+290 				if ( me._.tabBarMode )
+291 				{
+292 					// Change tabs.
+293 					var nextId = shiftPressed ? getPreviousVisibleTab.call( me ) : getNextVisibleTab.call( me );
+294 					me.selectPage( nextId );
+295 					me._.tabs[ nextId ][ 0 ].focus();
+296 				}
+297 				else
+298 				{
+299 					// Change the focus of inputs.
+300 					changeFocus( !shiftPressed );
+301 				}
+302
+303 				processed = true;
+304 			}
+305 			else if ( keystroke == CKEDITOR.ALT + 121 && !me._.tabBarMode )
+306 			{
+307 				// Alt-F10 puts focus into the current tab item in the tab bar.
+308 				me._.tabBarMode = true;
+309 				me._.tabs[ me._.currentTabId ][ 0 ].focus();
+310 				processed = true;
+311 			}
+312 			else if ( ( keystroke == 37 || keystroke == 39 ) && me._.tabBarMode )
+313 			{
+314 				// Arrow keys - used for changing tabs.
+315 				nextId = ( keystroke == 37 ? getPreviousVisibleTab.call( me ) : getNextVisibleTab.call( me ) );
+316 				me.selectPage( nextId );
+317 				me._.tabs[ nextId ][ 0 ].focus();
+318 				processed = true;
+319 			}
+320
+321 			if ( processed )
+322 			{
+323 				evt.stop();
+324 				evt.data.preventDefault();
+325 			}
+326 		}
+327
+328 		// Add the dialog keyboard handlers.
+329 		this.on( 'show', function()
+330 			{
+331 				CKEDITOR.document.on( 'keydown', focusKeydownHandler, this, null, 0 );
+332
+333 				if ( CKEDITOR.env.ie6Compat )
+334 				{
+335 					var coverDoc = coverElement.getChild( 0 ).getFrameDocument();
+336 					coverDoc.on( 'keydown', focusKeydownHandler, this, null, 0 );
+337 				}
+338 			} );
+339 		this.on( 'hide', function()
+340 			{
+341 				CKEDITOR.document.removeListener( 'keydown', focusKeydownHandler );
+342 			} );
+343 		this.on( 'iframeAdded', function( evt )
+344 			{
+345 				var doc = new CKEDITOR.dom.document( evt.data.iframe.$.contentWindow.document );
+346 				doc.on( 'keydown', focusKeydownHandler, this, null, 0 );
+347 			} );
+348
+349 		// Auto-focus logic in dialog.
+350 		this.on( 'show', function()
+351 			{
+352 				if ( !this._.hasFocus )
+353 				{
+354 					this._.currentFocusIndex = -1;
+355 					changeFocus( true );
+356
+357 					/*
+358 					 * IE BUG: If the initial focus went into a non-text element (e.g. button),
+359 					 * then IE would still leave the caret inside the editing area.
+360 					 */
+361 					if ( CKEDITOR.env.ie )
+362 					{
+363 						var $selection = editor.document.$.selection,
+364 							$range = $selection.createRange();
+365
+366 						if ( $range )
+367 						{
+368 							if ( $range.parentElement && $range.parentElement().ownerDocument == editor.document.$
+369 							  || $range.item && $range.item( 0 ).ownerDocument == editor.document.$ )
+370 							{
+371 								var $myRange = document.body.createTextRange();
+372 								$myRange.moveToElementText( this.getElement().getFirst().$ );
+373 								$myRange.collapse( true );
+374 								$myRange.select();
+375 							}
+376 						}
+377 					}
+378 				}
+379 			}, this, null, 0xffffffff );
+380
+381 		// IE6 BUG: Text fields and text areas are only half-rendered the first time the dialog appears in IE6 (#2661).
+382 		// This is still needed after [2708] and [2709] because text fields in hidden TR tags are still broken.
+383 		if ( CKEDITOR.env.ie6Compat )
+384 		{
+385 			this.on( 'load', function( evt )
+386 					{
+387 						var outer = this.getElement(),
+388 							inner = outer.getFirst();
+389 						inner.remove();
+390 						inner.appendTo( outer );
+391 					}, this );
+392 		}
+393
+394 		initDragAndDrop( this );
+395 		initResizeHandles( this );
+396
+397 		// Insert the title.
+398 		( new CKEDITOR.dom.text( definition.title, CKEDITOR.document ) ).appendTo( this.parts.title );
+399
+400 		// Insert the tabs and contents.
+401 		for ( var i = 0 ; i < definition.contents.length ; i++ )
+402 			this.addPage( definition.contents[i] );
+403
+404 		var tabRegex = /cke_dialog_tab(\s|$|_)/,
+405 			tabOuterRegex = /cke_dialog_tab(\s|$)/;
+406 		this.parts['tabs'].on( 'click', function( evt )
+407 				{
+408 					var target = evt.data.getTarget(), firstNode = target, id, page;
+409
+410 					// If we aren't inside a tab, bail out.
+411 					if ( !( tabRegex.test( target.$.className ) || target.getName() == 'a' ) )
+412 						return;
+413
+414 					// Find the outer <td> container of the tab.
+415 					id = target.$.id.substr( 0, target.$.id.lastIndexOf( '_' ) );
+416 					this.selectPage( id );
+417
+418 					if ( this._.tabBarMode )
+419 					{
+420 						this._.tabBarMode = false;
+421 						this._.currentFocusIndex = -1;
+422 						changeFocus( true );
+423 					}
+424
+425 					evt.data.preventDefault();
+426 				}, this );
+427
+428 		// Insert buttons.
+429 		var buttonsHtml = [],
+430 			buttons = CKEDITOR.dialog._.uiElementBuilders.hbox.build( this,
+431 				{
+432 					type : 'hbox',
+433 					className : 'cke_dialog_footer_buttons',
+434 					widths : [],
+435 					children : definition.buttons
+436 				}, buttonsHtml ).getChild();
+437 		this.parts.footer.setHtml( buttonsHtml.join( '' ) );
+438
+439 		for ( i = 0 ; i < buttons.length ; i++ )
+440 			this._.buttons[ buttons[i].id ] = buttons[i];
+441
+442 		CKEDITOR.skins.load( editor, 'dialog' );
+443 	};
+444
+445 	CKEDITOR.dialog.prototype =
+446 	{
+447 		/**
+448 		 * Resizes the dialog.
+449 		 * @param {Number} width The width of the dialog in pixels.
+450 		 * @param {Number} height The height of the dialog in pixels.
+451 		 * @function
+452 		 * @example
+453 		 * dialogObj.resize( 800, 640 );
+454 		 */
+455 		resize : (function()
+456 		{
+457 			return function( width, height )
+458 			{
+459 				if ( this._.contentSize && this._.contentSize.width == width && this._.contentSize.height == height )
+460 					return;
+461
+462 				CKEDITOR.dialog.fire( 'resize',
+463 					{
+464 						dialog : this,
+465 						skin : this._.editor.skinName,
+466 						width : width,
+467 						height : height
+468 					}, this._.editor );
+469
+470 				this._.contentSize = { width : width, height : height };
+471 				this._.updateSize = true;
+472 			};
+473 		})(),
+474
+475 		/**
+476 		 * Gets the current size of the dialog in pixels.
+477 		 * @returns {Object} An object with "width" and "height" properties.
+478 		 * @example
+479 		 * var width = dialogObj.getSize().width;
+480 		 */
+481 		getSize : function()
+482 		{
+483 			if ( !this._.updateSize )
+484 				return this._.size;
+485 			var element = this._.element.getFirst();
+486 			var size = this._.size = { width : element.$.offsetWidth || 0, height : element.$.offsetHeight || 0};
+487
+488 			// If either the offsetWidth or offsetHeight is 0, the element isn't visible.
+489 			this._.updateSize = !size.width || !size.height;
+490
+491 			return size;
+492 		},
+493
+494 		/**
+495 		 * Moves the dialog to an (x, y) coordinate relative to the window.
+496 		 * @function
+497 		 * @param {Number} x The target x-coordinate.
+498 		 * @param {Number} y The target y-coordinate.
+499 		 * @example
+500 		 * dialogObj.move( 10, 40 );
+501 		 */
+502 		move : (function()
+503 		{
+504 			var isFixed;
+505 			return function( x, y )
+506 			{
+507 				// The dialog may be fixed positioned or absolute positioned. Ask the
+508 				// browser what is the current situation first.
+509 				var element = this._.element.getFirst();
+510 				if ( isFixed === undefined )
+511 					isFixed = element.getComputedStyle( 'position' ) == 'fixed';
+512
+513 				if ( isFixed && this._.position && this._.position.x == x && this._.position.y == y )
+514 					return;
+515
+516 				// Save the current position.
+517 				this._.position = { x : x, y : y };
+518
+519 				// If not fixed positioned, add scroll position to the coordinates.
+520 				if ( !isFixed )
+521 				{
+522 					var scrollPosition = CKEDITOR.document.getWindow().getScrollPosition();
+523 					x += scrollPosition.x;
+524 					y += scrollPosition.y;
+525 				}
+526
+527 				element.setStyles(
+528 						{
+529 							'left'	: ( x > 0 ? x : 0 ) + 'px',
+530 							'top'	: ( y > 0 ? y : 0 ) + 'px'
+531 						});
+532 			};
+533 		})(),
+534
+535 		/**
+536 		 * Gets the dialog's position in the window.
+537 		 * @returns {Object} An object with "x" and "y" properties.
+538 		 * @example
+539 		 * var dialogX = dialogObj.getPosition().x;
+540 		 */
+541 		getPosition : function(){ return CKEDITOR.tools.extend( {}, this._.position ); },
+542
+543 		/**
+544 		 * Shows the dialog box.
+545 		 * @example
+546 		 * dialogObj.show();
+547 		 */
+548 		show : function()
+549 		{
+550 			if ( CKEDITOR.env.ie )
+551 				this._.editor.getSelection().lock();
+552
+553 			// Insert the dialog's element to the root document.
+554 			var element = this._.element;
+555 			var definition = this.definition;
+556 			if ( !( element.getParent() && element.getParent().equals( CKEDITOR.document.getBody() ) ) )
+557 				element.appendTo( CKEDITOR.document.getBody() );
+558 			else
+559 				return;
+560
+561 			// FIREFOX BUG: Fix vanishing caret for Firefox 2 or Gecko 1.8.
+562 			if ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 )
+563 			{
+564 				var dialogElement = this.parts.dialog;
+565 				dialogElement.setStyle( 'position', 'absolute' );
+566 				setTimeout( function()
+567 					{
+568 						dialogElement.setStyle( 'position', 'fixed' );
+569 					}, 0 );
+570 			}
+571
+572
+573 			// First, set the dialog to an appropriate size.
+574 			this.resize( definition.minWidth, definition.minHeight );
+575
+576 			// Select the first tab by default.
+577 			this.selectPage( this.definition.contents[0].id );
+578
+579 			// Reset all inputs back to their default value.
+580 			this.reset();
+581
+582 			// Set z-index.
+583 			if ( CKEDITOR.dialog._.currentZIndex === null )
+584 				CKEDITOR.dialog._.currentZIndex = this._.editor.config.baseFloatZIndex;
+585 			this._.element.getFirst().setStyle( 'z-index', CKEDITOR.dialog._.currentZIndex += 10 );
+586
+587 			// Maintain the dialog ordering and dialog cover.
+588 			// Also register key handlers if first dialog.
+589 			if ( CKEDITOR.dialog._.currentTop === null )
+590 			{
+591 				CKEDITOR.dialog._.currentTop = this;
+592 				this._.parentDialog = null;
+593 				addCover( this._.editor );
+594
+595 				CKEDITOR.document.on( 'keydown', accessKeyDownHandler );
+596 				CKEDITOR.document.on( 'keyup', accessKeyUpHandler );
+597 			}
+598 			else
+599 			{
+600 				this._.parentDialog = CKEDITOR.dialog._.currentTop;
+601 				var parentElement = this._.parentDialog.getElement().getFirst();
+602 				parentElement.$.style.zIndex  -= Math.floor( this._.editor.config.baseFloatZIndex / 2 );
+603 				CKEDITOR.dialog._.currentTop = this;
+604 			}
+605
+606 			// Register the Esc hotkeys.
+607 			registerAccessKey( this, this, '\x1b', null, function()
+608 					{
+609 						this.getButton( 'cancel' ) && this.getButton( 'cancel' ).click();
+610 					} );
+611
+612 			// Reset the hasFocus state.
+613 			this._.hasFocus = false;
+614
+615 			// Rearrange the dialog to the middle of the window.
+616 			CKEDITOR.tools.setTimeout( function()
+617 				{
+618 					var viewSize = CKEDITOR.document.getWindow().getViewPaneSize();
+619 					var dialogSize = this.getSize();
+620
+621 					this.move( ( viewSize.width - dialogSize.width ) / 2, ( viewSize.height - dialogSize.height ) / 2 );
+622
+623 					this.parts.dialog.setStyle( 'visibility', '' );
+624
+625 					// Execute onLoad for the first show.
+626 					this.fireOnce( 'load', {} );
+627 					this.fire( 'show', {} );
+628
+629 					// Save the initial values of the dialog.
+630 					this.foreach( function( contentObj ) { contentObj.setInitValue && contentObj.setInitValue(); } );
+631
+632 				},
+633 				100, this );
+634 		},
+635
+636 		/**
+637 		 * Executes a function for each UI element.
+638 		 * @param {Function} fn Function to execute for each UI element.
+639 		 * @returns {CKEDITOR.dialog} The current dialog object.
+640 		 */
+641 		foreach : function( fn )
+642 		{
+643 			for ( var i in this._.contents )
+644 			{
+645 				for ( var j in this._.contents[i] )
+646 					fn( this._.contents[i][j]);
+647 			}
+648 			return this;
+649 		},
+650
+651 		/**
+652 		 * Resets all input values in the dialog.
+653 		 * @example
+654 		 * dialogObj.reset();
+655 		 * @returns {CKEDITOR.dialog} The current dialog object.
+656 		 */
+657 		reset : (function()
+658 		{
+659 			var fn = function( widget ){ if ( widget.reset ) widget.reset(); };
+660 			return function(){ this.foreach( fn ); return this; };
+661 		})(),
+662
+663 		setupContent : function()
+664 		{
+665 			var args = arguments;
+666 			this.foreach( function( widget )
+667 				{
+668 					if ( widget.setup )
+669 						widget.setup.apply( widget, args );
+670 				});
+671 		},
+672
+673 		commitContent : function()
+674 		{
+675 			var args = arguments;
+676 			this.foreach( function( widget )
+677 				{
+678 					if ( widget.commit )
+679 						widget.commit.apply( widget, args );
+680 				});
+681 		},
+682
+683 		/**
+684 		 * Hides the dialog box.
+685 		 * @example
+686 		 * dialogObj.hide();
+687 		 */
+688 		hide : function()
+689 		{
+690 			this.fire( 'hide', {} );
+691
+692 			// Remove the dialog's element from the root document.
+693 			var element = this._.element;
+694 			if ( !element.getParent() )
+695 				return;
+696
+697 			element.remove();
+698 			this.parts.dialog.setStyle( 'visibility', 'hidden' );
+699
+700 			// Unregister all access keys associated with this dialog.
+701 			unregisterAccessKey( this );
+702
+703 			// Maintain dialog ordering and remove cover if needed.
+704 			if ( !this._.parentDialog )
+705 				removeCover();
+706 			else
+707 			{
+708 				var parentElement = this._.parentDialog.getElement().getFirst();
+709 				parentElement.setStyle( 'z-index', parseInt( parentElement.$.style.zIndex, 10 ) + Math.floor( this._.editor.config.baseFloatZIndex / 2 ) );
+710 			}
+711 			CKEDITOR.dialog._.currentTop = this._.parentDialog;
+712
+713 			// Deduct or clear the z-index.
+714 			if ( !this._.parentDialog )
+715 			{
+716 				CKEDITOR.dialog._.currentZIndex = null;
+717
+718 				// Remove access key handlers.
+719 				CKEDITOR.document.removeListener( 'keydown', accessKeyDownHandler );
+720 				CKEDITOR.document.removeListener( 'keyup', accessKeyUpHandler );
+721
+722 				var editor = this._.editor;
+723 				editor.focus();
+724
+725 				if ( CKEDITOR.env.ie )
+726 					editor.getSelection().unlock( true );
+727 			}
+728 			else
+729 				CKEDITOR.dialog._.currentZIndex -= 10;
+730
+731
+732 			// Reset the initial values of the dialog.
+733 			this.foreach( function( contentObj ) { contentObj.resetInitValue && contentObj.resetInitValue(); } );
+734 		},
+735
+736 		/**
+737 		 * Adds a tabbed page into the dialog.
+738 		 * @param {Object} contents Content definition.
+739 		 * @example
+740 		 */
+741 		addPage : function( contents )
+742 		{
+743 			var pageHtml = [],
+744 				titleHtml = contents.label ? ' title="' + CKEDITOR.tools.htmlEncode( contents.label ) + '"' : '',
+745 				elements = contents.elements,
+746 				vbox = CKEDITOR.dialog._.uiElementBuilders.vbox.build( this,
+747 						{
+748 							type : 'vbox',
+749 							className : 'cke_dialog_page_contents',
+750 							children : contents.elements,
+751 							expand : !!contents.expand,
+752 							padding : contents.padding,
+753 							style : contents.style || 'width: 100%; height: 100%;'
+754 						}, pageHtml );
+755
+756 			// Create the HTML for the tab and the content block.
+757 			var page = CKEDITOR.dom.element.createFromHtml( pageHtml.join( '' ) );
+758 			var tab = CKEDITOR.dom.element.createFromHtml( [
+759 					'<a class="cke_dialog_tab"',
+760 						( this._.pageCount > 0 ? ' cke_last' : 'cke_first' ),
+761 						titleHtml,
+762 						( !!contents.hidden ? ' style="display:none"' : '' ),
+763 						' id="', contents.id + '_', CKEDITOR.tools.getNextNumber(), '"' +
+764 						' href="javascript:void(0)"',
+765 						' hidefocus="true">',
+766 							contents.label,
+767 					'</a>'
+768 				].join( '' ) );
+769
+770 			// If only a single page exist, a different style is used in the central pane.
+771 			if ( this._.pageCount === 0 )
+772 				this.parts.dialog.addClass( 'cke_single_page' );
+773 			else
+774 				this.parts.dialog.removeClass( 'cke_single_page' );
+775
+776 			// Take records for the tabs and elements created.
+777 			this._.tabs[ contents.id ] = [ tab, page ];
+778 			this._.tabIdList.push( contents.id );
+779 			this._.pageCount++;
+780 			this._.lastTab = tab;
+781
+782 			var contentMap = this._.contents[ contents.id ] = {},
+783 				cursor,
+784 				children = vbox.getChild();
+785
+786 			while ( ( cursor = children.shift() ) )
+787 			{
+788 				contentMap[ cursor.id ] = cursor;
+789 				if ( typeof( cursor.getChild ) == 'function' )
+790 					children.push.apply( children, cursor.getChild() );
+791 			}
+792
+793 			// Attach the DOM nodes.
+794
+795 			page.setAttribute( 'name', contents.id );
+796 			page.appendTo( this.parts.contents );
+797
+798 			tab.unselectable();
+799 			this.parts.tabs.append( tab );
+800
+801 			// Add access key handlers if access key is defined.
+802 			if ( contents.accessKey )
+803 			{
+804 				registerAccessKey( this, this, 'CTRL+' + contents.accessKey,
+805 					tabAccessKeyDown, tabAccessKeyUp );
+806 				this._.accessKeyMap[ 'CTRL+' + contents.accessKey ] = contents.id;
+807 			}
+808 		},
+809
+810 		/**
+811 		 * Activates a tab page in the dialog by its id.
+812 		 * @param {String} id The id of the dialog tab to be activated.
+813 		 * @example
+814 		 * dialogObj.selectPage( 'tab_1' );
+815 		 */
+816 		selectPage : function( id )
+817 		{
+818 			// Hide the non-selected tabs and pages.
+819 			for ( var i in this._.tabs )
+820 			{
+821 				var tab = this._.tabs[i][0],
+822 					page = this._.tabs[i][1];
+823 				if ( i != id )
+824 				{
+825 					tab.removeClass( 'cke_dialog_tab_selected' );
+826 					page.hide();
+827 				}
+828 			}
+829
+830 			var selected = this._.tabs[id];
+831 			selected[0].addClass( 'cke_dialog_tab_selected' );
+832 			selected[1].show();
+833 			this._.currentTabId = id;
+834 			this._.currentTabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, id );
+835 		},
+836
+837 		/**
+838 		 * Hides a page's tab away from the dialog.
+839 		 * @param {String} id The page's Id.
+840 		 * @example
+841 		 * dialog.hidePage( 'tab_3' );
+842 		 */
+843 		hidePage : function( id )
+844 		{
+845 			var tab = this._.tabs[id] && this._.tabs[id][0];
+846 			if ( !tab )
+847 				return;
+848 			tab.hide();
+849 		},
+850
+851 		/**
+852 		 * Unhides a page's tab.
+853 		 * @param {String} id The page's Id.
+854 		 * @example
+855 		 * dialog.showPage( 'tab_2' );
+856 		 */
+857 		showPage : function( id )
+858 		{
+859 			var tab = this._.tabs[id] && this._.tabs[id][0];
+860 			if ( !tab )
+861 				return;
+862 			tab.show();
+863 		},
+864
+865 		/**
+866 		 * Gets the root DOM element of the dialog.
+867 		 * @returns {CKEDITOR.dom.element} The <span> element containing this dialog.
+868 		 * @example
+869 		 * var dialogElement = dialogObj.getElement().getFirst();
+870 		 * dialogElement.setStyle( 'padding', '5px' );
+871 		 */
+872 		getElement : function()
+873 		{
+874 			return this._.element;
+875 		},
+876
+877 		/**
+878 		 * Gets the name of the dialog.
+879 		 * @returns {String} The name of this dialog.
+880 		 * @example
+881 		 * var dialogName = dialogObj.getName();
+882 		 */
+883 		getName : function()
+884 		{
+885 			return this._.name;
+886 		},
+887
+888 		/**
+889 		 * Gets a dialog UI element object from a dialog page.
+890 		 * @param {String} pageId id of dialog page.
+891 		 * @param {String} elementId id of UI element.
+892 		 * @example
+893 		 * @returns {CKEDITOR.ui.dialog.uiElement} The dialog UI element.
+894 		 */
+895 		getContentElement : function( pageId, elementId )
+896 		{
+897 			return this._.contents[pageId][elementId];
+898 		},
+899
+900 		/**
+901 		 * Gets the value of a dialog UI element.
+902 		 * @param {String} pageId id of dialog page.
+903 		 * @param {String} elementId id of UI element.
+904 		 * @example
+905 		 * @returns {Object} The value of the UI element.
+906 		 */
+907 		getValueOf : function( pageId, elementId )
+908 		{
+909 			return this.getContentElement( pageId, elementId ).getValue();
+910 		},
+911
+912 		/**
+913 		 * Sets the value of a dialog UI element.
+914 		 * @param {String} pageId id of the dialog page.
+915 		 * @param {String} elementId id of the UI element.
+916 		 * @param {Object} value The new value of the UI element.
+917 		 * @example
+918 		 */
+919 		setValueOf : function( pageId, elementId, value )
+920 		{
+921 			return this.getContentElement( pageId, elementId ).setValue( value );
+922 		},
+923
+924 		/**
+925 		 * Gets the UI element of a button in the dialog's button row.
+926 		 * @param {String} id The id of the button.
+927 		 * @example
+928 		 * @returns {CKEDITOR.ui.dialog.button} The button object.
+929 		 */
+930 		getButton : function( id )
+931 		{
+932 			return this._.buttons[ id ];
+933 		},
+934
+935 		/**
+936 		 * Simulates a click to a dialog button in the dialog's button row.
+937 		 * @param {String} id The id of the button.
+938 		 * @example
+939 		 * @returns The return value of the dialog's "click" event.
+940 		 */
+941 		click : function( id )
+942 		{
+943 			return this._.buttons[ id ].click();
+944 		},
+945
+946 		/**
+947 		 * Disables a dialog button.
+948 		 * @param {String} id The id of the button.
+949 		 * @example
+950 		 */
+951 		disableButton : function( id )
+952 		{
+953 			return this._.buttons[ id ].disable();
+954 		},
+955
+956 		/**
+957 		 * Enables a dialog button.
+958 		 * @param {String} id The id of the button.
+959 		 * @example
+960 		 */
+961 		enableButton : function( id )
+962 		{
+963 			return this._.buttons[ id ].enable();
+964 		},
+965
+966 		/**
+967 		 * Gets the number of pages in the dialog.
+968 		 * @returns {Number} Page count.
+969 		 */
+970 		getPageCount : function()
+971 		{
+972 			return this._.pageCount;
+973 		},
+974
+975 		/**
+976 		 * Gets the editor instance which opened this dialog.
+977 		 * @returns {CKEDITOR.editor} Parent editor instances.
+978 		 */
+979 		getParentEditor : function()
+980 		{
+981 			return this._.editor;
+982 		},
+983
+984 		/**
+985 		 * Gets the element that was selected when opening the dialog, if any.
+986 		 * @returns {CKEDITOR.dom.element} The element that was selected, or null.
+987 		 */
+988 		getSelectedElement : function()
+989 		{
+990 			return this.getParentEditor().getSelection().getSelectedElement();
+991 		}
+992 	};
+993
+994 	CKEDITOR.tools.extend( CKEDITOR.dialog,
+995 		/**
+996 		 * @lends CKEDITOR.dialog
+997 		 */
+998 		{
+999 			/**
+1000 			 * Registers a dialog.
+1001 			 * @param {String} name The dialog's name.
+1002 			 * @param {Function|String} dialogDefinition
+1003 			 * A function returning the dialog's definition, or the URL to the .js file holding the function.
+1004 			 * The function should accept an argument "editor" which is the current editor instance, and
+1005 			 * return an object conforming to {@link CKEDITOR.dialog.dialogDefinition}.
+1006 			 * @example
+1007 			 * @see CKEDITOR.dialog.dialogDefinition
+1008 			 */
+1009 			add : function( name, dialogDefinition )
+1010 			{
+1011 				// Avoid path registration from multiple instances override definition.
+1012 				if ( !this._.dialogDefinitions[name]
+1013 					|| typeof  dialogDefinition == 'function' )
+1014 					this._.dialogDefinitions[name] = dialogDefinition;
+1015 			},
+1016
+1017 			exists : function( name )
+1018 			{
+1019 				return !!this._.dialogDefinitions[ name ];
+1020 			},
+1021
+1022 			getCurrent : function()
+1023 			{
+1024 				return CKEDITOR.dialog._.currentTop;
+1025 			},
+1026
+1027 			/**
+1028 			 * The default OK button for dialogs. Fires the "ok" event and closes the dialog if the event succeeds.
+1029 			 * @static
+1030 			 * @field
+1031 			 * @example
+1032 			 * @type Function
+1033 			 */
+1034 			okButton : (function()
+1035 			{
+1036 				var retval = function( editor, override )
+1037 				{
+1038 					override = override || {};
+1039 					return CKEDITOR.tools.extend( {
+1040 						id : 'ok',
+1041 						type : 'button',
+1042 						label : editor.lang.common.ok,
+1043 						'class' : 'cke_dialog_ui_button_ok',
+1044 						onClick : function( evt )
+1045 						{
+1046 							var dialog = evt.data.dialog;
+1047 							if ( dialog.fire( 'ok', { hide : true } ).hide !== false )
+1048 								dialog.hide();
+1049 						}
+1050 					}, override, true );
+1051 				};
+1052 				retval.type = 'button';
+1053 				retval.override = function( override )
+1054 				{
+1055 					return CKEDITOR.tools.extend( function( editor ){ return retval( editor, override ); },
+1056 							{ type : 'button' }, true );
+1057 				};
+1058 				return retval;
+1059 			})(),
+1060
+1061 			/**
+1062 			 * The default cancel button for dialogs. Fires the "cancel" event and closes the dialog if no UI element value changed.
+1063 			 * @static
+1064 			 * @field
+1065 			 * @example
+1066 			 * @type Function
+1067 			 */
+1068 			cancelButton : (function()
+1069 			{
+1070 				var retval = function( editor, override )
+1071 				{
+1072 					override = override || {};
+1073 					return CKEDITOR.tools.extend( {
+1074 						id : 'cancel',
+1075 						type : 'button',
+1076 						label : editor.lang.common.cancel,
+1077 						'class' : 'cke_dialog_ui_button_cancel',
+1078 						onClick : function( evt )
+1079 						{
+1080 							var dialog = evt.data.dialog;
+1081 							if ( dialog.fire( 'cancel', { hide : true } ).hide !== false )
+1082 								dialog.hide();
+1083 						}
+1084 					}, override, true );
+1085 				};
+1086 				retval.type = 'button';
+1087 				retval.override = function( override )
+1088 				{
+1089 					return CKEDITOR.tools.extend( function( editor ){ return retval( editor, override ); },
+1090 							{ type : 'button' }, true );
+1091 				};
+1092 				return retval;
+1093 			})(),
+1094
+1095 			/**
+1096 			 * Registers a dialog UI element.
+1097 			 * @param {String} typeName The name of the UI element.
+1098 			 * @param {Function} builder The function to build the UI element.
+1099 			 * @example
+1100 			 */
+1101 			addUIElement : function( typeName, builder )
+1102 			{
+1103 				this._.uiElementBuilders[ typeName ] = builder;
+1104 			}
+1105 		});
+1106
+1107 	CKEDITOR.dialog._ =
+1108 	{
+1109 		uiElementBuilders : {},
+1110
+1111 		dialogDefinitions : {},
+1112
+1113 		currentTop : null,
+1114
+1115 		currentZIndex : null
+1116 	};
+1117
+1118 	// "Inherit" (copy actually) from CKEDITOR.event.
+1119 	CKEDITOR.event.implementOn( CKEDITOR.dialog );
+1120 	CKEDITOR.event.implementOn( CKEDITOR.dialog.prototype, true );
+1121
+1122 	var defaultDialogDefinition =
+1123 	{
+1124 		resizable : CKEDITOR.DIALOG_RESIZE_NONE,
+1125 		minWidth : 600,
+1126 		minHeight : 400,
+1127 		buttons : [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ]
+1128 	};
+1129
+1130 	// Tool function used to return an item from an array based on its id
+1131 	// property.
+1132 	var getById = function( array, id, recurse )
+1133 	{
+1134 		for ( var i = 0, item ; ( item = array[ i ] ) ; i++ )
+1135 		{
+1136 			if ( item.id == id )
+1137 				return item;
+1138 			if ( recurse && item[ recurse ] )
+1139 			{
+1140 				var retval = getById( item[ recurse ], id, recurse ) ;
+1141 				if ( retval )
+1142 					return retval;
+1143 			}
+1144 		}
+1145 		return null;
+1146 	};
+1147
+1148 	// Tool function used to add an item into an array.
+1149 	var addById = function( array, newItem, nextSiblingId, recurse, nullIfNotFound )
+1150 	{
+1151 		if ( nextSiblingId )
+1152 		{
+1153 			for ( var i = 0, item ; ( item = array[ i ] ) ; i++ )
+1154 			{
+1155 				if ( item.id == nextSiblingId )
+1156 				{
+1157 					array.splice( i, 0, newItem );
+1158 					return newItem;
+1159 				}
+1160
+1161 				if ( recurse && item[ recurse ] )
+1162 				{
+1163 					var retval = addById( item[ recurse ], newItem, nextSiblingId, recurse, true );
+1164 					if ( retval )
+1165 						return retval;
+1166 				}
+1167 			}
+1168
+1169 			if ( nullIfNotFound )
+1170 				return null;
+1171 		}
+1172
+1173 		array.push( newItem );
+1174 		return newItem;
+1175 	};
+1176
+1177 	// Tool function used to remove an item from an array based on its id.
+1178 	var removeById = function( array, id, recurse )
+1179 	{
+1180 		for ( var i = 0, item ; ( item = array[ i ] ) ; i++ )
+1181 		{
+1182 			if ( item.id == id )
+1183 				return array.splice( i, 1 );
+1184 			if ( recurse && item[ recurse ] )
+1185 			{
+1186 				var retval = removeById( item[ recurse ], id, recurse );
+1187 				if ( retval )
+1188 					return retval;
+1189 			}
+1190 		}
+1191 		return null;
+1192 	};
+1193
+1194 	/**
+1195 	 * This class is not really part of the API. It is the "definition" property value
+1196 	 * passed to "dialogDefinition" event handlers.
+1197 	 * @constructor
+1198 	 * @name CKEDITOR.dialog.dialogDefinitionObject
+1199 	 * @extends CKEDITOR.dialog.dialogDefinition
+1200 	 * @example
+1201 	 * CKEDITOR.on( 'dialogDefinition', function( evt )
+1202 	 * 	{
+1203 	 * 		var definition = evt.data.definition;
+1204 	 * 		var content = definition.getContents( 'page1' );
+1205 	 * 		...
+1206 	 * 	} );
+1207 	 */
+1208 	var definitionObject = function( dialog, dialogDefinition )
+1209 	{
+1210 		// TODO : Check if needed.
+1211 		this.dialog = dialog;
+1212
+1213 		// Transform the contents entries in contentObjects.
+1214 		var contents = dialogDefinition.contents;
+1215 		for ( var i = 0, content ; ( content = contents[i] ) ; i++ )
+1216 			contents[ i ] = new contentObject( dialog, content );
+1217
+1218 		CKEDITOR.tools.extend( this, dialogDefinition );
+1219 	};
+1220
+1221 	definitionObject.prototype =
+1222 	/** @lends CKEDITOR.dialog.dialogDefinitionObject.prototype */
+1223 	{
+1224 		/**
+1225 		 * Gets a content definition.
+1226 		 * @param {String} id The id of the content definition.
+1227 		 * @returns {CKEDITOR.dialog.contentDefinition} The content definition
+1228 		 *		matching id.
+1229 		 */
+1230 		getContents : function( id )
+1231 		{
+1232 			return getById( this.contents, id );
+1233 		},
+1234
+1235 		/**
+1236 		 * Gets a button definition.
+1237 		 * @param {String} id The id of the button definition.
+1238 		 * @returns {CKEDITOR.dialog.buttonDefinition} The button definition
+1239 		 *		matching id.
+1240 		 */
+1241 		getButton : function( id )
+1242 		{
+1243 			return getById( this.buttons, id );
+1244 		},
+1245
+1246 		/**
+1247 		 * Adds a content definition object under this dialog definition.
+1248 		 * @param {CKEDITOR.dialog.contentDefinition} contentDefinition The
+1249 		 *		content definition.
+1250 		 * @param {String} [nextSiblingId] The id of an existing content
+1251 		 *		definition which the new content definition will be inserted
+1252 		 *		before. Omit if the new content definition is to be inserted as
+1253 		 *		the last item.
+1254 		 * @returns {CKEDITOR.dialog.contentDefinition} The inserted content
+1255 		 *		definition.
+1256 		 */
+1257 		addContents : function( contentDefinition, nextSiblingId )
+1258 		{
+1259 			return addById( this.contents, contentDefinition, nextSiblingId );
+1260 		},
+1261
+1262 		/**
+1263 		 * Adds a button definition object under this dialog definition.
+1264 		 * @param {CKEDITOR.dialog.buttonDefinition} buttonDefinition The
+1265 		 *		button definition.
+1266 		 * @param {String} [nextSiblingId] The id of an existing button
+1267 		 *		definition which the new button definition will be inserted
+1268 		 *		before. Omit if the new button definition is to be inserted as
+1269 		 *		the last item.
+1270 		 * @returns {CKEDITOR.dialog.buttonDefinition} The inserted button
+1271 		 *		definition.
+1272 		 */
+1273 		addButton : function( buttonDefinition, nextSiblingId )
+1274 		{
+1275 			return addById( this.buttons, buttonDefinition, nextSiblingId );
+1276 		},
+1277
+1278 		/**
+1279 		 * Removes a content definition from this dialog definition.
+1280 		 * @param {String} id The id of the content definition to be removed.
+1281 		 * @returns {CKEDITOR.dialog.contentDefinition} The removed content
+1282 		 *		definition.
+1283 		 */
+1284 		removeContents : function( id )
+1285 		{
+1286 			removeById( this.contents, id );
+1287 		},
+1288
+1289 		/**
+1290 		 * Removes a button definition from the dialog definition.
+1291 		 * @param {String} id The id of the button definition to be removed.
+1292 		 * @returns {CKEDITOR.dialog.buttonDefinition} The removed button
+1293 		 *		definition.
+1294 		 */
+1295 		removeButton : function( id )
+1296 		{
+1297 			removeById( this.buttons, id );
+1298 		}
+1299 	};
+1300
+1301 	/**
+1302 	 * This class is not really part of the API. It is the template of the
+1303 	 * objects representing content pages inside the
+1304 	 * CKEDITOR.dialog.dialogDefinitionObject.
+1305 	 * @constructor
+1306 	 * @name CKEDITOR.dialog.contentDefinitionObject
+1307 	 * @example
+1308 	 * CKEDITOR.on( 'dialogDefinition', function( evt )
+1309 	 * 	{
+1310 	 * 		var definition = evt.data.definition;
+1311 	 * 		var content = definition.getContents( 'page1' );
+1312 	 *		content.remove( 'textInput1' );
+1313 	 * 		...
+1314 	 * 	} );
+1315 	 */
+1316 	function contentObject( dialog, contentDefinition )
+1317 	{
+1318 		this._ =
+1319 		{
+1320 			dialog : dialog
+1321 		};
+1322
+1323 		CKEDITOR.tools.extend( this, contentDefinition );
+1324 	}
+1325
+1326 	contentObject.prototype =
+1327 	/** @lends CKEDITOR.dialog.contentDefinitionObject.prototype */
+1328 	{
+1329 		/**
+1330 		 * Gets a UI element definition under the content definition.
+1331 		 * @param {String} id The id of the UI element definition.
+1332 		 * @returns {CKEDITOR.dialog.uiElementDefinition}
+1333 		 */
+1334 		get : function( id )
+1335 		{
+1336 			return getById( this.elements, id, 'children' );
+1337 		},
+1338
+1339 		/**
+1340 		 * Adds a UI element definition to the content definition.
+1341 		 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition The
+1342 		 *		UI elemnet definition to be added.
+1343 		 * @param {String} nextSiblingId The id of an existing UI element
+1344 		 *		definition which the new UI element definition will be inserted
+1345 		 *		before. Omit if the new button definition is to be inserted as
+1346 		 *		the last item.
+1347 		 * @returns {CKEDITOR.dialog.uiElementDefinition} The element
+1348 		 *		definition inserted.
+1349 		 */
+1350 		add : function( elementDefinition, nextSiblingId )
+1351 		{
+1352 			return addById( this.elements, elementDefinition, nextSiblingId, 'children' );
+1353 		},
+1354
+1355 		/**
+1356 		 * Removes a UI element definition from the content definition.
+1357 		 * @param {String} id The id of the UI element definition to be
+1358 		 *		removed.
+1359 		 * @returns {CKEDITOR.dialog.uiElementDefinition} The element
+1360 		 *		definition removed.
+1361 		 * @example
+1362 		 */
+1363 		remove : function( id )
+1364 		{
+1365 			removeById( this.elements, id, 'children' );
+1366 		}
+1367 	};
+1368
+1369 	function initDragAndDrop( dialog )
+1370 	{
+1371 		var lastCoords = null,
+1372 			abstractDialogCoords = null,
+1373 			element = dialog.getElement().getFirst(),
+1374 			editor = dialog.getParentEditor(),
+1375 			magnetDistance = editor.config.dialog_magnetDistance,
+1376 			margins = skinData[ editor.skinName ].margins || [ 0, 0, 0, 0 ];
+1377
+1378 		function mouseMoveHandler( evt )
+1379 		{
+1380 			var dialogSize = dialog.getSize(),
+1381 				viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize(),
+1382 				x = evt.data.$.screenX,
+1383 				y = evt.data.$.screenY,
+1384 				dx = x - lastCoords.x,
+1385 				dy = y - lastCoords.y,
+1386 				realX, realY;
+1387
+1388 			lastCoords = { x : x, y : y };
+1389 			abstractDialogCoords.x += dx;
+1390 			abstractDialogCoords.y += dy;
+1391
+1392 			if ( abstractDialogCoords.x + margins[3] < magnetDistance )
+1393 				realX = - margins[3];
+1394 			else if ( abstractDialogCoords.x - margins[1] > viewPaneSize.width - dialogSize.width - magnetDistance )
+1395 				realX = viewPaneSize.width - dialogSize.width + margins[1];
+1396 			else
+1397 				realX = abstractDialogCoords.x;
+1398
+1399 			if ( abstractDialogCoords.y + margins[0] < magnetDistance )
+1400 				realY = - margins[0];
+1401 			else if ( abstractDialogCoords.y - margins[2] > viewPaneSize.height - dialogSize.height - magnetDistance )
+1402 				realY = viewPaneSize.height - dialogSize.height + margins[2];
+1403 			else
+1404 				realY = abstractDialogCoords.y;
+1405
+1406 			dialog.move( realX, realY );
+1407
+1408 			evt.data.preventDefault();
+1409 		}
+1410
+1411 		function mouseUpHandler( evt )
+1412 		{
+1413 			CKEDITOR.document.removeListener( 'mousemove', mouseMoveHandler );
+1414 			CKEDITOR.document.removeListener( 'mouseup', mouseUpHandler );
+1415
+1416 			if ( CKEDITOR.env.ie6Compat )
+1417 			{
+1418 				var coverDoc = coverElement.getChild( 0 ).getFrameDocument();
+1419 				coverDoc.removeListener( 'mousemove', mouseMoveHandler );
+1420 				coverDoc.removeListener( 'mouseup', mouseUpHandler );
+1421 			}
+1422 		}
+1423
+1424 		dialog.parts.title.on( 'mousedown', function( evt )
+1425 			{
+1426 				lastCoords = { x : evt.data.$.screenX, y : evt.data.$.screenY };
+1427
+1428 				CKEDITOR.document.on( 'mousemove', mouseMoveHandler );
+1429 				CKEDITOR.document.on( 'mouseup', mouseUpHandler );
+1430 				abstractDialogCoords = dialog.getPosition();
+1431
+1432 				if ( CKEDITOR.env.ie6Compat )
+1433 				{
+1434 					var coverDoc = coverElement.getChild( 0 ).getFrameDocument();
+1435 					coverDoc.on( 'mousemove', mouseMoveHandler );
+1436 					coverDoc.on( 'mouseup', mouseUpHandler );
+1437 				}
+1438
+1439 				evt.data.preventDefault();
+1440 			}, dialog );
+1441 	}
+1442
+1443 	function initResizeHandles( dialog )
+1444 	{
+1445 		var definition = dialog.definition,
+1446 			minWidth = definition.minWidth || 0,
+1447 			minHeight = definition.minHeight || 0,
+1448 			resizable = definition.resizable,
+1449 			margins = skinData[ dialog.getParentEditor().skinName ].margins || [ 0, 0, 0, 0 ];
+1450
+1451 		function topSizer( coords, dy )
+1452 		{
+1453 			coords.y += dy;
+1454 		}
+1455
+1456 		function rightSizer( coords, dx )
+1457 		{
+1458 			coords.x2 += dx;
+1459 		}
+1460
+1461 		function bottomSizer( coords, dy )
+1462 		{
+1463 			coords.y2 += dy;
+1464 		}
+1465
+1466 		function leftSizer( coords, dx )
+1467 		{
+1468 			coords.x += dx;
+1469 		}
+1470
+1471 		var lastCoords = null,
+1472 			abstractDialogCoords = null,
+1473 			magnetDistance = dialog._.editor.config.magnetDistance,
+1474 			parts = [ 'tl', 't', 'tr', 'l', 'r', 'bl', 'b', 'br' ];
+1475
+1476 		function mouseDownHandler( evt )
+1477 		{
+1478 			var partName = evt.listenerData.part, size = dialog.getSize();
+1479 			abstractDialogCoords = dialog.getPosition();
+1480 			CKEDITOR.tools.extend( abstractDialogCoords,
+1481 				{
+1482 					x2 : abstractDialogCoords.x + size.width,
+1483 					y2 : abstractDialogCoords.y + size.height
+1484 				} );
+1485 			lastCoords = { x : evt.data.$.screenX, y : evt.data.$.screenY };
+1486
+1487 			CKEDITOR.document.on( 'mousemove', mouseMoveHandler, dialog, { part : partName } );
+1488 			CKEDITOR.document.on( 'mouseup', mouseUpHandler, dialog, { part : partName } );
+1489
+1490 			if ( CKEDITOR.env.ie6Compat )
+1491 			{
+1492 				var coverDoc = coverElement.getChild( 0 ).getFrameDocument();
+1493 				coverDoc.on( 'mousemove', mouseMoveHandler, dialog, { part : partName } );
+1494 				coverDoc.on( 'mouseup', mouseUpHandler, dialog, { part : partName } );
+1495 			}
+1496
+1497 			evt.data.preventDefault();
+1498 		}
+1499
+1500 		function mouseMoveHandler( evt )
+1501 		{
+1502 			var x = evt.data.$.screenX,
+1503 				y = evt.data.$.screenY,
+1504 				dx = x - lastCoords.x,
+1505 				dy = y - lastCoords.y,
+1506 				viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize(),
+1507 				partName = evt.listenerData.part;
+1508
+1509 			if ( partName.search( 't' ) != -1 )
+1510 				topSizer( abstractDialogCoords, dy );
+1511 			if ( partName.search( 'l' ) != -1 )
+1512 				leftSizer( abstractDialogCoords, dx );
+1513 			if ( partName.search( 'b' ) != -1 )
+1514 				bottomSizer( abstractDialogCoords, dy );
+1515 			if ( partName.search( 'r' ) != -1 )
+1516 				rightSizer( abstractDialogCoords, dx );
+1517
+1518 			lastCoords = { x : x, y : y };
+1519
+1520 			var realX, realY, realX2, realY2;
+1521
+1522 			if ( abstractDialogCoords.x + margins[3] < magnetDistance )
+1523 				realX = - margins[3];
+1524 			else if ( partName.search( 'l' ) != -1 && abstractDialogCoords.x2 - abstractDialogCoords.x < minWidth + magnetDistance )
+1525 				realX = abstractDialogCoords.x2 - minWidth;
+1526 			else
+1527 				realX = abstractDialogCoords.x;
+1528
+1529 			if ( abstractDialogCoords.y + margins[0] < magnetDistance )
+1530 				realY = - margins[0];
+1531 			else if ( partName.search( 't' ) != -1 && abstractDialogCoords.y2 - abstractDialogCoords.y < minHeight + magnetDistance )
+1532 				realY = abstractDialogCoords.y2 - minHeight;
+1533 			else
+1534 				realY = abstractDialogCoords.y;
+1535
+1536 			if ( abstractDialogCoords.x2 - margins[1] > viewPaneSize.width - magnetDistance )
+1537 				realX2 = viewPaneSize.width + margins[1] ;
+1538 			else if ( partName.search( 'r' ) != -1 && abstractDialogCoords.x2 - abstractDialogCoords.x < minWidth + magnetDistance )
+1539 				realX2 = abstractDialogCoords.x + minWidth;
+1540 			else
+1541 				realX2 = abstractDialogCoords.x2;
+1542
+1543 			if ( abstractDialogCoords.y2 - margins[2] > viewPaneSize.height - magnetDistance )
+1544 				realY2= viewPaneSize.height + margins[2] ;
+1545 			else if ( partName.search( 'b' ) != -1 && abstractDialogCoords.y2 - abstractDialogCoords.y < minHeight + magnetDistance )
+1546 				realY2 = abstractDialogCoords.y + minHeight;
+1547 			else
+1548 				realY2 = abstractDialogCoords.y2 ;
+1549
+1550 			dialog.move( realX, realY );
+1551 			dialog.resize( realX2 - realX, realY2 - realY );
+1552
+1553 			evt.data.preventDefault();
+1554 		}
+1555
+1556 		function mouseUpHandler( evt )
+1557 		{
+1558 			CKEDITOR.document.removeListener( 'mouseup', mouseUpHandler );
+1559 			CKEDITOR.document.removeListener( 'mousemove', mouseMoveHandler );
+1560
+1561 			if ( CKEDITOR.env.ie6Compat )
+1562 			{
+1563 				var coverDoc = coverElement.getChild( 0 ).getFrameDocument();
+1564 				coverDoc.removeListener( 'mouseup', mouseUpHandler );
+1565 				coverDoc.removeListener( 'mousemove', mouseMoveHandler );
+1566 			}
+1567 		}
+1568
+1569 // TODO : Simplify the resize logic, having just a single resize grip <div>.
+1570 //		var widthTest = /[lr]/,
+1571 //			heightTest = /[tb]/;
+1572 //		for ( var i = 0 ; i < parts.length ; i++ )
+1573 //		{
+1574 //			var element = dialog.parts[ parts[i] + '_resize' ];
+1575 //			if ( resizable == CKEDITOR.DIALOG_RESIZE_NONE ||
+1576 //					resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT && widthTest.test( parts[i] ) ||
+1577 //			  		resizable == CKEDITOR.DIALOG_RESIZE_WIDTH && heightTest.test( parts[i] ) )
+1578 //			{
+1579 //				element.hide();
+1580 //				continue;
+1581 //			}
+1582 //			element.on( 'mousedown', mouseDownHandler, dialog, { part : parts[i] } );
+1583 //		}
+1584 	}
+1585
+1586 	var resizeCover;
+1587 	var coverElement;
+1588
+1589 	var addCover = function( editor )
+1590 	{
+1591 		var win = CKEDITOR.document.getWindow();
+1592
+1593 		if ( !coverElement )
+1594 		{
+1595 			var html = [
+1596 					'<div style="position: ', ( CKEDITOR.env.ie6Compat ? 'absolute' : 'fixed' ),
+1597 					'; z-index: ', editor.config.baseFloatZIndex,
+1598 					'; top: 0px; left: 0px; ',
+1599 					'background-color: ', editor.config.dialog_backgroundCoverColor,
+1600 					'" id="cke_dialog_background_cover">'
+1601 				];
+1602
+1603
+1604 			if ( CKEDITOR.env.ie6Compat )
+1605 			{
+1606 				// Support for custom document.domain in IE.
+1607 				var isCustomDomain = CKEDITOR.env.isCustomDomain();
+1608
+1609 				html.push(
+1610 					'<iframe' +
+1611 						' hidefocus="true"' +
+1612 						' frameborder="0"' +
+1613 						' id="cke_dialog_background_iframe"' +
+1614 						' src="javascript:' );
+1615
+1616 				html.push(
+1617 						isCustomDomain ?
+1618 							'void((function(){' +
+1619 								'document.open();' +
+1620 								'document.domain=\'' + document.domain + '\';' +
+1621 								'document.close();' +
+1622 							'})())'
+1623 						:
+1624 							'\'\'' );
+1625
+1626 				html.push(
+1627 						'"' +
+1628 						' style="' +
+1629 							'position:absolute;' +
+1630 							'left:0;' +
+1631 							'top:0;' +
+1632 							'width:100%;' +
+1633 							'height: 100%;' +
+1634 							'progid:DXImageTransform.Microsoft.Alpha(opacity=0)">' +
+1635 					'</iframe>' );
+1636 			}
+1637
+1638 			html.push( '</div>' );
+1639
+1640 			coverElement = CKEDITOR.dom.element.createFromHtml( html.join( '' ) );
+1641 		}
+1642
+1643 		var element = coverElement;
+1644
+1645 		var resizeFunc = function()
+1646 		{
+1647 			var size = win.getViewPaneSize();
+1648 			element.setStyles(
+1649 				{
+1650 					width : size.width + 'px',
+1651 					height : size.height + 'px'
+1652 				} );
+1653 		};
+1654
+1655 		var scrollFunc = function()
+1656 		{
+1657 			var pos = win.getScrollPosition(),
+1658 				cursor = CKEDITOR.dialog._.currentTop;
+1659 			element.setStyles(
+1660 					{
+1661 						left : pos.x + 'px',
+1662 						top : pos.y + 'px'
+1663 					});
+1664
+1665 			do
+1666 			{
+1667 				var dialogPos = cursor.getPosition();
+1668 				cursor.move( dialogPos.x, dialogPos.y );
+1669 			} while( ( cursor = cursor._.parentDialog ) );
+1670 		};
+1671
+1672 		resizeCover = resizeFunc;
+1673 		win.on( 'resize', resizeFunc );
+1674 		resizeFunc();
+1675 		if ( CKEDITOR.env.ie6Compat )
+1676 		{
+1677 			// IE BUG: win.$.onscroll assignment doesn't work.. it must be window.onscroll.
+1678 			// So we need to invent a really funny way to make it work.
+1679 			var myScrollHandler = function()
+1680 				{
+1681 					scrollFunc();
+1682 					arguments.callee.prevScrollHandler.apply( this, arguments );
+1683 				};
+1684 			win.$.setTimeout( function()
+1685 				{
+1686 					myScrollHandler.prevScrollHandler = window.onscroll || function(){};
+1687 					window.onscroll = myScrollHandler;
+1688 				}, 0 );
+1689 			scrollFunc();
+1690 		}
+1691 		element.setOpacity( editor.config.dialog_backgroundCoverOpacity );
+1692 		element.appendTo( CKEDITOR.document.getBody() );
+1693 	};
+1694
+1695 	var removeCover = function()
+1696 	{
+1697 		if ( !coverElement )
+1698 			return;
+1699
+1700 		var win = CKEDITOR.document.getWindow();
+1701 		coverElement.remove();
+1702 		win.removeListener( 'resize', resizeCover );
+1703
+1704 		if ( CKEDITOR.env.ie6Compat )
+1705 		{
+1706 			win.$.setTimeout( function()
+1707 				{
+1708 					var prevScrollHandler = window.onscroll && window.onscroll.prevScrollHandler;
+1709 					window.onscroll = prevScrollHandler || null;
+1710 				}, 0 );
+1711 		}
+1712 		resizeCover = null;
+1713 	};
+1714
+1715 	var accessKeyProcessors = {};
+1716
+1717 	var accessKeyDownHandler = function( evt )
+1718 	{
+1719 		var ctrl = evt.data.$.ctrlKey || evt.data.$.metaKey,
+1720 			alt = evt.data.$.altKey,
+1721 			shift = evt.data.$.shiftKey,
+1722 			key = String.fromCharCode( evt.data.$.keyCode ),
+1723 			keyProcessor = accessKeyProcessors[( ctrl ? 'CTRL+' : '' ) + ( alt ? 'ALT+' : '') + ( shift ? 'SHIFT+' : '' ) + key];
+1724
+1725 		if ( !keyProcessor || !keyProcessor.length )
+1726 			return;
+1727
+1728 		keyProcessor = keyProcessor[keyProcessor.length - 1];
+1729 		keyProcessor.keydown && keyProcessor.keydown.call( keyProcessor.uiElement, keyProcessor.dialog, keyProcessor.key );
+1730 		evt.data.preventDefault();
+1731 	};
+1732
+1733 	var accessKeyUpHandler = function( evt )
+1734 	{
+1735 		var ctrl = evt.data.$.ctrlKey || evt.data.$.metaKey,
+1736 			alt = evt.data.$.altKey,
+1737 			shift = evt.data.$.shiftKey,
+1738 			key = String.fromCharCode( evt.data.$.keyCode ),
+1739 			keyProcessor = accessKeyProcessors[( ctrl ? 'CTRL+' : '' ) + ( alt ? 'ALT+' : '') + ( shift ? 'SHIFT+' : '' ) + key];
+1740
+1741 		if ( !keyProcessor || !keyProcessor.length )
+1742 			return;
+1743
+1744 		keyProcessor = keyProcessor[keyProcessor.length - 1];
+1745 		keyProcessor.keyup && keyProcessor.keyup.call( keyProcessor.uiElement, keyProcessor.dialog, keyProcessor.key );
+1746 		evt.data.preventDefault();
+1747 	};
+1748
+1749 	var registerAccessKey = function( uiElement, dialog, key, downFunc, upFunc )
+1750 	{
+1751 		var procList = accessKeyProcessors[key] || ( accessKeyProcessors[key] = [] );
+1752 		procList.push( {
+1753 				uiElement : uiElement,
+1754 				dialog : dialog,
+1755 				key : key,
+1756 				keyup : upFunc || uiElement.accessKeyUp,
+1757 				keydown : downFunc || uiElement.accessKeyDown
+1758 			} );
+1759 	};
+1760
+1761 	var unregisterAccessKey = function( obj )
+1762 	{
+1763 		for ( var i in accessKeyProcessors )
+1764 		{
+1765 			var list = accessKeyProcessors[i];
+1766 			for ( var j = list.length - 1 ; j >= 0 ; j-- )
+1767 			{
+1768 				if ( list[j].dialog == obj || list[j].uiElement == obj )
+1769 					list.splice( j, 1 );
+1770 			}
+1771 			if ( list.length === 0 )
+1772 				delete accessKeyProcessors[i];
+1773 		}
+1774 	};
+1775
+1776 	var tabAccessKeyUp = function( dialog, key )
+1777 	{
+1778 		if ( dialog._.accessKeyMap[key] )
+1779 			dialog.selectPage( dialog._.accessKeyMap[key] );
+1780 	};
+1781
+1782 	var tabAccessKeyDown = function( dialog, key )
+1783 	{
+1784 	};
+1785
+1786 	(function()
+1787 	{
+1788 		CKEDITOR.ui.dialog =
+1789 		{
+1790 			/**
+1791 			 * The base class of all dialog UI elements.
+1792 			 * @constructor
+1793 			 * @param {CKEDITOR.dialog} dialog Parent dialog object.
+1794 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition Element
+1795 			 * definition. Accepted fields:
+1796 			 * <ul>
+1797 			 * 	<li><strong>id</strong> (Required) The id of the UI element. See {@link
+1798 			 * 	CKEDITOR.dialog#getContentElement}</li>
+1799 			 * 	<li><strong>type</strong> (Required) The type of the UI element. The
+1800 			 * 	value to this field specifies which UI element class will be used to
+1801 			 * 	generate the final widget.</li>
+1802 			 * 	<li><strong>title</strong> (Optional) The popup tooltip for the UI
+1803 			 * 	element.</li>
+1804 			 * 	<li><strong>hidden</strong> (Optional) A flag that tells if the element
+1805 			 * 	should be initially visible.</li>
+1806 			 * 	<li><strong>className</strong> (Optional) Additional CSS class names
+1807 			 * 	to add to the UI element. Separated by space.</li>
+1808 			 * 	<li><strong>style</strong> (Optional) Additional CSS inline styles
+1809 			 * 	to add to the UI element. A semicolon (;) is required after the last
+1810 			 * 	style declaration.</li>
+1811 			 * 	<li><strong>accessKey</strong> (Optional) The alphanumeric access key
+1812 			 * 	for this element. Access keys are automatically prefixed by CTRL.</li>
+1813 			 * 	<li><strong>on*</strong> (Optional) Any UI element definition field that
+1814 			 * 	starts with <em>on</em> followed immediately by a capital letter and
+1815 			 * 	probably more letters is an event handler. Event handlers may be further
+1816 			 * 	divided into registered event handlers and DOM event handlers. Please
+1817 			 * 	refer to {@link CKEDITOR.ui.dialog.uiElement#registerEvents} and
+1818 			 * 	{@link CKEDITOR.ui.dialog.uiElement#eventProcessors} for more
+1819 			 * 	information.</li>
+1820 			 * </ul>
+1821 			 * @param {Array} htmlList
+1822 			 * List of HTML code to be added to the dialog's content area.
+1823 			 * @param {Function|String} nodeNameArg
+1824 			 * A function returning a string, or a simple string for the node name for
+1825 			 * the root DOM node. Default is 'div'.
+1826 			 * @param {Function|Object} stylesArg
+1827 			 * A function returning an object, or a simple object for CSS styles applied
+1828 			 * to the DOM node. Default is empty object.
+1829 			 * @param {Function|Object} attributesArg
+1830 			 * A fucntion returning an object, or a simple object for attributes applied
+1831 			 * to the DOM node. Default is empty object.
+1832 			 * @param {Function|String} contentsArg
+1833 			 * A function returning a string, or a simple string for the HTML code inside
+1834 			 * the root DOM node. Default is empty string.
+1835 			 * @example
+1836 			 */
+1837 			uiElement : function( dialog, elementDefinition, htmlList, nodeNameArg, stylesArg, attributesArg, contentsArg )
+1838 			{
+1839 				if ( arguments.length < 4 )
+1840 					return;
+1841
+1842 				var nodeName = ( nodeNameArg.call ? nodeNameArg( elementDefinition ) : nodeNameArg ) || 'div',
+1843 					html = [ '<', nodeName, ' ' ],
+1844 					styles = ( stylesArg && stylesArg.call ? stylesArg( elementDefinition ) : stylesArg ) || {},
+1845 					attributes = ( attributesArg && attributesArg.call ? attributesArg( elementDefinition ) : attributesArg ) || {},
+1846 					innerHTML = ( contentsArg && contentsArg.call ? contentsArg( dialog, elementDefinition ) : contentsArg ) || '',
+1847 					domId = this.domId = attributes.id || CKEDITOR.tools.getNextNumber() + '_uiElement',
+1848 					id = this.id = elementDefinition.id,
+1849 					i;
+1850
+1851 				// Set the id, a unique id is required for getElement() to work.
+1852 				attributes.id = domId;
+1853
+1854 				// Set the type and definition CSS class names.
+1855 				var classes = {};
+1856 				if ( elementDefinition.type )
+1857 					classes[ 'cke_dialog_ui_' + elementDefinition.type ] = 1;
+1858 				if ( elementDefinition.className )
+1859 					classes[ elementDefinition.className ] = 1;
+1860 				var attributeClasses = ( attributes['class'] && attributes['class'].split ) ? attributes['class'].split( ' ' ) : [];
+1861 				for ( i = 0 ; i < attributeClasses.length ; i++ )
+1862 				{
+1863 					if ( attributeClasses[i] )
+1864 						classes[ attributeClasses[i] ] = 1;
+1865 				}
+1866 				var finalClasses = [];
+1867 				for ( i in classes )
+1868 					finalClasses.push( i );
+1869 				attributes['class'] = finalClasses.join( ' ' );
+1870
+1871 				// Set the popup tooltop.
+1872 				if ( elementDefinition.title )
+1873 					attributes.title = elementDefinition.title;
+1874
+1875 				// Write the inline CSS styles.
+1876 				var styleStr = ( elementDefinition.style || '' ).split( ';' );
+1877 				for ( i in styles )
+1878 					styleStr.push( i + ':' + styles[i] );
+1879 				if ( elementDefinition.hidden )
+1880 					styleStr.push( 'display:none' );
+1881 				for ( i = styleStr.length - 1 ; i >= 0 ; i-- )
+1882 				{
+1883 					if ( styleStr[i] === '' )
+1884 						styleStr.splice( i, 1 );
+1885 				}
+1886 				if ( styleStr.length > 0 )
+1887 					attributes.style = ( attributes.style ? ( attributes.style + '; ' ) : '' ) + styleStr.join( '; ' );
+1888
+1889 				// Write the attributes.
+1890 				for ( i in attributes )
+1891 					html.push( i + '="' + CKEDITOR.tools.htmlEncode( attributes[i] ) + '" ');
+1892
+1893 				// Write the content HTML.
+1894 				html.push( '>', innerHTML, '</', nodeName, '>' );
+1895
+1896 				// Add contents to the parent HTML array.
+1897 				htmlList.push( html.join( '' ) );
+1898
+1899 				( this._ || ( this._ = {} ) ).dialog = dialog;
+1900
+1901 				// Override isChanged if it is defined in element definition.
+1902 				if ( typeof( elementDefinition.isChanged ) == 'boolean' )
+1903 					this.isChanged = function(){ return elementDefinition.isChanged; };
+1904 				if ( typeof( elementDefinition.isChanged ) == 'function' )
+1905 					this.isChanged = elementDefinition.isChanged;
+1906
+1907 				// Add events.
+1908 				CKEDITOR.event.implementOn( this );
+1909
+1910 				this.registerEvents( elementDefinition );
+1911 				if ( this.accessKeyUp && this.accessKeyDown && elementDefinition.accessKey )
+1912 					registerAccessKey( this, dialog, 'CTRL+' + elementDefinition.accessKey );
+1913
+1914 				var me = this;
+1915 				dialog.on( 'load', function()
+1916 					{
+1917 						if ( me.getInputElement() )
+1918 						{
+1919 							me.getInputElement().on( 'focus', function()
+1920 								{
+1921 									dialog._.tabBarMode = false;
+1922 									dialog._.hasFocus = true;
+1923 									me.fire( 'focus' );
+1924 								}, me );
+1925 						}
+1926 					} );
+1927
+1928 				// Register the object as a tab focus if it can be included.
+1929 				if ( this.keyboardFocusable )
+1930 				{
+1931 					this.focusIndex = dialog._.focusList.push( this ) - 1;
+1932 					this.on( 'focus', function()
+1933 						{
+1934 							dialog._.currentFocusIndex = me.focusIndex;
+1935 						} );
+1936 				}
+1937
+1938 				// Completes this object with everything we have in the
+1939 				// definition.
+1940 				CKEDITOR.tools.extend( this, elementDefinition );
+1941 			},
+1942
+1943 			/**
+1944 			 * Horizontal layout box for dialog UI elements, auto-expends to available width of container.
+1945 			 * @constructor
+1946 			 * @extends CKEDITOR.ui.dialog.uiElement
+1947 			 * @param {CKEDITOR.dialog} dialog
+1948 			 * Parent dialog object.
+1949 			 * @param {Array} childObjList
+1950 			 * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this
+1951 			 * container.
+1952 			 * @param {Array} childHtmlList
+1953 			 * Array of HTML code that correspond to the HTML output of all the
+1954 			 * objects in childObjList.
+1955 			 * @param {Array} htmlList
+1956 			 * Array of HTML code that this element will output to.
+1957 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+1958 			 * The element definition. Accepted fields:
+1959 			 * <ul>
+1960 			 * 	<li><strong>widths</strong> (Optional) The widths of child cells.</li>
+1961 			 * 	<li><strong>height</strong> (Optional) The height of the layout.</li>
+1962 			 * 	<li><strong>padding</strong> (Optional) The padding width inside child
+1963 			 * 	 cells.</li>
+1964 			 * 	<li><strong>align</strong> (Optional) The alignment of the whole layout
+1965 			 * 	</li>
+1966 			 * </ul>
+1967 			 * @example
+1968 			 */
+1969 			hbox : function( dialog, childObjList, childHtmlList, htmlList, elementDefinition )
+1970 			{
+1971 				if ( arguments.length < 4 )
+1972 					return;
+1973
+1974 				this._ || ( this._ = {} );
+1975
+1976 				var children = this._.children = childObjList,
+1977 					widths = elementDefinition && elementDefinition.widths || null,
+1978 					height = elementDefinition && elementDefinition.height || null,
+1979 					styles = {},
+1980 					i;
+1981 				/** @ignore */
+1982 				var innerHTML = function()
+1983 				{
+1984 					var html = [ '<tbody><tr class="cke_dialog_ui_hbox">' ];
+1985 					for ( i = 0 ; i < childHtmlList.length ; i++ )
+1986 					{
+1987 						var className = 'cke_dialog_ui_hbox_child',
+1988 							styles = [];
+1989 						if ( i === 0 )
+1990 							className = 'cke_dialog_ui_hbox_first';
+1991 						if ( i == childHtmlList.length - 1 )
+1992 							className = 'cke_dialog_ui_hbox_last';
+1993 						html.push( '<td class="', className, '" ' );
+1994 						if ( widths )
+1995 						{
+1996 							if ( widths[i] )
+1997 								styles.push( 'width:' + CKEDITOR.tools.cssLength( widths[i] ) );
+1998 						}
+1999 						else
+2000 							styles.push( 'width:' + Math.floor( 100 / childHtmlList.length ) + '%' );
+2001 						if ( height )
+2002 							styles.push( 'height:' + CKEDITOR.tools.cssLength( height ) );
+2003 						if ( elementDefinition && elementDefinition.padding != undefined )
+2004 							styles.push( 'padding:' + CKEDITOR.tools.cssLength( elementDefinition.padding ) );
+2005 						if ( styles.length > 0 )
+2006 							html.push( 'style="' + styles.join('; ') + '" ' );
+2007 						html.push( '>', childHtmlList[i], '</td>' );
+2008 					}
+2009 					html.push( '</tr></tbody>' );
+2010 					return html.join( '' );
+2011 				};
+2012
+2013 				CKEDITOR.ui.dialog.uiElement.call(
+2014 					this,
+2015 					dialog,
+2016 					elementDefinition || { type : 'hbox' },
+2017 					htmlList,
+2018 					'table',
+2019 					styles,
+2020 					elementDefinition && elementDefinition.align && { align : elementDefinition.align } || null,
+2021 					innerHTML );
+2022 			},
+2023
+2024 			/**
+2025 			 * Vertical layout box for dialog UI elements.
+2026 			 * @constructor
+2027 			 * @extends CKEDITOR.ui.dialog.hbox
+2028 			 * @param {CKEDITOR.dialog} dialog
+2029 			 * Parent dialog object.
+2030 			 * @param {Array} childObjList
+2031 			 * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this
+2032 			 * container.
+2033 			 * @param {Array} childHtmlList
+2034 			 * Array of HTML code that correspond to the HTML output of all the
+2035 			 * objects in childObjList.
+2036 			 * @param {Array} htmlList
+2037 			 * Array of HTML code that this element will output to.
+2038 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+2039 			 * The element definition. Accepted fields:
+2040 			 * <ul>
+2041 			 * 	<li><strong>width</strong> (Optional) The width of the layout.</li>
+2042 			 * 	<li><strong>heights</strong> (Optional) The heights of individual cells.
+2043 			 * 	</li>
+2044 			 * 	<li><strong>align</strong> (Optional) The alignment of the layout.</li>
+2045 			 * 	<li><strong>padding</strong> (Optional) The padding width inside child
+2046 			 * 	cells.</li>
+2047 			 * 	<li><strong>expand</strong> (Optional) Whether the layout should expand
+2048 			 * 	vertically to fill its container.</li>
+2049 			 * </ul>
+2050 			 * @example
+2051 			 */
+2052 			vbox : function( dialog, childObjList, childHtmlList, htmlList, elementDefinition )
+2053 			{
+2054 				if (arguments.length < 3 )
+2055 					return;
+2056
+2057 				this._ || ( this._ = {} );
+2058
+2059 				var children = this._.children = childObjList,
+2060 					width = elementDefinition && elementDefinition.width || null,
+2061 					heights = elementDefinition && elementDefinition.heights || null;
+2062 				/** @ignore */
+2063 				var innerHTML = function()
+2064 				{
+2065 					var html = [ '<table cellspacing="0" border="0" ' ];
+2066 					html.push( 'style="' );
+2067 					if ( elementDefinition && elementDefinition.expand )
+2068 						html.push( 'height:100%;' );
+2069 					html.push( 'width:' + CKEDITOR.tools.cssLength( width || '100%' ), ';' );
+2070 					html.push( '"' );
+2071 					html.push( 'align="', CKEDITOR.tools.htmlEncode(
+2072 						( elementDefinition && elementDefinition.align ) || ( dialog.getParentEditor().lang.dir == 'ltr' ? 'left' : 'right' ) ), '" ' );
+2073
+2074 					html.push( '><tbody>' );
+2075 					for ( var i = 0 ; i < childHtmlList.length ; i++ )
+2076 					{
+2077 						var styles = [];
+2078 						html.push( '<tr><td ' );
+2079 						if ( width )
+2080 							styles.push( 'width:' + CKEDITOR.tools.cssLength( width || '100%' ) );
+2081 						if ( heights )
+2082 							styles.push( 'height:' + CKEDITOR.tools.cssLength( heights[i] ) );
+2083 						else if ( elementDefinition && elementDefinition.expand )
+2084 							styles.push( 'height:' + Math.floor( 100 / childHtmlList.length ) + '%' );
+2085 						if ( elementDefinition && elementDefinition.padding != undefined )
+2086 							styles.push( 'padding:' + CKEDITOR.tools.cssLength( elementDefinition.padding ) );
+2087 						if ( styles.length > 0 )
+2088 							html.push( 'style="', styles.join( '; ' ), '" ' );
+2089 						html.push( ' class="cke_dialog_ui_vbox_child">', childHtmlList[i], '</td></tr>' );
+2090 					}
+2091 					html.push( '</tbody></table>' );
+2092 					return html.join( '' );
+2093 				};
+2094 				CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition || { type : 'vbox' }, htmlList, 'div', null, null, innerHTML );
+2095 			}
+2096 		};
+2097 	})();
+2098
+2099 	CKEDITOR.ui.dialog.uiElement.prototype =
+2100 	{
+2101 		/**
+2102 		 * Gets the root DOM element of this dialog UI object.
+2103 		 * @returns {CKEDITOR.dom.element} Root DOM element of UI object.
+2104 		 * @example
+2105 		 * uiElement.getElement().hide();
+2106 		 */
+2107 		getElement : function()
+2108 		{
+2109 			return CKEDITOR.document.getById( this.domId );
+2110 		},
+2111
+2112 		/**
+2113 		 * Gets the DOM element that the user inputs values.
+2114 		 * This function is used by setValue(), getValue() and focus(). It should
+2115 		 * be overrided in child classes where the input element isn't the root
+2116 		 * element.
+2117 		 * @returns {CKEDITOR.dom.element} The element where the user input values.
+2118 		 * @example
+2119 		 * var rawValue = textInput.getInputElement().$.value;
+2120 		 */
+2121 		getInputElement : function()
+2122 		{
+2123 			return this.getElement();
+2124 		},
+2125
+2126 		/**
+2127 		 * Gets the parent dialog object containing this UI element.
+2128 		 * @returns {CKEDITOR.dialog} Parent dialog object.
+2129 		 * @example
+2130 		 * var dialog = uiElement.getDialog();
+2131 		 */
+2132 		getDialog : function()
+2133 		{
+2134 			return this._.dialog;
+2135 		},
+2136
+2137 		/**
+2138 		 * Sets the value of this dialog UI object.
+2139 		 * @param {Object} value The new value.
+2140 		 * @returns {CKEDITOR.dialog.uiElement} The current UI element.
+2141 		 * @example
+2142 		 * uiElement.setValue( 'Dingo' );
+2143 		 */
+2144 		setValue : function( value )
+2145 		{
+2146 			this.getInputElement().setValue( value );
+2147 			this.fire( 'change', { value : value } );
+2148 			return this;
+2149 		},
+2150
+2151 		/**
+2152 		 * Gets the current value of this dialog UI object.
+2153 		 * @returns {Object} The current value.
+2154 		 * @example
+2155 		 * var myValue = uiElement.getValue();
+2156 		 */
+2157 		getValue : function()
+2158 		{
+2159 			return this.getInputElement().getValue();
+2160 		},
+2161
+2162 		/**
+2163 		 * Tells whether the UI object's value has changed.
+2164 		 * @returns {Boolean} true if changed, false if not changed.
+2165 		 * @example
+2166 		 * if ( uiElement.isChanged() )
+2167 		 *   confirm( 'Value changed! Continue?' );
+2168 		 */
+2169 		isChanged : function()
+2170 		{
+2171 			// Override in input classes.
+2172 			return false;
+2173 		},
+2174
+2175 		/**
+2176 		 * Selects the parent tab of this element. Usually called by focus() or overridden focus() methods.
+2177 		 * @returns {CKEDITOR.dialog.uiElement} The current UI element.
+2178 		 * @example
+2179 		 * focus : function()
+2180 		 * {
+2181 		 * 		this.selectParentTab();
+2182 		 * 		// do something else.
+2183 		 * }
+2184 		 */
+2185 		selectParentTab : function()
+2186 		{
+2187 			var element = this.getInputElement(),
+2188 				cursor = element,
+2189 				tabId;
+2190 			while ( ( cursor = cursor.getParent() ) && cursor.$.className.search( 'cke_dialog_page_contents' ) == -1 )
+2191 			{ /*jsl:pass*/ }
+2192
+2193 			// Some widgets don't have parent tabs (e.g. OK and Cancel buttons).
+2194 			if ( !cursor )
+2195 				return this;
+2196
+2197 			tabId = cursor.getAttribute( 'name' );
+2198 			// Avoid duplicate select.
+2199 			if ( this._.dialog._.currentTabId != tabId )
+2200 				this._.dialog.selectPage( tabId );
+2201 			return this;
+2202 		},
+2203
+2204 		/**
+2205 		 * Puts the focus to the UI object. Switches tabs if the UI object isn't in the active tab page.
+2206 		 * @returns {CKEDITOR.dialog.uiElement} The current UI element.
+2207 		 * @example
+2208 		 * uiElement.focus();
+2209 		 */
+2210 		focus : function()
+2211 		{
+2212 			this.selectParentTab().getInputElement().focus();
+2213 			return this;
+2214 		},
+2215
+2216 		/**
+2217 		 * Registers the on* event handlers defined in the element definition.
+2218 		 * The default behavior of this function is:
+2219 		 * <ol>
+2220 		 *  <li>
+2221 		 *  	If the on* event is defined in the class's eventProcesors list,
+2222 		 *  	then the registration is delegated to the corresponding function
+2223 		 *  	in the eventProcessors list.
+2224 		 *  </li>
+2225 		 *  <li>
+2226 		 *  	If the on* event is not defined in the eventProcessors list, then
+2227 		 *  	register the event handler under the corresponding DOM event of
+2228 		 *  	the UI element's input DOM element (as defined by the return value
+2229 		 *  	of {@link CKEDITOR.ui.dialog.uiElement#getInputElement}).
+2230 		 *  </li>
+2231 		 * </ol>
+2232 		 * This function is only called at UI element instantiation, but can
+2233 		 * be overridded in child classes if they require more flexibility.
+2234 		 * @param {CKEDITOR.dialog.uiElementDefinition} definition The UI element
+2235 		 * definition.
+2236 		 * @returns {CKEDITOR.dialog.uiElement} The current UI element.
+2237 		 * @example
+2238 		 */
+2239 		registerEvents : function( definition )
+2240 		{
+2241 			var regex = /^on([A-Z]\w+)/,
+2242 				match;
+2243
+2244 			var registerDomEvent = function( uiElement, dialog, eventName, func )
+2245 			{
+2246 				dialog.on( 'load', function()
+2247 				{
+2248 					uiElement.getInputElement().on( eventName, func, uiElement );
+2249 				});
+2250 			};
+2251
+2252 			for ( var i in definition )
+2253 			{
+2254 				if ( !( match = i.match( regex ) ) )
+2255 					continue;
+2256 				if ( this.eventProcessors[i] )
+2257 					this.eventProcessors[i].call( this, this._.dialog, definition[i] );
+2258 				else
+2259 					registerDomEvent( this, this._.dialog, match[1].toLowerCase(), definition[i] );
+2260 			}
+2261
+2262 			return this;
+2263 		},
+2264
+2265 		/**
+2266 		 * The event processor list used by
+2267 		 * {@link CKEDITOR.ui.dialog.uiElement#getInputElement} at UI element
+2268 		 * instantiation. The default list defines three on* events:
+2269 		 * <ol>
+2270 		 *  <li>onLoad - Called when the element's parent dialog opens for the
+2271 		 *  first time</li>
+2272 		 *  <li>onShow - Called whenever the element's parent dialog opens.</li>
+2273 		 *  <li>onHide - Called whenever the element's parent dialog closes.</li>
+2274 		 * </ol>
+2275 		 * @field
+2276 		 * @type Object
+2277 		 * @example
+2278 		 * // This connects the 'click' event in CKEDITOR.ui.dialog.button to onClick
+2279 		 * // handlers in the UI element's definitions.
+2280 		 * CKEDITOR.ui.dialog.button.eventProcessors = CKEDITOR.tools.extend( {},
+2281 		 *   CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,
+2282 		 *   { onClick : function( dialog, func ) { this.on( 'click', func ); } },
+2283 		 *   true );
+2284 		 */
+2285 		eventProcessors :
+2286 		{
+2287 			onLoad : function( dialog, func )
+2288 			{
+2289 				dialog.on( 'load', func, this );
+2290 			},
+2291
+2292 			onShow : function( dialog, func )
+2293 			{
+2294 				dialog.on( 'show', func, this );
+2295 			},
+2296
+2297 			onHide : function( dialog, func )
+2298 			{
+2299 				dialog.on( 'hide', func, this );
+2300 			}
+2301 		},
+2302
+2303 		/**
+2304 		 * The default handler for a UI element's access key down event, which
+2305 		 * tries to put focus to the UI element.<br />
+2306 		 * Can be overridded in child classes for more sophisticaed behavior.
+2307 		 * @param {CKEDITOR.dialog} dialog The parent dialog object.
+2308 		 * @param {String} key The key combination pressed. Since access keys
+2309 		 * are defined to always include the CTRL key, its value should always
+2310 		 * include a 'CTRL+' prefix.
+2311 		 * @example
+2312 		 */
+2313 		accessKeyDown : function( dialog, key )
+2314 		{
+2315 			this.focus();
+2316 		},
+2317
+2318 		/**
+2319 		 * The default handler for a UI element's access key up event, which
+2320 		 * does nothing.<br />
+2321 		 * Can be overridded in child classes for more sophisticated behavior.
+2322 		 * @param {CKEDITOR.dialog} dialog The parent dialog object.
+2323 		 * @param {String} key The key combination pressed. Since access keys
+2324 		 * are defined to always include the CTRL key, its value should always
+2325 		 * include a 'CTRL+' prefix.
+2326 		 * @example
+2327 		 */
+2328 		accessKeyUp : function( dialog, key )
+2329 		{
+2330 		},
+2331
+2332 		/**
+2333 		 * Disables a UI element.
+2334 		 * @example
+2335 		 */
+2336 		disable : function()
+2337 		{
+2338 			var element = this.getInputElement();
+2339 			element.setAttribute( 'disabled', 'true' );
+2340 			element.addClass( 'cke_disabled' );
+2341 		},
+2342
+2343 		/**
+2344 		 * Enables a UI element.
+2345 		 * @example
+2346 		 */
+2347 		enable : function()
+2348 		{
+2349 			var element = this.getInputElement();
+2350 			element.removeAttribute( 'disabled' );
+2351 			element.removeClass( 'cke_disabled' );
+2352 		},
+2353
+2354 		/**
+2355 		 * Determines whether an UI element is enabled or not.
+2356 		 * @returns {Boolean} Whether the UI element is enabled.
+2357 		 * @example
+2358 		 */
+2359 		isEnabled : function()
+2360 		{
+2361 			return !this.getInputElement().getAttribute( 'disabled' );
+2362 		},
+2363
+2364 		/**
+2365 		 * Determines whether an UI element is visible or not.
+2366 		 * @returns {Boolean} Whether the UI element is visible.
+2367 		 * @example
+2368 		 */
+2369 		isVisible : function()
+2370 		{
+2371 			return !!this.getInputElement().$.offsetHeight;
+2372 		},
+2373
+2374 		/**
+2375 		 * Determines whether an UI element is focus-able or not.
+2376 		 * Focus-able is defined as being both visible and enabled.
+2377 		 * @returns {Boolean} Whether the UI element can be focused.
+2378 		 * @example
+2379 		 */
+2380 		isFocusable : function()
+2381 		{
+2382 			if ( !this.isEnabled() || !this.isVisible() )
+2383 				return false;
+2384 			return true;
+2385 		}
+2386 	};
+2387
+2388 	CKEDITOR.ui.dialog.hbox.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,
+2389 		/**
+2390 		 * @lends CKEDITOR.ui.dialog.hbox.prototype
+2391 		 */
+2392 		{
+2393 			/**
+2394 			 * Gets a child UI element inside this container.
+2395 			 * @param {Array|Number} indices An array or a single number to indicate the child's
+2396 			 * position in the container's descendant tree. Omit to get all the children in an array.
+2397 			 * @returns {Array|CKEDITOR.ui.dialog.uiElement} Array of all UI elements in the container
+2398 			 * if no argument given, or the specified UI element if indices is given.
+2399 			 * @example
+2400 			 * var checkbox = hbox.getChild( [0,1] );
+2401 			 * checkbox.setValue( true );
+2402 			 */
+2403 			getChild : function( indices )
+2404 			{
+2405 				// If no arguments, return a clone of the children array.
+2406 				if ( arguments.length < 1 )
+2407 					return this._.children.concat();
+2408
+2409 				// If indices isn't array, make it one.
+2410 				if ( !indices.splice )
+2411 					indices = [ indices ];
+2412
+2413 				// Retrieve the child element according to tree position.
+2414 				if ( indices.length < 2 )
+2415 					return this._.children[ indices[0] ];
+2416 				else
+2417 					return ( this._.children[ indices[0] ] && this._.children[ indices[0] ].getChild ) ?
+2418 						this._.children[ indices[0] ].getChild( indices.slice( 1, indices.length ) ) :
+2419 						null;
+2420 			}
+2421 		}, true );
+2422
+2423 	CKEDITOR.ui.dialog.vbox.prototype = new CKEDITOR.ui.dialog.hbox();
+2424
+2425
+2426
+2427 	(function()
+2428 	{
+2429 		var commonBuilder = {
+2430 			build : function( dialog, elementDefinition, output )
+2431 			{
+2432 				var children = elementDefinition.children,
+2433 					child,
+2434 					childHtmlList = [],
+2435 					childObjList = [];
+2436 				for ( var i = 0 ; ( i < children.length && ( child = children[i] ) ) ; i++ )
+2437 				{
+2438 					var childHtml = [];
+2439 					childHtmlList.push( childHtml );
+2440 					childObjList.push( CKEDITOR.dialog._.uiElementBuilders[ child.type ].build( dialog, child, childHtml ) );
+2441 				}
+2442 				return new CKEDITOR.ui.dialog[elementDefinition.type]( dialog, childObjList, childHtmlList, output, elementDefinition );
+2443 			}
+2444 		};
+2445
+2446 		CKEDITOR.dialog.addUIElement( 'hbox', commonBuilder );
+2447 		CKEDITOR.dialog.addUIElement( 'vbox', commonBuilder );
+2448 	})();
+2449
+2450 	/**
+2451 	 * Generic dialog command. It opens a specific dialog when executed.
+2452 	 * @constructor
+2453 	 * @augments CKEDITOR.commandDefinition
+2454 	 * @param {string} dialogName The name of the dialog to open when executing
+2455 	 *		this command.
+2456 	 * @example
+2457 	 * // Register the "link" command, which opens the "link" dialog.
+2458 	 * editor.addCommand( 'link', <b>new CKEDITOR.dialogCommand( 'link' )</b> );
+2459 	 */
+2460 	CKEDITOR.dialogCommand = function( dialogName )
+2461 	{
+2462 		this.dialogName = dialogName;
+2463 	};
+2464
+2465 	CKEDITOR.dialogCommand.prototype =
+2466 	{
+2467 		/** @ignore */
+2468 		exec : function( editor )
+2469 		{
+2470 			editor.openDialog( this.dialogName );
+2471 		},
+2472 		// Dialog commands just open a dialog ui, thus require no undo logic,
+2473 		// undo support should dedicate to specific dialog implementation.
+2474 		canUndo: false
+2475 	};
+2476
+2477 	(function()
+2478 	{
+2479 		var notEmptyRegex = /^([a]|[^a])+$/,
+2480 			integerRegex = /^\d*$/,
+2481 			numberRegex = /^\d*(?:\.\d+)?$/;
+2482
+2483 		CKEDITOR.VALIDATE_OR = 1;
+2484 		CKEDITOR.VALIDATE_AND = 2;
+2485
+2486 		CKEDITOR.dialog.validate =
+2487 		{
+2488 			functions : function()
+2489 			{
+2490 				return function()
+2491 				{
+2492 					/**
+2493 					 * It's important for validate functions to be able to accept the value
+2494 					 * as argument in addition to this.getValue(), so that it is possible to
+2495 					 * combine validate functions together to make more sophisticated
+2496 					 * validators.
+2497 					 */
+2498 					var value = this && this.getValue ? this.getValue() : arguments[0];
+2499
+2500 					var msg = undefined,
+2501 						relation = CKEDITOR.VALIDATE_AND,
+2502 						functions = [], i;
+2503
+2504 					for ( i = 0 ; i < arguments.length ; i++ )
+2505 					{
+2506 						if ( typeof( arguments[i] ) == 'function' )
+2507 							functions.push( arguments[i] );
+2508 						else
+2509 							break;
+2510 					}
+2511
+2512 					if ( i < arguments.length && typeof( arguments[i] ) == 'string' )
+2513 					{
+2514 						msg = arguments[i];
+2515 						i++;
+2516 					}
+2517
+2518 					if ( i < arguments.length && typeof( arguments[i]) == 'number' )
+2519 						relation = arguments[i];
+2520
+2521 					var passed = ( relation == CKEDITOR.VALIDATE_AND ? true : false );
+2522 					for ( i = 0 ; i < functions.length ; i++ )
+2523 					{
+2524 						if ( relation == CKEDITOR.VALIDATE_AND )
+2525 							passed = passed && functions[i]( value );
+2526 						else
+2527 							passed = passed || functions[i]( value );
+2528 					}
+2529
+2530 					if ( !passed )
+2531 					{
+2532 						if ( msg !== undefined )
+2533 							alert( msg );
+2534 						if ( this && ( this.select || this.focus ) )
+2535 							( this.select || this.focus )();
+2536 						return false;
+2537 					}
+2538
+2539 					return true;
+2540 				};
+2541 			},
+2542
+2543 			regex : function( regex, msg )
+2544 			{
+2545 				/*
+2546 				 * Can be greatly shortened by deriving from functions validator if code size
+2547 				 * turns out to be more important than performance.
+2548 				 */
+2549 				return function()
+2550 				{
+2551 					var value = this && this.getValue ? this.getValue() : arguments[0];
+2552 					if ( !regex.test( value ) )
+2553 					{
+2554 						if ( msg !== undefined )
+2555 							alert( msg );
+2556 						if ( this && ( this.select || this.focus ) )
+2557 						{
+2558 							if ( this.select )
+2559 								this.select();
+2560 							else
+2561 								this.focus();
+2562 						}
+2563 						return false;
+2564 					}
+2565 					return true;
+2566 				};
+2567 			},
+2568
+2569 			notEmpty : function( msg )
+2570 			{
+2571 				return this.regex( notEmptyRegex, msg );
+2572 			},
+2573
+2574 			integer : function( msg )
+2575 			{
+2576 				return this.regex( integerRegex, msg );
+2577 			},
+2578
+2579 			'number' : function( msg )
+2580 			{
+2581 				return this.regex( numberRegex, msg );
+2582 			},
+2583
+2584 			equals : function( value, msg )
+2585 			{
+2586 				return this.functions( function( val ){ return val == value; }, msg );
+2587 			},
+2588
+2589 			notEqual : function( value, msg )
+2590 			{
+2591 				return this.functions( function( val ){ return val != value; }, msg );
+2592 			}
+2593 		};
+2594 	})();
+2595
+2596 	// Grab the margin data from skin definition and store it away.
+2597 	CKEDITOR.skins.add = ( function()
+2598 	{
+2599 		var original = CKEDITOR.skins.add;
+2600 		return function( skinName, skinDefinition )
+2601 		{
+2602 			skinData[ skinName ] = { margins : skinDefinition.margins };
+2603 			return original.apply( this, arguments );
+2604 		};
+2605 	} )();
+2606 })();
+2607
+2608 // Extend the CKEDITOR.editor class with dialog specific functions.
+2609 CKEDITOR.tools.extend( CKEDITOR.editor.prototype,
+2610 	/** @lends CKEDITOR.editor.prototype */
+2611 	{
+2612 		/**
+2613 		 * Loads and opens a registered dialog.
+2614 		 * @param {String} dialogName The registered name of the dialog.
+2615 		 * @see CKEDITOR.dialog.add
+2616 		 * @example
+2617 		 * CKEDITOR.instances.editor1.openDialog( 'smiley' );
+2618 		 * @returns {CKEDITOR.dialog} The dialog object corresponding to the dialog displayed. null if the dialog name is not registered.
+2619 		 */
+2620 		openDialog : function( dialogName )
+2621 		{
+2622 			var dialogDefinitions = CKEDITOR.dialog._.dialogDefinitions[ dialogName ];
+2623
+2624 			// If the dialogDefinition is already loaded, open it immediately.
+2625 			if ( typeof dialogDefinitions == 'function' )
+2626 			{
+2627 				var storedDialogs = this._.storedDialogs ||
+2628 					( this._.storedDialogs = {} );
+2629
+2630 				var dialog = storedDialogs[ dialogName ] ||
+2631 					( storedDialogs[ dialogName ] = new CKEDITOR.dialog( this, dialogName ) );
+2632
+2633 				dialog.show();
+2634
+2635 				return dialog;
+2636 			}
+2637 			else if ( dialogDefinitions == 'failed' )
+2638 				throw new Error( '[CKEDITOR.dialog.openDialog] Dialog "' + dialogName + '" failed when loading definition.' );
+2639
+2640 			// Not loaded? Load the .js file first.
+2641 			var body = CKEDITOR.document.getBody(),
+2642 				cursor = body.$.style.cursor,
+2643 				me = this;
+2644
+2645 			body.setStyle( 'cursor', 'wait' );
+2646 			CKEDITOR.scriptLoader.load( CKEDITOR.getUrl( dialogDefinitions ), function()
+2647 				{
+2648 					// In case of plugin error, mark it as loading failed.
+2649 					if ( typeof CKEDITOR.dialog._.dialogDefinitions[ dialogName ] != 'function' )
+2650 							CKEDITOR.dialog._.dialogDefinitions[ dialogName ] =  'failed';
+2651 					me.openDialog( dialogName );
+2652 					body.setStyle( 'cursor', cursor );
+2653 				} );
+2654
+2655 			return null;
+2656 		}
+2657 	});
+2658
+2659 // Dialog related configurations.
+2660
+2661 /**
+2662  * The color of the dialog background cover. It should be a valid CSS color
+2663  * string.
+2664  * @type String
+2665  * @default white
+2666  * @example
+2667  * config.dialog_backgroundCoverColor = 'rgb(255, 254, 253)';
+2668  */
+2669 CKEDITOR.config.dialog_backgroundCoverColor = 'white';
+2670
+2671 /**
+2672  * The opacity of the dialog background cover. It should be a number within the
+2673  * range [0.0, 1.0].
+2674  * @type Number
+2675  * @default 0.5
+2676  * @example
+2677  * config.dialog_backgroundCoverOpacity = 0.7;
+2678  */
+2679 CKEDITOR.config.dialog_backgroundCoverOpacity = 0.5;
+2680
+2681 /**
+2682  * The distance of magnetic borders used in moving and resizing dialogs,
+2683  * measured in pixels.
+2684  * @type Number
+2685  * @default 20
+2686  * @example
+2687  * config.dialog_magnetDistance = 30;
+2688  */
+2689 CKEDITOR.config.dialog_magnetDistance = 20;
+2690 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialogui_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialogui_plugin.js.html new file mode 100644 index 000000000..82b2323ff --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_dialogui_plugin.js.html @@ -0,0 +1,1300 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /** @fileoverview The "dialogui" plugin. */
+  7
+  8 CKEDITOR.plugins.add( 'dialogui' );
+  9
+ 10 (function()
+ 11 {
+ 12 	var initPrivateObject = function( elementDefinition )
+ 13 	{
+ 14 		this._ || ( this._ = {} );
+ 15 		this._['default'] = this._.initValue = elementDefinition['default'] || '';
+ 16 		var args = [ this._ ];
+ 17 		for ( var i = 1 ; i < arguments.length ; i++ )
+ 18 			args.push( arguments[i] );
+ 19 		args.push( true );
+ 20 		CKEDITOR.tools.extend.apply( CKEDITOR.tools, args );
+ 21 		return this._;
+ 22 	},
+ 23 	textBuilder =
+ 24 	{
+ 25 		build : function( dialog, elementDefinition, output )
+ 26 		{
+ 27 			return new CKEDITOR.ui.dialog.textInput( dialog, elementDefinition, output );
+ 28 		}
+ 29 	},
+ 30 	commonBuilder =
+ 31 	{
+ 32 		build : function( dialog, elementDefinition, output )
+ 33 		{
+ 34 			return new CKEDITOR.ui.dialog[elementDefinition.type]( dialog, elementDefinition, output );
+ 35 		}
+ 36 	},
+ 37 	commonPrototype =
+ 38 	{
+ 39 		isChanged : function()
+ 40 		{
+ 41 			return this.getValue() != this.getInitValue();
+ 42 		},
+ 43
+ 44 		reset : function()
+ 45 		{
+ 46 			this.setValue( this.getInitValue() );
+ 47 		},
+ 48
+ 49 		setInitValue : function()
+ 50 		{
+ 51 			this._.initValue = this.getValue();
+ 52 		},
+ 53
+ 54 		resetInitValue : function()
+ 55 		{
+ 56 			this._.initValue = this._['default'];
+ 57 		},
+ 58
+ 59 		getInitValue : function()
+ 60 		{
+ 61 			return this._.initValue;
+ 62 		}
+ 63 	},
+ 64 	commonEventProcessors = CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,
+ 65 		{
+ 66 			onChange : function( dialog, func )
+ 67 			{
+ 68 				if ( !this._.domOnChangeRegistered )
+ 69 				{
+ 70 					dialog.on( 'load', function()
+ 71 						{
+ 72 							this.getInputElement().on( 'change', function(){ this.fire( 'change', { value : this.getValue() } ); }, this );
+ 73 						}, this );
+ 74 					this._.domOnChangeRegistered = true;
+ 75 				}
+ 76
+ 77 				this.on( 'change', func );
+ 78 			}
+ 79 		}, true ),
+ 80 	eventRegex = /^on([A-Z]\w+)/,
+ 81 	cleanInnerDefinition = function( def )
+ 82 	{
+ 83 		// An inner UI element should not have the parent's type, title or events.
+ 84 		for ( var i in def )
+ 85 		{
+ 86 			if ( eventRegex.test( i ) || i == 'title' || i == 'type' )
+ 87 				delete def[i];
+ 88 		}
+ 89 		return def;
+ 90 	};
+ 91
+ 92 	CKEDITOR.tools.extend( CKEDITOR.ui.dialog,
+ 93 		/** @lends CKEDITOR.ui.dialog */
+ 94 		{
+ 95 			/**
+ 96 			 * Base class for all dialog elements with a textual label on the left.
+ 97 			 * @constructor
+ 98 			 * @example
+ 99 			 * @extends CKEDITOR.ui.dialog.uiElement
+100 			 * @param {CKEDITOR.dialog} dialog
+101 			 * Parent dialog object.
+102 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+103 			 * The element definition. Accepted fields:
+104 			 * <ul>
+105 			 * 	<li><strong>label</strong> (Required) The label string.</li>
+106 			 * 	<li><strong>labelLayout</strong> (Optional) Put 'horizontal' here if the
+107 			 * 	label element is to be layed out horizontally. Otherwise a vertical
+108 			 * 	layout will be used.</li>
+109 			 * 	<li><strong>widths</strong> (Optional) This applies only for horizontal
+110 			 * 	layouts - an 2-element array of lengths to specify the widths of the
+111 			 * 	label and the content element.</li>
+112 			 * </ul>
+113 			 * @param {Array} htmlList
+114 			 * List of HTML code to output to.
+115 			 * @param {Function} contentHtml
+116 			 * A function returning the HTML code string to be added inside the content
+117 			 * cell.
+118 			 */
+119 			labeledElement : function( dialog, elementDefinition, htmlList, contentHtml )
+120 			{
+121 				if ( arguments.length < 4 )
+122 					return;
+123
+124 				var _ = initPrivateObject.call( this, elementDefinition );
+125 				_.labelId = CKEDITOR.tools.getNextNumber() + '_label';
+126 				var children = this._.children = [];
+127 				/** @ignore */
+128 				var innerHTML = function()
+129 				{
+130 					var html = [];
+131 					if ( elementDefinition.labelLayout != 'horizontal' )
+132 						html.push( '<div class="cke_dialog_ui_labeled_label" id="',
+133 								_.labelId,
+134 								'" >',
+135 								elementDefinition.label,
+136 								'</div>',
+137 								'<div class="cke_dialog_ui_labeled_content">',
+138 								contentHtml( dialog, elementDefinition ),
+139 								'</div>' );
+140 					else
+141 					{
+142 						var hboxDefinition = {
+143 							type : 'hbox',
+144 							widths : elementDefinition.widths,
+145 							padding : 0,
+146 							children :
+147 							[
+148 								{
+149 									type : 'html',
+150 									html : '<span class="cke_dialog_ui_labeled_label" ' +
+151 										'id="' + _.labelId + '">' +  CKEDITOR.tools.htmlEncode( elementDefinition.label ) +
+152 										'</span>'
+153 								},
+154 								{
+155 									type : 'html',
+156 									html : '<span class="cke_dialog_ui_labeled_content">' +
+157 										contentHtml( dialog, elementDefinition ) +
+158 										'</span>'
+159 								}
+160 							]
+161 						};
+162 						CKEDITOR.dialog._.uiElementBuilders.hbox.build( dialog, hboxDefinition, html );
+163 					}
+164 					return html.join( '' );
+165 				};
+166 				CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'div', null, null, innerHTML );
+167 			},
+168
+169 			/**
+170 			 * A text input with a label. This UI element class represents both the
+171 			 * single-line text inputs and password inputs in dialog boxes.
+172 			 * @constructor
+173 			 * @example
+174 			 * @extends CKEDITOR.ui.dialog.labeledElement
+175 			 * @param {CKEDITOR.dialog} dialog
+176 			 * Parent dialog object.
+177 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+178 			 * The element definition. Accepted fields:
+179 			 * <ul>
+180 			 * 	<li><strong>default</strong> (Optional) The default value.</li>
+181 			 * 	<li><strong>validate</strong> (Optional) The validation function. </li>
+182 			 * 	<li><strong>maxLength</strong> (Optional) The maximum length of text box
+183 			 * 	contents.</li>
+184 			 * 	<li><strong>size</strong> (Optional) The size of the text box. This is
+185 			 * 	usually overridden by the size defined by the skin, however.</li>
+186 			 * </ul>
+187 			 * @param {Array} htmlList
+188 			 * List of HTML code to output to.
+189 			 */
+190 			textInput : function( dialog, elementDefinition, htmlList )
+191 			{
+192 				if ( arguments.length < 3 )
+193 					return;
+194
+195 				initPrivateObject.call( this, elementDefinition );
+196 				var domId = this._.inputId = CKEDITOR.tools.getNextNumber() + '_textInput',
+197 					attributes = { 'class' : 'cke_dialog_ui_input_' + elementDefinition.type, id : domId, type : 'text' },
+198 					i;
+199
+200 				// Set the validator, if any.
+201 				if ( elementDefinition.validate )
+202 					this.validate = elementDefinition.validate;
+203
+204 				// Set the max length and size.
+205 				if ( elementDefinition.maxLength )
+206 					attributes.maxlength = elementDefinition.maxLength;
+207 				if ( elementDefinition.size )
+208 					attributes.size = elementDefinition.size;
+209
+210 				// If user presses Enter in a text box, it implies clicking OK for the dialog.
+211 				var me = this, keyPressedOnMe = false;
+212 				dialog.on( 'load', function()
+213 					{
+214 						me.getInputElement().on( 'keydown', function( evt )
+215 							{
+216 								if ( evt.data.getKeystroke() == 13 )
+217 									keyPressedOnMe = true;
+218 							} );
+219
+220 						// Lower the priority this 'keyup' since 'ok' will close the dialog.(#3749)
+221 						me.getInputElement().on( 'keyup', function( evt )
+222 							{
+223 								if ( evt.data.getKeystroke() == 13 && keyPressedOnMe )
+224 								{
+225 									dialog.getButton( 'ok' ) && dialog.getButton( 'ok' ).click();
+226 									keyPressedOnMe = false;
+227 								}
+228 							}, null, null, 1000 );
+229 					} );
+230
+231 				/** @ignore */
+232 				var innerHTML = function()
+233 				{
+234 					// IE BUG: Text input fields in IE at 100% would exceed a <td> or inline
+235 					// container's width, so need to wrap it inside a <div>.
+236 					var html = [ '<div class="cke_dialog_ui_input_', elementDefinition.type, '"><input ' ];
+237 					for ( var i in attributes )
+238 						html.push( i + '="' + attributes[i] + '" ' );
+239 					html.push( ' /></div>' );
+240 					return html.join( '' );
+241 				};
+242 				CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
+243 			},
+244
+245 			/**
+246 			 * A text area with a label on the top or left.
+247 			 * @constructor
+248 			 * @extends CKEDITOR.ui.dialog.labeledElement
+249 			 * @example
+250 			 * @param {CKEDITOR.dialog} dialog
+251 			 * Parent dialog object.
+252 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+253 			 * The element definition. Accepted fields:
+254 			 * <ul>
+255 			 * 	<li><strong>rows</strong> (Optional) The number of rows displayed.
+256 			 * 	Defaults to 5 if not defined.</li>
+257 			 * 	<li><strong>cols</strong> (Optional) The number of cols displayed.
+258 			 * 	Defaults to 20 if not defined. Usually overridden by skins.</li>
+259 			 * 	<li><strong>default</strong> (Optional) The default value.</li>
+260 			 * 	<li><strong>validate</strong> (Optional) The validation function. </li>
+261 			 * </ul>
+262 			 * @param {Array} htmlList
+263 			 * List of HTML code to output to.
+264 			 */
+265 			textarea : function( dialog, elementDefinition, htmlList )
+266 			{
+267 				if ( arguments.length < 3 )
+268 					return;
+269
+270 				initPrivateObject.call( this, elementDefinition );
+271 				var me = this,
+272 					domId = this._.inputId = CKEDITOR.tools.getNextNumber() + '_textarea',
+273 					attributes = {};
+274
+275 				if ( elementDefinition.validate )
+276 					this.validate = elementDefinition.validate;
+277
+278 				// Generates the essential attributes for the textarea tag.
+279 				attributes.rows = elementDefinition.rows || 5;
+280 				attributes.cols = elementDefinition.cols || 20;
+281
+282 				/** @ignore */
+283 				var innerHTML = function()
+284 				{
+285 					var html = [ '<div class="cke_dialog_ui_input_textarea"><textarea class="cke_dialog_ui_input_textarea" id="', domId, '" ' ];
+286 					for ( var i in attributes )
+287 						html.push( i + '="' + CKEDITOR.tools.htmlEncode( attributes[i] ) + '" ' );
+288 					html.push( '>', CKEDITOR.tools.htmlEncode( me._['default'] ), '</textarea></div>' );
+289 					return html.join( '' );
+290 				};
+291 				CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
+292 			},
+293
+294 			/**
+295 			 * A single checkbox with a label on the right.
+296 			 * @constructor
+297 			 * @extends CKEDITOR.ui.dialog.uiElement
+298 			 * @example
+299 			 * @param {CKEDITOR.dialog} dialog
+300 			 * Parent dialog object.
+301 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+302 			 * The element definition. Accepted fields:
+303 			 * <ul>
+304 			 * 	<li><strong>checked</strong> (Optional) Whether the checkbox is checked
+305 			 * 	on instantiation. Defaults to false.</li>
+306 			 * 	<li><strong>validate</strong> (Optional) The validation function.</li>
+307 			 * 	<li><strong>label</strong> (Optional) The checkbox label.</li>
+308 			 * </ul>
+309 			 * @param {Array} htmlList
+310 			 * List of HTML code to output to.
+311 			 */
+312 			checkbox : function( dialog, elementDefinition, htmlList )
+313 			{
+314 				if ( arguments.length < 3 )
+315 					return;
+316
+317 				var _ = initPrivateObject.call( this, elementDefinition, { 'default' : !!elementDefinition[ 'default' ] } );
+318
+319 				if ( elementDefinition.validate )
+320 					this.validate = elementDefinition.validate;
+321
+322 				/** @ignore */
+323 				var innerHTML = function()
+324 				{
+325 					var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition,
+326 							{
+327 								id : elementDefinition.id ? elementDefinition.id + '_checkbox' : CKEDITOR.tools.getNextNumber() + '_checkbox'
+328 							}, true ),
+329 						html = [],
+330 						attributes = { 'class' : 'cke_dialog_ui_checkbox_input', type : 'checkbox' };
+331 					cleanInnerDefinition( myDefinition );
+332 					if ( elementDefinition[ 'default' ] )
+333 						attributes.checked = 'checked';
+334 					_.checkbox = new CKEDITOR.ui.dialog.uiElement( dialog, myDefinition, html, 'input', null, attributes );
+335 					html.push( ' ', CKEDITOR.tools.htmlEncode( elementDefinition.label ) );
+336 					return html.join( '' );
+337 				};
+338
+339 				CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'label', null, null, innerHTML );
+340 			},
+341
+342 			/**
+343 			 * A group of radio buttons.
+344 			 * @constructor
+345 			 * @example
+346 			 * @extends CKEDITOR.ui.dialog.labeledElement
+347 			 * @param {CKEDITOR.dialog} dialog
+348 			 * Parent dialog object.
+349 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+350 			 * The element definition. Accepted fields:
+351 			 * <ul>
+352 			 * 	<li><strong>default</strong> (Required) The default value.</li>
+353 			 * 	<li><strong>validate</strong> (Optional) The validation function.</li>
+354 			 * 	<li><strong>items</strong> (Required) An array of options. Each option
+355 			 * 	is a 1- or 2-item array of format [ 'Description', 'Value' ]. If 'Value'
+356 			 * 	is missing, then the value would be assumed to be the same as the
+357 			 * 	description.</li>
+358 			 * </ul>
+359 			 * @param {Array} htmlList
+360 			 * List of HTML code to output to.
+361 			 */
+362 			radio : function( dialog, elementDefinition, htmlList )
+363 			{
+364 				if ( arguments.length < 3)
+365 					return;
+366
+367 				initPrivateObject.call( this, elementDefinition );
+368 				if ( !this._['default'] )
+369 					this._['default'] = this._.initValue = elementDefinition.items[0][1];
+370 				if ( elementDefinition.validate )
+371 					this.validate = elementDefinition.valdiate;
+372 				var children = [], me = this;
+373
+374 				/** @ignore */
+375 				var innerHTML = function()
+376 				{
+377 					var inputHtmlList = [], html = [],
+378 						commonAttributes = { 'class' : 'cke_dialog_ui_radio_item' },
+379 						commonName = elementDefinition.id ? elementDefinition.id + '_radio' : CKEDITOR.tools.getNextNumber() + '_radio';
+380 					for ( var i = 0 ; i < elementDefinition.items.length ; i++ )
+381 					{
+382 						var item = elementDefinition.items[i],
+383 							title = item[2] !== undefined ? item[2] : item[0],
+384 							value = item[1] !== undefined ? item[1] : item[0],
+385 							inputDefinition = CKEDITOR.tools.extend( {}, elementDefinition,
+386 									{
+387 										id : CKEDITOR.tools.getNextNumber() + '_radio_input',
+388 										title : null,
+389 										type : null
+390 									}, true ),
+391 							labelDefinition = CKEDITOR.tools.extend( {}, inputDefinition,
+392 									{
+393 										id : null,
+394 										title : title
+395 									}, true ),
+396 							inputHtml = [],
+397 							inputAttributes =
+398 							{
+399 								type : 'radio',
+400 								'class' : 'cke_dialog_ui_radio_input',
+401 								name : commonName,
+402 								value : value
+403 							};
+404 						if ( me._['default'] == value )
+405 							inputAttributes.checked = 'checked';
+406 						cleanInnerDefinition( inputDefinition );
+407 						cleanInnerDefinition( labelDefinition );
+408 						children.push( new CKEDITOR.ui.dialog.uiElement( dialog, inputDefinition, inputHtml, 'input', null, inputAttributes ) );
+409 						new CKEDITOR.ui.dialog.uiElement( dialog, labelDefinition, inputHtmlList, 'label', null, null,
+410 							   inputHtml.join( '' ) + ' ' + item[0] );
+411 					}
+412 					new CKEDITOR.ui.dialog.hbox( dialog, [], inputHtmlList, html );
+413 					return html.join( '' );
+414 				};
+415
+416 				CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
+417 				this._.children = children;
+418 			},
+419
+420 			/**
+421 			 * A button with a label inside.
+422 			 * @constructor
+423 			 * @example
+424 			 * @extends CKEDITOR.ui.dialog.uiElement
+425 			 * @param {CKEDITOR.dialog} dialog
+426 			 * Parent dialog object.
+427 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+428 			 * The element definition. Accepted fields:
+429 			 * <ul>
+430 			 * 	<li><strong>label</strong> (Required) The button label.</li>
+431 			 * 	<li><strong>disabled</strong> (Optional) Set to true if you want the
+432 			 * 	button to appear in disabled state.</li>
+433 			 * </ul>
+434 			 * @param {Array} htmlList
+435 			 * List of HTML code to output to.
+436 			 */
+437 			button : function( dialog, elementDefinition, htmlList )
+438 			{
+439 				if ( !arguments.length )
+440 					return;
+441
+442 				if ( typeof elementDefinition == 'function' )
+443 					elementDefinition = elementDefinition( dialog.getParentEditor() );
+444
+445 				initPrivateObject.call( this, elementDefinition, { disabled : elementDefinition.disabled || false } );
+446
+447 				// Add OnClick event to this input.
+448 				CKEDITOR.event.implementOn( this );
+449
+450 				var me = this;
+451
+452 				// Register an event handler for processing button clicks.
+453 				dialog.on( 'load', function( eventInfo )
+454 					{
+455 						var element = this.getElement();
+456
+457 						(function()
+458 						{
+459 							element.on( 'click', function( evt )
+460 								{
+461 									me.fire( 'click', { dialog : me.getDialog() } );
+462 									evt.data.preventDefault();
+463 								} );
+464 						})();
+465
+466 						element.unselectable();
+467 					}, this );
+468
+469 				var outerDefinition = CKEDITOR.tools.extend( {}, elementDefinition );
+470 				delete outerDefinition.style;
+471
+472 				CKEDITOR.ui.dialog.uiElement.call(
+473 					this,
+474 					dialog,
+475 					outerDefinition,
+476 					htmlList,
+477 					'a',
+478 					null,
+479 					{
+480 						style : elementDefinition.style,
+481 						href : 'javascript:void(0)',
+482 						title : elementDefinition.label,
+483 						hidefocus : 'true',
+484 						'class' : elementDefinition['class']
+485 					},
+486 					'<span class="cke_dialog_ui_button">' +
+487 						CKEDITOR.tools.htmlEncode( elementDefinition.label ) +
+488 					'</span>' );
+489 			},
+490
+491 			/**
+492 			 * A select box.
+493 			 * @extends CKEDITOR.ui.dialog.uiElement
+494 			 * @example
+495 			 * @constructor
+496 			 * @param {CKEDITOR.dialog} dialog
+497 			 * Parent dialog object.
+498 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+499 			 * The element definition. Accepted fields:
+500 			 * <ul>
+501 			 * 	<li><strong>default</strong> (Required) The default value.</li>
+502 			 * 	<li><strong>validate</strong> (Optional) The validation function.</li>
+503 			 * 	<li><strong>items</strong> (Required) An array of options. Each option
+504 			 * 	is a 1- or 2-item array of format [ 'Description', 'Value' ]. If 'Value'
+505 			 * 	is missing, then the value would be assumed to be the same as the
+506 			 * 	description.</li>
+507 			 * 	<li><strong>multiple</strong> (Optional) Set this to true if you'd like
+508 			 * 	to have a multiple-choice select box.</li>
+509 			 * 	<li><strong>size</strong> (Optional) The number of items to display in
+510 			 * 	the select box.</li>
+511 			 * </ul>
+512 			 * @param {Array} htmlList
+513 			 * List of HTML code to output to.
+514 			 */
+515 			select : function( dialog, elementDefinition, htmlList )
+516 			{
+517 				if ( arguments.length < 3 )
+518 					return;
+519
+520 				var _ = initPrivateObject.call( this, elementDefinition );
+521
+522 				if ( elementDefinition.validate )
+523 					this.validate = elementDefinition.validate;
+524
+525 				/** @ignore */
+526 				var innerHTML = function()
+527 				{
+528 					var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition,
+529 							{
+530 								id : elementDefinition.id ? elementDefinition.id + '_select' : CKEDITOR.tools.getNextNumber() + '_select'
+531 							}, true ),
+532 						html = [],
+533 						innerHTML = [],
+534 						attributes = { 'class' : 'cke_dialog_ui_input_select' };
+535
+536 					// Add multiple and size attributes from element definition.
+537 					if ( elementDefinition.size != undefined )
+538 						attributes.size = elementDefinition.size;
+539 					if ( elementDefinition.multiple != undefined )
+540 						attributes.multiple = elementDefinition.multiple;
+541
+542 					cleanInnerDefinition( myDefinition );
+543 					for ( var i = 0, item ; i < elementDefinition.items.length && ( item = elementDefinition.items[i] ) ; i++ )
+544 					{
+545 						innerHTML.push( '<option value="',
+546 							CKEDITOR.tools.htmlEncode( item[1] !== undefined ? item[1] : item[0] ), '" /> ',
+547 							CKEDITOR.tools.htmlEncode( item[0] ) );
+548 					}
+549
+550 					_.select = new CKEDITOR.ui.dialog.uiElement( dialog, myDefinition, html, 'select', null, attributes, innerHTML.join( '' ) );
+551 					return html.join( '' );
+552 				};
+553
+554 				CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
+555 			},
+556
+557 			/**
+558 			 * A file upload input.
+559 			 * @extends CKEDITOR.ui.dialog.labeledElement
+560 			 * @example
+561 			 * @constructor
+562 			 * @param {CKEDITOR.dialog} dialog
+563 			 * Parent dialog object.
+564 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+565 			 * The element definition. Accepted fields:
+566 			 * <ul>
+567 			 * 	<li><strong>validate</strong> (Optional) The validation function.</li>
+568 			 * </ul>
+569 			 * @param {Array} htmlList
+570 			 * List of HTML code to output to.
+571 			 */
+572 			file : function( dialog, elementDefinition, htmlList )
+573 			{
+574 				if ( arguments.length < 3 )
+575 					return;
+576
+577 				if ( elementDefinition['default'] === undefined )
+578 					elementDefinition['default'] = '';
+579
+580 				var _ = CKEDITOR.tools.extend( initPrivateObject.call( this, elementDefinition ), { definition : elementDefinition, buttons : [] } );
+581
+582 				if ( elementDefinition.validate )
+583 					this.validate = elementDefinition.validate;
+584
+585 				/** @ignore */
+586 				var innerHTML = function()
+587 				{
+588 					_.frameId = CKEDITOR.tools.getNextNumber() + '_fileInput';
+589
+590 					// Support for custom document.domain in IE.
+591 					var isCustomDomain = CKEDITOR.env.ie && document.domain != window.location.hostname;
+592
+593 					var html = [
+594 						'<iframe' +
+595 							' frameborder="0"' +
+596 							' allowtransparency="0"' +
+597 							' class="cke_dialog_ui_input_file"' +
+598 							' id="', _.frameId, '"' +
+599 							' src="javascript:void(' ];
+600
+601 					html.push(
+602 							isCustomDomain ?
+603 								'(function(){' +
+604 									'document.open();' +
+605 									'document.domain=\'' + document.domain + '\';' +
+606 									'document.close();' +
+607 								'})()'
+608 							:
+609 								'0' );
+610
+611 					html.push(
+612 							')">' +
+613 						'</iframe>' );
+614
+615 					return html.join( '' );
+616 				};
+617
+618 				// IE BUG: Parent container does not resize to contain the iframe automatically.
+619 				dialog.on( 'load', function()
+620 					{
+621 						var iframe = CKEDITOR.document.getById( _.frameId ),
+622 							contentDiv = iframe.getParent();
+623 						contentDiv.addClass( 'cke_dialog_ui_input_file' );
+624 					} );
+625
+626 				CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
+627 			},
+628
+629 			/**
+630 			 * A button for submitting the file in a file upload input.
+631 			 * @extends CKEDITOR.ui.dialog.button
+632 			 * @example
+633 			 * @constructor
+634 			 * @param {CKEDITOR.dialog} dialog
+635 			 * Parent dialog object.
+636 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+637 			 * The element definition. Accepted fields:
+638 			 * <ul>
+639 			 * 	<li><strong>for</strong> (Required) The file input's page and element Id
+640 			 * 	to associate to, in a 2-item array format: [ 'page_id', 'element_id' ].
+641 			 * 	</li>
+642 			 * 	<li><strong>validate</strong> (Optional) The validation function.</li>
+643 			 * </ul>
+644 			 * @param {Array} htmlList
+645 			 * List of HTML code to output to.
+646 			 */
+647 			fileButton : function( dialog, elementDefinition, htmlList )
+648 			{
+649 				if ( arguments.length < 3 )
+650 					return;
+651
+652 				var _ = initPrivateObject.call( this, elementDefinition ),
+653 					me = this;
+654
+655 				if ( elementDefinition.validate )
+656 					this.validate = elementDefinition.validate;
+657
+658 				var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition );
+659 				var onClick = myDefinition.onClick;
+660 				myDefinition.className = ( myDefinition.className ? myDefinition.className + ' ' : '' ) + 'cke_dialog_ui_button';
+661 				myDefinition.onClick = function( evt )
+662 				{
+663 					var target = elementDefinition[ 'for' ];		// [ pageId, elementId ]
+664 					if ( !onClick || onClick.call( this, evt ) !== false )
+665 					{
+666 						dialog.getContentElement( target[0], target[1] ).submit();
+667 						this.disable();
+668 					}
+669 				};
+670
+671 				dialog.on( 'load', function()
+672 						{
+673 							dialog.getContentElement( elementDefinition[ 'for' ][0], elementDefinition[ 'for' ][1] )._.buttons.push( me );
+674 						} );
+675
+676 				CKEDITOR.ui.dialog.button.call( this, dialog, myDefinition, htmlList );
+677 			},
+678
+679 			html : (function()
+680 			{
+681 				var myHtmlRe = /^\s*<[\w:]+\s+([^>]*)?>/,
+682 					theirHtmlRe = /^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,
+683 					emptyTagRe = /\/$/;
+684 				/**
+685 				 * A dialog element made from raw HTML code.
+686 				 * @extends CKEDITOR.ui.dialog.uiElement
+687 				 * @name CKEDITOR.ui.dialog.html
+688 				 * @param {CKEDITOR.dialog} dialog Parent dialog object.
+689 				 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition Element definition.
+690 				 * Accepted fields:
+691 				 * <ul>
+692 				 * 	<li><strong>html</strong> (Required) HTML code of this element.</li>
+693 				 * </ul>
+694 				 * @param {Array} htmlList List of HTML code to be added to the dialog's content area.
+695 				 * @example
+696 				 * @constructor
+697 				 */
+698 				return function( dialog, elementDefinition, htmlList )
+699 				{
+700 					if ( arguments.length < 3 )
+701 						return;
+702
+703 					var myHtmlList = [],
+704 						myHtml,
+705 						theirHtml = elementDefinition.html,
+706 						myMatch, theirMatch;
+707
+708 					// If the HTML input doesn't contain any tags at the beginning, add a <span> tag around it.
+709 					if ( theirHtml.charAt( 0 ) != '<' )
+710 						theirHtml = '<span>' + theirHtml + '</span>';
+711
+712 					// Look for focus function in definition.
+713 					if ( elementDefinition.focus )
+714 					{
+715 						var oldFocus = this.focus;
+716 						this.focus = function()
+717 						{
+718 							oldFocus.call( this );
+719 							elementDefinition.focus.call( this );
+720 							this.fire( 'focus' );
+721 						};
+722 						if ( elementDefinition.isFocusable )
+723 						{
+724 							var oldIsFocusable = this.isFocusable;
+725 							this.isFocusable = oldIsFocusable;
+726 						}
+727 						this.keyboardFocusable = true;
+728 					}
+729
+730 					CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtmlList, 'span', null, null, '' );
+731
+732 					// Append the attributes created by the uiElement call to the real HTML.
+733 					myHtml = myHtmlList.join( '' );
+734 					myMatch = myHtml.match( myHtmlRe );
+735 					theirMatch = theirHtml.match( theirHtmlRe ) || [ '', '', '' ];
+736
+737 					if ( emptyTagRe.test( theirMatch[1] ) )
+738 					{
+739 						theirMatch[1] = theirMatch[1].slice( 0, -1 );
+740 						theirMatch[2] = '/' + theirMatch[2];
+741 					}
+742
+743 					htmlList.push( [ theirMatch[1], ' ', myMatch[1] || '', theirMatch[2] ].join( '' ) );
+744 				};
+745 			})()
+746 		}, true );
+747
+748 	CKEDITOR.ui.dialog.html.prototype = new CKEDITOR.ui.dialog.uiElement;
+749
+750 	CKEDITOR.ui.dialog.labeledElement.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,
+751 			/** @lends CKEDITOR.ui.dialog.labeledElement.prototype */
+752 			{
+753 				/**
+754 				 * Sets the label text of the element.
+755 				 * @param {String} label The new label text.
+756 				 * @returns {CKEDITOR.ui.dialog.labeledElement} The current labeled element.
+757 				 * @example
+758 				 */
+759 				setLabel : function( label )
+760 				{
+761 					var node = CKEDITOR.document.getById( this._.labelId );
+762 					if ( node.getChildCount() < 1 )
+763 						( new CKEDITOR.dom.text( label, CKEDITOR.document ) ).appendTo( node );
+764 					else
+765 						node.getChild( 0 ).$.nodeValue = label;
+766 					return this;
+767 				},
+768
+769 				/**
+770 				 * Retrieves the current label text of the elment.
+771 				 * @returns {String} The current label text.
+772 				 * @example
+773 				 */
+774 				getLabel : function()
+775 				{
+776 					var node = CKEDITOR.document.getById( this._.labelId );
+777 					if ( !node || node.getChildCount() < 1 )
+778 						return '';
+779 					else
+780 						return node.getChild( 0 ).getText();
+781 				},
+782
+783 				/**
+784 				 * Defines the onChange event for UI element definitions.
+785 				 * @field
+786 				 * @type Object
+787 				 * @example
+788 				 */
+789 				eventProcessors : commonEventProcessors
+790 			}, true );
+791
+792 	CKEDITOR.ui.dialog.button.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,
+793 			/** @lends CKEDITOR.ui.dialog.button.prototype */
+794 			{
+795 				/**
+796 				 * Simulates a click to the button.
+797 				 * @example
+798 				 * @returns {Object} Return value of the 'click' event.
+799 				 */
+800 				click : function()
+801 				{
+802 					if ( !this._.disabled )
+803 						return this.fire( 'click', { dialog : this._.dialog } );
+804 					this.getElement().$.blur();
+805 					return false;
+806 				},
+807
+808 				/**
+809 				 * Enables the button.
+810 				 * @example
+811 				 */
+812 				enable : function()
+813 				{
+814 					this._.disabled = false;
+815 					this.getElement().removeClass( 'disabled' );
+816 				},
+817
+818 				/**
+819 				 * Disables the button.
+820 				 * @example
+821 				 */
+822 				disable : function()
+823 				{
+824 					this._.disabled = true;
+825 					this.getElement().addClass( 'disabled' );
+826 				},
+827
+828 				isVisible : function()
+829 				{
+830 					return !!this.getElement().$.firstChild.offsetHeight;
+831 				},
+832
+833 				isEnabled : function()
+834 				{
+835 					return !this._.disabled;
+836 				},
+837
+838 				/**
+839 				 * Defines the onChange event and onClick for button element definitions.
+840 				 * @field
+841 				 * @type Object
+842 				 * @example
+843 				 */
+844 				eventProcessors : CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,
+845 					{
+846 						/** @ignore */
+847 						onClick : function( dialog, func )
+848 						{
+849 							this.on( 'click', func );
+850 						}
+851 					}, true ),
+852
+853 				/**
+854 				 * Handler for the element's access key up event. Simulates a click to
+855 				 * the button.
+856 				 * @example
+857 				 */
+858 				accessKeyUp : function()
+859 				{
+860 					this.click();
+861 				},
+862
+863 				/**
+864 				 * Handler for the element's access key down event. Simulates a mouse
+865 				 * down to the button.
+866 				 * @example
+867 				 */
+868 				accessKeyDown : function()
+869 				{
+870 					this.focus();
+871 				},
+872
+873 				keyboardFocusable : true
+874 			}, true );
+875
+876 	CKEDITOR.ui.dialog.textInput.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement,
+877 			/** @lends CKEDITOR.ui.dialog.textInput.prototype */
+878 			{
+879 				/**
+880 				 * Gets the text input DOM element under this UI object.
+881 				 * @example
+882 				 * @returns {CKEDITOR.dom.element} The DOM element of the text input.
+883 				 */
+884 				getInputElement : function()
+885 				{
+886 					return CKEDITOR.document.getById( this._.inputId );
+887 				},
+888
+889 				/**
+890 				 * Puts focus into the text input.
+891 				 * @example
+892 				 */
+893 				focus : function()
+894 				{
+895 					var me = this.selectParentTab();
+896
+897 					// GECKO BUG: setTimeout() is needed to workaround invisible selections.
+898 					setTimeout( function(){ me.getInputElement().$.focus(); }, 0 );
+899 				},
+900
+901 				/**
+902 				 * Selects all the text in the text input.
+903 				 * @example
+904 				 */
+905 				select : function()
+906 				{
+907 					var me = this.selectParentTab();
+908
+909 					// GECKO BUG: setTimeout() is needed to workaround invisible selections.
+910 					setTimeout( function(){ var e = me.getInputElement().$; e.focus(); e.select(); }, 0 );
+911 				},
+912
+913 				/**
+914 				 * Handler for the text input's access key up event. Makes a select()
+915 				 * call to the text input.
+916 				 * @example
+917 				 */
+918 				accessKeyUp : function()
+919 				{
+920 					this.select();
+921 				},
+922
+923 				/**
+924 				 * Sets the value of this text input object.
+925 				 * @param {Object} value The new value.
+926 				 * @returns {CKEDITOR.ui.dialog.textInput} The current UI element.
+927 				 * @example
+928 				 * uiElement.setValue( 'Blamo' );
+929 				 */
+930 				setValue : function( value )
+931 				{
+932 					value = value || '';
+933 					return CKEDITOR.ui.dialog.uiElement.prototype.setValue.call( this, value );
+934 				},
+935
+936 				keyboardFocusable : true
+937 			}, commonPrototype, true );
+938
+939 	CKEDITOR.ui.dialog.textarea.prototype = new CKEDITOR.ui.dialog.textInput();
+940
+941 	CKEDITOR.ui.dialog.select.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement,
+942 			/** @lends CKEDITOR.ui.dialog.select.prototype */
+943 			{
+944 				/**
+945 				 * Gets the DOM element of the select box.
+946 				 * @returns {CKEDITOR.dom.element} The <select> element of this UI
+947 				 * element.
+948 				 * @example
+949 				 */
+950 				getInputElement : function()
+951 				{
+952 					return this._.select.getElement();
+953 				},
+954
+955 				/**
+956 				 * Adds an option to the select box.
+957 				 * @param {String} label Option label.
+958 				 * @param {String} value (Optional) Option value, if not defined it'll be
+959 				 * assumed to be the same as the label.
+960 				 * @param {Number} index (Optional) Position of the option to be inserted
+961 				 * to. If not defined the new option will be inserted to the end of list.
+962 				 * @example
+963 				 * @returns {CKEDITOR.ui.dialog.select} The current select UI element.
+964 				 */
+965 				add : function( label, value, index )
+966 				{
+967 					var option = new CKEDITOR.dom.element( 'option', this.getDialog().getParentEditor().document ),
+968 						selectElement = this.getInputElement().$;
+969 					option.$.text = label;
+970 					option.$.value = ( value === undefined || value === null ) ? label : value;
+971 					if ( index === undefined || index === null )
+972 					{
+973 						if ( CKEDITOR.env.ie )
+974 							selectElement.add( option.$ );
+975 						else
+976 							selectElement.add( option.$, null );
+977 					}
+978 					else
+979 						selectElement.add( option.$, index );
+980 					return this;
+981 				},
+982
+983 				/**
+984 				 * Removes an option from the selection list.
+985 				 * @param {Number} index Index of the option to be removed.
+986 				 * @example
+987 				 * @returns {CKEDITOR.ui.dialog.select} The current select UI element.
+988 				 */
+989 				remove : function( index )
+990 				{
+991 					var selectElement = this.getInputElement().$;
+992 					selectElement.remove( index );
+993 					return this;
+994 				},
+995
+996 				/**
+997 				 * Clears all options out of the selection list.
+998 				 * @returns {CKEDITOR.ui.dialog.select} The current select UI element.
+999 				 */
+1000 				clear : function()
+1001 				{
+1002 					var selectElement = this.getInputElement().$;
+1003 					while ( selectElement.length > 0 )
+1004 						selectElement.remove( 0 );
+1005 					return this;
+1006 				},
+1007
+1008 				keyboardFocusable : true
+1009 			}, commonPrototype, true );
+1010
+1011 	CKEDITOR.ui.dialog.checkbox.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,
+1012 			/** @lends CKEDITOR.ui.dialog.checkbox.prototype */
+1013 			{
+1014 				/**
+1015 				 * Gets the checkbox DOM element.
+1016 				 * @example
+1017 				 * @returns {CKEDITOR.dom.element} The DOM element of the checkbox.
+1018 				 */
+1019 				getInputElement : function()
+1020 				{
+1021 					return this._.checkbox.getElement();
+1022 				},
+1023
+1024 				/**
+1025 				 * Sets the state of the checkbox.
+1026 				 * @example
+1027 				 * @param {Boolean} true to tick the checkbox, false to untick it.
+1028 				 */
+1029 				setValue : function( checked )
+1030 				{
+1031 					this.getInputElement().$.checked = checked;
+1032 					this.fire( 'change', { value : checked } );
+1033 				},
+1034
+1035 				/**
+1036 				 * Gets the state of the checkbox.
+1037 				 * @example
+1038 				 * @returns {Boolean} true means the checkbox is ticked, false means it's not ticked.
+1039 				 */
+1040 				getValue : function()
+1041 				{
+1042 					return this.getInputElement().$.checked;
+1043 				},
+1044
+1045 				/**
+1046 				 * Handler for the access key up event. Toggles the checkbox.
+1047 				 * @example
+1048 				 */
+1049 				accessKeyUp : function()
+1050 				{
+1051 					this.setValue( !this.getValue() );
+1052 				},
+1053
+1054 				/**
+1055 				 * Defines the onChange event for UI element definitions.
+1056 				 * @field
+1057 				 * @type Object
+1058 				 * @example
+1059 				 */
+1060 				eventProcessors :
+1061 				{
+1062 					onChange : function( dialog, func )
+1063 					{
+1064 						if ( !CKEDITOR.env.ie )
+1065 							return commonEventProcessors.onChange.apply( this, arguments );
+1066 						else
+1067 						{
+1068 							dialog.on( 'load', function()
+1069 								{
+1070 									var element = this._.checkbox.getElement();
+1071 									element.on( 'propertychange', function( evt )
+1072 										{
+1073 											evt = evt.data.$;
+1074 											if ( evt.propertyName == 'checked' )
+1075 												this.fire( 'change', { value : element.$.checked } );
+1076 										}, this );
+1077 								}, this );
+1078 							this.on( 'change', func );
+1079 						}
+1080 						return null;
+1081 					}
+1082 				},
+1083
+1084 				keyboardFocusable : true
+1085 			}, commonPrototype, true );
+1086
+1087 	CKEDITOR.ui.dialog.radio.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,
+1088 			/** @lends CKEDITOR.ui.dialog.radio.prototype */
+1089 			{
+1090 				/**
+1091 				 * Checks one of the radio buttons in this button group.
+1092 				 * @example
+1093 				 * @param {String} value The value of the button to be chcked.
+1094 				 */
+1095 				setValue : function( value )
+1096 				{
+1097 					var children = this._.children,
+1098 						item;
+1099 					for ( var i = 0 ; ( i < children.length ) && ( item = children[i] ) ; i++ )
+1100 						item.getElement().$.checked = ( item.getValue() == value );
+1101 					this.fire( 'change', { value : value } );
+1102 				},
+1103
+1104 				/**
+1105 				 * Gets the value of the currently checked radio button.
+1106 				 * @example
+1107 				 * @returns {String} The currently checked button's value.
+1108 				 */
+1109 				getValue : function()
+1110 				{
+1111 					var children = this._.children;
+1112 					for ( var i = 0 ; i < children.length ; i++ )
+1113 					{
+1114 						if ( children[i].getElement().$.checked )
+1115 							return children[i].getValue();
+1116 					}
+1117 					return null;
+1118 				},
+1119
+1120 				/**
+1121 				 * Handler for the access key up event. Focuses the currently
+1122 				 * selected radio button, or the first radio button if none is
+1123 				 * selected.
+1124 				 * @example
+1125 				 */
+1126 				accessKeyUp : function()
+1127 				{
+1128 					var children = this._.children, i;
+1129 					for ( i = 0 ; i < children.length ; i++ )
+1130 					{
+1131 						if ( children[i].getElement().$.checked )
+1132 						{
+1133 							children[i].getElement().focus();
+1134 							return;
+1135 						}
+1136 					}
+1137 					children[0].getElement().focus();
+1138 				},
+1139
+1140 				/**
+1141 				 * Defines the onChange event for UI element definitions.
+1142 				 * @field
+1143 				 * @type Object
+1144 				 * @example
+1145 				 */
+1146 				eventProcessors :
+1147 				{
+1148 					onChange : function( dialog, func )
+1149 					{
+1150 						if ( !CKEDITOR.env.ie )
+1151 							return commonEventProcessors.onChange.apply( this, arguments );
+1152 						else
+1153 						{
+1154 							dialog.on( 'load', function()
+1155 								{
+1156 									var children = this._.children, me = this;
+1157 									for ( var i = 0 ; i < children.length ; i++ )
+1158 									{
+1159 										var element = children[i].getElement();
+1160 										element.on( 'propertychange', function( evt )
+1161 											{
+1162 												evt = evt.data.$;
+1163 												if ( evt.propertyName == 'checked' && this.$.checked )
+1164 													me.fire( 'change', { value : this.getAttribute( 'value' ) } );
+1165 											} );
+1166 									}
+1167 								}, this );
+1168 							this.on( 'change', func );
+1169 						}
+1170 						return null;
+1171 					}
+1172 				},
+1173
+1174 				keyboardFocusable : true
+1175 			}, commonPrototype, true );
+1176
+1177 	CKEDITOR.ui.dialog.file.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement,
+1178 			commonPrototype,
+1179 			/** @lends CKEDITOR.ui.dialog.file.prototype */
+1180 			{
+1181 				/**
+1182 				 * Gets the <input> element of this file input.
+1183 				 * @returns {CKEDITOR.dom.element} The file input element.
+1184 				 * @example
+1185 				 */
+1186 				getInputElement : function()
+1187 				{
+1188 					var frameDocument = CKEDITOR.document.getById( this._.frameId ).getFrameDocument();
+1189 					return frameDocument.$.forms.length > 0 ?
+1190 						new CKEDITOR.dom.element( frameDocument.$.forms[0].elements[0] ) :
+1191 						this.getElement();
+1192 				},
+1193
+1194 				/**
+1195 				 * Uploads the file in the file input.
+1196 				 * @returns {CKEDITOR.ui.dialog.file} This object.
+1197 				 * @example
+1198 				 */
+1199 				submit : function()
+1200 				{
+1201 					this.getInputElement().getParent().$.submit();
+1202 					return this;
+1203 				},
+1204
+1205 				/**
+1206 				 * Get the action assigned to the form.
+1207 				 * @returns {String} The value of the action.
+1208 				 * @example
+1209 				 */
+1210 				getAction : function( action )
+1211 				{
+1212 					return this.getInputElement().getParent().$.action;
+1213 				},
+1214
+1215 				/**
+1216 				 * Redraws the file input and resets the file path in the file input.
+1217 				 * The redraw logic is necessary because non-IE browsers tend to clear
+1218 				 * the <iframe> containing the file input after closing the dialog.
+1219 				 * @example
+1220 				 */
+1221 				reset : function()
+1222 				{
+1223 					var frameElement = CKEDITOR.document.getById( this._.frameId ),
+1224 						frameDocument = frameElement.getFrameDocument(),
+1225 						elementDefinition = this._.definition,
+1226 						buttons = this._.buttons;
+1227
+1228 					function generateFormField()
+1229 					{
+1230 						frameDocument.$.open();
+1231
+1232 						// Support for custom document.domain in IE.
+1233 						if ( CKEDITOR.env.isCustomDomain() )
+1234 							frameDocument.$.domain = document.domain;
+1235
+1236 						frameDocument.$.write( [ '<html><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">',
+1237 								'<form enctype="multipart/form-data" method="POST" action="',
+1238 								CKEDITOR.tools.htmlEncode( elementDefinition.action ),
+1239 								'">',
+1240 								'<input type="file" name="',
+1241 								CKEDITOR.tools.htmlEncode( elementDefinition.id || 'cke_upload' ),
+1242 								'" size="',
+1243 								CKEDITOR.tools.htmlEncode( elementDefinition.size || '' ),
+1244 								'" />',
+1245 								'</form>',
+1246 								'</body></html>' ].join( '' ) );
+1247
+1248 						frameDocument.$.close();
+1249
+1250 						for ( var i = 0 ; i < buttons.length ; i++ )
+1251 							buttons[i].enable();
+1252 					}
+1253
+1254 					// #3465: Wait for the browser to finish rendering the dialog first.
+1255 					if ( CKEDITOR.env.gecko )
+1256 						setTimeout( generateFormField, 500 );
+1257 					else
+1258 						generateFormField();
+1259 				},
+1260
+1261 				getValue : function()
+1262 				{
+1263 					// The file path returned from the input tag is incomplete anyway, so it's
+1264 					// safe to ignore it and prevent the confirmation dialog from appearing.
+1265 					// (Part of #3465)
+1266 					return '';
+1267 				},
+1268
+1269 				/**
+1270 				 * Defines the onChange event for UI element definitions.
+1271 				 * @field
+1272 				 * @type Object
+1273 				 * @example
+1274 				 */
+1275 				eventProcessors : commonEventProcessors,
+1276
+1277 				keyboardFocusable : true
+1278 			}, true );
+1279
+1280 	CKEDITOR.ui.dialog.fileButton.prototype = new CKEDITOR.ui.dialog.button;
+1281
+1282 	CKEDITOR.dialog.addUIElement( 'text', textBuilder );
+1283 	CKEDITOR.dialog.addUIElement( 'password', textBuilder );
+1284 	CKEDITOR.dialog.addUIElement( 'textarea', commonBuilder );
+1285 	CKEDITOR.dialog.addUIElement( 'checkbox', commonBuilder );
+1286 	CKEDITOR.dialog.addUIElement( 'radio', commonBuilder );
+1287 	CKEDITOR.dialog.addUIElement( 'button', commonBuilder );
+1288 	CKEDITOR.dialog.addUIElement( 'select', commonBuilder );
+1289 	CKEDITOR.dialog.addUIElement( 'file', commonBuilder );
+1290 	CKEDITOR.dialog.addUIElement( 'fileButton', commonBuilder );
+1291 	CKEDITOR.dialog.addUIElement( 'html', commonBuilder );
+1292 })();
+1293 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_domiterator_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_domiterator_plugin.js.html new file mode 100644 index 000000000..dd59e8354 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_domiterator_plugin.js.html @@ -0,0 +1,324 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file DOM iterator, which iterates over list items, lines and paragraphs.
+  8  */
+  9
+ 10 CKEDITOR.plugins.add( 'domiterator' );
+ 11
+ 12 (function()
+ 13 {
+ 14
+ 15 	var iterator = function( range )
+ 16 	{
+ 17 		if ( arguments.length < 1 )
+ 18 			return;
+ 19
+ 20 		this.range = range;
+ 21 		this.forceBrBreak = false;
+ 22 		this.enforceRealBlocks = false;
+ 23
+ 24 		this._ || ( this._ = {} );
+ 25 	},
+ 26 		beginWhitespaceRegex = /^[\r\n\t ]+$/;
+ 27
+ 28
+ 29 	iterator.prototype = {
+ 30 		getNextParagraph : function( blockTag )
+ 31 		{
+ 32 			// The block element to be returned.
+ 33 			var block;
+ 34
+ 35 			// The range object used to identify the paragraph contents.
+ 36 			var range;
+ 37
+ 38 			// Indicats that the current element in the loop is the last one.
+ 39 			var isLast;
+ 40
+ 41 			// Instructs to cleanup remaining BRs.
+ 42 			var removePreviousBr, removeLastBr;
+ 43
+ 44 			// This is the first iteration. Let's initialize it.
+ 45 			if ( !this._.lastNode )
+ 46 			{
+ 47 				range = this.range.clone();
+ 48 				range.enlarge( this.forceBrBreak ? CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS : CKEDITOR.ENLARGE_BLOCK_CONTENTS );
+ 49
+ 50 				var walker = new CKEDITOR.dom.walker( range ),
+ 51 					ignoreBookmarkTextEvaluator = CKEDITOR.dom.walker.bookmark( true, true );
+ 52 				// Avoid anchor inside bookmark inner text.
+ 53 				walker.evaluator = ignoreBookmarkTextEvaluator;
+ 54 				this._.nextNode = walker.next();
+ 55 				// TODO: It's better to have walker.reset() used here.
+ 56 				walker = new CKEDITOR.dom.walker( range );
+ 57 				walker.evaluator = ignoreBookmarkTextEvaluator;
+ 58 				var lastNode = walker.previous();
+ 59 				this._.lastNode = lastNode.getNextSourceNode( true );
+ 60 				// Probably the document end is reached, we need a marker node.
+ 61 				if ( !this._.lastNode )
+ 62 				{
+ 63 						this._.lastNode = range.document.createText( '' );
+ 64 						this._.lastNode.insertAfter( lastNode );
+ 65 				}
+ 66 				// Let's reuse this variable.
+ 67 				range = null;
+ 68 			}
+ 69
+ 70 			var currentNode = this._.nextNode;
+ 71 			lastNode = this._.lastNode;
+ 72
+ 73 			this._.nextNode = null;
+ 74 			while ( currentNode )
+ 75 			{
+ 76 				// closeRange indicates that a paragraph boundary has been found,
+ 77 				// so the range can be closed.
+ 78 				var closeRange = false;
+ 79
+ 80 				// includeNode indicates that the current node is good to be part
+ 81 				// of the range. By default, any non-element node is ok for it.
+ 82 				var includeNode = ( currentNode.type != CKEDITOR.NODE_ELEMENT ),
+ 83 					continueFromSibling = false;
+ 84
+ 85 				// If it is an element node, let's check if it can be part of the
+ 86 				// range.
+ 87 				if ( !includeNode )
+ 88 				{
+ 89 					var nodeName = currentNode.getName();
+ 90
+ 91 					if ( currentNode.isBlockBoundary( this.forceBrBreak && { br : 1 } ) )
+ 92 					{
+ 93 						// <br> boundaries must be part of the range. It will
+ 94 						// happen only if ForceBrBreak.
+ 95 						if ( nodeName == 'br' )
+ 96 							includeNode = true;
+ 97 						else if ( !range && !currentNode.getChildCount() && nodeName != 'hr' )
+ 98 						{
+ 99 							// If we have found an empty block, and haven't started
+100 							// the range yet, it means we must return this block.
+101 							block = currentNode;
+102 							isLast = currentNode.equals( lastNode );
+103 							break;
+104 						}
+105
+106 						// The range must finish right before the boundary,
+107 						// including possibly skipped empty spaces. (#1603)
+108 						if ( range )
+109 						{
+110 							range.setEndAt( currentNode, CKEDITOR.POSITION_BEFORE_START );
+111
+112 							// The found boundary must be set as the next one at this
+113 							// point. (#1717)
+114 							if ( nodeName != 'br' )
+115 								this._.nextNode = currentNode;
+116 						}
+117
+118 						closeRange = true;
+119 					}
+120 					else
+121 					{
+122 						// If we have child nodes, let's check them.
+123 						if ( currentNode.getFirst() )
+124 						{
+125 							// If we don't have a range yet, let's start it.
+126 							if ( !range )
+127 							{
+128 								range = new CKEDITOR.dom.range( this.range.document );
+129 								range.setStartAt( currentNode, CKEDITOR.POSITION_BEFORE_START );
+130 							}
+131
+132 							currentNode = currentNode.getFirst();
+133 							continue;
+134 						}
+135 						includeNode = true;
+136 					}
+137 				}
+138 				else if ( currentNode.type == CKEDITOR.NODE_TEXT )
+139 				{
+140 					// Ignore normal whitespaces (i.e. not including   or
+141 					// other unicode whitespaces) before/after a block node.
+142 					if ( beginWhitespaceRegex.test( currentNode.getText() ) )
+143 						includeNode = false;
+144 				}
+145
+146 				// The current node is good to be part of the range and we are
+147 				// starting a new range, initialize it first.
+148 				if ( includeNode && !range )
+149 				{
+150 					range = new CKEDITOR.dom.range( this.range.document );
+151 					range.setStartAt( currentNode, CKEDITOR.POSITION_BEFORE_START );
+152 				}
+153
+154 				// The last node has been found.
+155 				isLast = ( ( !closeRange || includeNode ) && currentNode.equals( lastNode ) );
+156
+157 				// If we are in an element boundary, let's check if it is time
+158 				// to close the range, otherwise we include the parent within it.
+159 				if ( range && !closeRange )
+160 				{
+161 					while ( !currentNode.getNext() && !isLast )
+162 					{
+163 						var parentNode = currentNode.getParent();
+164
+165 						if ( parentNode.isBlockBoundary( this.forceBrBreak && { br : 1 } ) )
+166 						{
+167 							closeRange = true;
+168 							isLast = isLast || ( parentNode.equals( lastNode) );
+169 							break;
+170 						}
+171
+172 						currentNode = parentNode;
+173 						includeNode = true;
+174 						isLast = ( currentNode.equals( lastNode ) );
+175 						continueFromSibling = true;
+176 					}
+177 				}
+178
+179 				// Now finally include the node.
+180 				if ( includeNode )
+181 					range.setEndAt( currentNode, CKEDITOR.POSITION_AFTER_END );
+182
+183 				// We have found a block boundary. Let's close the range and move out of the
+184 				// loop.
+185 				if ( ( closeRange || isLast ) && range )
+186 				{
+187 					var boundaryNodes = range.getBoundaryNodes(),
+188 						startPath = new CKEDITOR.dom.elementPath( range.startContainer ),
+189 						endPath = new CKEDITOR.dom.elementPath( range.endContainer );
+190 					if ( boundaryNodes.startNode.equals( boundaryNodes.endNode )
+191 							&& boundaryNodes.startNode.getParent().equals( startPath.blockLimit )
+192 							&& boundaryNodes.startNode.type == CKEDITOR.NODE_ELEMENT && boundaryNodes.startNode.getAttribute( '_fck_bookmark' ) )
+193 						range = null;
+194 					else
+195 						break;
+196 				}
+197
+198 				if ( isLast )
+199 					break;
+200
+201 				currentNode = currentNode.getNextSourceNode( continueFromSibling, null, lastNode );
+202 			}
+203
+204 			// Now, based on the processed range, look for (or create) the block to be returned.
+205 			if ( !block )
+206 			{
+207 				// If no range has been found, this is the end.
+208 				if ( !range )
+209 				{
+210 					this._.nextNode = null;
+211 					return null;
+212 				}
+213
+214 				startPath = new CKEDITOR.dom.elementPath( range.startContainer );
+215 				var startBlockLimit = startPath.blockLimit,
+216 					checkLimits = { div : 1, th : 1, td : 1 };
+217 				block = startPath.block;
+218
+219 				if ( !block
+220 						&& !this.enforceRealBlocks
+221 						&& checkLimits[ startBlockLimit.getName() ]
+222 						&& range.checkStartOfBlock()
+223 						&& range.checkEndOfBlock() )
+224 					block = startBlockLimit;
+225 				else if ( !block || ( this.enforceRealBlocks && block.getName() == 'li' ) )
+226 				{
+227 					// Create the fixed block.
+228 					block = this.range.document.createElement( blockTag || 'p' );
+229
+230 					// Move the contents of the temporary range to the fixed block.
+231 					range.extractContents().appendTo( block );
+232 					block.trim();
+233
+234 					// Insert the fixed block into the DOM.
+235 					range.insertNode( block );
+236
+237 					removePreviousBr = removeLastBr = true;
+238 				}
+239 				else if ( block.getName() != 'li' )
+240 				{
+241 					// If the range doesn't includes the entire contents of the
+242 					// block, we must split it, isolating the range in a dedicated
+243 					// block.
+244 					if ( !range.checkStartOfBlock() || !range.checkEndOfBlock() )
+245 					{
+246 						// The resulting block will be a clone of the current one.
+247 						block = block.clone( false );
+248
+249 						// Extract the range contents, moving it to the new block.
+250 						range.extractContents().appendTo( block );
+251 						block.trim();
+252
+253 						// Split the block. At this point, the range will be in the
+254 						// right position for our intents.
+255 						var splitInfo = range.splitBlock();
+256
+257 						removePreviousBr = !splitInfo.wasStartOfBlock;
+258 						removeLastBr = !splitInfo.wasEndOfBlock;
+259
+260 						// Insert the new block into the DOM.
+261 						range.insertNode( block );
+262 					}
+263 				}
+264 				else if ( !isLast )
+265 				{
+266 					// LIs are returned as is, with all their children (due to the
+267 					// nested lists). But, the next node is the node right after
+268 					// the current range, which could be an <li> child (nested
+269 					// lists) or the next sibling <li>.
+270
+271 					this._.nextNode = ( block.equals( lastNode ) ? null :
+272 						range.getBoundaryNodes().endNode.getNextSourceNode( true, null, lastNode ) );
+273 				}
+274 			}
+275
+276 			if ( removePreviousBr )
+277 			{
+278 				var previousSibling = block.getPrevious();
+279 				if ( previousSibling && previousSibling.type == CKEDITOR.NODE_ELEMENT )
+280 				{
+281 					if ( previousSibling.getName() == 'br' )
+282 						previousSibling.remove();
+283 					else if ( previousSibling.getLast() && previousSibling.getLast().$.nodeName.toLowerCase() == 'br' )
+284 						previousSibling.getLast().remove();
+285 				}
+286 			}
+287
+288 			if ( removeLastBr )
+289 			{
+290 				var lastChild = block.getLast();
+291 				if ( lastChild && lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.getName() == 'br' )
+292 				{
+293 					// Take care not to remove the block expanding <br> in non-IE browsers.
+294 					if ( CKEDITOR.env.ie || lastChild.getPrevious() || lastChild.getNext() )
+295 						lastChild.remove();
+296 				}
+297 			}
+298
+299 			// Get a reference for the next element. This is important because the
+300 			// above block can be removed or changed, so we can rely on it for the
+301 			// next interation.
+302 			if ( !this._.nextNode )
+303 			{
+304 				this._.nextNode = ( isLast || block.equals( lastNode ) ) ? null :
+305 					block.getNextSourceNode( true, null, lastNode );
+306 			}
+307
+308 			return block;
+309 		}
+310 	};
+311
+312 	CKEDITOR.dom.range.prototype.createIterator = function()
+313 	{
+314 		return new iterator( this );
+315 	};
+316 })();
+317 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_editingblock_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_editingblock_plugin.js.html new file mode 100644 index 000000000..99b967f8e --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_editingblock_plugin.js.html @@ -0,0 +1,233 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview The default editing block plugin, which holds the editing area
+  8  *		and source view.
+  9  */
+ 10
+ 11 (function()
+ 12 {
+ 13 	var getMode = function( editor, mode )
+ 14 	{
+ 15 		return editor._.modes && editor._.modes[ mode || editor.mode ];
+ 16 	};
+ 17
+ 18 	// This is a semaphore used to avoid recursive calls between
+ 19 	// the following data handling functions.
+ 20 	var isHandlingData;
+ 21
+ 22 	CKEDITOR.plugins.add( 'editingblock',
+ 23 	{
+ 24 		init : function( editor )
+ 25 		{
+ 26 			if ( !editor.config.editingBlock )
+ 27 				return;
+ 28
+ 29 			editor.on( 'themeSpace', function( event )
+ 30 				{
+ 31 					if ( event.data.space == 'contents' )
+ 32 						event.data.html += '<br>';
+ 33 				});
+ 34
+ 35 			editor.on( 'themeLoaded', function()
+ 36 				{
+ 37 					editor.fireOnce( 'editingBlockReady' );
+ 38 				});
+ 39
+ 40 			editor.on( 'uiReady', function()
+ 41 				{
+ 42 					editor.setMode( editor.config.startupMode );
+ 43 				});
+ 44
+ 45 			editor.on( 'afterSetData', function()
+ 46 				{
+ 47 					if ( !isHandlingData )
+ 48 					{
+ 49 						function setData()
+ 50 						{
+ 51 							isHandlingData = true;
+ 52 							getMode( editor ).loadData( editor.getData() );
+ 53 							isHandlingData = false;
+ 54 						}
+ 55
+ 56 						if ( editor.mode )
+ 57 							setData();
+ 58 						else
+ 59 						{
+ 60 							editor.on( 'mode', function()
+ 61 								{
+ 62 									setData();
+ 63 									editor.removeListener( 'mode', arguments.callee );
+ 64 								});
+ 65 						}
+ 66 					}
+ 67 				});
+ 68
+ 69 			editor.on( 'beforeGetData', function()
+ 70 				{
+ 71 					if ( !isHandlingData && editor.mode )
+ 72 					{
+ 73 						isHandlingData = true;
+ 74 						editor.setData( getMode( editor ).getData() );
+ 75 						isHandlingData = false;
+ 76 					}
+ 77 				});
+ 78
+ 79 			editor.on( 'getSnapshot', function( event )
+ 80 				{
+ 81 					if ( editor.mode )
+ 82 						event.data = getMode( editor ).getSnapshotData();
+ 83 				});
+ 84
+ 85 			editor.on( 'loadSnapshot', function( event )
+ 86 				{
+ 87 					if ( editor.mode )
+ 88 						getMode( editor ).loadSnapshotData( event.data );
+ 89 				});
+ 90
+ 91 			// For the first "mode" call, we'll also fire the "instanceReady"
+ 92 			// event.
+ 93 			editor.on( 'mode', function( event )
+ 94 				{
+ 95 					// Do that once only.
+ 96 					event.removeListener();
+ 97
+ 98 					// Grab editor focus if the editor container is focused. (#3104)
+ 99 					var focusGrabber = editor.container;
+100
+101 					// Safari 3 can't handle tabindex in all elements, so we do
+102 					// a trick to make it move the focus to the editor on TAB.
+103 					if ( CKEDITOR.env.webkit && CKEDITOR.env.version < 528 )
+104 					{
+105 						var tabIndex = editor.config.tabIndex || editor.element.getAttribute( 'tabindex' ) || 0;
+106 						focusGrabber = focusGrabber.append( CKEDITOR.dom.element.createFromHtml(
+107 							'<input' +
+108 								' tabindex="' + tabIndex + '"' +
+109 								' style="position:absolute; left:-10000">' ) );
+110 					}
+111
+112 					focusGrabber.on( 'focus', function()
+113 						{
+114 							editor.focus();
+115 						});
+116
+117 					if ( editor.config.startupFocus )
+118 						editor.focus();
+119
+120 					// Fire instanceReady for both the editor and CKEDITOR, but
+121 					// defer this until the whole execution has completed
+122 					// to guarantee the editor is fully responsible.
+123 					setTimeout( function(){
+124 						editor.fireOnce( 'instanceReady' );
+125 						CKEDITOR.fire( 'instanceReady', null, editor );
+126 					} );
+127 				});
+128 		}
+129 	});
+130
+131 	/**
+132 	 * The current editing mode. An editing mode is basically a viewport for
+133 	 * editing or content viewing. By default the possible values for this
+134 	 * property are "wysiwyg" and "source".
+135 	 * @type String
+136 	 * @example
+137 	 * alert( CKEDITOR.instances.editor1.mode );  // "wysiwyg" (e.g.)
+138 	 */
+139 	CKEDITOR.editor.prototype.mode = '';
+140
+141 	/**
+142 	 * Registers an editing mode. This function is to be used mainly by plugins.
+143 	 * @param {String} mode The mode name.
+144 	 * @param {Object} modeEditor The mode editor definition.
+145 	 * @example
+146 	 */
+147 	CKEDITOR.editor.prototype.addMode = function( mode, modeEditor )
+148 	{
+149 		modeEditor.name = mode;
+150 		( this._.modes || ( this._.modes = {} ) )[ mode ] = modeEditor;
+151 	};
+152
+153 	/**
+154 	 * Sets the current editing mode in this editor instance.
+155 	 * @param {String} mode A registered mode name.
+156 	 * @example
+157 	 * // Switch to "source" view.
+158 	 * CKEDITOR.instances.editor1.setMode( 'source' );
+159 	 */
+160 	CKEDITOR.editor.prototype.setMode = function( mode )
+161 	{
+162 		var data,
+163 			holderElement = this.getThemeSpace( 'contents' ),
+164 			isDirty = this.checkDirty();
+165
+166 		// Unload the previous mode.
+167 		if ( this.mode )
+168 		{
+169 			if ( mode == this.mode )
+170 				return;
+171
+172 			var currentMode = getMode( this );
+173 			data = currentMode.getData();
+174 			currentMode.unload( holderElement );
+175 			this.mode = '';
+176 		}
+177
+178 		holderElement.setHtml( '' );
+179
+180 		// Load required mode.
+181 		var modeEditor = getMode( this, mode );
+182 		if ( !modeEditor )
+183 			throw '[CKEDITOR.editor.setMode] Unknown mode "' + mode + '".';
+184
+185 		if ( !isDirty )
+186 		{
+187 			this.on( 'mode', function()
+188 				{
+189 					this.resetDirty();
+190 					this.removeListener( 'mode', arguments.callee );
+191 				});
+192 		}
+193
+194 		modeEditor.load( holderElement, ( typeof data ) != 'string'  ? this.getData() : data);
+195 	};
+196
+197 	/**
+198 	 * Moves the selection focus to the editing are space in the editor.
+199 	 */
+200 	CKEDITOR.editor.prototype.focus = function()
+201 	{
+202 		var mode = getMode( this );
+203 		if ( mode )
+204 			mode.focus();
+205 	};
+206 })();
+207
+208 /**
+209  * The mode to load at the editor startup. It depends on the plugins
+210  * loaded. By default, the "wysiwyg" and "source" modes are available.
+211  * @type String
+212  * @default 'wysiwyg'
+213  * @example
+214  * config.toolbarLocation = 'source';
+215  */
+216 CKEDITOR.config.startupMode = 'wysiwyg';
+217
+218 /**
+219  * Sets whether the editor should have the focus when the page loads.
+220  * @type Boolean
+221  * @default false
+222  */
+223 CKEDITOR.config.startupFocus = false;
+224
+225 CKEDITOR.config.editingBlock = true;
+226 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_elementspath_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_elementspath_plugin.js.html new file mode 100644 index 000000000..f3c022671 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_elementspath_plugin.js.html @@ -0,0 +1,190 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview The "elementspath" plugin. It shows all elements in the DOM
+  8  *		parent tree relative to the current selection in the editing area.
+  9  */
+ 10
+ 11 (function()
+ 12 {
+ 13 	var commands =
+ 14 	{
+ 15 		toolbarFocus :
+ 16 		{
+ 17 			exec : function( editor )
+ 18 			{
+ 19 				var idBase = editor._.elementsPath.idBase;
+ 20 				var element = CKEDITOR.document.getById( idBase + '0' );
+ 21
+ 22 				if ( element )
+ 23 					element.focus();
+ 24 			}
+ 25 		}
+ 26 	};
+ 27
+ 28 	var emptyHtml = '<span class="cke_empty"> </span>';
+ 29
+ 30 	CKEDITOR.plugins.add( 'elementspath',
+ 31 	{
+ 32 		requires : [ 'selection' ],
+ 33
+ 34 		init : function( editor )
+ 35 		{
+ 36 			var spaceId = 'cke_path_' + editor.name;
+ 37 			var spaceElement;
+ 38 			var getSpaceElement = function()
+ 39 			{
+ 40 				if ( !spaceElement )
+ 41 					spaceElement = CKEDITOR.document.getById( spaceId );
+ 42 				return spaceElement;
+ 43 			};
+ 44
+ 45 			var idBase = 'cke_elementspath_' + CKEDITOR.tools.getNextNumber() + '_';
+ 46
+ 47 			editor._.elementsPath = { idBase : idBase };
+ 48
+ 49 			editor.on( 'themeSpace', function( event )
+ 50 				{
+ 51 					if ( event.data.space == 'bottom' )
+ 52 						event.data.html += '<div id="' + spaceId + '" class="cke_path">' + emptyHtml + '</div>';
+ 53 				});
+ 54
+ 55 			editor.on( 'selectionChange', function( ev )
+ 56 				{
+ 57 					var env = CKEDITOR.env;
+ 58
+ 59 					var selection = ev.data.selection;
+ 60
+ 61 					var element = selection.getStartElement(),
+ 62 						html = [],
+ 63 						elementsList = this._.elementsPath.list = [];
+ 64
+ 65 					while ( element )
+ 66 					{
+ 67 						var index = elementsList.push( element ) - 1;
+ 68 						var name;
+ 69 						if ( element.getAttribute( '_cke_real_element_type' ) )
+ 70 							name = element.getAttribute( '_cke_real_element_type' );
+ 71 						else
+ 72 							name = element.getName();
+ 73
+ 74 						// Use this variable to add conditional stuff to the
+ 75 						// HTML (because we are doing it in reverse order... unshift).
+ 76 						var extra = '';
+ 77
+ 78 						// Some browsers don't cancel key events in the keydown but in the
+ 79 						// keypress.
+ 80 						// TODO: Check if really needed for Gecko+Mac.
+ 81 						if ( env.opera || ( env.gecko && env.mac ) )
+ 82 							extra += ' onkeypress="return false;"';
+ 83
+ 84 						// With Firefox, we need to force the button to redraw, otherwise it
+ 85 						// will remain in the focus state.
+ 86 						if ( env.gecko )
+ 87 							extra += ' onblur="this.style.cssText = this.style.cssText;"';
+ 88
+ 89 						html.unshift(
+ 90 							'<a' +
+ 91 								' id="', idBase, index, '"' +
+ 92 								' href="javascript:void(\'', name, '\')"' +
+ 93 								' tabindex="-1"' +
+ 94 								' title="', editor.lang.elementsPath.eleTitle.replace( /%1/, name ), '"' +
+ 95 								( ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 ) ?
+ 96 								' onfocus="event.preventBubble();"' : '' ) +
+ 97 								' hidefocus="true" ' +
+ 98 								' onkeydown="return CKEDITOR._.elementsPath.keydown(\'', this.name, '\',', index, ', event);"' +
+ 99 								extra ,
+100 								' onclick="return CKEDITOR._.elementsPath.click(\'', this.name, '\',', index, ');">',
+101 									name,
+102 							'</a>' );
+103
+104 						if ( name == 'body' )
+105 							break;
+106
+107 						element = element.getParent();
+108 					}
+109
+110 					getSpaceElement().setHtml( html.join('') + emptyHtml );
+111 				});
+112
+113 			editor.on( 'contentDomUnload', function()
+114 				{
+115 					getSpaceElement().setHtml( emptyHtml );
+116 				});
+117
+118 			editor.addCommand( 'elementsPathFocus', commands.toolbarFocus );
+119 		}
+120 	});
+121 })();
+122
+123 /**
+124  * Handles the click on an element in the element path.
+125  * @private
+126  */
+127 CKEDITOR._.elementsPath =
+128 {
+129 	click : function( instanceName, elementIndex )
+130 	{
+131 		var editor = CKEDITOR.instances[ instanceName ];
+132 		editor.focus();
+133
+134 		var element = editor._.elementsPath.list[ elementIndex ];
+135 		editor.getSelection().selectElement( element );
+136
+137 		return false;
+138 	},
+139
+140 	keydown : function( instanceName, elementIndex, ev )
+141 	{
+142 		var instance = CKEDITOR.ui.button._.instances[ elementIndex ];
+143 		var editor = CKEDITOR.instances[ instanceName ];
+144 		var idBase = editor._.elementsPath.idBase;
+145
+146 		var element;
+147
+148 		ev = new CKEDITOR.dom.event( ev );
+149
+150 		switch ( ev.getKeystroke() )
+151 		{
+152 			case 37 :					// LEFT-ARROW
+153 			case 9 :					// TAB
+154 				element = CKEDITOR.document.getById( idBase + ( elementIndex + 1 ) );
+155 				if ( !element )
+156 					element = CKEDITOR.document.getById( idBase + '0' );
+157 				element.focus();
+158 				return false;
+159
+160 			case 39 :					// RIGHT-ARROW
+161 			case CKEDITOR.SHIFT + 9 :	// SHIFT + TAB
+162 				element = CKEDITOR.document.getById( idBase + ( elementIndex - 1 ) );
+163 				if ( !element )
+164 					element = CKEDITOR.document.getById( idBase + ( editor._.elementsPath.list.length - 1 ) );
+165 				element.focus();
+166 				return false;
+167
+168 			case 27 :					// ESC
+169 				editor.focus();
+170 				return false;
+171
+172 			case 13 :					// ENTER	// Opera
+173 			case 32 :					// SPACE
+174 				this.click( instanceName, elementIndex );
+175 				return false;
+176
+177 			//default :
+178 			//	alert( ev.getKeystroke() );
+179 		}
+180 		return true;
+181 	}
+182 };
+183 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_enterkey_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_enterkey_plugin.js.html new file mode 100644 index 000000000..4c1771216 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_enterkey_plugin.js.html @@ -0,0 +1,331 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	CKEDITOR.plugins.add( 'enterkey',
+  9 	{
+ 10 		requires : [ 'keystrokes', 'indent' ],
+ 11
+ 12 		init : function( editor )
+ 13 		{
+ 14 			var specialKeys = editor.specialKeys;
+ 15 			specialKeys[ 13 ] = enter;
+ 16 			specialKeys[ CKEDITOR.SHIFT + 13 ] = shiftEnter;
+ 17 		}
+ 18 	});
+ 19
+ 20 	var forceMode,
+ 21 		headerTagRegex = /^h[1-6]$/;
+ 22
+ 23 	function shiftEnter( editor )
+ 24 	{
+ 25 		// On SHIFT+ENTER we want to enforce the mode to be respected, instead
+ 26 		// of cloning the current block. (#77)
+ 27 		forceMode = 1;
+ 28
+ 29 		return enter( editor, editor.config.shiftEnterMode );
+ 30 	}
+ 31
+ 32 	function enter( editor, mode )
+ 33 	{
+ 34 		// Only effective within document.
+ 35 		if ( editor.mode != 'wysiwyg' )
+ 36 			return false;
+ 37
+ 38 		if ( !mode )
+ 39 			mode = editor.config.enterMode;
+ 40
+ 41 		// Use setTimout so the keys get cancelled immediatelly.
+ 42 		setTimeout( function()
+ 43 			{
+ 44 				editor.fire( 'saveSnapshot' );	// Save undo step.
+ 45 				if ( mode == CKEDITOR.ENTER_BR || editor.getSelection().getStartElement().hasAscendant( 'pre', true ) )
+ 46 					enterBr( editor, mode );
+ 47 				else
+ 48 					enterBlock( editor, mode );
+ 49
+ 50 				forceMode = 0;
+ 51 			}, 0 );
+ 52
+ 53 		return true;
+ 54 	}
+ 55
+ 56 	function enterBlock( editor, mode, range )
+ 57 	{
+ 58 		// Get the range for the current selection.
+ 59 		range = range || getRange( editor );
+ 60
+ 61 		var doc = range.document;
+ 62
+ 63 		// Determine the block element to be used.
+ 64 		var blockTag = ( mode == CKEDITOR.ENTER_DIV ? 'div' : 'p' );
+ 65
+ 66 		// Split the range.
+ 67 		var splitInfo = range.splitBlock( blockTag );
+ 68
+ 69 		if ( !splitInfo )
+ 70 			return;
+ 71
+ 72 		// Get the current blocks.
+ 73 		var previousBlock	= splitInfo.previousBlock,
+ 74 			nextBlock		= splitInfo.nextBlock;
+ 75
+ 76 		var isStartOfBlock	= splitInfo.wasStartOfBlock,
+ 77 			isEndOfBlock	= splitInfo.wasEndOfBlock;
+ 78
+ 79 		var node;
+ 80
+ 81 		// If this is a block under a list item, split it as well. (#1647)
+ 82 		if ( nextBlock )
+ 83 		{
+ 84 			node = nextBlock.getParent();
+ 85 			if ( node.is( 'li' ) )
+ 86 			{
+ 87 				nextBlock.breakParent( node );
+ 88 				nextBlock.move( nextBlock.getNext(), true );
+ 89 			}
+ 90 		}
+ 91 		else if ( previousBlock && ( node = previousBlock.getParent() ) && node.is( 'li' ) )
+ 92 		{
+ 93 			previousBlock.breakParent( node );
+ 94 			range.moveToElementEditStart( previousBlock.getNext() );
+ 95 			previousBlock.move( previousBlock.getPrevious() );
+ 96 		}
+ 97
+ 98 		// If we have both the previous and next blocks, it means that the
+ 99 		// boundaries were on separated blocks, or none of them where on the
+100 		// block limits (start/end).
+101 		if ( !isStartOfBlock && !isEndOfBlock )
+102 		{
+103 			// If the next block is an <li> with another list tree as the first
+104 			// child, we'll need to append a placeholder or the list item
+105 			// wouldn't be editable. (#1420)
+106 			if ( nextBlock.is( 'li' ) && ( node = nextBlock.getFirst() )
+107 					&& node.is && node.is( 'ul', 'ol') )
+108 				nextBlock.insertBefore( doc.createText( '\xa0' ), node );
+109
+110 			// Move the selection to the end block.
+111 			if ( nextBlock )
+112 				range.moveToElementEditStart( nextBlock );
+113 		}
+114 		else
+115 		{
+116
+117 			if ( isStartOfBlock && isEndOfBlock && previousBlock.is( 'li' ) )
+118 			{
+119 				editor.execCommand( 'outdent' );
+120 				return;
+121 			}
+122
+123 			var newBlock;
+124
+125 			if ( previousBlock )
+126 			{
+127 				// Do not enter this block if it's a header tag, or we are in
+128 				// a Shift+Enter (#77). Create a new block element instead
+129 				// (later in the code).
+130 				if ( !forceMode && !headerTagRegex.test( previousBlock.getName() ) )
+131 				{
+132 					// Otherwise, duplicate the previous block.
+133 					newBlock = previousBlock.clone();
+134 				}
+135 			}
+136 			else if ( nextBlock )
+137 				newBlock = nextBlock.clone();
+138
+139 			if ( !newBlock )
+140 				newBlock = doc.createElement( blockTag );
+141
+142 			// Recreate the inline elements tree, which was available
+143 			// before hitting enter, so the same styles will be available in
+144 			// the new block.
+145 			var elementPath = splitInfo.elementPath;
+146 			if ( elementPath )
+147 			{
+148 				for ( var i = 0, len = elementPath.elements.length ; i < len ; i++ )
+149 				{
+150 					var element = elementPath.elements[ i ];
+151
+152 					if ( element.equals( elementPath.block ) || element.equals( elementPath.blockLimit ) )
+153 						break;
+154
+155 					if ( CKEDITOR.dtd.$removeEmpty[ element.getName() ] )
+156 					{
+157 						element = element.clone();
+158 						newBlock.moveChildren( element );
+159 						newBlock.append( element );
+160 					}
+161 				}
+162 			}
+163
+164 			if ( !CKEDITOR.env.ie )
+165 				newBlock.appendBogus();
+166
+167 			range.insertNode( newBlock );
+168
+169 			// This is tricky, but to make the new block visible correctly
+170 			// we must select it.
+171 			// The previousBlock check has been included because it may be
+172 			// empty if we have fixed a block-less space (like ENTER into an
+173 			// empty table cell).
+174 			if ( CKEDITOR.env.ie && isStartOfBlock && ( !isEndOfBlock || !previousBlock.getChildCount() ) )
+175 			{
+176 				// Move the selection to the new block.
+177 				range.moveToElementEditStart( isEndOfBlock ? previousBlock : newBlock );
+178 				range.select();
+179 			}
+180
+181 			// Move the selection to the new block.
+182 			range.moveToElementEditStart( isStartOfBlock && !isEndOfBlock ? nextBlock : newBlock );
+183 		}
+184
+185 		if ( !CKEDITOR.env.ie )
+186 		{
+187 			if ( nextBlock )
+188 			{
+189 				// If we have split the block, adds a temporary span at the
+190 				// range position and scroll relatively to it.
+191 				var tmpNode = doc.createElement( 'span' );
+192
+193 				// We need some content for Safari.
+194 				tmpNode.setHtml( ' ' );
+195
+196 				range.insertNode( tmpNode );
+197 				tmpNode.scrollIntoView();
+198 				range.deleteContents();
+199 			}
+200 			else
+201 			{
+202 				// We may use the above scroll logic for the new block case
+203 				// too, but it gives some weird result with Opera.
+204 				newBlock.scrollIntoView();
+205 			}
+206 		}
+207
+208 		range.select();
+209 	}
+210
+211 	function enterBr( editor, mode )
+212 	{
+213 		// Get the range for the current selection.
+214 		var range = getRange( editor ),
+215 			doc = range.document;
+216
+217 		// Determine the block element to be used.
+218 		var blockTag = ( mode == CKEDITOR.ENTER_DIV ? 'div' : 'p' );
+219
+220 		var isEndOfBlock = range.checkEndOfBlock();
+221
+222 		var elementPath = new CKEDITOR.dom.elementPath( editor.getSelection().getStartElement() );
+223
+224 		var startBlock = elementPath.block,
+225 			startBlockTag = startBlock && elementPath.block.getName();
+226
+227 		var isPre = false;
+228
+229 		if ( !forceMode && startBlockTag == 'li' )
+230 		{
+231 			enterBlock( editor, mode, range );
+232 			return;
+233 		}
+234
+235 		// If we are at the end of a header block.
+236 		if ( !forceMode && isEndOfBlock && headerTagRegex.test( startBlockTag ) )
+237 		{
+238 			// Insert a <br> after the current paragraph.
+239 			doc.createElement( 'br' ).insertAfter( startBlock );
+240
+241 			// A text node is required by Gecko only to make the cursor blink.
+242 			if ( CKEDITOR.env.gecko )
+243 				doc.createText( '' ).insertAfter( startBlock );
+244
+245 			// IE has different behaviors regarding position.
+246 			range.setStartAt( startBlock.getNext(), CKEDITOR.env.ie ? CKEDITOR.POSITION_BEFORE_START : CKEDITOR.POSITION_AFTER_START );
+247 		}
+248 		else
+249 		{
+250 			var lineBreak;
+251
+252 			isPre = ( startBlockTag == 'pre' );
+253
+254 			if ( isPre )
+255 				lineBreak = doc.createText( CKEDITOR.env.ie ? '\r' : '\n' );
+256 			else
+257 				lineBreak = doc.createElement( 'br' );
+258
+259 			range.insertNode( lineBreak );
+260
+261 			// A text node is required by Gecko only to make the cursor blink.
+262 			// We need some text inside of it, so the bogus <br> is properly
+263 			// created.
+264 			if ( !CKEDITOR.env.ie )
+265 				doc.createText( '\ufeff' ).insertAfter( lineBreak );
+266
+267 			// If we are at the end of a block, we must be sure the bogus node is available in that block.
+268 			if ( isEndOfBlock && !CKEDITOR.env.ie )
+269 				lineBreak.getParent().appendBogus();
+270
+271 			// Now we can remove the text node contents, so the caret doesn't
+272 			// stop on it.
+273 			if ( !CKEDITOR.env.ie )
+274 				lineBreak.getNext().$.nodeValue = '';
+275 			// IE has different behavior regarding position.
+276 			if ( CKEDITOR.env.ie )
+277 				range.setStartAt( lineBreak, CKEDITOR.POSITION_AFTER_END );
+278 			else
+279 				range.setStartAt( lineBreak.getNext(), CKEDITOR.POSITION_AFTER_START );
+280
+281 			// Scroll into view, for non IE.
+282 			if ( !CKEDITOR.env.ie )
+283 			{
+284 				var dummy = null;
+285
+286 				// BR is not positioned in Opera and Webkit.
+287 				if ( !CKEDITOR.env.gecko )
+288 				{
+289 					dummy = doc.createElement( 'span' );
+290 					// We need have some contents for Webkit to position it
+291 					// under parent node. ( #3681)
+292 					dummy.setHtml(' ');
+293 				}
+294 				else
+295 					dummy = doc.createElement( 'br' );
+296
+297 				dummy.insertBefore( lineBreak.getNext() );
+298 				dummy.scrollIntoView();
+299 				dummy.remove();
+300 			}
+301 		}
+302
+303 		// This collapse guarantees the cursor will be blinking.
+304 		range.collapse( true );
+305
+306 		range.select( isPre );
+307 	}
+308
+309 	function getRange( editor )
+310 	{
+311 		// Get the selection ranges.
+312 		var ranges = editor.getSelection().getRanges();
+313
+314 		// Delete the contents of all ranges except the first one.
+315 		for ( var i = ranges.length - 1 ; i > 0 ; i-- )
+316 		{
+317 			ranges[ i ].deleteContents();
+318 		}
+319
+320 		// Return the first range.
+321 		return ranges[ 0 ];
+322 	}
+323 })();
+324 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_entities_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_entities_plugin.js.html new file mode 100644 index 000000000..522c67fcd --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_entities_plugin.js.html @@ -0,0 +1,160 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	var entities =
+  9
+ 10 		// Base HTML entities.
+ 11 		'nbsp,gt,lt,quot,' +
+ 12
+ 13 		// Latin-1 Entities
+ 14 		'iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,' +
+ 15 		'not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,' +
+ 16 		'cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,' +
+ 17
+ 18 		// Symbols
+ 19 		'fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,' +
+ 20 		'alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,' +
+ 21 		'forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,' +
+ 22 		'radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,' +
+ 23 		'equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,' +
+ 24 		'rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,' +
+ 25
+ 26 		// Other Special Characters
+ 27 		'circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,' +
+ 28 		'rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,' +
+ 29 		'euro';
+ 30
+ 31 	// Latin Letters Entities
+ 32 	var latin =
+ 33 		'Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,' +
+ 34 		'Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,' +
+ 35 		'Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,' +
+ 36 		'agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,' +
+ 37 		'ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,' +
+ 38 		'otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,' +
+ 39 		'OElig,oelig,Scaron,scaron,Yuml';
+ 40
+ 41 	// Greek Letters Entities.
+ 42 	var greek =
+ 43 		'Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,' +
+ 44 		'Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,' +
+ 45 		'beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,' +
+ 46 		'omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,' +
+ 47 		'upsih,piv';
+ 48
+ 49 	function buildTable( entities )
+ 50 	{
+ 51 		var table = {},
+ 52 			regex = [];
+ 53
+ 54 		// Entities that the browsers DOM don't transform to the final char
+ 55 		// automatically.
+ 56 		var specialTable =
+ 57 			{
+ 58 				nbsp	: '\u00A0',		// IE | FF
+ 59 				shy		: '\u00AD',		// IE
+ 60 				gt		: '\u003E',		// IE | FF |   --   | Opera
+ 61 				lt		: '\u003C'		// IE | FF | Safari | Opera
+ 62 			};
+ 63
+ 64 		entities = entities.replace( /\b(nbsp|shy|gt|lt|amp)(?:,|$)/g, function( match, entity )
+ 65 			{
+ 66 				table[ specialTable[ entity ] ] = '&' + entity + ';';
+ 67 				regex.push( specialTable[ entity ] );
+ 68 				return '';
+ 69 			});
+ 70
+ 71 		// Transforms the entities string into an array.
+ 72 		entities = entities.split( ',' );
+ 73
+ 74 		// Put all entities inside a DOM element, transforming them to their
+ 75 		// final chars.
+ 76 		var div = document.createElement( 'div' ),
+ 77 			chars;
+ 78 		div.innerHTML = '&' + entities.join( ';&' ) + ';';
+ 79 		chars = div.innerHTML;
+ 80 		div = null;
+ 81
+ 82 		// Add all chars to the table.
+ 83 		for ( var i = 0 ; i < chars.length ; i++ )
+ 84 		{
+ 85 			var charAt = chars.charAt( i );
+ 86 			table[ charAt ] = '&' + entities[ i ] + ';';
+ 87 			regex.push( charAt );
+ 88 		}
+ 89
+ 90 		table.regex = regex.join( '' );
+ 91
+ 92 		return table;
+ 93 	}
+ 94
+ 95 	CKEDITOR.plugins.add( 'entities',
+ 96 	{
+ 97 		afterInit : function( editor )
+ 98 		{
+ 99 			var config = editor.config;
+100
+101 			if ( !config.entities )
+102 				return;
+103
+104 			var dataProcessor = editor.dataProcessor,
+105 				htmlFilter = dataProcessor && dataProcessor.htmlFilter;
+106
+107 			if ( htmlFilter )
+108 			{
+109 				var selectedEntities = entities;
+110
+111 				if ( config.entities_latin )
+112 					selectedEntities += ',' + latin;
+113
+114 				if ( config.entities_greek )
+115 					selectedEntities += ',' + greek;
+116
+117 				if ( config.entities_additional )
+118 					selectedEntities += ',' + config.entities_additional;
+119
+120 				var entitiesTable = buildTable( selectedEntities );
+121
+122 				// Create the Regex used to find entities in the text.
+123 				var entitiesRegex = '[' + entitiesTable.regex + ']';
+124 				delete entitiesTable.regex;
+125
+126 				if ( config.entities_processNumerical )
+127 					entitiesRegex = '[^ -~]|' + entitiesRegex ;
+128
+129 				entitiesRegex = new RegExp( entitiesRegex, 'g' );
+130
+131 				function getChar( character )
+132 				{
+133 					return entitiesTable[ character ] || ( '&#' + character.charCodeAt(0) + ';' );
+134 				}
+135
+136 				htmlFilter.addRules(
+137 					{
+138 						text : function( text )
+139 						{
+140 							return text.replace( entitiesRegex, getChar );
+141 						}
+142 					});
+143 			}
+144 		}
+145 	});
+146 })();
+147
+148 CKEDITOR.config.entities = true;
+149 CKEDITOR.config.entities_latin = true;
+150 CKEDITOR.config.entities_greek = true;
+151 CKEDITOR.config.entities_processNumerical = false;
+152 CKEDITOR.config.entities_additional = '#39';
+153 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_filebrowser_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_filebrowser_plugin.js.html new file mode 100644 index 000000000..387d63576 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_filebrowser_plugin.js.html @@ -0,0 +1,391 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview The "filebrowser" plugin, it adds support for file uploads and
+  8  *               browsing.
+  9  *
+ 10  * When file is selected inside of the file browser or uploaded, its url is
+ 11  * inserted automatically to a field, which is described in the 'filebrowser'
+ 12  * attribute. To specify field that should be updated, pass the tab id and
+ 13  * element id, separated with a colon.
+ 14  *
+ 15  * Example 1: (Browse)
+ 16  *
+ 17  * <pre>
+ 18  * {
+ 19  * 	type : 'button',
+ 20  * 	id : 'browse',
+ 21  * 	filebrowser : 'tabId:elementId',
+ 22  * 	label : editor.lang.common.browseServer
+ 23  * }
+ 24  * </pre>
+ 25  *
+ 26  * If you set the 'filebrowser' attribute on any element other than
+ 27  * 'fileButton', the 'Browse' action will be triggered.
+ 28  *
+ 29  * Example 2: (Quick Upload)
+ 30  *
+ 31  * <pre>
+ 32  * {
+ 33  * 	type : 'fileButton',
+ 34  * 	id : 'uploadButton',
+ 35  * 	filebrowser : 'tabId:elementId',
+ 36  * 	label : editor.lang.common.uploadSubmit,
+ 37  * 	'for' : [ 'upload', 'upload' ]
+ 38  * }
+ 39  * </pre>
+ 40  *
+ 41  * If you set the 'filebrowser' attribute on a fileButton element, the
+ 42  * 'QuickUpload' action will be executed.
+ 43  *
+ 44  * Filebrowser plugin also supports more advanced configuration (through
+ 45  * javascript object).
+ 46  *
+ 47  * The following settings are supported:
+ 48  *
+ 49  * <pre>
+ 50  *  [action] - Browse or QuickUpload
+ 51  *  [target] - field to update, tabId:elementId
+ 52  *  [params] - additional arguments to be passed to the server connector (optional)
+ 53  *  [onSelect] - function to execute when file is selected/uploaded (optional)
+ 54  *  [url] - the URL to be called (optional)
+ 55  * </pre>
+ 56  *
+ 57  * Example 3: (Quick Upload)
+ 58  *
+ 59  * <pre>
+ 60  * {
+ 61  * 	type : 'fileButton',
+ 62  * 	label : editor.lang.common.uploadSubmit,
+ 63  * 	id : 'buttonId',
+ 64  * 	filebrowser :
+ 65  * 	{
+ 66  * 		action : 'QuickUpload', //required
+ 67  * 		target : 'tab1:elementId', //required
+ 68  * 		params : //optional
+ 69  * 		{
+ 70  * 			type : 'Files',
+ 71  * 			currentFolder : '/folder/'
+ 72  * 		},
+ 73  * 		onSelect : function( fileUrl, errorMessage ) //optional
+ 74  * 		{
+ 75  * 			// Do not call the built-in selectFuntion
+ 76  * 			// return false;
+ 77  * 		}
+ 78  * 	},
+ 79  * 	'for' : [ 'tab1', 'myFile' ]
+ 80  * }
+ 81  * </pre>
+ 82  *
+ 83  * Suppose we have a file element with id 'myFile', text field with id
+ 84  * 'elementId' and a fileButton. If filebowser.url is not specified explicitly,
+ 85  * form action will be set to 'filebrowser[DialogName]UploadUrl' or, if not
+ 86  * specified, to 'filebrowserUploadUrl'. Additional parameters from 'params'
+ 87  * object will be added to the query string. It is possible to create your own
+ 88  * uploadHandler and cancel the built-in updateTargetElement command.
+ 89  *
+ 90  * Example 4: (Browse)
+ 91  *
+ 92  * <pre>
+ 93  * {
+ 94  * 	type : 'button',
+ 95  * 	id : 'buttonId',
+ 96  * 	label : editor.lang.common.browseServer,
+ 97  * 	filebrowser :
+ 98  * 	{
+ 99  * 		action : 'Browse',
+100  * 		url : '/ckfinder/ckfinder.html&type=Images',
+101  * 		target : 'tab1:elementId'
+102  * 	}
+103  * }
+104  * </pre>
+105  *
+106  * In this example, after pressing a button, file browser will be opened in a
+107  * popup. If we don't specify filebrowser.url attribute,
+108  * 'filebrowser[DialogName]BrowseUrl' or 'filebrowserBrowseUrl' will be used.
+109  * After selecting a file in a file browser, an element with id 'elementId' will
+110  * be updated. Just like in the third example, a custom 'onSelect' function may be
+111  * defined.
+112  */
+113 ( function()
+114 {
+115 	/**
+116 	 * Adds (additional) arguments to given url.
+117 	 *
+118 	 * @param {String}
+119 	 *            url The url.
+120 	 * @param {Object}
+121 	 *            params Additional parameters.
+122 	 */
+123 	function addQueryString( url, params )
+124 	{
+125 		var queryString = [];
+126
+127 		if ( !params )
+128 			return url;
+129 		else
+130 		{
+131 			for ( var i in params )
+132 				queryString.push( i + "=" + encodeURIComponent( params[ i ] ) );
+133 		}
+134
+135 		return url + ( ( url.indexOf( "?" ) != -1 ) ? "&" : "?" ) + queryString.join( "&" );
+136 	}
+137
+138 	/**
+139 	 * Make a string's first character uppercase.
+140 	 *
+141 	 * @param {String}
+142 	 *            str String.
+143 	 */
+144 	function ucFirst( str )
+145 	{
+146 		str += '';
+147 		var f = str.charAt( 0 ).toUpperCase();
+148 		return f + str.substr( 1 );
+149 	}
+150
+151 	/**
+152 	 * The onlick function assigned to the 'Browse Server' button. Opens the
+153 	 * file browser and updates target field when file is selected.
+154 	 *
+155 	 * @param {CKEDITOR.event}
+156 	 *            evt The event object.
+157 	 */
+158 	function browseServer( evt )
+159 	{
+160 		var dialog = this.getDialog();
+161 		var editor = dialog.getParentEditor();
+162
+163 		editor._.filebrowserSe = this;
+164
+165 		var width = editor.config[ 'filebrowser' + ucFirst( dialog.getName() ) + 'WindowWidth' ]
+166 				|| editor.config.filebrowserWindowWidth || '80%';
+167 		var height = editor.config[ 'filebrowser' + ucFirst( dialog.getName() ) + 'WindowHeight' ]
+168 				|| editor.config.filebrowserWindowHeight || '70%';
+169
+170 		var params = this.filebrowser.params || {};
+171 		params.CKEditor = editor.name;
+172 		params.CKEditorFuncNum = editor._.filebrowserFn;
+173 		if ( !params.langCode )
+174 			params.langCode = editor.langCode;
+175
+176 		var url = addQueryString( this.filebrowser.url, params );
+177 		editor.popup( url, width, height );
+178 	}
+179
+180 	/**
+181 	 * The onlick function assigned to the 'Upload' button. Makes the final
+182 	 * decision whether form is really submitted and updates target field when
+183 	 * file is uploaded.
+184 	 *
+185 	 * @param {CKEDITOR.event}
+186 	 *            evt The event object.
+187 	 */
+188 	function uploadFile( evt )
+189 	{
+190 		var dialog = this.getDialog();
+191 		var editor = dialog.getParentEditor();
+192
+193 		editor._.filebrowserSe = this;
+194
+195 		// If user didn't select the file, stop the upload.
+196 		if ( !dialog.getContentElement( this[ 'for' ][ 0 ], this[ 'for' ][ 1 ] ).getInputElement().$.value )
+197 			return false;
+198
+199 		if ( !dialog.getContentElement( this[ 'for' ][ 0 ], this[ 'for' ][ 1 ] ).getAction() )
+200 			return false;
+201
+202 		return true;
+203 	}
+204
+205 	/**
+206 	 * Setups the file element.
+207 	 *
+208 	 * @param {CKEDITOR.ui.dialog.file}
+209 	 *            fileInput The file element used during file upload.
+210 	 * @param {Object}
+211 	 *            filebrowser Object containing filebrowser settings assigned to
+212 	 *            the fileButton associated with this file element.
+213 	 */
+214 	function setupFileElement( editor, fileInput, filebrowser )
+215 	{
+216 		var params = filebrowser.params || {};
+217 		params.CKEditor = editor.name;
+218 		params.CKEditorFuncNum = editor._.filebrowserFn;
+219 		if ( !params.langCode )
+220 			params.langCode = editor.langCode;
+221
+222 		fileInput.action = addQueryString( filebrowser.url, params );
+223 		fileInput.filebrowser = filebrowser;
+224 	}
+225
+226 	/**
+227 	 * Traverse through the content definition and attach filebrowser to
+228 	 * elements with 'filebrowser' attribute.
+229 	 *
+230 	 * @param String
+231 	 *            dialogName Dialog name.
+232 	 * @param {CKEDITOR.dialog.dialogDefinitionObject}
+233 	 *            definition Dialog definition.
+234 	 * @param {Array}
+235 	 *            elements Array of {@link CKEDITOR.dialog.contentDefinition}
+236 	 *            objects.
+237 	 */
+238 	function attachFileBrowser( editor, dialogName, definition, elements )
+239 	{
+240 		var element, fileInput;
+241
+242 		for ( var i in elements )
+243 		{
+244 			element = elements[ i ];
+245
+246 			if ( element.type == 'hbox' || element.type == 'vbox' )
+247 				attachFileBrowser( editor, dialogName, definition, element.children );
+248
+249 			if ( !element.filebrowser )
+250 				continue;
+251
+252 			if ( typeof element.filebrowser == 'string' )
+253 			{
+254 				var fb =
+255 				{
+256 					action : ( element.type == 'fileButton' ) ? 'QuickUpload' : 'Browse',
+257 					target : element.filebrowser
+258 				};
+259 				element.filebrowser = fb;
+260 			}
+261
+262 			if ( element.filebrowser.action == 'Browse' )
+263 			{
+264 				var url = element.filebrowser.url || editor.config[ 'filebrowser' + ucFirst( dialogName ) + 'BrowseUrl' ]
+265 							|| editor.config.filebrowserBrowseUrl;
+266
+267 				if ( url )
+268 				{
+269 					element.onClick = browseServer;
+270 					element.filebrowser.url = url;
+271 					element.hidden = false;
+272 				}
+273 			}
+274 			else if ( element.filebrowser.action == 'QuickUpload' && element[ 'for' ] )
+275 			{
+276 				url =  element.filebrowser.url || editor.config[ 'filebrowser' + ucFirst( dialogName ) + 'UploadUrl' ]
+277 							|| editor.config.filebrowserUploadUrl;
+278
+279 				if ( url )
+280 				{
+281 					element.onClick = uploadFile;
+282 					element.filebrowser.url = url;
+283 					element.hidden = false;
+284 					setupFileElement( editor, definition.getContents( element[ 'for' ][ 0 ] ).get( element[ 'for' ][ 1 ] ), element.filebrowser );
+285 				}
+286 			}
+287 		}
+288 	}
+289
+290 	/**
+291 	 * Updates the target element with the url of uploaded/selected file.
+292 	 *
+293 	 * @param {String}
+294 	 *            url The url of a file.
+295 	 */
+296 	function updateTargetElement( url, sourceElement )
+297 	{
+298 		var dialog = sourceElement.getDialog();
+299 		var targetElement = sourceElement.filebrowser.target || null;
+300 		url = url.replace( /#/g, '%23' );
+301
+302 		// If there is a reference to targetElement, update it.
+303 		if ( targetElement )
+304 		{
+305 			var target = targetElement.split( ':' );
+306 			var element = dialog.getContentElement( target[ 0 ], target[ 1 ] );
+307 			if ( element )
+308 			{
+309 				element.setValue( url );
+310 				dialog.selectPage( target[ 0 ] );
+311 			}
+312 		}
+313 	}
+314
+315 	/**
+316 	 * Returns true if filebrowser is configured in one of the elements.
+317 	 *
+318 	 * @param {CKEDITOR.dialog.dialogDefinitionObject}
+319 	 *            definition Dialog definition.
+320 	 * @param String
+321 	 *            tabId The tab id where element(s) can be found.
+322 	 * @param String
+323 	 *            elementId The element id (or ids, separated with a semicolon) to check.
+324 	 */
+325 	function isConfigured( definition, tabId, elementId )
+326 	{
+327 		if ( elementId.indexOf( ";" ) !== -1 )
+328 		{
+329 			var ids = elementId.split( ";" );
+330 			for ( var i = 0 ; i < ids.length ; i++ )
+331 			{
+332 				if ( isConfigured( definition, tabId, ids[i]) )
+333 					return true;
+334 			}
+335 			return false;
+336 		}
+337
+338 		return ( definition.getContents( tabId ).get( elementId ).filebrowser && definition.getContents( tabId ).get( elementId ).filebrowser.url );
+339 	}
+340
+341 	function setUrl( fileUrl, data )
+342 	{
+343 		var dialog = this._.filebrowserSe.getDialog(),
+344 			targetInput = this._.filebrowserSe[ 'for' ],
+345 			onSelect = this._.filebrowserSe.filebrowser.onSelect;
+346
+347 		if ( targetInput )
+348 			dialog.getContentElement( targetInput[ 0 ], targetInput[ 1 ] ).reset();
+349
+350 		if ( onSelect && onSelect.call( this._.filebrowserSe, fileUrl, data ) === false )
+351 			return;
+352
+353 		// The "data" argument may be used to pass the error message to the editor.
+354 		if ( typeof data == 'string' && data )
+355 			alert( data );
+356
+357 		if ( fileUrl )
+358 			updateTargetElement( fileUrl, this._.filebrowserSe );
+359 	}
+360
+361 	CKEDITOR.plugins.add( 'filebrowser',
+362 	{
+363 		init : function( editor, pluginPath )
+364 		{
+365 			editor._.filebrowserFn = CKEDITOR.tools.addFunction( setUrl, editor );
+366
+367 			CKEDITOR.on( 'dialogDefinition', function( evt )
+368 			{
+369 				// Associate filebrowser to elements with 'filebrowser' attribute.
+370 				for ( var i in evt.data.definition.contents )
+371 				{
+372 					attachFileBrowser( evt.editor, evt.data.name, evt.data.definition, evt.data.definition.contents[ i ].elements );
+373 					if ( evt.data.definition.contents[ i ].hidden && evt.data.definition.contents[ i ].filebrowser )
+374 					{
+375 						evt.data.definition.contents[ i ].hidden =
+376 							!isConfigured( evt.data.definition, evt.data.definition.contents[ i ][ 'id' ], evt.data.definition.contents[ i ].filebrowser );
+377 					}
+378 				}
+379 			} );
+380 		}
+381 	} );
+382
+383 } )();
+384 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_find_dialogs_find.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_find_dialogs_find.js.html new file mode 100644 index 000000000..3cff5965e --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_find_dialogs_find.js.html @@ -0,0 +1,851 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	function guardDomWalkerNonEmptyTextNode( node )
+  9 	{
+ 10 		return ( node.type == CKEDITOR.NODE_TEXT && node.getLength() > 0 );
+ 11 	}
+ 12
+ 13 	/**
+ 14 	 * Elements which break characters been considered as sequence.
+ 15 	*/
+ 16 	function checkCharactersBoundary ( node )
+ 17 	{
+ 18 		var dtd = CKEDITOR.dtd;
+ 19 		return node.isBlockBoundary(
+ 20 			CKEDITOR.tools.extend( {}, dtd.$empty, dtd.$nonEditable ) );
+ 21 	}
+ 22
+ 23 	/**
+ 24 	 * Get the cursor object which represent both current character and it's dom
+ 25 	 * position thing.
+ 26 	 */
+ 27 	var cursorStep = function()
+ 28 	{
+ 29 		return {
+ 30 			textNode : this.textNode,
+ 31 			offset : this.offset,
+ 32 			character : this.textNode ?
+ 33 				this.textNode.getText().charAt( this.offset ) : null,
+ 34 			hitMatchBoundary : this._.matchBoundary
+ 35 		};
+ 36 	};
+ 37
+ 38 	var pages = [ 'find', 'replace' ],
+ 39 		fieldsMapping = [
+ 40 		[ 'txtFindFind', 'txtFindReplace' ],
+ 41 		[ 'txtFindCaseChk', 'txtReplaceCaseChk' ],
+ 42 		[ 'txtFindWordChk', 'txtReplaceWordChk' ],
+ 43 		[ 'txtFindCyclic', 'txtReplaceCyclic' ] ];
+ 44
+ 45 	/**
+ 46 	 * Synchronize corresponding filed values between 'replace' and 'find' pages.
+ 47 	 * @param {String} currentPageId	The page id which receive values.
+ 48 	 */
+ 49 	function syncFieldsBetweenTabs( currentPageId )
+ 50 	{
+ 51 		var sourceIndex, targetIndex,
+ 52 			sourceField, targetField;
+ 53
+ 54 		sourceIndex = currentPageId === 'find' ? 1 : 0;
+ 55 		targetIndex = 1 - sourceIndex;
+ 56 		var i, l = fieldsMapping.length;
+ 57 		for ( i = 0 ; i < l ; i++ )
+ 58 		{
+ 59 			sourceField = this.getContentElement( pages[ sourceIndex ],
+ 60 					fieldsMapping[ i ][ sourceIndex ] );
+ 61 			targetField = this.getContentElement( pages[ targetIndex ],
+ 62 					fieldsMapping[ i ][ targetIndex ] );
+ 63
+ 64 			targetField.setValue( sourceField.getValue() );
+ 65 		}
+ 66 	}
+ 67
+ 68 	var findDialog = function( editor, startupPage )
+ 69 	{
+ 70 		// Style object for highlights.
+ 71 		var highlightStyle = new CKEDITOR.style( editor.config.find_highlight );
+ 72
+ 73 		/**
+ 74 		 * Iterator which walk through the specified range char by char. By
+ 75 		 * default the walking will not stop at the character boundaries, until
+ 76 		 * the end of the range is encountered.
+ 77 		 * @param { CKEDITOR.dom.range } range
+ 78 		 * @param {Boolean} matchWord Whether the walking will stop at character boundary.
+ 79 		 */
+ 80 		var characterWalker = function( range , matchWord )
+ 81 		{
+ 82 			var walker =
+ 83 				new CKEDITOR.dom.walker( range );
+ 84 			walker[ matchWord ? 'guard' : 'evaluator' ] =
+ 85 				guardDomWalkerNonEmptyTextNode;
+ 86 			walker.breakOnFalse = true;
+ 87
+ 88 			this._ = {
+ 89 				matchWord : matchWord,
+ 90 				walker : walker,
+ 91 				matchBoundary : false
+ 92 			};
+ 93 		};
+ 94
+ 95 		characterWalker.prototype = {
+ 96 			next : function()
+ 97 			{
+ 98 				return this.move();
+ 99 			},
+100
+101 			back : function()
+102 			{
+103 				return this.move( true );
+104 			},
+105
+106 			move : function( rtl )
+107 			{
+108 				var currentTextNode = this.textNode;
+109 				// Already at the end of document, no more character available.
+110 				if(  currentTextNode === null )
+111 					return cursorStep.call( this );
+112
+113 				this._.matchBoundary = false;
+114
+115 				// There are more characters in the text node, step forward.
+116 				if( currentTextNode
+117 				    && rtl
+118 					&& this.offset > 0 )
+119 				{
+120 					this.offset--;
+121 					return cursorStep.call( this );
+122 				}
+123 				else if( currentTextNode
+124 					&& this.offset < currentTextNode.getLength() - 1 )
+125 				{
+126 					this.offset++;
+127 					return cursorStep.call( this );
+128 				}
+129 				else
+130 				{
+131 					currentTextNode = null;
+132 					// At the end of the text node, walking foward for the next.
+133 					while ( !currentTextNode )
+134 					{
+135 						currentTextNode =
+136 							this._.walker[ rtl ? 'previous' : 'next' ].call( this._.walker );
+137
+138 						// Stop searching if we're need full word match OR
+139 						// already reach document end.
+140 						if ( this._.matchWord && !currentTextNode
+141 							 ||this._.walker._.end )
+142 							break;
+143
+144 						// Marking as match character boundaries.
+145 						if( !currentTextNode
+146 						   && checkCharactersBoundary( this._.walker.current ) )
+147 							this._.matchBoundary = true;
+148
+149 					}
+150 					// Found a fresh text node.
+151 					this.textNode = currentTextNode;
+152 					if ( currentTextNode )
+153 						this.offset = rtl ? currentTextNode.getLength() - 1 : 0;
+154 					else
+155 						this.offset = 0;
+156 				}
+157
+158 				return cursorStep.call( this );
+159 			}
+160
+161 		};
+162
+163 		/**
+164 		 * A range of cursors which represent a trunk of characters which try to
+165 		 * match, it has the same length as the pattern  string.
+166 		 */
+167 		var characterRange = function( characterWalker, rangeLength )
+168 		{
+169 			this._ = {
+170 				walker : characterWalker,
+171 				cursors : [],
+172 				rangeLength : rangeLength,
+173 				highlightRange : null,
+174 				isMatched : false
+175 			};
+176 		};
+177
+178 		characterRange.prototype = {
+179 			/**
+180 			 * Translate this range to {@link CKEDITOR.dom.range}
+181 			 */
+182 			toDomRange : function()
+183 			{
+184 				var cursors = this._.cursors;
+185 				if ( cursors.length < 1 )
+186 					return null;
+187
+188 				var first = cursors[0],
+189 					last = cursors[ cursors.length - 1 ],
+190 					range = new CKEDITOR.dom.range( editor.document );
+191
+192 				range.setStart( first.textNode, first.offset );
+193 				range.setEnd( last.textNode, last.offset + 1 );
+194 				return range;
+195 			},
+196 			/**
+197 			 * Reflect the latest changes from dom range.
+198 			 */
+199 			updateFromDomRange : function( domRange )
+200 			{
+201 				var cursor,
+202 						walker = new characterWalker( domRange );
+203 				this._.cursors = [];
+204 				do
+205 				{
+206 					cursor = walker.next();
+207 					if ( cursor.character )
+208 						this._.cursors.push( cursor );
+209 				}
+210 				while ( cursor.character );
+211 				this._.rangeLength = this._.cursors.length;
+212 			},
+213
+214 			setMatched : function()
+215 			{
+216 				this._.isMatched = true;
+217 			},
+218
+219 			clearMatched : function()
+220 			{
+221 				this._.isMatched = false;
+222 			},
+223
+224 			isMatched : function()
+225 			{
+226 				return this._.isMatched;
+227 			},
+228
+229 			/**
+230 			 * Hightlight the current matched chunk of text.
+231 			 */
+232 			highlight : function()
+233 			{
+234 				// Do not apply if nothing is found.
+235 				if ( this._.cursors.length < 1 )
+236 					return;
+237
+238 				// Remove the previous highlight if there's one.
+239 				if ( this._.highlightRange )
+240 					this.removeHighlight();
+241
+242 				// Apply the highlight.
+243 				var range = this.toDomRange();
+244 				highlightStyle.applyToRange( range );
+245 				this._.highlightRange = range;
+246
+247 				// Scroll the editor to the highlighted area.
+248 				var element = range.startContainer;
+249 				if ( element.type != CKEDITOR.NODE_ELEMENT )
+250 					element = element.getParent();
+251 				element.scrollIntoView();
+252
+253 				// Update the character cursors.
+254 				this.updateFromDomRange( range );
+255 			},
+256
+257 			/**
+258 			 * Remove highlighted find result.
+259 			 */
+260 			removeHighlight : function()
+261 			{
+262 				if ( !this._.highlightRange )
+263 					return;
+264
+265 				highlightStyle.removeFromRange( this._.highlightRange );
+266 				this.updateFromDomRange( this._.highlightRange );
+267 				this._.highlightRange = null;
+268 			},
+269
+270 			moveBack : function()
+271 			{
+272 				var retval = this._.walker.back(),
+273 					cursors = this._.cursors;
+274
+275 				if ( retval.hitMatchBoundary )
+276 					this._.cursors = cursors = [];
+277
+278 				cursors.unshift( retval );
+279 				if ( cursors.length > this._.rangeLength )
+280 					cursors.pop();
+281
+282 				return retval;
+283 			},
+284
+285 			moveNext : function()
+286 			{
+287 				var retval = this._.walker.next(),
+288 					cursors = this._.cursors;
+289
+290 				// Clear the cursors queue if we've crossed a match boundary.
+291 				if ( retval.hitMatchBoundary )
+292 					this._.cursors = cursors = [];
+293
+294 				cursors.push( retval );
+295 				if ( cursors.length > this._.rangeLength )
+296 					cursors.shift();
+297
+298 				return retval;
+299 			},
+300
+301 			getEndCharacter : function()
+302 			{
+303 				var cursors = this._.cursors;
+304 				if ( cursors.length < 1 )
+305 					return null;
+306
+307 				return cursors[ cursors.length - 1 ].character;
+308 			},
+309
+310 			getNextCharacterRange : function( maxLength )
+311 			{
+312 				var lastCursor,
+313 						cursors = this._.cursors;
+314 				if ( !( lastCursor = cursors[ cursors.length - 1 ] ) )
+315 					return null;
+316 				return new characterRange(
+317 										new characterWalker(
+318 											getRangeAfterCursor( lastCursor ) ),
+319 										maxLength );
+320 			},
+321
+322 			getCursors : function()
+323 			{
+324 				return this._.cursors;
+325 			}
+326 		};
+327
+328
+329 		// The remaining document range after the character cursor.
+330 		function getRangeAfterCursor( cursor , inclusive )
+331 		{
+332 			var range = new CKEDITOR.dom.range();
+333 			range.setStart( cursor.textNode,
+334 						   ( inclusive ? cursor.offset : cursor.offset + 1 ) );
+335 			range.setEndAt( editor.document.getBody(),
+336 							CKEDITOR.POSITION_BEFORE_END );
+337 			return range;
+338 		}
+339
+340 		// The document range before the character cursor.
+341 		function getRangeBeforeCursor( cursor )
+342 		{
+343 			var range = new CKEDITOR.dom.range();
+344 			range.setStartAt( editor.document.getBody(),
+345 							CKEDITOR.POSITION_AFTER_START );
+346 			range.setEnd( cursor.textNode, cursor.offset );
+347 			return range;
+348 		}
+349
+350 		var KMP_NOMATCH = 0,
+351 			KMP_ADVANCED = 1,
+352 			KMP_MATCHED = 2;
+353 		/**
+354 		 * Examination the occurrence of a word which implement KMP algorithm.
+355 		 */
+356 		var kmpMatcher = function( pattern, ignoreCase )
+357 		{
+358 			var overlap = [ -1 ];
+359 			if ( ignoreCase )
+360 				pattern = pattern.toLowerCase();
+361 			for ( var i = 0 ; i < pattern.length ; i++ )
+362 			{
+363 				overlap.push( overlap[i] + 1 );
+364 				while ( overlap[ i + 1 ] > 0
+365 					&& pattern.charAt( i ) != pattern
+366 						.charAt( overlap[ i + 1 ] - 1 ) )
+367 					overlap[ i + 1 ] = overlap[ overlap[ i + 1 ] - 1 ] + 1;
+368 			}
+369
+370 			this._ = {
+371 				overlap : overlap,
+372 				state : 0,
+373 				ignoreCase : !!ignoreCase,
+374 				pattern : pattern
+375 			};
+376 		};
+377
+378 		kmpMatcher.prototype =
+379 		{
+380 			feedCharacter : function( c )
+381 			{
+382 				if ( this._.ignoreCase )
+383 					c = c.toLowerCase();
+384
+385 				while ( true )
+386 				{
+387 					if ( c == this._.pattern.charAt( this._.state ) )
+388 					{
+389 						this._.state++;
+390 						if ( this._.state == this._.pattern.length )
+391 						{
+392 							this._.state = 0;
+393 							return KMP_MATCHED;
+394 						}
+395 						return KMP_ADVANCED;
+396 					}
+397 					else if ( !this._.state )
+398 						return KMP_NOMATCH;
+399 					else
+400 						this._.state = this._.overlap[ this._.state ];
+401 				}
+402
+403 				return null;
+404 			},
+405
+406 			reset : function()
+407 			{
+408 				this._.state = 0;
+409 			}
+410 		};
+411
+412 		var wordSeparatorRegex =
+413 		/[.,"'?!;: \u0085\u00a0\u1680\u280e\u2028\u2029\u202f\u205f\u3000]/;
+414
+415 		var isWordSeparator = function( c )
+416 		{
+417 			if ( !c )
+418 				return true;
+419 			var code = c.charCodeAt( 0 );
+420 			return ( code >= 9 && code <= 0xd )
+421 				|| ( code >= 0x2000 && code <= 0x200a )
+422 				|| wordSeparatorRegex.test( c );
+423 		};
+424
+425 		var finder = {
+426 			searchRange : null,
+427 			matchRange : null,
+428 			find : function( pattern, matchCase, matchWord, matchCyclic, highlightMatched )
+429 			{
+430 				if( !this.matchRange )
+431 					this.matchRange =
+432 						new characterRange(
+433 							new characterWalker( this.searchRange ),
+434 							pattern.length );
+435 				else
+436 				{
+437 					this.matchRange.removeHighlight();
+438 					this.matchRange = this.matchRange.getNextCharacterRange( pattern.length );
+439 				}
+440
+441 				var matcher = new kmpMatcher( pattern, !matchCase ),
+442 					matchState = KMP_NOMATCH,
+443 					character = '%';
+444
+445 				while ( character !== null )
+446 				{
+447 					this.matchRange.moveNext();
+448 					while ( ( character = this.matchRange.getEndCharacter() ) )
+449 					{
+450 						matchState = matcher.feedCharacter( character );
+451 						if ( matchState == KMP_MATCHED )
+452 							break;
+453 						if ( this.matchRange.moveNext().hitMatchBoundary )
+454 							matcher.reset();
+455 					}
+456
+457 					if ( matchState == KMP_MATCHED )
+458 					{
+459 						if ( matchWord )
+460 						{
+461 							var cursors = this.matchRange.getCursors(),
+462 								tail = cursors[ cursors.length - 1 ],
+463 								head = cursors[ 0 ];
+464
+465 							var headWalker = new characterWalker( getRangeBeforeCursor( head ), true ),
+466 								tailWalker = new characterWalker( getRangeAfterCursor( tail ), true );
+467
+468 							if ( ! ( isWordSeparator( headWalker.back().character )
+469 										&& isWordSeparator( tailWalker.next().character ) ) )
+470 								continue;
+471 						}
+472 						this.matchRange.setMatched();
+473 						if ( highlightMatched !== false )
+474 							this.matchRange.highlight();
+475 						return true;
+476 					}
+477 				}
+478
+479 				this.matchRange.clearMatched();
+480 				this.matchRange.removeHighlight();
+481 				// Clear current session and restart with the default search
+482 				// range.
+483 				if ( matchCyclic )
+484 				{
+485 					this.searchRange = getSearchRange( true );
+486 					this.matchRange = null;
+487 				}
+488
+489 				return false;
+490 			},
+491
+492 			/**
+493 			 * Record how much replacement occurred toward one replacing.
+494 			 */
+495 			replaceCounter : 0,
+496
+497 			replace : function( dialog, pattern, newString, matchCase, matchWord,
+498 				matchCyclic , isReplaceAll )
+499 			{
+500 				// Successiveness of current replace/find.
+501 				var result = false;
+502
+503 				// 1. Perform the replace when there's already a match here.
+504 				// 2. Otherwise perform the find but don't replace it immediately.
+505 				if ( this.matchRange && this.matchRange.isMatched()
+506 						&& !this.matchRange._.isReplaced )
+507 				{
+508 					// Turn off highlight for a while when saving snapshots.
+509 					this.matchRange.removeHighlight();
+510 					var domRange = this.matchRange.toDomRange();
+511 					var text = editor.document.createText( newString );
+512 					if ( !isReplaceAll )
+513 					{
+514 						// Save undo snaps before and after the replacement.
+515 						var selection = editor.getSelection();
+516 						selection.selectRanges( [ domRange ] );
+517 						editor.fire( 'saveSnapshot' );
+518 					}
+519 					domRange.deleteContents();
+520 					domRange.insertNode( text );
+521 					if ( !isReplaceAll )
+522 					{
+523 						selection.selectRanges( [ domRange ] );
+524 						editor.fire( 'saveSnapshot' );
+525 					}
+526 					this.matchRange.updateFromDomRange( domRange );
+527 					if ( !isReplaceAll )
+528 						this.matchRange.highlight();
+529 					this.matchRange._.isReplaced = true;
+530 					this.replaceCounter++;
+531 					result = true;
+532 				}
+533 				else
+534 					result = this.find( pattern, matchCase, matchWord, matchCyclic, !isReplaceAll );
+535
+536 				return result;
+537 			}
+538 		};
+539
+540 		/**
+541 		 * The range in which find/replace happened, receive from user
+542 		 * selection prior.
+543 		 */
+544 		function getSearchRange( isDefault )
+545 		{
+546 			var searchRange,
+547 				sel = editor.getSelection(),
+548 				body = editor.document.getBody();
+549 			if ( sel && !isDefault )
+550 			{
+551 				searchRange = sel.getRanges()[ 0 ].clone();
+552 				searchRange.collapse( true );
+553 			}
+554 			else
+555 			{
+556 				searchRange = new CKEDITOR.dom.range();
+557 				searchRange.setStartAt( body, CKEDITOR.POSITION_AFTER_START );
+558 			}
+559 			searchRange.setEndAt( body, CKEDITOR.POSITION_BEFORE_END );
+560 			return searchRange;
+561 		}
+562
+563 		return {
+564 			title : editor.lang.findAndReplace.title,
+565 			resizable : CKEDITOR.DIALOG_RESIZE_NONE,
+566 			minWidth : 350,
+567 			minHeight : 165,
+568 			buttons : [ CKEDITOR.dialog.cancelButton ],		//Cancel button only.
+569 			contents : [
+570 				{
+571 					id : 'find',
+572 					label : editor.lang.findAndReplace.find,
+573 					title : editor.lang.findAndReplace.find,
+574 					accessKey : '',
+575 					elements : [
+576 						{
+577 							type : 'hbox',
+578 							widths : [ '230px', '90px' ],
+579 							children :
+580 							[
+581 								{
+582 									type : 'text',
+583 									id : 'txtFindFind',
+584 									label : editor.lang.findAndReplace.findWhat,
+585 									isChanged : false,
+586 									labelLayout : 'horizontal',
+587 									accessKey : 'F'
+588 								},
+589 								{
+590 									type : 'button',
+591 									align : 'left',
+592 									style : 'width:100%',
+593 									label : editor.lang.findAndReplace.find,
+594 									onClick : function()
+595 									{
+596 										var dialog = this.getDialog();
+597 										if ( !finder.find( dialog.getValueOf( 'find', 'txtFindFind' ),
+598 													dialog.getValueOf( 'find', 'txtFindCaseChk' ),
+599 													dialog.getValueOf( 'find', 'txtFindWordChk' ),
+600 													dialog.getValueOf( 'find', 'txtFindCyclic' ) ) )
+601 											alert( editor.lang.findAndReplace
+602 												.notFoundMsg );
+603 									}
+604 								}
+605 							]
+606 						},
+607 						{
+608 							type : 'vbox',
+609 							padding : 0,
+610 							children :
+611 							[
+612 								{
+613 									type : 'checkbox',
+614 									id : 'txtFindCaseChk',
+615 									isChanged : false,
+616 									style : 'margin-top:28px',
+617 									label : editor.lang.findAndReplace.matchCase
+618 								},
+619 								{
+620 									type : 'checkbox',
+621 									id : 'txtFindWordChk',
+622 									isChanged : false,
+623 									label : editor.lang.findAndReplace.matchWord
+624 								},
+625 								{
+626 									type : 'checkbox',
+627 									id : 'txtFindCyclic',
+628 									isChanged : false,
+629 									'default' : true,
+630 									label : editor.lang.findAndReplace.matchCyclic
+631 								}
+632 							]
+633 						}
+634 					]
+635 				},
+636 				{
+637 					id : 'replace',
+638 					label : editor.lang.findAndReplace.replace,
+639 					accessKey : 'M',
+640 					elements : [
+641 						{
+642 							type : 'hbox',
+643 							widths : [ '230px', '90px' ],
+644 							children :
+645 							[
+646 								{
+647 									type : 'text',
+648 									id : 'txtFindReplace',
+649 									label : editor.lang.findAndReplace.findWhat,
+650 									isChanged : false,
+651 									labelLayout : 'horizontal',
+652 									accessKey : 'F'
+653 								},
+654 								{
+655 									type : 'button',
+656 									align : 'left',
+657 									style : 'width:100%',
+658 									label : editor.lang.findAndReplace.replace,
+659 									onClick : function()
+660 									{
+661 										var dialog = this.getDialog();
+662 										if ( !finder.replace( dialog,
+663 													dialog.getValueOf( 'replace', 'txtFindReplace' ),
+664 													dialog.getValueOf( 'replace', 'txtReplace' ),
+665 													dialog.getValueOf( 'replace', 'txtReplaceCaseChk' ),
+666 													dialog.getValueOf( 'replace', 'txtReplaceWordChk' ),
+667 													dialog.getValueOf( 'replace', 'txtReplaceCyclic' ) ) )
+668 											alert( editor.lang.findAndReplace
+669 												.notFoundMsg );
+670 									}
+671 								}
+672 							]
+673 						},
+674 						{
+675 							type : 'hbox',
+676 							widths : [ '230px', '90px' ],
+677 							children :
+678 							[
+679 								{
+680 									type : 'text',
+681 									id : 'txtReplace',
+682 									label : editor.lang.findAndReplace.replaceWith,
+683 									isChanged : false,
+684 									labelLayout : 'horizontal',
+685 									accessKey : 'R'
+686 								},
+687 								{
+688 									type : 'button',
+689 									align : 'left',
+690 									style : 'width:100%',
+691 									label : editor.lang.findAndReplace.replaceAll,
+692 									isChanged : false,
+693 									onClick : function()
+694 									{
+695 										var dialog = this.getDialog();
+696 										var replaceNums;
+697
+698 										finder.replaceCounter = 0;
+699
+700 										// Scope to full document.
+701 										finder.searchRange = getSearchRange( true );
+702 										if ( finder.matchRange )
+703 										{
+704 											finder.matchRange.removeHighlight();
+705 											finder.matchRange = null;
+706 										}
+707 										editor.fire( 'saveSnapshot' );
+708 										while( finder.replace( dialog,
+709 											dialog.getValueOf( 'replace', 'txtFindReplace' ),
+710 											dialog.getValueOf( 'replace', 'txtReplace' ),
+711 											dialog.getValueOf( 'replace', 'txtReplaceCaseChk' ),
+712 											dialog.getValueOf( 'replace', 'txtReplaceWordChk' ),
+713 											false, true ) )
+714 										;
+715
+716 										if ( finder.replaceCounter )
+717 										{
+718 											alert( editor.lang.findAndReplace.replaceSuccessMsg.replace( /%1/, finder.replaceCounter ) );
+719 											editor.fire( 'saveSnapshot' );
+720 										}
+721 										else
+722 											alert( editor.lang.findAndReplace.notFoundMsg );
+723 									}
+724 								}
+725 							]
+726 						},
+727 						{
+728 							type : 'vbox',
+729 							padding : 0,
+730 							children :
+731 							[
+732 								{
+733 									type : 'checkbox',
+734 									id : 'txtReplaceCaseChk',
+735 									isChanged : false,
+736 									label : editor.lang.findAndReplace
+737 										.matchCase
+738 								},
+739 								{
+740 									type : 'checkbox',
+741 									id : 'txtReplaceWordChk',
+742 									isChanged : false,
+743 									label : editor.lang.findAndReplace
+744 										.matchWord
+745 								},
+746 								{
+747 									type : 'checkbox',
+748 									id : 'txtReplaceCyclic',
+749 									isChanged : false,
+750 									'default' : true,
+751 									label : editor.lang.findAndReplace
+752 										.matchCyclic
+753 								}
+754 							]
+755 						}
+756 					]
+757 				}
+758 			],
+759 			onLoad : function()
+760 			{
+761 				var dialog = this;
+762
+763 				//keep track of the current pattern field in use.
+764 				var patternField, wholeWordChkField;
+765
+766 				//Ignore initial page select on dialog show
+767 				var isUserSelect = false;
+768 				this.on('hide', function()
+769 						{
+770 							isUserSelect = false;
+771 						} );
+772 				this.on('show', function()
+773 						{
+774 							isUserSelect = true;
+775 						} );
+776
+777 				this.selectPage = CKEDITOR.tools.override( this.selectPage, function( originalFunc )
+778 					{
+779 						return function( pageId )
+780 						{
+781 							originalFunc.call( dialog, pageId );
+782
+783 							var currPage = dialog._.tabs[ pageId ];
+784 							var patternFieldInput, patternFieldId, wholeWordChkFieldId;
+785 							patternFieldId = pageId === 'find' ? 'txtFindFind' : 'txtFindReplace';
+786 							wholeWordChkFieldId = pageId === 'find' ? 'txtFindWordChk' : 'txtReplaceWordChk';
+787
+788 							patternField = dialog.getContentElement( pageId,
+789 								patternFieldId );
+790 							wholeWordChkField = dialog.getContentElement( pageId,
+791 								wholeWordChkFieldId );
+792
+793 							// prepare for check pattern text filed 'keyup' event
+794 							if ( !currPage.initialized )
+795 							{
+796 								patternFieldInput = CKEDITOR.document
+797 									.getById( patternField._.inputId );
+798 								currPage.initialized = true;
+799 							}
+800
+801 							if( isUserSelect )
+802 								// synchronize fields on tab switch.
+803 								syncFieldsBetweenTabs.call( this, pageId );
+804 						};
+805 					} );
+806
+807 			},
+808 			onShow : function()
+809 			{
+810 				// Establish initial searching start position.
+811 				finder.searchRange = getSearchRange();
+812
+813 				if ( startupPage == 'replace' )
+814 					this.getContentElement( 'replace', 'txtFindReplace' ).focus();
+815 				else
+816 					this.getContentElement( 'find', 'txtFindFind' ).focus();
+817 			},
+818 			onHide : function()
+819 			{
+820 				if ( finder.matchRange && finder.matchRange.isMatched() )
+821 				{
+822 					finder.matchRange.removeHighlight();
+823 					editor.focus();
+824 					editor.getSelection().selectRanges(
+825 						[ finder.matchRange.toDomRange() ] );
+826 				}
+827
+828 				// Clear current session before dialog close
+829 				delete finder.matchRange;
+830 			}
+831 		};
+832 	};
+833
+834 	CKEDITOR.dialog.add( 'find', function( editor )
+835 		{
+836 			return findDialog( editor, 'find' );
+837 		});
+838
+839 	CKEDITOR.dialog.add( 'replace', function( editor )
+840 		{
+841 			return findDialog( editor, 'replace' );
+842 		});
+843 })();
+844 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_find_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_find_plugin.js.html new file mode 100644 index 000000000..963935680 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_find_plugin.js.html @@ -0,0 +1,43 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'find',
+  7 {
+  8 	init : function( editor )
+  9 	{
+ 10 		var forms = CKEDITOR.plugins.find;
+ 11 		editor.ui.addButton( 'Find',
+ 12 			{
+ 13 				label : editor.lang.findAndReplace.find,
+ 14 				command : 'find'
+ 15 			});
+ 16 		var findCommand = editor.addCommand( 'find', new CKEDITOR.dialogCommand( 'find' ) );
+ 17 		findCommand.canUndo = false;
+ 18
+ 19 		editor.ui.addButton( 'Replace',
+ 20 			{
+ 21 				label : editor.lang.findAndReplace.replace,
+ 22 				command : 'replace'
+ 23 			});
+ 24 		var replaceCommand = editor.addCommand( 'replace', new CKEDITOR.dialogCommand( 'replace' ) );
+ 25 		replaceCommand.canUndo = false;
+ 26
+ 27 		CKEDITOR.dialog.add( 'find',	this.path + 'dialogs/find.js' );
+ 28 		CKEDITOR.dialog.add( 'replace',	this.path + 'dialogs/find.js' );
+ 29 	},
+ 30
+ 31 	requires : [ 'styles' ]
+ 32 } );
+ 33
+ 34 // Styles for highlighting search results.
+ 35 CKEDITOR.config.find_highlight = { element : 'span', styles : { 'background-color' : '#004', 'color' : '#fff' } };
+ 36 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_flash_dialogs_flash.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_flash_dialogs_flash.js.html new file mode 100644 index 000000000..1bfe4d30a --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_flash_dialogs_flash.js.html @@ -0,0 +1,686 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	/*
+  9 	 * It is possible to set things in three different places.
+ 10 	 * 1. As attributes in the object tag.
+ 11 	 * 2. As param tags under the object tag.
+ 12 	 * 3. As attributes in the embed tag.
+ 13 	 * It is possible for a single attribute to be present in more than one place.
+ 14 	 * So let's define a mapping between a sementic attribute and its syntactic
+ 15 	 * equivalents.
+ 16 	 * Then we'll set and retrieve attribute values according to the mapping,
+ 17 	 * instead of having to check and set each syntactic attribute every time.
+ 18 	 *
+ 19 	 * Reference: http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_12701
+ 20 	 */
+ 21 	var ATTRTYPE_OBJECT = 1,
+ 22 		ATTRTYPE_PARAM = 2,
+ 23 		ATTRTYPE_EMBED = 4;
+ 24
+ 25 	var attributesMap =
+ 26 	{
+ 27 		id : [ { type : ATTRTYPE_OBJECT, name : CKEDITOR.env.ie ? '_cke_saved_id' : 'id' } ],
+ 28 		classid : [ { type : ATTRTYPE_OBJECT, name : 'classid' } ],
+ 29 		codebase : [ { type : ATTRTYPE_OBJECT, name : 'codebase'} ],
+ 30 		pluginspage : [ { type : ATTRTYPE_EMBED, name : 'pluginspage' } ],
+ 31 		src : [ { type : ATTRTYPE_PARAM, name : 'movie' }, { type : ATTRTYPE_EMBED, name : 'src' } ],
+ 32 		name : [ { type : ATTRTYPE_EMBED, name : 'name' } ],
+ 33 		align : [ { type : ATTRTYPE_OBJECT, name : 'align' } ],
+ 34 		title : [ { type : ATTRTYPE_OBJECT, name : 'title' }, { type : ATTRTYPE_EMBED, name : 'title' } ],
+ 35 		'class' : [ { type : ATTRTYPE_OBJECT, name : 'class' }, { type : ATTRTYPE_EMBED, name : 'class'} ],
+ 36 		width : [ { type : ATTRTYPE_OBJECT, name : 'width' }, { type : ATTRTYPE_EMBED, name : 'width' } ],
+ 37 		height : [ { type : ATTRTYPE_OBJECT, name : 'height' }, { type : ATTRTYPE_EMBED, name : 'height' } ],
+ 38 		hSpace : [ { type : ATTRTYPE_OBJECT, name : 'hSpace' }, { type : ATTRTYPE_EMBED, name : 'hSpace' } ],
+ 39 		vSpace : [ { type : ATTRTYPE_OBJECT, name : 'vSpace' }, { type : ATTRTYPE_EMBED, name : 'vSpace' } ],
+ 40 		style : [ { type : ATTRTYPE_OBJECT, name : 'style' }, { type : ATTRTYPE_EMBED, name : 'style' } ],
+ 41 		type : [ { type : ATTRTYPE_EMBED, name : 'type' } ]
+ 42 	};
+ 43
+ 44 	var names = [ 'play', 'loop', 'menu', 'quality', 'scale', 'salign', 'wmode', 'bgcolor', 'base', 'flashvars', 'allowScriptAccess',
+ 45 		'allowFullScreen' ];
+ 46 	for ( var i = 0 ; i < names.length ; i++ )
+ 47 		attributesMap[ names[i] ] = [ { type : ATTRTYPE_EMBED, name : names[i] }, { type : ATTRTYPE_PARAM, name : names[i] } ];
+ 48 	names = [ 'allowFullScreen', 'play', 'loop', 'menu' ];
+ 49 	for ( i = 0 ; i < names.length ; i++ )
+ 50 		attributesMap[ names[i] ][0]['default'] = attributesMap[ names[i] ][1]['default'] = true;
+ 51
+ 52 	function loadValue( objectNode, embedNode, paramMap )
+ 53 	{
+ 54 		var attributes = attributesMap[ this.id ];
+ 55 		if ( !attributes )
+ 56 			return;
+ 57
+ 58 		var isCheckbox = ( this instanceof CKEDITOR.ui.dialog.checkbox );
+ 59 		for ( var i = 0 ; i < attributes.length ; i++ )
+ 60 		{
+ 61 			var attrDef = attributes[ i ];
+ 62 			switch ( attrDef.type )
+ 63 			{
+ 64 				case ATTRTYPE_OBJECT:
+ 65 					if ( !objectNode )
+ 66 						continue;
+ 67 					if ( objectNode.getAttribute( attrDef.name ) !== null )
+ 68 					{
+ 69 						var value = objectNode.getAttribute( attrDef.name );
+ 70 						if ( isCheckbox )
+ 71 							this.setValue( value.toLowerCase() == 'true' );
+ 72 						else
+ 73 							this.setValue( value );
+ 74 						return;
+ 75 					}
+ 76 					else if ( isCheckbox )
+ 77 						this.setValue( !!attrDef[ 'default' ] );
+ 78 					break;
+ 79 				case ATTRTYPE_PARAM:
+ 80 					if ( !objectNode )
+ 81 						continue;
+ 82 					if ( attrDef.name in paramMap )
+ 83 					{
+ 84 						value = paramMap[ attrDef.name ];
+ 85 						if ( isCheckbox )
+ 86 							this.setValue( value.toLowerCase() == 'true' );
+ 87 						else
+ 88 							this.setValue( value );
+ 89 						return;
+ 90 					}
+ 91 					else if ( isCheckbox )
+ 92 						this.setValue( !!attrDef[ 'default' ] );
+ 93 					break;
+ 94 				case ATTRTYPE_EMBED:
+ 95 					if ( !embedNode )
+ 96 						continue;
+ 97 					if ( embedNode.getAttribute( attrDef.name ) )
+ 98 					{
+ 99 						value = embedNode.getAttribute( attrDef.name );
+100 						if ( isCheckbox )
+101 							this.setValue( value.toLowerCase() == 'true' );
+102 						else
+103 							this.setValue( value );
+104 						return;
+105 					}
+106 					else if ( isCheckbox )
+107 						this.setValue( !!attrDef[ 'default' ] );
+108 			}
+109 		}
+110 	}
+111
+112 	function commitValue( objectNode, embedNode, paramMap )
+113 	{
+114 		var attributes = attributesMap[ this.id ];
+115 		if ( !attributes )
+116 			return;
+117
+118 		var isRemove = ( this.getValue() === '' ),
+119 			isCheckbox = ( this instanceof CKEDITOR.ui.dialog.checkbox );
+120
+121 		for ( var i = 0 ; i < attributes.length ; i++ )
+122 		{
+123 			var attrDef = attributes[i];
+124 			switch ( attrDef.type )
+125 			{
+126 				case ATTRTYPE_OBJECT:
+127 					if ( !objectNode )
+128 						continue;
+129 					var value = this.getValue();
+130 					if ( isRemove || isCheckbox && value === attrDef[ 'default' ] )
+131 						objectNode.removeAttribute( attrDef.name );
+132 					else
+133 						objectNode.setAttribute( attrDef.name, value );
+134 					break;
+135 				case ATTRTYPE_PARAM:
+136 					if ( !objectNode )
+137 						continue;
+138 					value = this.getValue();
+139 					if ( isRemove || isCheckbox && value === attrDef[ 'default' ] )
+140 					{
+141 						if ( attrDef.name in paramMap )
+142 							paramMap[ attrDef.name ].remove();
+143 					}
+144 					else
+145 					{
+146 						if ( attrDef.name in paramMap )
+147 							paramMap[ attrDef.name ].setAttribute( 'value', value );
+148 						else
+149 						{
+150 							var param = CKEDITOR.dom.element.createFromHtml( '<cke:param></cke:param>', objectNode.getDocument() );
+151 							param.setAttributes( { name : attrDef.name, value : value } );
+152 							if ( objectNode.getChildCount() < 1 )
+153 								param.appendTo( objectNode );
+154 							else
+155 								param.insertBefore( objectNode.getFirst() );
+156 						}
+157 					}
+158 					break;
+159 				case ATTRTYPE_EMBED:
+160 					if ( !embedNode )
+161 						continue;
+162 					value = this.getValue();
+163 					if ( isRemove || isCheckbox && value === attrDef[ 'default' ])
+164 						embedNode.removeAttribute( attrDef.name );
+165 					else
+166 						embedNode.setAttribute( attrDef.name, value );
+167 			}
+168 		}
+169 	}
+170
+171 	CKEDITOR.dialog.add( 'flash', function( editor )
+172 	{
+173 		var makeObjectTag = !editor.config.flashEmbedTagOnly,
+174 			makeEmbedTag = editor.config.flashAddEmbedTag || editor.config.flashEmbedTagOnly;
+175
+176 		var previewAreaHtml = '<div>' + CKEDITOR.tools.htmlEncode( editor.lang.image.preview ) +'<br>' +
+177 			'<div id="FlashPreviewLoader" style="display:none"><div class="loading"> </div></div>' +
+178 			'<div id="FlashPreviewBox"></div></div>';
+179
+180 		return {
+181 			title : editor.lang.flash.title,
+182 			minWidth : 420,
+183 			minHeight : 310,
+184 			onShow : function()
+185 			{
+186 				// Clear previously saved elements.
+187 				this.fakeImage = this.objectNode = this.embedNode = null;
+188
+189 				// Try to detect any embed or object tag that has Flash parameters.
+190 				var fakeImage = this.getSelectedElement();
+191 				if ( fakeImage && fakeImage.getAttribute( '_cke_real_element_type' ) && fakeImage.getAttribute( '_cke_real_element_type' ) == 'flash' )
+192 				{
+193 					this.fakeImage = fakeImage;
+194
+195 					var realElement = editor.restoreRealElement( fakeImage ),
+196 						objectNode = null, embedNode = null, paramMap = {};
+197 					if ( realElement.getName() == 'cke:object' )
+198 					{
+199 						objectNode = realElement;
+200 						var embedList = objectNode.getElementsByTag( 'embed', 'cke' );
+201 						if ( embedList.count() > 0 )
+202 							embedNode = embedList.getItem( 0 );
+203 						var paramList = objectNode.getElementsByTag( 'param', 'cke' );
+204 						for ( var i = 0, length = paramList.count() ; i < length ; i++ )
+205 						{
+206 							var item = paramList.getItem( i ),
+207 								name = item.getAttribute( 'name' ),
+208 								value = item.getAttribute( 'value' );
+209 							paramMap[ name ] = value;
+210 						}
+211 					}
+212 					else if ( realElement.getName() == 'cke:embed' )
+213 						embedNode = realElement;
+214
+215 					this.objectNode = objectNode;
+216 					this.embedNode = embedNode;
+217
+218 					this.setupContent( objectNode, embedNode, paramMap, fakeImage );
+219 				}
+220 			},
+221 			onOk : function()
+222 			{
+223 				// If there's no selected object or embed, create one. Otherwise, reuse the
+224 				// selected object and embed nodes.
+225 				var objectNode = null,
+226 					embedNode = null,
+227 					paramMap = null;
+228 				if ( !this.fakeImage )
+229 				{
+230 					if ( makeObjectTag )
+231 					{
+232 						objectNode = CKEDITOR.dom.element.createFromHtml( '<cke:object></cke:object>', editor.document );
+233 						var attributes = {
+234 							classid : 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000',
+235 							codebase : 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'
+236 						};
+237 						objectNode.setAttributes( attributes );
+238 					}
+239 					if ( makeEmbedTag )
+240 					{
+241 						embedNode = CKEDITOR.dom.element.createFromHtml( '<cke:embed></cke:embed>', editor.document );
+242 						embedNode.setAttributes(
+243 							{
+244 								type : 'application/x-shockwave-flash',
+245 								pluginspage : 'http://www.macromedia.com/go/getflashplayer'
+246 							} );
+247 						if ( objectNode )
+248 							embedNode.appendTo( objectNode );
+249 					}
+250 				}
+251 				else
+252 				{
+253 					objectNode = this.objectNode;
+254 					embedNode = this.embedNode;
+255 				}
+256
+257 				// Produce the paramMap if there's an object tag.
+258 				if ( objectNode )
+259 				{
+260 					paramMap = {};
+261 					var paramList = objectNode.getElementsByTag( 'param', 'cke' );
+262 					for ( var i = 0, length = paramList.count() ; i < length ; i++ )
+263 						paramMap[ paramList.getItem( i ).getAttribute( 'name' ) ] = paramList.getItem( i );
+264 				}
+265
+266 				// Apply or remove flash parameters.
+267 				var extraStyles = {};
+268 				this.commitContent( objectNode, embedNode, paramMap, extraStyles );
+269
+270 				// Refresh the fake image.
+271 				var newFakeImage = editor.createFakeElement( objectNode || embedNode, 'cke_flash', 'flash', true );
+272 				newFakeImage.setStyles( extraStyles );
+273 				if ( this.fakeImage )
+274 					newFakeImage.replace( this.fakeImage );
+275 				else
+276 					editor.insertElement( newFakeImage );
+277 			},
+278
+279 			onHide : function()
+280 			{
+281 				if ( this.preview )
+282 					this.preview.setHtml('');
+283 			},
+284
+285 			contents : [
+286 				{
+287 					id : 'info',
+288 					label : editor.lang.common.generalTab,
+289 					accessKey : 'I',
+290 					elements :
+291 					[
+292 						{
+293 							type : 'vbox',
+294 							padding : 0,
+295 							children :
+296 							[
+297 								{
+298 									type : 'html',
+299 									html : '<span>' + CKEDITOR.tools.htmlEncode( editor.lang.image.url ) + '</span>'
+300 								},
+301 								{
+302 									type : 'hbox',
+303 									widths : [ '280px', '110px' ],
+304 									align : 'right',
+305 									children :
+306 									[
+307 										{
+308 											id : 'src',
+309 											type : 'text',
+310 											label : '',
+311 											validate : CKEDITOR.dialog.validate.notEmpty( editor.lang.flash.validateSrc ),
+312 											setup : loadValue,
+313 											commit : commitValue,
+314 											onLoad : function()
+315 											{
+316 												var dialog = this.getDialog(),
+317 												updatePreview = function( src ){
+318
+319 													dialog.preview.setHtml( '<embed height="100%" width="100%" src="'
+320 														+ CKEDITOR.tools.htmlEncode( src )
+321 														+ '" type="application/x-shockwave-flash"></embed>' );
+322 												};
+323 												// Preview element
+324 												dialog.preview = dialog.getContentElement( 'info', 'preview' ).getElement().getChild( 3 );
+325
+326 												// Sync on inital value loaded.
+327 												this.on( 'change', function( evt ){
+328
+329 														if ( evt.data && evt.data.value )
+330 															updatePreview( evt.data.value );
+331 													} );
+332 												// Sync when input value changed.
+333 												this.getInputElement().on( 'change', function( evt ){
+334
+335 													updatePreview( this.getValue() );
+336 												}, this );
+337 											}
+338 										},
+339 										{
+340 											type : 'button',
+341 											id : 'browse',
+342 											filebrowser : 'info:src',
+343 											hidden : true,
+344 											align : 'center',
+345 											label : editor.lang.common.browseServer
+346 										}
+347 									]
+348 								}
+349 							]
+350 						},
+351 						{
+352 							type : 'hbox',
+353 							widths : [ '25%', '25%', '25%', '25%', '25%' ],
+354 							children :
+355 							[
+356 								{
+357 									type : 'text',
+358 									id : 'width',
+359 									label : editor.lang.flash.width,
+360 									validate : CKEDITOR.dialog.validate.integer( editor.lang.flash.validateWidth ),
+361 									setup : function( objectNode, embedNode, paramMap, fakeImage )
+362 									{
+363 										loadValue.apply( this, arguments );
+364 										if ( fakeImage )
+365 										{
+366 											var fakeImageWidth = parseInt( fakeImage.$.style.width, 10 );
+367 											if ( !isNaN( fakeImageWidth ) )
+368 												this.setValue( fakeImageWidth );
+369 										}
+370 									},
+371 									commit : function( objectNode, embedNode, paramMap, extraStyles )
+372 									{
+373 										commitValue.apply( this, arguments );
+374 										if ( this.getValue() )
+375 											extraStyles.width = this.getValue() + 'px';
+376 									}
+377 								},
+378 								{
+379 									type : 'text',
+380 									id : 'height',
+381 									label : editor.lang.flash.height,
+382 									validate : CKEDITOR.dialog.validate.integer( editor.lang.flash.validateHeight ),
+383 									setup : function( objectNode, embedNode, paramMap, fakeImage )
+384 									{
+385 										loadValue.apply( this, arguments );
+386 										if ( fakeImage )
+387 										{
+388 											var fakeImageHeight = parseInt( fakeImage.$.style.height, 10 );
+389 											if ( !isNaN( fakeImageHeight ) )
+390 												this.setValue( fakeImageHeight );
+391 										}
+392 									},
+393 									commit : function( objectNode, embedNode, paramMap, extraStyles )
+394 									{
+395 										commitValue.apply( this, arguments );
+396 										if ( this.getValue() )
+397 											extraStyles.height = this.getValue() + 'px';
+398 									}
+399 								},
+400 								{
+401 									type : 'text',
+402 									id : 'hSpace',
+403 									label : editor.lang.flash.hSpace,
+404 									validate : CKEDITOR.dialog.validate.integer( editor.lang.flash.validateHSpace ),
+405 									setup : loadValue,
+406 									commit : commitValue
+407 								},
+408 								{
+409 									type : 'text',
+410 									id : 'vSpace',
+411 									label : editor.lang.flash.vSpace,
+412 									validate : CKEDITOR.dialog.validate.integer( editor.lang.flash.validateVSpace ),
+413 									setup : loadValue,
+414 									commit : commitValue
+415 								}
+416 							]
+417 						},
+418
+419 						{
+420 							type : 'vbox',
+421 							children :
+422 							[
+423 								{
+424 									type : 'html',
+425 									id : 'preview',
+426 									style : 'width:95%;',
+427 									html : previewAreaHtml
+428 								}
+429 							]
+430 						}
+431 					]
+432 				},
+433 				{
+434 					id : 'Upload',
+435 					hidden : true,
+436 					filebrowser : 'uploadButton',
+437 					label : editor.lang.common.upload,
+438 					elements :
+439 					[
+440 						{
+441 							type : 'file',
+442 							id : 'upload',
+443 							label : editor.lang.common.upload,
+444 							size : 38
+445 						},
+446 						{
+447 							type : 'fileButton',
+448 							id : 'uploadButton',
+449 							label : editor.lang.common.uploadSubmit,
+450 							filebrowser : 'info:src',
+451 							'for' : [ 'Upload', 'upload' ]
+452 						}
+453 					]
+454 				},
+455 				{
+456 					id : 'properties',
+457 					label : editor.lang.flash.propertiesTab,
+458 					elements :
+459 					[
+460 						{
+461 							type : 'hbox',
+462 							widths : [ '50%', '50%' ],
+463 							children :
+464 							[
+465 								{
+466 									id : 'scale',
+467 									type : 'select',
+468 									label : editor.lang.flash.scale,
+469 									'default' : '',
+470 									style : 'width : 100%;',
+471 									items :
+472 									[
+473 										[ editor.lang.common.notSet , ''],
+474 										[ editor.lang.flash.scaleAll, 'showall' ],
+475 										[ editor.lang.flash.scaleNoBorder, 'noborder' ],
+476 										[ editor.lang.flash.scaleFit, 'exactfit' ]
+477 									],
+478 									setup : loadValue,
+479 									commit : commitValue
+480 								},
+481 								{
+482 									id : 'allowScriptAccess',
+483 									type : 'select',
+484 									label : editor.lang.flash.access,
+485 									'default' : '',
+486 									style : 'width : 100%;',
+487 									items :
+488 									[
+489 										[ editor.lang.common.notSet , ''],
+490 										[ editor.lang.flash.accessAlways, 'always' ],
+491 										[ editor.lang.flash.accessSameDomain, 'samedomain' ],
+492 										[ editor.lang.flash.accessNever, 'never' ]
+493 									],
+494 									setup : loadValue,
+495 									commit : commitValue
+496 								}
+497 							]
+498 						},
+499 						{
+500 							type : 'hbox',
+501 							widths : [ '50%', '50%' ],
+502 							children :
+503 							[
+504 								{
+505 									id : 'wmode',
+506 									type : 'select',
+507 									label : editor.lang.flash.windowMode,
+508 									'default' : '',
+509 									style : 'width : 100%;',
+510 									items :
+511 									[
+512 										[ editor.lang.common.notSet , '' ],
+513 										[ editor.lang.flash.windowModeWindow, 'window' ],
+514 										[ editor.lang.flash.windowModeOpaque, 'opaque' ],
+515 										[ editor.lang.flash.windowModeTransparent, 'transparent' ]
+516 									],
+517 									setup : loadValue,
+518 									commit : commitValue
+519 								},
+520 								{
+521 									id : 'quality',
+522 									type : 'select',
+523 									label : editor.lang.flash.quality,
+524 									'default' : 'high',
+525 									style : 'width : 100%;',
+526 									items :
+527 									[
+528 										[ editor.lang.common.notSet , '' ],
+529 										[ editor.lang.flash.qualityBest, 'best' ],
+530 										[ editor.lang.flash.qualityHigh, 'high' ],
+531 										[ editor.lang.flash.qualityAutoHigh, 'autohigh' ],
+532 										[ editor.lang.flash.qualityMedium, 'medium' ],
+533 										[ editor.lang.flash.qualityAutoLow, 'autolow' ],
+534 										[ editor.lang.flash.qualityLow, 'low' ]
+535 									],
+536 									setup : loadValue,
+537 									commit : commitValue
+538 								}
+539 							]
+540 						},
+541 						{
+542 							type : 'hbox',
+543 							widths : [ '50%', '50%' ],
+544 							children :
+545 							[
+546 								{
+547 									id : 'align',
+548 									type : 'select',
+549 									label : editor.lang.flash.align,
+550 									'default' : '',
+551 									style : 'width : 100%;',
+552 									items :
+553 									[
+554 										[ editor.lang.common.notSet , ''],
+555 										[ editor.lang.image.alignLeft , 'left'],
+556 										[ editor.lang.image.alignAbsBottom , 'absBottom'],
+557 										[ editor.lang.image.alignAbsMiddle , 'absMiddle'],
+558 										[ editor.lang.image.alignBaseline , 'baseline'],
+559 										[ editor.lang.image.alignBottom , 'bottom'],
+560 										[ editor.lang.image.alignMiddle , 'middle'],
+561 										[ editor.lang.image.alignRight , 'right'],
+562 										[ editor.lang.image.alignTextTop , 'textTop'],
+563 										[ editor.lang.image.alignTop , 'top']
+564 									],
+565 									setup : loadValue,
+566 									commit : commitValue
+567 								},
+568 								{
+569 									type : 'html',
+570 									html : '<div></div>'
+571 								}
+572 							]
+573 						},
+574 						{
+575 							type : 'vbox',
+576 							padding : 0,
+577 							children :
+578 							[
+579 								{
+580 									type : 'html',
+581 									html : CKEDITOR.tools.htmlEncode( editor.lang.flash.flashvars )
+582 								},
+583 								{
+584 									type : 'checkbox',
+585 									id : 'menu',
+586 									label : editor.lang.flash.chkMenu,
+587 									'default' : true,
+588 									setup : loadValue,
+589 									commit : commitValue
+590 								},
+591 								{
+592 									type : 'checkbox',
+593 									id : 'play',
+594 									label : editor.lang.flash.chkPlay,
+595 									'default' : true,
+596 									setup : loadValue,
+597 									commit : commitValue
+598 								},
+599 								{
+600 									type : 'checkbox',
+601 									id : 'loop',
+602 									label : editor.lang.flash.chkLoop,
+603 									'default' : true,
+604 									setup : loadValue,
+605 									commit : commitValue
+606 								},
+607 								{
+608 									type : 'checkbox',
+609 									id : 'allowFullScreen',
+610 									label : editor.lang.flash.chkFull,
+611 									'default' : true,
+612 									setup : loadValue,
+613 									commit : commitValue
+614 								}
+615 							]
+616 						}
+617 					]
+618 				},
+619 				{
+620 					id : 'advanced',
+621 					label : editor.lang.common.advancedTab,
+622 					elements :
+623 					[
+624 						{
+625 							type : 'hbox',
+626 							widths : [ '45%', '55%' ],
+627 							children :
+628 							[
+629 								{
+630 									type : 'text',
+631 									id : 'id',
+632 									label : editor.lang.common.id,
+633 									setup : loadValue,
+634 									commit : commitValue
+635 								},
+636 								{
+637 									type : 'text',
+638 									id : 'title',
+639 									label : editor.lang.common.advisoryTitle,
+640 									setup : loadValue,
+641 									commit : commitValue
+642 								}
+643 							]
+644 						},
+645 						{
+646 							type : 'hbox',
+647 							widths : [ '45%', '55%' ],
+648 							children :
+649 							[
+650 								{
+651 									type : 'text',
+652 									id : 'bgcolor',
+653 									label : editor.lang.flash.bgcolor,
+654 									setup : loadValue,
+655 									commit : commitValue
+656 								},
+657 								{
+658 									type : 'text',
+659 									id : 'class',
+660 									label : editor.lang.common.cssClass,
+661 									setup : loadValue,
+662 									commit : commitValue
+663 								}
+664 							]
+665 						},
+666 						{
+667 							type : 'text',
+668 							id : 'style',
+669 							label : editor.lang.common.cssStyle,
+670 							setup : loadValue,
+671 							commit : commitValue
+672 						}
+673 					]
+674 				}
+675 			]
+676 		};
+677 	} );
+678 })();
+679 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_flash_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_flash_plugin.js.html new file mode 100644 index 000000000..bd552ecab --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_flash_plugin.js.html @@ -0,0 +1,173 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	var flashFilenameRegex = /\.swf(?:$|\?)/i,
+  9 		numberRegex = /^\d+(?:\.\d+)?$/;
+ 10
+ 11 	function cssifyLength( length )
+ 12 	{
+ 13 		if ( numberRegex.test( length ) )
+ 14 			return length + 'px';
+ 15 		return length;
+ 16 	}
+ 17
+ 18 	function isFlashEmbed( element )
+ 19 	{
+ 20 		var attributes = element.attributes;
+ 21
+ 22 		return ( attributes.type != 'application/x-shockwave-flash' || !flashFilenameRegex.test( attributes.src || '' ) );
+ 23 	}
+ 24
+ 25 	function createFakeElement( editor, realElement )
+ 26 	{
+ 27 		var fakeElement = editor.createFakeParserElement( realElement, 'cke_flash', 'flash', true ),
+ 28 			fakeStyle = fakeElement.attributes.style || '';
+ 29
+ 30 		var width = realElement.attributes.width,
+ 31 			height = realElement.attributes.height;
+ 32
+ 33 		if ( typeof width != 'undefined' )
+ 34 			fakeStyle = fakeElement.attributes.style = fakeStyle + 'width:' + cssifyLength( width ) + ';';
+ 35
+ 36 		if ( typeof height != 'undefined' )
+ 37 			fakeStyle = fakeElement.attributes.style = fakeStyle + 'height:' + cssifyLength( height ) + ';';
+ 38
+ 39 		return fakeElement;
+ 40 	}
+ 41
+ 42 	CKEDITOR.plugins.add( 'flash',
+ 43 	{
+ 44 		init : function( editor )
+ 45 		{
+ 46 			editor.addCommand( 'flash', new CKEDITOR.dialogCommand( 'flash' ) );
+ 47 			editor.ui.addButton( 'Flash',
+ 48 				{
+ 49 					label : editor.lang.common.flash,
+ 50 					command : 'flash'
+ 51 				});
+ 52 			CKEDITOR.dialog.add( 'flash', this.path + 'dialogs/flash.js' );
+ 53
+ 54 			editor.addCss(
+ 55 				'img.cke_flash' +
+ 56 				'{' +
+ 57 					'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/placeholder.png' ) + ');' +
+ 58 					'background-position: center center;' +
+ 59 					'background-repeat: no-repeat;' +
+ 60 					'border: 1px solid #a9a9a9;' +
+ 61 					'width: 80px;' +
+ 62 					'height: 80px;' +
+ 63 				'}'
+ 64 				);
+ 65
+ 66 			// If the "menu" plugin is loaded, register the menu items.
+ 67 			if ( editor.addMenuItems )
+ 68 			{
+ 69 				editor.addMenuItems(
+ 70 					{
+ 71 						flash :
+ 72 						{
+ 73 							label : editor.lang.flash.properties,
+ 74 							command : 'flash',
+ 75 							group : 'flash'
+ 76 						}
+ 77 					});
+ 78 			}
+ 79
+ 80 			// If the "contextmenu" plugin is loaded, register the listeners.
+ 81 			if ( editor.contextMenu )
+ 82 			{
+ 83 				editor.contextMenu.addListener( function( element, selection )
+ 84 					{
+ 85 						if ( element && element.is( 'img' ) && element.getAttribute( '_cke_real_element_type' ) == 'flash' )
+ 86 							return { flash : CKEDITOR.TRISTATE_OFF };
+ 87 					});
+ 88 			}
+ 89 		},
+ 90
+ 91 		afterInit : function( editor )
+ 92 		{
+ 93 			var dataProcessor = editor.dataProcessor,
+ 94 				dataFilter = dataProcessor && dataProcessor.dataFilter;
+ 95
+ 96 			if ( dataFilter )
+ 97 			{
+ 98 				dataFilter.addRules(
+ 99 					{
+100 						elements :
+101 						{
+102 							'cke:object' : function( element )
+103 							{
+104 								var attributes = element.attributes,
+105 									classId = attributes.classid && String( attributes.classid ).toLowerCase();
+106
+107 								if ( !classId )
+108 								{
+109 									// Look for the inner <embed>
+110 									for ( var i = 0 ; i < element.children.length ; i++ )
+111 									{
+112 										if ( element.children[ i ].name == 'embed' )
+113 										{
+114 											if ( !isFlashEmbed( element.children[ i ] ) )
+115 												return null;
+116
+117 											return createFakeElement( editor, element );
+118 										}
+119 									}
+120 									return null;
+121 								}
+122
+123 								return createFakeElement( editor, element );
+124 							},
+125
+126 							'cke:embed' : function( element )
+127 							{
+128 								if ( !isFlashEmbed( element ) )
+129 									return null;
+130
+131 								return createFakeElement( editor, element );
+132 							}
+133 						}
+134 					},
+135 					5);
+136 			}
+137 		},
+138
+139 		requires : [ 'fakeobjects' ]
+140 	});
+141 })();
+142
+143 CKEDITOR.tools.extend( CKEDITOR.config,
+144 {
+145 	/**
+146 	 * Save as EMBED tag only. This tag is unrecommended.
+147 	 * @type Boolean
+148 	 * @default false
+149 	 */
+150 	flashEmbedTagOnly : false,
+151
+152 	/**
+153 	 * Add EMBED tag as alternative: <object><embed></embed></object>
+154 	 * @type Boolean
+155 	 * @default false
+156 	 */
+157 	flashAddEmbedTag : true,
+158
+159 	/**
+160 	 * Use embedTagOnly and addEmbedTag values on edit.
+161 	 * @type Boolean
+162 	 * @default false
+163 	 */
+164 	flashConvertOnEdit : false
+165 } );
+166 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_floatpanel_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_floatpanel_plugin.js.html new file mode 100644 index 000000000..cd6453a86 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_floatpanel_plugin.js.html @@ -0,0 +1,330 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'floatpanel',
+  7 {
+  8 	requires : [ 'panel' ]
+  9 });
+ 10
+ 11 (function()
+ 12 {
+ 13 	var panels = {};
+ 14 	var isShowing = false;
+ 15
+ 16 	function getPanel( editor, doc, parentElement, definition, level )
+ 17 	{
+ 18 		// Generates the panel key: docId-eleId-skinName-langDir[-uiColor][-CSSs][-level]
+ 19 		var key =
+ 20 			doc.getUniqueId() +
+ 21 			'-' + parentElement.getUniqueId() +
+ 22 			'-' + editor.skinName +
+ 23 			'-' + editor.lang.dir +
+ 24 			( ( editor.uiColor && ( '-' + editor.uiColor ) ) || '' ) +
+ 25 			( ( definition.css && ( '-' + definition.css ) ) || '' ) +
+ 26 			( ( level && ( '-' + level ) ) || '' );
+ 27
+ 28 		var panel = panels[ key ];
+ 29
+ 30 		if ( !panel )
+ 31 		{
+ 32 			panel = panels[ key ] = new CKEDITOR.ui.panel( doc, definition );
+ 33 			panel.element = parentElement.append( CKEDITOR.dom.element.createFromHtml( panel.renderHtml( editor ), doc ) );
+ 34
+ 35 			panel.element.setStyles(
+ 36 				{
+ 37 					display : 'none',
+ 38 					position : 'absolute'
+ 39 				});
+ 40 		}
+ 41
+ 42 		return panel;
+ 43 	}
+ 44
+ 45 	CKEDITOR.ui.floatPanel = CKEDITOR.tools.createClass(
+ 46 	{
+ 47 		$ : function( editor, parentElement, definition, level )
+ 48 		{
+ 49 			definition.forceIFrame = true;
+ 50
+ 51 			var doc = parentElement.getDocument(),
+ 52 				panel = getPanel( editor, doc, parentElement, definition, level || 0 ),
+ 53 				element = panel.element,
+ 54 				iframe = element.getFirst().getFirst();
+ 55
+ 56 			this.element = element;
+ 57
+ 58 			this._ =
+ 59 			{
+ 60 				// The panel that will be floating.
+ 61 				panel : panel,
+ 62 				parentElement : parentElement,
+ 63 				definition : definition,
+ 64 				document : doc,
+ 65 				iframe : iframe,
+ 66 				children : [],
+ 67 				dir : editor.lang.dir
+ 68 			};
+ 69 		},
+ 70
+ 71 		proto :
+ 72 		{
+ 73 			addBlock : function( name, block )
+ 74 			{
+ 75 				return this._.panel.addBlock( name, block );
+ 76 			},
+ 77
+ 78 			addListBlock : function( name, multiSelect )
+ 79 			{
+ 80 				return this._.panel.addListBlock( name, multiSelect );
+ 81 			},
+ 82
+ 83 			getBlock : function( name )
+ 84 			{
+ 85 				return this._.panel.getBlock( name );
+ 86 			},
+ 87
+ 88 			/*
+ 89 				corner (LTR):
+ 90 					1 = top-left
+ 91 					2 = top-right
+ 92 					3 = bottom-right
+ 93 					4 = bottom-left
+ 94
+ 95 				corner (RTL):
+ 96 					1 = top-right
+ 97 					2 = top-left
+ 98 					3 = bottom-left
+ 99 					4 = bottom-right
+100 			 */
+101 			showBlock : function( name, offsetParent, corner, offsetX, offsetY )
+102 			{
+103 				var panel = this._.panel,
+104 					block = panel.showBlock( name );
+105
+106 				this.allowBlur( false );
+107 				isShowing = true;
+108
+109 				var element = this.element,
+110 					iframe = this._.iframe,
+111 					definition = this._.definition,
+112 					position = offsetParent.getDocumentPosition( element.getDocument() ),
+113 					rtl = this._.dir == 'rtl';
+114
+115 				var left	= position.x + ( offsetX || 0 ),
+116 					top		= position.y + ( offsetY || 0 );
+117
+118 				if ( ( rtl && ( corner == 1 || corner == 4 ) ) || ( !rtl && ( corner == 2 || corner == 3 ) ) )
+119 					left += offsetParent.$.offsetWidth - 1;
+120
+121 				if ( corner == 3 || corner == 4 )
+122 					top += offsetParent.$.offsetHeight - 1;
+123
+124 				element.setStyles(
+125 					{
+126 						top : top + 'px',
+127 						left : '-3000px',
+128 						visibility : 'hidden',
+129 						opacity : '0',	// FF3 is ignoring "visibility"
+130 						display	: ''
+131 					});
+132
+133 				// Configure the IFrame blur event. Do that only once.
+134 				if ( !this._.blurSet )
+135 				{
+136 					// Non IE prefer the event into a window object.
+137 					var focused = CKEDITOR.env.ie ? iframe : new CKEDITOR.dom.window( iframe.$.contentWindow );
+138
+139 					// With addEventListener compatible browsers, we must
+140 					// useCapture when registering the focus/blur events to
+141 					// guarantee they will be firing in all situations. (#3068, #3222 )
+142 					CKEDITOR.event.useCapture = true;
+143
+144 					focused.on( 'blur', function( ev )
+145 						{
+146 							if ( CKEDITOR.env.ie && !this.allowBlur() )
+147 								return;
+148
+149 							// As we are using capture to register the listener,
+150 							// the blur event may get fired even when focusing
+151 							// inside the window itself, so we must ensure the
+152 							// target is out of it.
+153 							var target = ev.data.getTarget(),
+154 								targetWindow = target.getWindow && target.getWindow();
+155
+156 							if ( targetWindow && targetWindow.equals( focused ) )
+157 								return;
+158
+159 							if ( this.visible && !this._.activeChild && !isShowing )
+160 								this.hide();
+161 						},
+162 						this );
+163
+164 					focused.on( 'focus', function()
+165 						{
+166 							this._.focused = true;
+167 							this.hideChild();
+168 							this.allowBlur( true );
+169 						},
+170 						this );
+171
+172 					CKEDITOR.event.useCapture = false;
+173
+174 					this._.blurSet = 1;
+175 				}
+176
+177 				panel.onEscape = CKEDITOR.tools.bind( function()
+178 					{
+179 						this.onEscape && this.onEscape();
+180 					},
+181 					this );
+182
+183 				setTimeout( function()
+184 					{
+185 						if ( rtl )
+186 							left -= element.$.offsetWidth;
+187
+188 						element.setStyles(
+189 							{
+190 								left : left + 'px',
+191 								visibility	: '',
+192 								opacity : '1'	// FF3 is ignoring "visibility"
+193 							});
+194
+195 						if ( block.autoSize )
+196 						{
+197 							function setHeight()
+198 							{
+199 								var target = element.getFirst();
+200 								var height = block.element.$.scrollHeight;
+201
+202 								// Account for extra height needed due to IE quirks box model bug:
+203 								// http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug
+204 								// (#3426)
+205 								if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && height > 0 )
+206 									height += ( target.$.offsetHeight || 0 ) - ( target.$.clientHeight || 0 );
+207
+208 								target.setStyle( 'height', height + 'px' );
+209
+210 								// Fix IE < 8 visibility.
+211 								panel._.currentBlock.element.setStyle( 'display', 'none' ).removeStyle( 'display' );
+212 							}
+213
+214 							if ( !CKEDITOR.env.gecko || panel.isLoaded )
+215 							{
+216 								// IE7 needs some time (setting the delay to 0ms won't work) to refresh
+217 								// the scrollHeight. (#3174)
+218 								if ( CKEDITOR.env.ie && CKEDITOR.env.version >= 7 )
+219 									setTimeout( setHeight, 50 );
+220 								else
+221 									setHeight();
+222 							}
+223 							else
+224 								panel.onLoad = setHeight;
+225 						}
+226 						else
+227 							element.getFirst().removeStyle( 'height' );
+228
+229 						// Set the IFrame focus, so the blur event gets fired.
+230 						setTimeout( function()
+231 							{
+232 								if ( definition.voiceLabel )
+233 								{
+234 									if ( CKEDITOR.env.gecko )
+235 									{
+236 										var container = iframe.getParent();
+237 										container.setAttribute( 'role', 'region' );
+238 										container.setAttribute( 'title', definition.voiceLabel );
+239 										iframe.setAttribute( 'role', 'region' );
+240 										iframe.setAttribute( 'title', ' ' );
+241 									}
+242 								}
+243 								if ( CKEDITOR.env.ie && CKEDITOR.env.quirks )
+244 									iframe.focus();
+245 								else
+246 									iframe.$.contentWindow.focus();
+247 							}, 0);
+248 					}, 0);
+249
+250 				this.visible = 1;
+251
+252 				if ( this.onShow )
+253 					this.onShow.call( this );
+254
+255 				isShowing = false;
+256 			},
+257
+258 			hide : function()
+259 			{
+260 				if ( this.visible && ( !this.onHide || this.onHide.call( this ) !== true ) )
+261 				{
+262 					this.hideChild();
+263 					this.element.setStyle( 'display', 'none' );
+264 					this.visible = 0;
+265 				}
+266 			},
+267
+268 			allowBlur : function( allow )	// Prevent editor from hiding the panel. #3222.
+269 			{
+270 				var panel = this._.panel;
+271 				if ( allow != undefined )
+272 					panel.allowBlur = allow;
+273
+274 				return panel.allowBlur;
+275 			},
+276
+277 			showAsChild : function( panel, blockName, offsetParent, corner, offsetX, offsetY )
+278 			{
+279 				this.hideChild();
+280
+281 				panel.onHide = CKEDITOR.tools.bind( function()
+282 					{
+283 						// Use a timeout, so we give time for this menu to get
+284 						// potentially focused.
+285 						CKEDITOR.tools.setTimeout( function()
+286 							{
+287 								if ( !this._.focused )
+288 									this.hide();
+289 							},
+290 							0, this );
+291 					},
+292 					this );
+293
+294 				this._.activeChild = panel;
+295 				this._.focused = false;
+296
+297 				panel.showBlock( blockName, offsetParent, corner, offsetX, offsetY );
+298
+299 				/* #3767 IE: Second level menu may not have borders */
+300 				if ( CKEDITOR.env.ie7Compat || ( CKEDITOR.env.ie8 && CKEDITOR.env.ie6Compat ) )
+301 				{
+302 					setTimeout(function()
+303 						{
+304 							panel.element.getChild( 0 ).$.style.cssText += '';
+305 						}, 100);
+306 				}
+307 			},
+308
+309 			hideChild : function()
+310 			{
+311 				var activeChild = this._.activeChild;
+312
+313 				if ( activeChild )
+314 				{
+315 					delete activeChild.onHide;
+316 					delete this._.activeChild;
+317 					activeChild.hide();
+318 				}
+319 			}
+320 		}
+321 	});
+322 })();
+323 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_font_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_font_plugin.js.html new file mode 100644 index 000000000..2b2193a12 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_font_plugin.js.html @@ -0,0 +1,160 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	function addCombo( editor, comboName, styleType, lang, entries, defaultLabel, styleDefinition )
+  9 	{
+ 10 		var config = editor.config;
+ 11
+ 12 		// Gets the list of fonts from the settings.
+ 13 		var names = entries.split( ';' ),
+ 14 			values = [];
+ 15
+ 16 		// Create style objects for all fonts.
+ 17 		var styles = {};
+ 18 		for ( var i = 0 ; i < names.length ; i++ )
+ 19 		{
+ 20 			var vars = {};
+ 21 			var parts = names[ i ].split( '/' );
+ 22
+ 23 			var name = names[ i ] = parts[ 0 ];
+ 24 			vars[ styleType ] = values[ i ] = parts[ 1 ] || name;
+ 25
+ 26 			styles[ name ] = new CKEDITOR.style( styleDefinition, vars );
+ 27 		}
+ 28
+ 29 		editor.ui.addRichCombo( comboName,
+ 30 			{
+ 31 				label : lang.label,
+ 32 				title : lang.panelTitle,
+ 33 				voiceLabel : lang.voiceLabel,
+ 34 				className : 'cke_' + ( styleType == 'size' ? 'fontSize' : 'font' ),
+ 35 				multiSelect : false,
+ 36
+ 37 				panel :
+ 38 				{
+ 39 					css : [ config.contentsCss, CKEDITOR.getUrl( editor.skinPath + 'editor.css' ) ],
+ 40 					voiceLabel : lang.panelVoiceLabel
+ 41 				},
+ 42
+ 43 				init : function()
+ 44 				{
+ 45 					this.startGroup( lang.panelTitle );
+ 46
+ 47 					for ( var i = 0 ; i < names.length ; i++ )
+ 48 					{
+ 49 						var name = names[ i ];
+ 50
+ 51 						// Add the tag entry to the panel list.
+ 52 						this.add( name, '<span style="font-' + styleType + ':' + values[ i ] + '">' + name + '</span>', name );
+ 53 					}
+ 54 				},
+ 55
+ 56 				onClick : function( value )
+ 57 				{
+ 58 					editor.focus();
+ 59 					editor.fire( 'saveSnapshot' );
+ 60
+ 61 					var style = styles[ value ];
+ 62
+ 63 					if ( this.getValue() == value )
+ 64 						style.remove( editor.document );
+ 65 					else
+ 66 						style.apply( editor.document );
+ 67
+ 68 					editor.fire( 'saveSnapshot' );
+ 69 				},
+ 70
+ 71 				onRender : function()
+ 72 				{
+ 73 					editor.on( 'selectionChange', function( ev )
+ 74 						{
+ 75 							var currentValue = this.getValue();
+ 76
+ 77 							var elementPath = ev.data.path,
+ 78 								elements = elementPath.elements;
+ 79
+ 80 							// For each element into the elements path.
+ 81 							for ( var i = 0, element ; i < elements.length ; i++ )
+ 82 							{
+ 83 								element = elements[i];
+ 84
+ 85 								// Check if the element is removable by any of
+ 86 								// the styles.
+ 87 								for ( var value in styles )
+ 88 								{
+ 89 									if ( styles[ value ].checkElementRemovable( element, true ) )
+ 90 									{
+ 91 										if ( value != currentValue )
+ 92 											this.setValue( value );
+ 93 										return;
+ 94 									}
+ 95 								}
+ 96 							}
+ 97
+ 98 							// If no styles match, just empty it.
+ 99 							this.setValue( '', defaultLabel );
+100 						},
+101 						this);
+102 				}
+103 			});
+104 	}
+105
+106 	CKEDITOR.plugins.add( 'font',
+107 	{
+108 		requires : [ 'richcombo', 'styles' ],
+109
+110 		init : function( editor )
+111 		{
+112 			var config = editor.config;
+113
+114 			addCombo( editor, 'Font', 'family', editor.lang.font, config.font_names, config.font_defaultLabel, config.font_style );
+115 			addCombo( editor, 'FontSize', 'size', editor.lang.fontSize, config.fontSize_sizes, config.fontSize_defaultLabel, config.fontSize_style );
+116 		}
+117 	});
+118 })();
+119
+120 // Font settings.
+121
+122 CKEDITOR.config.font_names =
+123 	'Arial/Arial, Helvetica, sans-serif;' +
+124 	'Comic Sans MS/Comic Sans MS, cursive;' +
+125 	'Courier New/Courier New, Courier, monospace;' +
+126 	'Georgia/Georgia, serif;' +
+127 	'Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;' +
+128 	'Tahoma/Tahoma, Geneva, sans-serif;' +
+129 	'Times New Roman/Times New Roman, Times, serif;' +
+130 	'Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;' +
+131 	'Verdana/Verdana, Geneva, sans-serif';
+132
+133 CKEDITOR.config.font_defaultLabel = '';
+134 CKEDITOR.config.font_style =
+135 	{
+136 		element		: 'span',
+137 		styles		: { 'font-family' : '#(family)' },
+138 		overrides	: [ { element : 'font', attributes : { 'face' : null } } ]
+139 	};
+140
+141 // Font Size setting.
+142
+143 CKEDITOR.config.fontSize_sizes =
+144 	'8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px';
+145
+146 CKEDITOR.config.fontSize_defaultLabel = '';
+147 CKEDITOR.config.fontSize_style =
+148 	{
+149 		element		: 'span',
+150 		styles		: { 'font-size' : '#(size)' },
+151 		overrides	: [ { element : 'font', attributes : { 'face' : null } } ]
+152 	};
+153 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_format_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_format_plugin.js.html new file mode 100644 index 000000000..51c45a128 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_format_plugin.js.html @@ -0,0 +1,109 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'format',
+  7 {
+  8 	requires : [ 'richcombo', 'styles' ],
+  9
+ 10 	init : function( editor )
+ 11 	{
+ 12 		var config = editor.config,
+ 13 			lang = editor.lang.format;
+ 14
+ 15 		// Gets the list of tags from the settings.
+ 16 		var tags = config.format_tags.split( ';' );
+ 17
+ 18 		// Create style objects for all defined styles.
+ 19 		var styles = {};
+ 20 		for ( var i = 0 ; i < tags.length ; i++ )
+ 21 		{
+ 22 			var tag = tags[ i ];
+ 23 			styles[ tag ] = new CKEDITOR.style( config[ 'format_' + tag ] );
+ 24 		}
+ 25
+ 26 		editor.ui.addRichCombo( 'Format',
+ 27 			{
+ 28 				label : lang.label,
+ 29 				title : lang.panelTitle,
+ 30 				voiceLabel : lang.voiceLabel,
+ 31 				className : 'cke_format',
+ 32 				multiSelect : false,
+ 33
+ 34 				panel :
+ 35 				{
+ 36 					css : [ config.contentsCss, CKEDITOR.getUrl( editor.skinPath + 'editor.css' ) ],
+ 37 					voiceLabel : lang.panelVoiceLabel
+ 38 				},
+ 39
+ 40 				init : function()
+ 41 				{
+ 42 					this.startGroup( lang.panelTitle );
+ 43
+ 44 					for ( var tag in styles )
+ 45 					{
+ 46 						var label = lang[ 'tag_' + tag ];
+ 47
+ 48 						// Add the tag entry to the panel list.
+ 49 						this.add( tag, '<' + tag + '>' + label + '</' + tag + '>', label );
+ 50 					}
+ 51 				},
+ 52
+ 53 				onClick : function( value )
+ 54 				{
+ 55 					editor.focus();
+ 56 					editor.fire( 'saveSnapshot' );
+ 57
+ 58 					styles[ value ].apply( editor.document );
+ 59
+ 60 					editor.fire( 'saveSnapshot' );
+ 61 				},
+ 62
+ 63 				onRender : function()
+ 64 				{
+ 65 					editor.on( 'selectionChange', function( ev )
+ 66 						{
+ 67 							var currentTag = this.getValue();
+ 68
+ 69 							var elementPath = ev.data.path;
+ 70
+ 71 							for ( var tag in styles )
+ 72 							{
+ 73 								if ( styles[ tag ].checkActive( elementPath ) )
+ 74 								{
+ 75 									if ( tag != currentTag )
+ 76 										this.setValue( tag, editor.lang.format[ 'tag_' + tag ] );
+ 77 									return;
+ 78 								}
+ 79 							}
+ 80
+ 81 							// If no styles match, just empty it.
+ 82 							this.setValue( '' );
+ 83 						},
+ 84 						this);
+ 85 				}
+ 86 			});
+ 87 	}
+ 88 });
+ 89
+ 90 CKEDITOR.config.format_tags = 'p;h1;h2;h3;h4;h5;h6;pre;address;div';
+ 91
+ 92 CKEDITOR.config.format_p		= { element : 'p' };
+ 93 CKEDITOR.config.format_div		= { element : 'div' };
+ 94 CKEDITOR.config.format_pre		= { element : 'pre' };
+ 95 CKEDITOR.config.format_address	= { element : 'address' };
+ 96 CKEDITOR.config.format_h1		= { element : 'h1' };
+ 97 CKEDITOR.config.format_h2		= { element : 'h2' };
+ 98 CKEDITOR.config.format_h3		= { element : 'h3' };
+ 99 CKEDITOR.config.format_h4		= { element : 'h4' };
+100 CKEDITOR.config.format_h5		= { element : 'h5' };
+101 CKEDITOR.config.format_h6		= { element : 'h6' };
+102 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_button.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_button.js.html new file mode 100644 index 000000000..374a23d24 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_button.js.html @@ -0,0 +1,143 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5 CKEDITOR.dialog.add( 'button', function( editor )
+  6 {
+  7 	return {
+  8 		title : editor.lang.button.title,
+  9 		minWidth : 350,
+ 10 		minHeight : 150,
+ 11 		onShow : function()
+ 12 		{
+ 13 			delete this.button;
+ 14 			var element = this.getParentEditor().getSelection().getSelectedElement();
+ 15 			if ( element && element.getName() == "input" )
+ 16 			{
+ 17 				var type = element.getAttribute( 'type' );
+ 18 				if ( type == "button" || type == "reset" || type == "submit" )
+ 19 				{
+ 20 					this.button = element;
+ 21 					this.setupContent( element );
+ 22 				}
+ 23 			}
+ 24 		},
+ 25 		onOk : function()
+ 26 		{
+ 27 			var editor,
+ 28 				element = this.button,
+ 29 				isInsertMode = !element;
+ 30
+ 31 			if ( isInsertMode )
+ 32 			{
+ 33 				editor = this.getParentEditor();
+ 34 				element = editor.document.createElement( 'input' );
+ 35 			}
+ 36
+ 37 			if ( isInsertMode )
+ 38 				editor.insertElement( element );
+ 39 			this.commitContent( { element : element } );
+ 40 		},
+ 41 		contents : [
+ 42 			{
+ 43 				id : 'info',
+ 44 				label : editor.lang.button.title,
+ 45 				title : editor.lang.button.title,
+ 46 				elements : [
+ 47 					{
+ 48 						id : '_cke_saved_name',
+ 49 						type : 'text',
+ 50 						label : editor.lang.common.name,
+ 51 						'default' : '',
+ 52 						setup : function( element )
+ 53 						{
+ 54 							this.setValue(
+ 55 									element.getAttribute( '_cke_saved_name' ) ||
+ 56 									element.getAttribute( 'name' ) ||
+ 57 									'' );
+ 58 						},
+ 59 						commit : function( data )
+ 60 						{
+ 61 							var element = data.element;
+ 62
+ 63 							if ( this.getValue() )
+ 64 								element.setAttribute( '_cke_saved_name', this.getValue() );
+ 65 							else
+ 66 							{
+ 67 								element.removeAttribute( '_cke_saved_name' );
+ 68 								element.removeAttribute( 'name' );
+ 69 							}
+ 70 						}
+ 71 					},
+ 72 					{
+ 73 						id : 'value',
+ 74 						type : 'text',
+ 75 						label : editor.lang.button.text,
+ 76 						accessKey : 'V',
+ 77 						'default' : '',
+ 78 						setup : function( element )
+ 79 						{
+ 80 							this.setValue( element.getAttribute( 'value' ) || '' );
+ 81 						},
+ 82 						commit : function( data )
+ 83 						{
+ 84 							var element = data.element;
+ 85
+ 86 							if ( this.getValue() )
+ 87 								element.setAttribute( 'value', this.getValue() );
+ 88 							else
+ 89 								element.removeAttribute( 'value' );
+ 90 						}
+ 91 					},
+ 92 					{
+ 93 						id : 'type',
+ 94 						type : 'select',
+ 95 						label : editor.lang.button.type,
+ 96 						'default' : 'button',
+ 97 						accessKey : 'T',
+ 98 						items :
+ 99 						[
+100 							[ editor.lang.button.typeBtn, 'button' ],
+101 							[ editor.lang.button.typeSbm, 'submit' ],
+102 							[ editor.lang.button.typeRst, 'reset' ]
+103 						],
+104 						setup : function( element )
+105 						{
+106 							this.setValue( element.getAttribute( 'type' ) || '' );
+107 						},
+108 						commit : function( data )
+109 						{
+110 							var element = data.element;
+111
+112 							if ( CKEDITOR.env.ie )
+113 							{
+114 								var elementType = element.getAttribute( 'type' );
+115 								var currentType = this.getValue();
+116
+117 								if ( currentType != elementType )
+118 								{
+119 									var replace = CKEDITOR.dom.element.createFromHtml( '<input type="' + currentType +
+120 										'"></input>', editor.document );
+121 									element.copyAttributes( replace, { type : 1 } );
+122 									replace.replace( element );
+123 									editor.getSelection().selectElement( replace );
+124 									data.element = replace;
+125 								}
+126 							}
+127 							else
+128 								element.setAttribute( 'type', this.getValue() );
+129 						}
+130 					}
+131 				]
+132 			}
+133 		]
+134 	};
+135 });
+136 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_checkbox.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_checkbox.js.html new file mode 100644 index 000000000..33049e2ba --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_checkbox.js.html @@ -0,0 +1,146 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5 CKEDITOR.dialog.add( 'checkbox', function( editor )
+  6 {
+  7 	return {
+  8 		title : editor.lang.checkboxAndRadio.checkboxTitle,
+  9 		minWidth : 350,
+ 10 		minHeight : 140,
+ 11 		onShow : function()
+ 12 		{
+ 13 			delete this.checkbox;
+ 14
+ 15 			var element = this.getParentEditor().getSelection().getSelectedElement();
+ 16
+ 17 			if ( element && element.getAttribute( 'type' ) == "checkbox" )
+ 18 			{
+ 19 				this.checkbox = element;
+ 20 				this.setupContent( element );
+ 21 			}
+ 22 		},
+ 23 		onOk : function()
+ 24 		{
+ 25 			var editor,
+ 26 				element = this.checkbox,
+ 27 				isInsertMode = !element;
+ 28
+ 29 			if ( isInsertMode )
+ 30 			{
+ 31 				editor = this.getParentEditor();
+ 32 				element = editor.document.createElement( 'input' );
+ 33 				element.setAttribute( 'type', 'checkbox' );
+ 34 			}
+ 35
+ 36 			if ( isInsertMode )
+ 37 				editor.insertElement( element );
+ 38 			this.commitContent( { element : element } );
+ 39 		},
+ 40 		contents : [
+ 41 			{
+ 42 				id : 'info',
+ 43 				label : editor.lang.checkboxAndRadio.checkboxTitle,
+ 44 				title : editor.lang.checkboxAndRadio.checkboxTitle,
+ 45 				startupFocus : 'txtName',
+ 46 				elements : [
+ 47 					{
+ 48 						id : 'txtName',
+ 49 						type : 'text',
+ 50 						label : editor.lang.common.name,
+ 51 						'default' : '',
+ 52 						accessKey : 'N',
+ 53 						setup : function( element )
+ 54 						{
+ 55 							this.setValue(
+ 56 									element.getAttribute( '_cke_saved_name' ) ||
+ 57 									element.getAttribute( 'name' ) ||
+ 58 									'' );
+ 59 						},
+ 60 						commit : function( data )
+ 61 						{
+ 62 							var element = data.element;
+ 63
+ 64 							// IE failed to update 'name' property on input elements, protect it now.
+ 65 							if ( this.getValue() )
+ 66 								element.setAttribute( '_cke_saved_name', this.getValue() );
+ 67 							else
+ 68 							{
+ 69 								element.removeAttribute( '_cke_saved_name' );
+ 70 								element.removeAttribute( 'name' );
+ 71 							}
+ 72 						}
+ 73 					},
+ 74 					{
+ 75 						id : 'txtValue',
+ 76 						type : 'text',
+ 77 						label : editor.lang.checkboxAndRadio.value,
+ 78 						'default' : '',
+ 79 						accessKey : 'V',
+ 80 						setup : function( element )
+ 81 						{
+ 82 							this.setValue( element.getAttribute( 'value' ) || '' );
+ 83 						},
+ 84 						commit : function( data )
+ 85 						{
+ 86 							var element = data.element;
+ 87
+ 88 							if ( this.getValue() )
+ 89 								element.setAttribute( 'value', this.getValue() );
+ 90 							else
+ 91 								element.removeAttribute( 'value' );
+ 92 						}
+ 93 					},
+ 94 					{
+ 95 						id : 'cmbSelected',
+ 96 						type : 'checkbox',
+ 97 						label : editor.lang.checkboxAndRadio.selected,
+ 98 						'default' : '',
+ 99 						accessKey : 'S',
+100 						value : "checked",
+101 						setup : function( element )
+102 						{
+103 							this.setValue( element.getAttribute( 'checked' ) );
+104 						},
+105 						commit : function( data )
+106 						{
+107 							var element = data.element;
+108
+109 							if ( CKEDITOR.env.ie )
+110 							{
+111 								var isElementChecked = !!element.getAttribute( 'checked' );
+112 								var isChecked = !!this.getValue();
+113
+114 								if ( isElementChecked != isChecked )
+115 								{
+116 									var replace = CKEDITOR.dom.element.createFromHtml( '<input type="checkbox"'
+117 										   + ( isChecked ? ' checked="checked"' : '' )
+118 										   + '></input>', editor.document );
+119 									element.copyAttributes( replace, { type : 1, checked : 1 } );
+120 									replace.replace( element );
+121 									editor.getSelection().selectElement( replace );
+122 									data.element = replace;
+123 								}
+124 							}
+125 							else
+126 							{
+127 								if ( this.getValue() )
+128 									element.setAttribute( 'checked', this.getValue() );
+129 								else
+130 									element.removeAttribute( 'checked' );
+131 							}
+132 						}
+133 					}
+134 				]
+135 			}
+136 		]
+137 	};
+138 });
+139 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_form.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_form.js.html new file mode 100644 index 000000000..90199908c --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_form.js.html @@ -0,0 +1,185 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5 CKEDITOR.dialog.add( 'form', function( editor )
+  6 {
+  7 	var autoAttributes =
+  8 	{
+  9 		action : 1,
+ 10 		id : 1,
+ 11 		method : 1,
+ 12 		encoding : 1,
+ 13 		target : 1
+ 14 	};
+ 15
+ 16 	return {
+ 17 		title : editor.lang.form.title,
+ 18 		minWidth : 350,
+ 19 		minHeight : 200,
+ 20 		onShow : function()
+ 21 		{
+ 22 			delete this.form;
+ 23
+ 24 			var element = this.getParentEditor().getSelection().getStartElement();
+ 25 			var form = element && element.getAscendant( 'form', true );
+ 26 			if ( form )
+ 27 			{
+ 28 				this.form = form;
+ 29 				this.setupContent( form );
+ 30 			}
+ 31 		},
+ 32 		onOk : function()
+ 33 		{
+ 34 			var editor,
+ 35 				element = this.form,
+ 36 				isInsertMode = !element;
+ 37
+ 38 			if ( isInsertMode )
+ 39 			{
+ 40 				editor = this.getParentEditor();
+ 41 				element = editor.document.createElement( 'form' );
+ 42 				element.append( editor.document.createElement( 'br' ) );
+ 43 			}
+ 44
+ 45 			if ( isInsertMode )
+ 46 				editor.insertElement( element );
+ 47 			this.commitContent( element );
+ 48 		},
+ 49 		onLoad : function()
+ 50 		{
+ 51 			function autoSetup( element )
+ 52 			{
+ 53 				this.setValue( element.getAttribute( this.id ) || '' );
+ 54 			}
+ 55
+ 56 			function autoCommit( element )
+ 57 			{
+ 58 				if ( this.getValue() )
+ 59 					element.setAttribute( this.id, this.getValue() );
+ 60 				else
+ 61 					element.removeAttribute( this.id );
+ 62 			}
+ 63
+ 64 			this.foreach( function( contentObj )
+ 65 				{
+ 66 					if ( autoAttributes[ contentObj.id ] )
+ 67 					{
+ 68 						contentObj.setup = autoSetup;
+ 69 						contentObj.commit = autoCommit;
+ 70 					}
+ 71 				} );
+ 72 		},
+ 73 		contents : [
+ 74 			{
+ 75 				id : 'info',
+ 76 				label : editor.lang.form.title,
+ 77 				title : editor.lang.form.title,
+ 78 				elements : [
+ 79 					{
+ 80 						id : 'txtName',
+ 81 						type : 'text',
+ 82 						label : editor.lang.common.name,
+ 83 						'default' : '',
+ 84 						accessKey : 'N',
+ 85 						setup : function( element )
+ 86 						{
+ 87 							this.setValue( element.getAttribute( '_cke_saved_name' ) ||
+ 88 									element.getAttribute( 'name' ) ||
+ 89 									'' );
+ 90 						},
+ 91 						commit : function( element )
+ 92 						{
+ 93 							if ( this.getValue() )
+ 94 								element.setAttribute( '_cke_saved_name', this.getValue() );
+ 95 							else
+ 96 							{
+ 97 								element.removeAttribute( '_cke_saved_name' );
+ 98 								element.removeAttribute( 'name' );
+ 99 							}
+100 						}
+101 					},
+102 					{
+103 						id : 'action',
+104 						type : 'text',
+105 						label : editor.lang.form.action,
+106 						'default' : '',
+107 						accessKey : 'A'
+108 					},
+109 					{
+110 						type : 'hbox',
+111 						widths : [ '45%', '55%' ],
+112 						children :
+113 						[
+114 							{
+115 								id : 'id',
+116 								type : 'text',
+117 								label : editor.lang.common.id,
+118 								'default' : '',
+119 								accessKey : 'I'
+120 							},
+121 							{
+122 								id : 'encoding',
+123 								type : 'select',
+124 								label : editor.lang.form.encoding,
+125 								style : 'width:100%',
+126 								accessKey : 'E',
+127 								'default' : '',
+128 								items :
+129 								[
+130 									[ '' ],
+131 									[ 'text/plain' ],
+132 									[ 'multipart/form-data' ],
+133 									[ 'application/x-www-form-urlencoded' ]
+134 								]
+135 							}
+136 						]
+137 					},
+138 					{
+139 						type : 'hbox',
+140 						widths : [ '45%', '55%' ],
+141 						children :
+142 						[
+143 							{
+144 								id : 'target',
+145 								type : 'select',
+146 								label : editor.lang.form.target,
+147 								style : 'width:100%',
+148 								accessKey : 'M',
+149 								'default' : '',
+150 								items :
+151 								[
+152 									[ editor.lang.form.targetNotSet, '' ],
+153 									[ editor.lang.form.targetNew, '_blank' ],
+154 									[ editor.lang.form.targetTop, '_top' ],
+155 									[ editor.lang.form.targetSelf, '_self' ],
+156 									[ editor.lang.form.targetParent, '_parent' ]
+157 								]
+158 							},
+159 							{
+160 								id : 'method',
+161 								type : 'select',
+162 								label : editor.lang.form.method,
+163 								accessKey : 'M',
+164 								'default' : 'GET',
+165 								items :
+166 								[
+167 									[ 'GET', 'get' ],
+168 									[ 'POST', 'post' ]
+169 								]
+170 							}
+171 						]
+172 					}
+173 				]
+174 			}
+175 		]
+176 	};
+177 });
+178 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_hiddenfield.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_hiddenfield.js.html new file mode 100644 index 000000000..7bb89e7ee --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_hiddenfield.js.html @@ -0,0 +1,99 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5 CKEDITOR.dialog.add( 'hiddenfield', function( editor )
+  6 {
+  7 	return {
+  8 		title : editor.lang.hidden.title,
+  9 		minWidth : 350,
+ 10 		minHeight : 110,
+ 11 		onShow : function()
+ 12 		{
+ 13 			delete this.hiddenField;
+ 14
+ 15 			var element = this.getParentEditor().getSelection().getSelectedElement();
+ 16 			if ( element && element.getName() == "input" && element.getAttribute( 'type' ) == "checkbox" )
+ 17 			{
+ 18 				this.hiddenField = element;
+ 19 				this.setupContent( element );
+ 20 			}
+ 21 		},
+ 22 		onOk : function()
+ 23 		{
+ 24 			var editor,
+ 25 				element = this.hiddenField,
+ 26 				isInsertMode = !element;
+ 27
+ 28 			if ( isInsertMode )
+ 29 			{
+ 30 				editor = this.getParentEditor();
+ 31 				element = editor.document.createElement( 'input' );
+ 32 				element.setAttribute( 'type', 'hidden' );
+ 33 			}
+ 34
+ 35 			if ( isInsertMode )
+ 36 				editor.insertElement( element );
+ 37 			this.commitContent( element );
+ 38 		},
+ 39 		contents : [
+ 40 			{
+ 41 				id : 'info',
+ 42 				label : editor.lang.hidden.title,
+ 43 				title : editor.lang.hidden.title,
+ 44 				elements : [
+ 45 					{
+ 46 						id : '_cke_saved_name',
+ 47 						type : 'text',
+ 48 						label : editor.lang.hidden.name,
+ 49 						'default' : '',
+ 50 						accessKey : 'N',
+ 51 						setup : function( element )
+ 52 						{
+ 53 							this.setValue(
+ 54 									element.getAttribute( '_cke_saved_name' ) ||
+ 55 									element.getAttribute( 'name' ) ||
+ 56 									'' );
+ 57 						},
+ 58 						commit : function( element )
+ 59 						{
+ 60 							if ( this.getValue() )
+ 61 								element.setAttribute( '_cke_saved_name', this.getValue() );
+ 62 							else
+ 63 							{
+ 64 								element.removeAttribute( '_cke_saved_name' );
+ 65 								element.removeAttribute( 'name' );
+ 66 							}
+ 67 						}
+ 68 					},
+ 69 					{
+ 70 						id : 'value',
+ 71 						type : 'text',
+ 72 						label : editor.lang.hidden.value,
+ 73 						'default' : '',
+ 74 						accessKey : 'V',
+ 75 						setup : function( element )
+ 76 						{
+ 77 							this.setValue( element.getAttribute( 'value' ) || '' );
+ 78 						},
+ 79 						commit : function( element )
+ 80 						{
+ 81 							if ( this.getValue() )
+ 82 								element.setAttribute( 'value', this.getValue() );
+ 83 							else
+ 84 								element.removeAttribute( 'value' );
+ 85 						}
+ 86 					}
+ 87 				]
+ 88 			}
+ 89 		]
+ 90 	};
+ 91 });
+ 92 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_radio.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_radio.js.html new file mode 100644 index 000000000..0fe702012 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_radio.js.html @@ -0,0 +1,143 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5 CKEDITOR.dialog.add( 'radio', function( editor )
+  6 {
+  7 	return {
+  8 		title : editor.lang.checkboxAndRadio.radioTitle,
+  9 		minWidth : 350,
+ 10 		minHeight : 140,
+ 11 		onShow : function()
+ 12 		{
+ 13 			delete this.radioButton;
+ 14
+ 15 			var element = this.getParentEditor().getSelection().getSelectedElement();
+ 16 			if ( element && element.getName() == "input" && element.getAttribute( 'type' ) == "radio" )
+ 17 			{
+ 18 				this.radioButton = element;
+ 19 				this.setupContent( element );
+ 20 			}
+ 21 		},
+ 22 		onOk : function()
+ 23 		{
+ 24 			var editor,
+ 25 				element = this.radioButton,
+ 26 				isInsertMode = !element;
+ 27
+ 28 			if ( isInsertMode )
+ 29 			{
+ 30 				editor = this.getParentEditor();
+ 31 				element = editor.document.createElement( 'input' );
+ 32 				element.setAttribute( 'type', 'radio' );
+ 33 			}
+ 34
+ 35 			if ( isInsertMode )
+ 36 				editor.insertElement( element );
+ 37 			this.commitContent( { element : element } );
+ 38 		},
+ 39 		contents : [
+ 40 			{
+ 41 				id : 'info',
+ 42 				label : editor.lang.checkboxAndRadio.radioTitle,
+ 43 				title : editor.lang.checkboxAndRadio.radioTitle,
+ 44 				elements : [
+ 45 					{
+ 46 						id : 'name',
+ 47 						type : 'text',
+ 48 						label : editor.lang.common.name,
+ 49 						'default' : '',
+ 50 						accessKey : 'N',
+ 51 						setup : function( element )
+ 52 						{
+ 53 							this.setValue(
+ 54 									element.getAttribute( '_cke_saved_name' ) ||
+ 55 									element.getAttribute( 'name' ) ||
+ 56 									'' );
+ 57 						},
+ 58 						commit : function( data )
+ 59 						{
+ 60 							var element = data.element;
+ 61
+ 62 							if ( this.getValue() )
+ 63 								element.setAttribute( '_cke_saved_name', this.getValue() );
+ 64 							else
+ 65 							{
+ 66 								element.removeAttribute( '_cke_saved_name' );
+ 67 								element.removeAttribute( 'name' );
+ 68 							}
+ 69 						}
+ 70 					},
+ 71 					{
+ 72 						id : 'value',
+ 73 						type : 'text',
+ 74 						label : editor.lang.checkboxAndRadio.value,
+ 75 						'default' : '',
+ 76 						accessKey : 'V',
+ 77 						setup : function( element )
+ 78 						{
+ 79 							this.setValue( element.getAttribute( 'value' ) || '' );
+ 80 						},
+ 81 						commit : function( data )
+ 82 						{
+ 83 							var element = data.element;
+ 84
+ 85 							if ( this.getValue() )
+ 86 								element.setAttribute( 'value', this.getValue() );
+ 87 							else
+ 88 								element.removeAttribute( 'value' );
+ 89 						}
+ 90 					},
+ 91 					{
+ 92 						id : 'checked',
+ 93 						type : 'checkbox',
+ 94 						label : editor.lang.checkboxAndRadio.selected,
+ 95 						'default' : '',
+ 96 						accessKey : 'S',
+ 97 						value : "checked",
+ 98 						setup : function( element )
+ 99 						{
+100 							this.setValue( element.getAttribute( 'checked' ) );
+101 						},
+102 						commit : function( data )
+103 						{
+104 							var element = data.element;
+105
+106 							if ( !CKEDITOR.env.ie )
+107 							{
+108 								if ( this.getValue() )
+109 									element.setAttribute( 'checked', 'checked' );
+110 								else
+111 									element.removeAttribute( 'checked' );
+112 							}
+113 							else
+114 							{
+115 								var isElementChecked = element.getAttribute( 'checked' );
+116 								var isChecked = !!this.getValue();
+117
+118 								if ( isElementChecked != isChecked )
+119 								{
+120 									var replace = CKEDITOR.dom.element.createFromHtml( '<input type="radio"'
+121 											+ ( isChecked ? ' checked="checked"' : '' )
+122 											+ '></input>', editor.document );
+123 									element.copyAttributes( replace, { type : 1, checked : 1 } );
+124 									replace.replace( element );
+125 									editor.getSelection().selectElement( replace );
+126 									data.element = replace;
+127 								}
+128 							}
+129 						}
+130 					}
+131 				]
+132 			}
+133 		]
+134 	};
+135 });
+136 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_select.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_select.js.html new file mode 100644 index 000000000..21370e0d8 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_select.js.html @@ -0,0 +1,549 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5 CKEDITOR.dialog.add( 'select', function( editor )
+  6 {
+  7 	// Add a new option to a SELECT object (combo or list).
+  8 	function addOption( combo, optionText, optionValue, documentObject, index )
+  9 	{
+ 10 		combo = getSelect( combo );
+ 11 		var oOption;
+ 12 		if ( documentObject )
+ 13 			oOption = documentObject.createElement( "OPTION" );
+ 14 		else
+ 15 			oOption = document.createElement( "OPTION" );
+ 16
+ 17 		if ( combo && oOption && oOption.getName() == 'option' )
+ 18 		{
+ 19 			if ( CKEDITOR.env.ie ) {
+ 20 				if ( !isNaN( parseInt( index, 10) ) )
+ 21 					combo.$.options.add( oOption.$, index );
+ 22 				else
+ 23 					combo.$.options.add( oOption.$ );
+ 24
+ 25 				oOption.$.innerHTML = optionText.length > 0 ? optionText : '';
+ 26 				oOption.$.value     = optionValue;
+ 27 			}
+ 28 			else
+ 29 			{
+ 30 				if ( index !== null && index < combo.getChildCount() )
+ 31 					combo.getChild( index < 0 ? 0 : index ).insertBeforeMe( oOption );
+ 32 				else
+ 33 					combo.append( oOption );
+ 34
+ 35 				oOption.setText( optionText.length > 0 ? optionText : '' );
+ 36 				oOption.setValue( optionValue );
+ 37 			}
+ 38 		}
+ 39 		else
+ 40 			return false;
+ 41
+ 42 		return oOption;
+ 43 	}
+ 44 	// Remove all selected options from a SELECT object.
+ 45 	function removeSelectedOptions( combo )
+ 46 	{
+ 47 		combo = getSelect( combo );
+ 48
+ 49 		// Save the selected index
+ 50 		var iSelectedIndex = getSelectedIndex( combo );
+ 51
+ 52 		// Remove all selected options.
+ 53 		for ( var i = combo.getChildren().count() - 1 ; i >= 0 ; i-- )
+ 54 		{
+ 55 			if ( combo.getChild( i ).$.selected )
+ 56 				combo.getChild( i ).remove();
+ 57 		}
+ 58
+ 59 		// Reset the selection based on the original selected index.
+ 60 		setSelectedIndex( combo, iSelectedIndex );
+ 61 	}
+ 62 	//Modify option  from a SELECT object.
+ 63 	function modifyOption( combo, index, title, value )
+ 64 	{
+ 65 		combo = getSelect( combo );
+ 66 		if ( index < 0 )
+ 67 			return false;
+ 68 		var child = combo.getChild( index );
+ 69 		child.setText( title );
+ 70 		child.setValue( value );
+ 71 		return child;
+ 72 	}
+ 73 	function removeAllOptions( combo )
+ 74 	{
+ 75 		combo = getSelect( combo );
+ 76 		while( combo.getChild( 0 ) && combo.getChild( 0 ).remove() )
+ 77 		{ /*jsl:pass*/ }
+ 78 	}
+ 79 	// Moves the selected option by a number of steps (also negative).
+ 80 	function changeOptionPosition( combo, steps, documentObject )
+ 81 	{
+ 82 		combo = getSelect( combo );
+ 83 		var iActualIndex = getSelectedIndex( combo );
+ 84 		if ( iActualIndex < 0 )
+ 85 			return false;
+ 86
+ 87 		var iFinalIndex = iActualIndex + steps;
+ 88 		iFinalIndex = ( iFinalIndex < 0 ) ? 0 : iFinalIndex;
+ 89 		iFinalIndex = ( iFinalIndex >= combo.getChildCount() ) ? combo.getChildCount() - 1 : iFinalIndex;
+ 90
+ 91 		if ( iActualIndex == iFinalIndex )
+ 92 			return false;
+ 93
+ 94 		var oOption = combo.getChild( iActualIndex ),
+ 95 			sText	= oOption.getText(),
+ 96 			sValue	= oOption.getValue();
+ 97
+ 98 		oOption.remove();
+ 99
+100 		oOption = addOption( combo, sText, sValue, ( !documentObject ) ? null : documentObject, iFinalIndex );
+101 		setSelectedIndex( combo, iFinalIndex );
+102 		return oOption;
+103 	}
+104 	function getSelectedIndex( combo )
+105 	{
+106 		combo = getSelect( combo );
+107 		return combo ? combo.$.selectedIndex : -1;
+108 	}
+109 	function setSelectedIndex( combo, index )
+110 	{
+111 		combo = getSelect( combo );
+112 		if ( index < 0 )
+113 			return null;
+114 		var count = combo.getChildren().count();
+115 		combo.$.selectedIndex = ( index >= count ) ? ( count - 1 ) : index;
+116 		return combo;
+117 	}
+118 	function getOptions( combo )
+119 	{
+120 		combo = getSelect( combo );
+121 		return combo ? combo.getChildren() : false;
+122 	}
+123 	function getSelect( obj )
+124 	{
+125 		if ( obj && obj.domId && obj.getInputElement().$ )				// Dialog element.
+126 			return  obj.getInputElement();
+127 		else if ( obj && obj.$ )
+128 			return obj;
+129 		return false;
+130 	}
+131
+132 	return {
+133 		title : editor.lang.select.title,
+134 		minWidth : CKEDITOR.env.ie ? 460 : 395,
+135 		minHeight : CKEDITOR.env.ie ? 320 : 300,
+136 		onShow : function()
+137 		{
+138 			delete this.selectBox;
+139 			this.setupContent( 'clear' );
+140 			var element = this.getParentEditor().getSelection().getSelectedElement();
+141 			if ( element && element.getName() == "select" )
+142 			{
+143 				this.selectBox = element;
+144 				this.setupContent( element.getName(), element );
+145
+146 				// Load Options into dialog.
+147 				var objOptions = getOptions( element );
+148 				for ( var i = 0 ; i < objOptions.count() ; i++ )
+149 					this.setupContent( 'option', objOptions.getItem( i ) );
+150 			}
+151 		},
+152 		onOk : function()
+153 		{
+154 			var editor = this.getParentEditor(),
+155 				element = this.selectBox,
+156 				isInsertMode = !element;
+157
+158 			if ( isInsertMode )
+159 				element = editor.document.createElement( 'select' );
+160 			this.commitContent( element );
+161
+162 			if ( isInsertMode )
+163 				editor.insertElement( element );
+164 		},
+165 		contents : [
+166 			{
+167 				id : 'info',
+168 				label : editor.lang.select.selectInfo,
+169 				title : editor.lang.select.selectInfo,
+170 				accessKey : '',
+171 				elements : [
+172 					{
+173 						id : 'txtName',
+174 						type : 'text',
+175 						widths : [ '25%','75%' ],
+176 						labelLayout : 'horizontal',
+177 						label : editor.lang.common.name,
+178 						'default' : '',
+179 						accessKey : 'N',
+180 						align : 'center',
+181 						style : 'width:350px',
+182 						setup : function( name, element )
+183 						{
+184 							if ( name == 'clear' )
+185 								this.setValue( '' );
+186 							else if ( name == 'select' )
+187 							{
+188 								this.setValue(
+189 										element.getAttribute( '_cke_saved_name' ) ||
+190 										element.getAttribute( 'name' ) ||
+191 										'' );
+192 							}
+193 						},
+194 						commit : function( element )
+195 						{
+196 							if ( this.getValue() )
+197 								element.setAttribute( '_cke_saved_name', this.getValue() );
+198 							else
+199 							{
+200 								element.removeAttribute( '_cke_saved_name' ) ;
+201 								element.removeAttribute( 'name' );
+202 							}
+203 						}
+204 					},
+205 					{
+206 						id : 'txtValue',
+207 						type : 'text',
+208 						widths : [ '25%','75%' ],
+209 						labelLayout : 'horizontal',
+210 						label : editor.lang.select.value,
+211 						style : 'width:350px',
+212 						'default' : '',
+213 						className : 'cke_disabled',
+214 						onLoad : function()
+215 						{
+216 							this.getInputElement().setAttribute( 'readOnly', true );
+217 						},
+218 						setup : function( name, element )
+219 						{
+220 							if ( name == 'clear' )
+221 								this.setValue( '' );
+222 							else if ( name == 'option' && element.getAttribute( 'selected' ) )
+223 								this.setValue( element.$.value );
+224 						}
+225 					},
+226 					{
+227 						type : 'hbox',
+228 						widths : [ '175px', '170px' ],
+229 						align : 'center',
+230 						children :
+231 						[
+232 							{
+233 								id : 'txtSize',
+234 								type : 'text',
+235 								align : 'center',
+236 								labelLayout : 'horizontal',
+237 								label : editor.lang.select.size,
+238 								'default' : '',
+239 								accessKey : 'S',
+240 								style : 'width:175px',
+241 								validate: function()
+242 								{
+243 									var func = CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed );
+244 									return ( ( this.getValue() === '' ) || func.apply( this ) );
+245 								},
+246 								setup : function( name, element )
+247 								{
+248 									if ( name == 'select' )
+249 										this.setValue( element.getAttribute( 'size' ) || '' );
+250 								},
+251 								commit : function( element )
+252 								{
+253 									if ( this.getValue() )
+254 										element.setAttribute( 'size', this.getValue() );
+255 									else
+256 										element.removeAttribute( 'size' );
+257 								}
+258 							},
+259 							{
+260 								type : 'html',
+261 								html : '<span>' + CKEDITOR.tools.htmlEncode( editor.lang.select.lines ) + '</span>'
+262 							}
+263 						]
+264 					},
+265 					{
+266 						type : 'html',
+267 						html : '<span>' + CKEDITOR.tools.htmlEncode( editor.lang.select.opAvail ) + '</span>'
+268 					},
+269 					{
+270 						type : 'hbox',
+271 						widths : [ '115px', '115px' ,'100px' ],
+272 						align : 'top',
+273 						children :
+274 						[
+275 							{
+276 								type : 'vbox',
+277 								children :
+278 								[
+279 									{
+280 										id : 'txtOptName',
+281 										type : 'text',
+282 										label : editor.lang.select.opText,
+283 										style : 'width:115px',
+284 										setup : function( name, element )
+285 										{
+286 											if ( name == 'clear' )
+287 												this.setValue( "" );
+288 										}
+289 									},
+290 									{
+291 										type : 'select',
+292 										id : 'cmbName',
+293 										label : '',
+294 										title : '',
+295 										size : 5,
+296 										style : 'width:115px;height:75px',
+297 										items : [],
+298 										onChange : function()
+299 										{
+300 											var dialog = this.getDialog(),
+301 												values = dialog.getContentElement( 'info', 'cmbValue' ),
+302 												optName = dialog.getContentElement( 'info', 'txtOptName' ),
+303 												optValue = dialog.getContentElement( 'info', 'txtOptValue' ),
+304 												iIndex = getSelectedIndex( this );
+305
+306 											setSelectedIndex( values, iIndex );
+307 											optName.setValue( this.getValue() );
+308 											optValue.setValue( values.getValue() );
+309 										},
+310 										setup : function( name, element )
+311 										{
+312 											if ( name == 'clear' )
+313 												removeAllOptions( this );
+314 											else if ( name == 'option' )
+315 												addOption( this, element.getText(), element.getText(),
+316 													this.getDialog().getParentEditor().document );
+317 										},
+318 										commit : function( element )
+319 										{
+320 											var dialog = this.getDialog(),
+321 												optionsNames = getOptions( this ),
+322 												optionsValues = getOptions( dialog.getContentElement( 'info', 'cmbValue' ) ),
+323 												selectValue = dialog.getContentElement( 'info', 'txtValue' ).getValue();
+324
+325 											removeAllOptions( element );
+326
+327 											for ( var i = 0 ; i < optionsNames.count() ; i++ )
+328 											{
+329 												var oOption = addOption( element, optionsNames.getItem( i ).getValue(),
+330 													optionsValues.getItem( i ).getValue(), dialog.getParentEditor().document );
+331 												if ( optionsValues.getItem( i ).getValue() == selectValue )
+332 												{
+333 													oOption.setAttribute( 'selected', 'selected' );
+334 													oOption.selected = true;
+335 												}
+336 											}
+337 										}
+338 									}
+339 								]
+340 							},
+341 							{
+342 								type : 'vbox',
+343 								children :
+344 								[
+345 									{
+346 										id : 'txtOptValue',
+347 										type : 'text',
+348 										label : editor.lang.select.opValue,
+349 										style : 'width:115px',
+350 										setup : function( name, element )
+351 										{
+352 											if ( name == 'clear' )
+353 												this.setValue( "" );
+354 										}
+355 									},
+356 									{
+357 										type : 'select',
+358 										id : 'cmbValue',
+359 										label : '',
+360 										size : 5,
+361 										style : 'width:115px;height:75px',
+362 										items : [],
+363 										onChange : function()
+364 										{
+365 											var dialog = this.getDialog(),
+366 												names = dialog.getContentElement( 'info', 'cmbName' ),
+367 												optName = dialog.getContentElement( 'info', 'txtOptName' ),
+368 												optValue = dialog.getContentElement( 'info', 'txtOptValue' ),
+369 												iIndex = getSelectedIndex( this );
+370
+371 											setSelectedIndex( names, iIndex );
+372 											optName.setValue( names.getValue() );
+373 											optValue.setValue( this.getValue() );
+374 										},
+375 										setup : function( name, element )
+376 										{
+377 											if ( name == 'clear' )
+378 												removeAllOptions( this );
+379 											else if ( name == 'option' )
+380 											{
+381 												var oValue	= element.getValue();
+382 												addOption( this, oValue, oValue,
+383 													this.getDialog().getParentEditor().document );
+384 												if ( element.getAttribute( 'selected' ) == 'selected' )
+385 													this.getDialog().getContentElement( 'info', 'txtValue' ).setValue( oValue );
+386 											}
+387 										}
+388 									}
+389 								]
+390 							},
+391 							{
+392 								type : 'vbox',
+393 								padding : 5,
+394 								children :
+395 								[
+396 									{
+397 										type : 'button',
+398 										style : '',
+399 										label : editor.lang.select.btnAdd,
+400 										title : editor.lang.select.btnAdd,
+401 										style : 'width:100%;',
+402 										onClick : function()
+403 										{
+404 											//Add new option.
+405 											var dialog = this.getDialog(),
+406 												parentEditor = dialog.getParentEditor(),
+407 												optName = dialog.getContentElement( 'info', 'txtOptName' ),
+408 												optValue = dialog.getContentElement( 'info', 'txtOptValue' ),
+409 												names = dialog.getContentElement( 'info', 'cmbName' ),
+410 												values = dialog.getContentElement( 'info', 'cmbValue' );
+411
+412 											addOption(names, optName.getValue(), optName.getValue(), dialog.getParentEditor().document );
+413 											addOption(values, optValue.getValue(), optValue.getValue(), dialog.getParentEditor().document );
+414
+415 											optName.setValue( "" );
+416 											optValue.setValue( "" );
+417 										}
+418 									},
+419 									{
+420 										type : 'button',
+421 										label : editor.lang.select.btnModify,
+422 										title : editor.lang.select.btnModify,
+423 										style : 'width:100%;',
+424 										onClick : function()
+425 										{
+426 											//Modify selected option.
+427 											var dialog = this.getDialog(),
+428 												optName = dialog.getContentElement( 'info', 'txtOptName' ),
+429 												optValue = dialog.getContentElement( 'info', 'txtOptValue' ),
+430 												names = dialog.getContentElement( 'info', 'cmbName' ),
+431 												values = dialog.getContentElement( 'info', 'cmbValue' ),
+432 												iIndex = getSelectedIndex( names );
+433
+434 											if ( iIndex >= 0 )
+435 											{
+436 												modifyOption( names, iIndex, optName.getValue(), optName.getValue() );
+437 												modifyOption( values, iIndex, optValue.getValue(), optValue.getValue() );
+438 											}
+439 										}
+440 									},
+441 									{
+442 										type : 'button',
+443 										style : 'width:100%;',
+444 										label : editor.lang.select.btnUp,
+445 										title : editor.lang.select.btnUp,
+446 										onClick : function()
+447 										{
+448 											//Move up.
+449 											var dialog = this.getDialog(),
+450 												names = dialog.getContentElement( 'info', 'cmbName' ),
+451 												values = dialog.getContentElement( 'info', 'cmbValue' );
+452
+453 											changeOptionPosition( names, -1, dialog.getParentEditor().document );
+454 											changeOptionPosition( values, -1, dialog.getParentEditor().document );
+455 										}
+456 									},
+457 									{
+458 										type : 'button',
+459 										style : 'width:100%;',
+460 										label : editor.lang.select.btnDown,
+461 										title : editor.lang.select.btnDown,
+462 										onClick : function()
+463 										{
+464 											//Move down.
+465 											var dialog = this.getDialog(),
+466 												names = dialog.getContentElement( 'info', 'cmbName' ),
+467 												values = dialog.getContentElement( 'info', 'cmbValue' );
+468
+469 											changeOptionPosition( names, 1, dialog.getParentEditor().document );
+470 											changeOptionPosition( values, 1, dialog.getParentEditor().document );
+471 										}
+472 									}
+473 								]
+474 							}
+475 						]
+476 					},
+477 					{
+478 						type : 'hbox',
+479 						widths : [ '40%', '20%', '40%' ],
+480 						children :
+481 						[
+482 							{
+483 								type : 'button',
+484 								label : editor.lang.select.btnSetValue,
+485 								title : editor.lang.select.btnSetValue,
+486 								onClick : function()
+487 								{
+488 									//Set as default value.
+489 									var dialog = this.getDialog(),
+490 										values = dialog.getContentElement( 'info', 'cmbValue' ),
+491 										txtValue = dialog.getContentElement( 'info', 'txtValue' );
+492 									txtValue.setValue( values.getValue() );
+493 								}
+494 							},
+495 							{
+496 								type : 'button',
+497 								label : editor.lang.select.btnDelete,
+498 								title : editor.lang.select.btnDelete,
+499 								onClick : function()
+500 								{
+501 									// Delete option.
+502 									var dialog = this.getDialog(),
+503 										names = dialog.getContentElement( 'info', 'cmbName' ),
+504 										values = dialog.getContentElement( 'info', 'cmbValue' ),
+505 										optName = dialog.getContentElement( 'info', 'txtOptName' ),
+506 										optValue = dialog.getContentElement( 'info', 'txtOptValue' );
+507
+508 									removeSelectedOptions( names );
+509 									removeSelectedOptions( values );
+510
+511 									optName.setValue( "" );
+512 									optValue.setValue( "" );
+513 								}
+514 							},
+515 							{
+516 								id : 'chkMulti',
+517 								type : 'checkbox',
+518 								label : editor.lang.select.chkMulti,
+519 								'default' : '',
+520 								accessKey : 'M',
+521 								value : "checked",
+522 								setup : function( name, element )
+523 								{
+524 									if ( name == 'select' )
+525 										this.setValue( element.getAttribute( 'multiple' ) );
+526 								},
+527 								commit : function( element )
+528 								{
+529 									if ( this.getValue() )
+530 										element.setAttribute( 'multiple', this.getValue() );
+531 									else
+532 										element.removeAttribute( 'multiple' );
+533 								}
+534 							}
+535 						]
+536 					}
+537 				]
+538 			}
+539 		]
+540 	};
+541 });
+542 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_textarea.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_textarea.js.html new file mode 100644 index 000000000..e92ffdcc6 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_textarea.js.html @@ -0,0 +1,122 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5 CKEDITOR.dialog.add( 'textarea', function( editor )
+  6 {
+  7 	return {
+  8 		title : editor.lang.textarea.title,
+  9 		minWidth : 350,
+ 10 		minHeight : 150,
+ 11 		onShow : function()
+ 12 		{
+ 13 			delete this.textarea;
+ 14
+ 15 			var element = this.getParentEditor().getSelection().getSelectedElement();
+ 16 			if ( element && element.getName() == "textarea" )
+ 17 			{
+ 18 				this.textarea = element;
+ 19 				this.setupContent( element );
+ 20 			}
+ 21 		},
+ 22 		onOk : function()
+ 23 		{
+ 24 			var editor,
+ 25 				element = this.textarea,
+ 26 				isInsertMode = !element;
+ 27
+ 28 			if ( isInsertMode )
+ 29 			{
+ 30 				editor = this.getParentEditor();
+ 31 				element = editor.document.createElement( 'textarea' );
+ 32 			}
+ 33 			this.commitContent( element );
+ 34
+ 35 			if ( isInsertMode )
+ 36 				editor.insertElement( element );
+ 37 		},
+ 38 		contents : [
+ 39 			{
+ 40 				id : 'info',
+ 41 				label : editor.lang.textarea.title,
+ 42 				title : editor.lang.textarea.title,
+ 43 				elements : [
+ 44 					{
+ 45 						id : '_cke_saved_name',
+ 46 						type : 'text',
+ 47 						label : editor.lang.common.name,
+ 48 						'default' : '',
+ 49 						accessKey : 'N',
+ 50 						setup : function( element )
+ 51 						{
+ 52 							this.setValue(
+ 53 									element.getAttribute( '_cke_saved_name' ) ||
+ 54 									element.getAttribute( 'name' ) ||
+ 55 									'' );
+ 56 						},
+ 57 						commit : function( element )
+ 58 						{
+ 59 							if ( this.getValue() )
+ 60 								element.setAttribute( '_cke_saved_name', this.getValue() );
+ 61 							else
+ 62 							{
+ 63 								element.removeAttribute( '_cke_saved_name' );
+ 64 								element.removeAttribute( 'name' );
+ 65 							}
+ 66 						}
+ 67 					},
+ 68 					{
+ 69 						id : 'cols',
+ 70 						type : 'text',
+ 71 						label : editor.lang.textarea.cols,
+ 72 						'default' : '',
+ 73 						accessKey : 'C',
+ 74 						style : 'width:50px',
+ 75 						validate : CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed ),
+ 76 						setup : function( element )
+ 77 						{
+ 78 							var value = element.hasAttribute( 'cols' ) && element.getAttribute( 'cols' );
+ 79 							this.setValue( value || '' );
+ 80 						},
+ 81 						commit : function( element )
+ 82 						{
+ 83 							if ( this.getValue() )
+ 84 								element.setAttribute( 'cols', this.getValue() );
+ 85 							else
+ 86 								element.removeAttribute( 'cols' );
+ 87 						}
+ 88 					},
+ 89 					{
+ 90 						id : 'rows',
+ 91 						type : 'text',
+ 92 						label : editor.lang.textarea.rows,
+ 93 						'default' : '',
+ 94 						accessKey : 'R',
+ 95 						style : 'width:50px',
+ 96 						validate : CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed ),
+ 97 						setup : function( element )
+ 98 						{
+ 99 							var value = element.hasAttribute( 'rows' ) && element.getAttribute( 'rows' );
+100 							this.setValue( value || '' );
+101 						},
+102 						commit : function( element )
+103 						{
+104 							if ( this.getValue() )
+105 								element.setAttribute( 'rows', this.getValue() );
+106 							else
+107 								element.removeAttribute( 'rows' );
+108 						}
+109 					}
+110 				]
+111 			}
+112 		]
+113 	};
+114 });
+115 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_textfield.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_textfield.js.html new file mode 100644 index 000000000..31f442d19 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_dialogs_textfield.js.html @@ -0,0 +1,201 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5 CKEDITOR.dialog.add( 'textfield', function( editor )
+  6 {
+  7 	var autoAttributes =
+  8 	{
+  9 		value : 1,
+ 10 		size : 1,
+ 11 		maxLength : 1
+ 12 	};
+ 13
+ 14 	var acceptedTypes =
+ 15 	{
+ 16 		text : 1,
+ 17 		password : 1
+ 18 	};
+ 19
+ 20 	return {
+ 21 		title : editor.lang.textfield.title,
+ 22 		minWidth : 350,
+ 23 		minHeight : 150,
+ 24 		onShow : function()
+ 25 		{
+ 26 			delete this.textField;
+ 27
+ 28 			var element = this.getParentEditor().getSelection().getSelectedElement();
+ 29 			if ( element && element.getName() == "input" &&
+ 30 					( acceptedTypes[ element.getAttribute( 'type' ) ] || !element.getAttribute( 'type' ) ) )
+ 31 			{
+ 32 				this.textField = element;
+ 33 				this.setupContent( element );
+ 34 			}
+ 35 		},
+ 36 		onOk : function()
+ 37 		{
+ 38 			var editor,
+ 39 				element = this.textField,
+ 40 				isInsertMode = !element;
+ 41
+ 42 			if ( isInsertMode )
+ 43 			{
+ 44 				editor = this.getParentEditor();
+ 45 				element = editor.document.createElement( 'input' );
+ 46 				element.setAttribute( 'type', 'text' );
+ 47 			}
+ 48
+ 49 			if ( isInsertMode )
+ 50 				editor.insertElement( element );
+ 51 			this.commitContent( { element : element } );
+ 52 		},
+ 53 		onLoad : function()
+ 54 		{
+ 55 			var autoSetup = function( element )
+ 56 			{
+ 57 				var value = element.hasAttribute( this.id ) && element.getAttribute( this.id );
+ 58 				this.setValue( value || '' );
+ 59 			};
+ 60
+ 61 			var autoCommit = function( data )
+ 62 			{
+ 63 				var element = data.element;
+ 64 				var value = this.getValue();
+ 65
+ 66 				if ( value )
+ 67 					element.setAttribute( this.id, value );
+ 68 				else
+ 69 					element.removeAttribute( this.id );
+ 70 			};
+ 71
+ 72 			this.foreach( function( contentObj )
+ 73 				{
+ 74 					if ( autoAttributes[ contentObj.id ] )
+ 75 					{
+ 76 						contentObj.setup = autoSetup;
+ 77 						contentObj.commit = autoCommit;
+ 78 					}
+ 79 				} );
+ 80 		},
+ 81 		contents : [
+ 82 			{
+ 83 				id : 'info',
+ 84 				label : editor.lang.textfield.title,
+ 85 				title : editor.lang.textfield.title,
+ 86 				elements : [
+ 87 					{
+ 88 						type : 'hbox',
+ 89 						widths : [ '50%', '50%' ],
+ 90 						children :
+ 91 						[
+ 92 							{
+ 93 								id : '_cke_saved_name',
+ 94 								type : 'text',
+ 95 								label : editor.lang.textfield.name,
+ 96 								'default' : '',
+ 97 								accessKey : 'N',
+ 98 								setup : function( element )
+ 99 								{
+100 									this.setValue(
+101 											element.getAttribute( '_cke_saved_name' ) ||
+102 											element.getAttribute( 'name' ) ||
+103 											'' );
+104 								},
+105 								commit : function( data )
+106 								{
+107 									var element = data.element;
+108
+109 									if ( this.getValue() )
+110 										element.setAttribute( '_cke_saved_name', this.getValue() );
+111 									else
+112 									{
+113 										element.removeAttribute( '_cke_saved_name' );
+114 										element.removeAttribute( 'name' );
+115 									}
+116 								}
+117 							},
+118 							{
+119 								id : 'value',
+120 								type : 'text',
+121 								label : editor.lang.textfield.value,
+122 								'default' : '',
+123 								accessKey : 'V'
+124 							}
+125 						]
+126 					},
+127 					{
+128 						type : 'hbox',
+129 						widths : [ '50%', '50%' ],
+130 						children :
+131 						[
+132 							{
+133 								id : 'size',
+134 								type : 'text',
+135 								label : editor.lang.textfield.charWidth,
+136 								'default' : '',
+137 								accessKey : 'C',
+138 								style : 'width:50px',
+139 								validate : CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed )
+140 							},
+141 							{
+142 								id : 'maxLength',
+143 								type : 'text',
+144 								label : editor.lang.textfield.maxChars,
+145 								'default' : '',
+146 								accessKey : 'M',
+147 								style : 'width:50px',
+148 								validate : CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed )
+149 							}
+150 						]
+151 					},
+152 					{
+153 						id : 'type',
+154 						type : 'select',
+155 						label : editor.lang.textfield.type,
+156 						'default' : 'text',
+157 						accessKey : 'M',
+158 						items :
+159 						[
+160 							[ editor.lang.textfield.typeText, 'text' ],
+161 							[ editor.lang.textfield.typePass, 'password' ]
+162 						],
+163 						setup : function( element )
+164 						{
+165 							this.setValue( element.getAttribute( 'type' ) );
+166 						},
+167 						commit : function( data )
+168 						{
+169 							var element = data.element;
+170
+171 							if ( CKEDITOR.env.ie )
+172 							{
+173 								var elementType = element.getAttribute( 'type' );
+174 								var myType = this.getValue();
+175
+176 								if ( elementType != myType )
+177 								{
+178 									var replace = CKEDITOR.dom.element.createFromHtml( '<input type="' + myType + '"></input>', editor.document );
+179 									element.copyAttributes( replace, { type : 1 } );
+180 									replace.replace( element );
+181 									editor.getSelection().selectElement( replace );
+182 									data.element = element;
+183 								}
+184 							}
+185 							else
+186 								element.setAttribute( 'type', this.getValue() );
+187 						}
+188 					}
+189 				]
+190 			}
+191 		]
+192 	};
+193 });
+194 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_plugin.js.html new file mode 100644 index 000000000..959ab14a6 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_forms_plugin.js.html @@ -0,0 +1,201 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Forms Plugin
+  8  */
+  9
+ 10 CKEDITOR.plugins.add( 'forms',
+ 11 {
+ 12 	init : function( editor )
+ 13 	{
+ 14 		var lang = editor.lang;
+ 15
+ 16 		editor.addCss(
+ 17 			'form' +
+ 18 			'{' +
+ 19 				'border: 1px dotted #FF0000;' +
+ 20 				'padding: 2px;' +
+ 21 			'}' );
+ 22
+ 23 		// All buttons use the same code to register. So, to avoid
+ 24 		// duplications, let's use this tool function.
+ 25 		var addButtonCommand = function( buttonName, commandName, dialogFile )
+ 26 		{
+ 27 			editor.addCommand( commandName, new CKEDITOR.dialogCommand( commandName ) );
+ 28
+ 29 			editor.ui.addButton( buttonName,
+ 30 				{
+ 31 					label : lang.common[ buttonName.charAt(0).toLowerCase() + buttonName.slice(1) ],
+ 32 					command : commandName
+ 33 				});
+ 34 			CKEDITOR.dialog.add( commandName, dialogFile );
+ 35 		};
+ 36
+ 37 		var dialogPath = this.path + 'dialogs/';
+ 38 		addButtonCommand( 'Form',			'form',			dialogPath + 'form.js' );
+ 39 		addButtonCommand( 'Checkbox',		'checkbox',		dialogPath + 'checkbox.js' );
+ 40 		addButtonCommand( 'Radio',			'radio',		dialogPath + 'radio.js' );
+ 41 		addButtonCommand( 'TextField',		'textfield',	dialogPath + 'textfield.js' );
+ 42 		addButtonCommand( 'Textarea',		'textarea',		dialogPath + 'textarea.js' );
+ 43 		addButtonCommand( 'Select',			'select',		dialogPath + 'select.js' );
+ 44 		addButtonCommand( 'Button',			'button',		dialogPath + 'button.js' );
+ 45 		addButtonCommand( 'ImageButton',	'imagebutton',	CKEDITOR.plugins.getPath('image') + 'dialogs/image.js' );
+ 46 		addButtonCommand( 'HiddenField',	'hiddenfield',	dialogPath + 'hiddenfield.js' );
+ 47
+ 48 		// If the "menu" plugin is loaded, register the menu items.
+ 49 		if ( editor.addMenuItems )
+ 50 		{
+ 51 			editor.addMenuItems(
+ 52 				{
+ 53 					form :
+ 54 					{
+ 55 						label : lang.form.menu,
+ 56 						command : 'form',
+ 57 						group : 'form'
+ 58 					},
+ 59
+ 60 					checkbox :
+ 61 					{
+ 62 						label : lang.checkboxAndRadio.checkboxTitle,
+ 63 						command : 'checkbox',
+ 64 						group : 'checkbox'
+ 65 					},
+ 66
+ 67 					radio :
+ 68 					{
+ 69 						label : lang.checkboxAndRadio.radioTitle,
+ 70 						command : 'radio',
+ 71 						group : 'radio'
+ 72 					},
+ 73
+ 74 					textfield :
+ 75 					{
+ 76 						label : lang.textfield.title,
+ 77 						command : 'textfield',
+ 78 						group : 'textfield'
+ 79 					},
+ 80
+ 81 					hiddenfield :
+ 82 					{
+ 83 						label : lang.hidden.title,
+ 84 						command : 'hiddenfield',
+ 85 						group : 'hiddenfield'
+ 86 					},
+ 87
+ 88 					imagebutton :
+ 89 					{
+ 90 						label : lang.image.titleButton,
+ 91 						command : 'imagebutton',
+ 92 						group : 'imagebutton'
+ 93 					},
+ 94
+ 95 					button :
+ 96 					{
+ 97 						label : lang.button.title,
+ 98 						command : 'button',
+ 99 						group : 'button'
+100 					},
+101
+102 					select :
+103 					{
+104 						label : lang.select.title,
+105 						command : 'select',
+106 						group : 'select'
+107 					},
+108
+109 					textarea :
+110 					{
+111 						label : lang.textarea.title,
+112 						command : 'textarea',
+113 						group : 'textarea'
+114 					}
+115 				});
+116 		}
+117
+118 		// If the "contextmenu" plugin is loaded, register the listeners.
+119 		if ( editor.contextMenu )
+120 		{
+121 			editor.contextMenu.addListener( function( element )
+122 				{
+123 					if ( element && element.hasAscendant( 'form' ) )
+124 						return { form : CKEDITOR.TRISTATE_OFF };
+125 				});
+126
+127 			editor.contextMenu.addListener( function( element )
+128 				{
+129 					if ( element )
+130 					{
+131 						var name = element.getName();
+132
+133 						if ( name == 'select' )
+134 							return { select : CKEDITOR.TRISTATE_OFF };
+135
+136 						if ( name == 'textarea' )
+137 							return { textarea : CKEDITOR.TRISTATE_OFF };
+138
+139 						if ( name == 'input' )
+140 						{
+141 							var type = element.getAttribute( 'type' );
+142
+143 							if ( type == 'text' || type == 'password' )
+144 								return { textfield : CKEDITOR.TRISTATE_OFF };
+145
+146 							if ( type == 'button' || type == 'submit' || type == 'reset' )
+147 								return { button : CKEDITOR.TRISTATE_OFF };
+148
+149 							if ( type == 'checkbox' )
+150 								return { checkbox : CKEDITOR.TRISTATE_OFF };
+151
+152 							if ( type == 'radio' )
+153 								return { radio : CKEDITOR.TRISTATE_OFF };
+154
+155 							if ( type == 'image' )
+156 								return { imagebutton : CKEDITOR.TRISTATE_OFF };
+157 						}
+158
+159 						if ( name == 'img' && element.getAttribute( '_cke_real_element_type' ) == 'hiddenfield' )
+160 							return { hiddenfield : CKEDITOR.TRISTATE_OFF };
+161 					}
+162 				});
+163 		}
+164 	},
+165 	requires : [ 'image' ]
+166 } );
+167
+168 if ( CKEDITOR.env.ie )
+169 {
+170 	CKEDITOR.dom.element.prototype.hasAttribute = function( name )
+171 	{
+172 		var $attr = this.$.attributes.getNamedItem( name );
+173
+174 		if ( this.getName() == 'input' )
+175 		{
+176 			switch ( name )
+177 			{
+178 				case 'class' :
+179 					return this.$.className.length > 0;
+180 				case 'checked' :
+181 					return !!this.$.checked;
+182 				case 'value' :
+183 					var type = this.getAttribute( 'type' );
+184 					if ( type == 'checkbox' || type == 'radio' )
+185 						return this.$.value != 'on';
+186 					break;
+187 				default:
+188 			}
+189 		}
+190
+191 		return !!( $attr && $attr.specified );
+192 	};
+193 }
+194 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_horizontalrule_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_horizontalrule_plugin.js.html new file mode 100644 index 000000000..93a3150d2 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_horizontalrule_plugin.js.html @@ -0,0 +1,43 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Horizontal Rule plugin.
+  8  */
+  9
+ 10 (function()
+ 11 {
+ 12 	var horizontalruleCmd =
+ 13 	{
+ 14 		exec : function( editor )
+ 15 		{
+ 16 			editor.insertElement( editor.document.createElement( 'hr' ) );
+ 17 		}
+ 18 	};
+ 19
+ 20 	var pluginName = 'horizontalrule';
+ 21
+ 22 	// Register a plugin named "horizontalrule".
+ 23 	CKEDITOR.plugins.add( pluginName,
+ 24 	{
+ 25 		init : function( editor )
+ 26 		{
+ 27 			editor.addCommand( pluginName, horizontalruleCmd );
+ 28 			editor.ui.addButton( 'HorizontalRule',
+ 29 				{
+ 30 					label : editor.lang.horizontalrule,
+ 31 					command : pluginName
+ 32 				});
+ 33 		}
+ 34 	});
+ 35 })();
+ 36 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_htmldataprocessor_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_htmldataprocessor_plugin.js.html new file mode 100644 index 000000000..f195ee7cb --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_htmldataprocessor_plugin.js.html @@ -0,0 +1,342 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	// Regex to scan for   at the end of blocks, which are actually placeholders.
+  9 	var tailNbspRegex = /^[\t\r\n ]* $/;
+ 10
+ 11 	var protectedSourceMarker = '{cke_protected}';
+ 12
+ 13 	function trimFillers( block, fromSource )
+ 14 	{
+ 15 		// If the current node is a block, and if we're converting from source or
+ 16 		// we're not in IE then search for and remove any tailing BR node.
+ 17 		//
+ 18 		// Also, any   at the end of blocks are fillers, remove them as well.
+ 19 		// (#2886)
+ 20 		var children = block.children;
+ 21 		var lastChild = children[ children.length - 1 ];
+ 22 		if ( lastChild )
+ 23 		{
+ 24 			if ( ( fromSource || !CKEDITOR.env.ie ) && lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br' )
+ 25 				children.pop();
+ 26 			if ( lastChild.type == CKEDITOR.NODE_TEXT && tailNbspRegex.test( lastChild.value ) )
+ 27 				children.pop();
+ 28 		}
+ 29 	}
+ 30
+ 31 	function blockNeedsExtension( block )
+ 32 	{
+ 33 		if ( block.children.length < 1 )
+ 34 			return true;
+ 35
+ 36 		var lastChild = block.children[ block.children.length - 1 ];
+ 37 		return lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br';
+ 38 	}
+ 39
+ 40 	function extendBlockForDisplay( block )
+ 41 	{
+ 42 		trimFillers( block, true );
+ 43
+ 44 		if ( blockNeedsExtension( block ) )
+ 45 		{
+ 46 			if ( CKEDITOR.env.ie )
+ 47 				block.add( new CKEDITOR.htmlParser.text( '\xa0' ) );
+ 48 			else
+ 49 				block.add( new CKEDITOR.htmlParser.element( 'br', {} ) );
+ 50 		}
+ 51 	}
+ 52
+ 53 	function extendBlockForOutput( block )
+ 54 	{
+ 55 		trimFillers( block );
+ 56
+ 57 		if ( blockNeedsExtension( block ) )
+ 58 			block.add( new CKEDITOR.htmlParser.text( '\xa0' ) );
+ 59 	}
+ 60
+ 61 	var dtd = CKEDITOR.dtd;
+ 62
+ 63 	// Find out the list of block-like tags that can contain <br>.
+ 64 	var blockLikeTags = CKEDITOR.tools.extend( {}, dtd.$block, dtd.$listItem, dtd.$tableContent );
+ 65 	for ( var i in blockLikeTags )
+ 66 	{
+ 67 		if ( ! ( 'br' in dtd[i] ) )
+ 68 			delete blockLikeTags[i];
+ 69 	}
+ 70 	// We just avoid filler in <pre> right now.
+ 71 	// TODO: Support filler for <pre>, line break is also occupy line height.
+ 72 	delete blockLikeTags.pre;
+ 73 	var defaultDataFilterRules =
+ 74 	{
+ 75 		elementNames :
+ 76 		[
+ 77 			// Elements that cause problems in wysiwyg mode.
+ 78 			[ ( /^(object|embed|param)$/ ), 'cke:$1' ]
+ 79 		],
+ 80
+ 81 		attributeNames :
+ 82 		[
+ 83 			// Event attributes (onXYZ) must not be directly set. They can become
+ 84 			// active in the editing area (IE|WebKit).
+ 85 			[ ( /^on/ ), '_cke_pa_on' ]
+ 86 		]
+ 87 	};
+ 88
+ 89 	var defaultDataBlockFilterRules = { elements : {} };
+ 90
+ 91 	for ( i in blockLikeTags )
+ 92 		defaultDataBlockFilterRules.elements[ i ] = extendBlockForDisplay;
+ 93
+ 94 	/**
+ 95 	 * IE sucks with dynamic 'name' attribute after element is created, '_cke_saved_name' is used instead for this attribute.
+ 96 	 */
+ 97 	var removeName = function( element )
+ 98 	{
+ 99 		var attribs = element.attributes;
+100
+101 		if ( attribs._cke_saved_name )
+102 			delete attribs.name;
+103 	};
+104
+105 	var defaultHtmlFilterRules =
+106 		{
+107 			elementNames :
+108 			[
+109 				// Remove the "cke:" namespace prefix.
+110 				[ ( /^cke:/ ), '' ],
+111
+112 				// Ignore <?xml:namespace> tags.
+113 				[ ( /^\?xml:namespace$/ ), '' ]
+114 			],
+115
+116 			attributeNames :
+117 			[
+118 				// Attributes saved for changes and protected attributes.
+119 				[ ( /^_cke_(saved|pa)_/ ), '' ],
+120
+121 				// All "_cke" attributes are to be ignored.
+122 				[ ( /^_cke.*/ ), '' ]
+123 			],
+124
+125 			elements :
+126 			{
+127 				embed : function( element )
+128 				{
+129 					var parent = element.parent;
+130
+131 					// If the <embed> is child of a <object>, copy the width
+132 					// and height attributes from it.
+133 					if ( parent && parent.name == 'object' )
+134 					{
+135 						element.attributes.width = parent.attributes.width;
+136 						element.attributes.height = parent.attributes.height;
+137 					}
+138 				},
+139
+140 				img : function( element )
+141 				{
+142 					var attribs = element.attributes;
+143
+144 					if ( attribs._cke_saved_name )
+145 						delete attribs.name;
+146 					if ( attribs._cke_saved_src )
+147 						delete attribs.src;
+148 				},
+149
+150 				a : function( element )
+151 				{
+152 					var attribs = element.attributes;
+153
+154 					if ( attribs._cke_saved_name )
+155 						delete attribs.name;
+156 					if ( attribs._cke_saved_href )
+157 						delete attribs.href;
+158 				},
+159
+160 				input : removeName,
+161 				textarea : removeName,
+162 				select : removeName,
+163 				form : removeName
+164 			},
+165
+166 			attributes :
+167 			{
+168 				'class' : function( value, element )
+169 				{
+170 					// Remove all class names starting with "cke_".
+171 					return CKEDITOR.tools.ltrim( value.replace( /(?:^|\s+)cke_[^\s]*/g, '' ) ) || false;
+172 				}
+173 			},
+174
+175 			comment : function( contents )
+176 			{
+177 				if ( contents.substr( 0, protectedSourceMarker.length ) == protectedSourceMarker )
+178 					return new CKEDITOR.htmlParser.cdata( decodeURIComponent( contents.substr( protectedSourceMarker.length ) ) );
+179
+180 				return contents;
+181 			}
+182 		};
+183
+184 	var defaultHtmlBlockFilterRules = { elements : {} };
+185
+186 	for ( i in blockLikeTags )
+187 		defaultHtmlBlockFilterRules.elements[ i ] = extendBlockForOutput;
+188
+189 	if ( CKEDITOR.env.ie )
+190 	{
+191 		// IE outputs style attribute in capital letters. We should convert
+192 		// them back to lower case.
+193 		defaultHtmlFilterRules.attributes.style = function( value, element )
+194 		{
+195 			return value.toLowerCase();
+196 		};
+197 	}
+198
+199 	var protectAttributeRegex = /<(?:a|area|img|input).*?\s((?:href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+)))/gi;
+200
+201 	function protectAttributes( html )
+202 	{
+203 		return html.replace( protectAttributeRegex, '$& _cke_saved_$1' );
+204 	}
+205
+206 	var protectStyleTagsRegex = /<(style)(?=[ >])[^>]*>[^<]*<\/\1>/gi;
+207 	var encodedTagsRegex = /<cke:encoded>([^<]*)<\/cke:encoded>/gi;
+208
+209 	function protectStyleTagsMatch( match )
+210 	{
+211 		return '<cke:encoded>' + encodeURIComponent( match ) + '</cke:encoded>';
+212 	}
+213
+214 	function protectStyleTags( html )
+215 	{
+216 		return html.replace( protectStyleTagsRegex, protectStyleTagsMatch );
+217 	}
+218
+219 	function unprotectEncodedTagsMatch( match, encoded )
+220 	{
+221 		return decodeURIComponent( encoded );
+222 	}
+223
+224 	function unprotectEncodedTags( html )
+225 	{
+226 		return html.replace( encodedTagsRegex, unprotectEncodedTagsMatch );
+227 	}
+228
+229 	function protectSource( data, protectRegexes )
+230 	{
+231 		var regexes =
+232 			[
+233 				// First of any other protection, we must protect all comments
+234 				// to avoid loosing them (of course, IE related).
+235 				/<!--[\s\S]*?-->/g,
+236
+237 				// Script tags will also be forced to be protected, otherwise
+238 				// IE will execute them.
+239 				/<script[\s\S]*?<\/script>/gi,
+240
+241 				// <noscript> tags (get lost in IE and messed up in FF).
+242 				/<noscript[\s\S]*?<\/noscript>/gi
+243 			]
+244 			.concat( protectRegexes );
+245
+246 		for ( var i = 0 ; i < regexes.length ; i++ )
+247 		{
+248 			data = data.replace( regexes[i], function( match )
+249 				{
+250 					return '<!--' + protectedSourceMarker + encodeURIComponent( match ).replace( /--/g, '%2D%2D' ) + '-->';
+251 				});
+252 		}
+253
+254 		return data;
+255 	}
+256
+257 	CKEDITOR.plugins.add( 'htmldataprocessor',
+258 	{
+259 		requires : [ 'htmlwriter' ],
+260
+261 		init : function( editor )
+262 		{
+263 			var dataProcessor = editor.dataProcessor = new CKEDITOR.htmlDataProcessor( editor );
+264
+265 			dataProcessor.writer.forceSimpleAmpersand = editor.config.forceSimpleAmpersand;
+266
+267 			dataProcessor.dataFilter.addRules( defaultDataFilterRules );
+268 			dataProcessor.dataFilter.addRules( defaultDataBlockFilterRules );
+269 			dataProcessor.htmlFilter.addRules( defaultHtmlFilterRules );
+270 			dataProcessor.htmlFilter.addRules( defaultHtmlBlockFilterRules );
+271 		}
+272 	});
+273
+274 	CKEDITOR.htmlDataProcessor = function( editor )
+275 	{
+276 		this.editor = editor;
+277
+278 		this.writer = new CKEDITOR.htmlWriter();
+279 		this.dataFilter = new CKEDITOR.htmlParser.filter();
+280 		this.htmlFilter = new CKEDITOR.htmlParser.filter();
+281 	};
+282
+283 	CKEDITOR.htmlDataProcessor.prototype =
+284 	{
+285 		toHtml : function( data, fixForBody )
+286 		{
+287 			// The source data is already HTML, but we need to clean
+288 			// it up and apply the filter.
+289
+290 			data = protectSource( data, this.editor.config.protectedSource );
+291
+292 			// Before anything, we must protect the URL attributes as the
+293 			// browser may changing them when setting the innerHTML later in
+294 			// the code.
+295 			data = protectAttributes( data );
+296
+297 			// IE remvoes style tags from innerHTML. (#3710).
+298 			if ( CKEDITOR.env.ie )
+299 				data = protectStyleTags( data );
+300
+301 			// Call the browser to help us fixing a possibly invalid HTML
+302 			// structure.
+303 			var div = document.createElement( 'div' );
+304 			div.innerHTML = data;
+305 			data = div.innerHTML;
+306
+307 			if ( CKEDITOR.env.ie )
+308 				data = unprotectEncodedTags( data );
+309
+310 			// Now use our parser to make further fixes to the structure, as
+311 			// well as apply the filter.
+312 			var fragment = CKEDITOR.htmlParser.fragment.fromHtml( data, fixForBody ),
+313 				writer = new CKEDITOR.htmlParser.basicWriter();
+314
+315 			fragment.writeHtml( writer, this.dataFilter );
+316
+317 			return writer.getHtml( true );
+318 		},
+319
+320 		toDataFormat : function( html, fixForBody )
+321 		{
+322 			var writer = this.writer,
+323 				fragment = CKEDITOR.htmlParser.fragment.fromHtml( html, fixForBody );
+324
+325 			writer.reset();
+326
+327 			fragment.writeHtml( writer, this.htmlFilter );
+328
+329 			return writer.getHtml( true );
+330 		}
+331 	};
+332 })();
+333
+334 CKEDITOR.config.forceSimpleAmpersand = false;
+335 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_htmlwriter_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_htmlwriter_plugin.js.html new file mode 100644 index 000000000..9038a9a18 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_htmlwriter_plugin.js.html @@ -0,0 +1,297 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'htmlwriter' );
+  7
+  8 /**
+  9  * Class used to write HTML data.
+ 10  * @constructor
+ 11  * @example
+ 12  * var writer = new CKEDITOR.htmlWriter();
+ 13  * writer.openTag( 'p' );
+ 14  * writer.attribute( 'class', 'MyClass' );
+ 15  * writer.openTagClose( 'p' );
+ 16  * writer.text( 'Hello' );
+ 17  * writer.closeTag( 'p' );
+ 18  * alert( writer.getHtml() );  "<p class="MyClass">Hello</p>"
+ 19  */
+ 20 CKEDITOR.htmlWriter = CKEDITOR.tools.createClass(
+ 21 {
+ 22 	base : CKEDITOR.htmlParser.basicWriter,
+ 23
+ 24 	$ : function()
+ 25 	{
+ 26 		// Call the base contructor.
+ 27 		this.base();
+ 28
+ 29 		/**
+ 30 		 * The characters to be used for each identation step.
+ 31 		 * @type String
+ 32 		 * @default "\t" (tab)
+ 33 		 * @example
+ 34 		 * // Use two spaces for indentation.
+ 35 		 * editorInstance.dataProcessor.writer.indentationChars = '  ';
+ 36 		 */
+ 37 		this.indentationChars = '\t';
+ 38
+ 39 		/**
+ 40 		 * The characters to be used to close "self-closing" elements, like "br" or
+ 41 		 * "img".
+ 42 		 * @type String
+ 43 		 * @default " />"
+ 44 		 * @example
+ 45 		 * // Use HTML4 notation for self-closing elements.
+ 46 		 * editorInstance.dataProcessor.writer.selfClosingEnd = '>';
+ 47 		 */
+ 48 		this.selfClosingEnd = ' />';
+ 49
+ 50 		/**
+ 51 		 * The characters to be used for line breaks.
+ 52 		 * @type String
+ 53 		 * @default "\n" (LF)
+ 54 		 * @example
+ 55 		 * // Use CRLF for line breaks.
+ 56 		 * editorInstance.dataProcessor.writer.lineBreakChars = '\r\n';
+ 57 		 */
+ 58 		this.lineBreakChars = '\n';
+ 59
+ 60 		this.forceSimpleAmpersand = false;
+ 61
+ 62 		this.sortAttributes = true;
+ 63
+ 64 		this._.indent = false;
+ 65 		this._.indentation = '';
+ 66 		this._.rules = {};
+ 67
+ 68 		var dtd = CKEDITOR.dtd;
+ 69
+ 70 		for ( var e in CKEDITOR.tools.extend( {}, dtd.$block, dtd.$listItem, dtd.$tableContent ) )
+ 71 		{
+ 72 			this.setRules( e,
+ 73 				{
+ 74 					indent : true,
+ 75 					breakBeforeOpen : true,
+ 76 					breakAfterOpen : true,
+ 77 					breakBeforeClose : !dtd[ e ][ '#' ],
+ 78 					breakAfterClose : true
+ 79 				});
+ 80 		}
+ 81 		this.setRules( 'br',
+ 82 			{
+ 83 				breakAfterOpen : true
+ 84 			});
+ 85 		// Disable indentation on <pre>.
+ 86 		this.setRules( 'pre',
+ 87 		{
+ 88 		  indent: false
+ 89 		} );
+ 90 	},
+ 91
+ 92 	proto :
+ 93 	{
+ 94 		/**
+ 95 		 * Writes the tag opening part for a opener tag.
+ 96 		 * @param {String} tagName The element name for this tag.
+ 97 		 * @param {Object} attributes The attributes defined for this tag. The
+ 98 		 *		attributes could be used to inspect the tag.
+ 99 		 * @example
+100 		 * // Writes "<p".
+101 		 * writer.openTag( 'p', { class : 'MyClass', id : 'MyId' } );
+102 		 */
+103 		openTag : function( tagName, attributes )
+104 		{
+105 			var rules = this._.rules[ tagName ];
+106
+107 			if ( this._.indent )
+108 				this.indentation();
+109 			// Do not break if indenting.
+110 			else if ( rules && rules.breakBeforeOpen )
+111 			{
+112 				this.lineBreak();
+113 				this.indentation();
+114 			}
+115
+116 			this._.output.push( '<', tagName );
+117 		},
+118
+119 		/**
+120 		 * Writes the tag closing part for a opener tag.
+121 		 * @param {String} tagName The element name for this tag.
+122 		 * @param {Boolean} isSelfClose Indicates that this is a self-closing tag,
+123 		 *		like "br" or "img".
+124 		 * @example
+125 		 * // Writes ">".
+126 		 * writer.openTagClose( 'p', false );
+127 		 * @example
+128 		 * // Writes " />".
+129 		 * writer.openTagClose( 'br', true );
+130 		 */
+131 		openTagClose : function( tagName, isSelfClose )
+132 		{
+133 			var rules = this._.rules[ tagName ];
+134
+135 			if ( isSelfClose )
+136 				this._.output.push( this.selfClosingEnd );
+137 			else
+138 			{
+139 				this._.output.push( '>' );
+140
+141 				if ( rules && rules.indent )
+142 					this._.indentation += this.indentationChars;
+143 			}
+144
+145 			if ( rules && rules.breakAfterOpen )
+146 				this.lineBreak();
+147 		},
+148
+149 		/**
+150 		 * Writes an attribute. This function should be called after opening the
+151 		 * tag with {@link #openTagClose}.
+152 		 * @param {String} attName The attribute name.
+153 		 * @param {String} attValue The attribute value.
+154 		 * @example
+155 		 * // Writes ' class="MyClass"'.
+156 		 * writer.attribute( 'class', 'MyClass' );
+157 		 */
+158 		attribute : function( attName, attValue )
+159 		{
+160 			if ( this.forceSimpleAmpersand )
+161 				attValue = attValue.replace( /&/, '&' );
+162
+163 			this._.output.push( ' ', attName, '="', attValue, '"' );
+164 		},
+165
+166 		/**
+167 		 * Writes a closer tag.
+168 		 * @param {String} tagName The element name for this tag.
+169 		 * @example
+170 		 * // Writes "</p>".
+171 		 * writer.closeTag( 'p' );
+172 		 */
+173 		closeTag : function( tagName )
+174 		{
+175 			var rules = this._.rules[ tagName ];
+176
+177 			if ( rules && rules.indent )
+178 				this._.indentation = this._.indentation.substr( this.indentationChars.length );
+179
+180 			if ( this._.indent )
+181 				this.indentation();
+182 			// Do not break if indenting.
+183 			else if ( rules && rules.breakBeforeClose )
+184 			{
+185 				this.lineBreak();
+186 				this.indentation();
+187 			}
+188
+189 			this._.output.push( '</', tagName, '>' );
+190
+191 			if ( rules && rules.breakAfterClose )
+192 				this.lineBreak();
+193 		},
+194
+195 		/**
+196 		 * Writes text.
+197 		 * @param {String} text The text value
+198 		 * @example
+199 		 * // Writes "Hello Word".
+200 		 * writer.text( 'Hello Word' );
+201 		 */
+202 		text : function( text )
+203 		{
+204 			if ( this._.indent )
+205 			{
+206 				this.indentation();
+207 				text = CKEDITOR.tools.ltrim( text );
+208 			}
+209
+210 			this._.output.push( text );
+211 		},
+212
+213 		/**
+214 		 * Writes a comment.
+215 		 * @param {String} comment The comment text.
+216 		 * @example
+217 		 * // Writes "<!-- My comment -->".
+218 		 * writer.comment( ' My comment ' );
+219 		 */
+220 		comment : function( comment )
+221 		{
+222 			if ( this._.indent )
+223 				this.indentation();
+224
+225 			this._.output.push( '<!--', comment, '-->' );
+226 		},
+227
+228 		/**
+229 		 * Writes a line break. It uses the {@link #lineBreakChars} property for it.
+230 		 * @example
+231 		 * // Writes "\n" (e.g.).
+232 		 * writer.lineBreak();
+233 		 */
+234 		lineBreak : function()
+235 		{
+236 			if ( this._.output.length > 0 )
+237 				this._.output.push( this.lineBreakChars );
+238 			this._.indent = true;
+239 		},
+240
+241 		/**
+242 		 * Writes the current indentation chars. It uses the
+243 		 * {@link #indentationChars} property, repeating it for the current
+244 		 * indentation steps.
+245 		 * @example
+246 		 * // Writes "\t" (e.g.).
+247 		 * writer.indentation();
+248 		 */
+249 		indentation : function()
+250 		{
+251 			this._.output.push( this._.indentation );
+252 			this._.indent = false;
+253 		},
+254
+255 		/**
+256 		 * Sets formatting rules for a give element. The possible rules are:
+257 		 * <ul>
+258 		 *	<li><b>indent</b>: indent the element contents.</li>
+259 		 *	<li><b>breakBeforeOpen</b>: break line before the opener tag for this element.</li>
+260 		 *	<li><b>breakAfterOpen</b>: break line after the opener tag for this element.</li>
+261 		 *	<li><b>breakBeforeClose</b>: break line before the closer tag for this element.</li>
+262 		 *	<li><b>breakAfterClose</b>: break line after the closer tag for this element.</li>
+263 		 * </ul>
+264 		 *
+265 		 * All rules default to "false".
+266 		 *
+267 		 * By default, all elements available in the {@link CKEDITOR.dtd.$block),
+268 		 * {@link CKEDITOR.dtd.$listItem} and {@link CKEDITOR.dtd.$tableContent}
+269 		 * lists have all the above rules set to "true". Additionaly, the "br"
+270 		 * element has the "breakAfterOpen" set to "true".
+271 		 * @param {String} tagName The element name to which set the rules.
+272 		 * @param {Object} rules An object containing the element rules.
+273 		 * @example
+274 		 * // Break line before and after "img" tags.
+275 		 * writer.setRules( 'img',
+276 		 *     {
+277 		 *         breakBeforeOpen : true
+278 		 *         breakAfterOpen : true
+279 		 *     });
+280 		 * @example
+281 		 * // Reset the rules for the "h1" tag.
+282 		 * writer.setRules( 'h1', {} );
+283 		 */
+284 		setRules : function( tagName, rules )
+285 		{
+286 			this._.rules[ tagName ] = rules;
+287 		}
+288 	}
+289 });
+290 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_iframedialog_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_iframedialog_plugin.js.html new file mode 100644 index 000000000..0ed1cd532 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_iframedialog_plugin.js.html @@ -0,0 +1,144 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Plugin for making iframe based dialogs.
+  8  */
+  9
+ 10 CKEDITOR.plugins.add( 'iframedialog',
+ 11 {
+ 12 	requires : [ 'dialog' ],
+ 13 	onLoad : function()
+ 14 	{
+ 15 		CKEDITOR.dialog.addIframe = function( name, title, src, width, height, onContentLoad )
+ 16 		{
+ 17 			var element =
+ 18 			{
+ 19 				type : 'iframe',
+ 20 				src : src,
+ 21 				width : '100%',
+ 22 				height : '100%'
+ 23 			};
+ 24
+ 25 			if ( typeof( onContentLoad ) == 'function' )
+ 26 				element.onContentLoad = onContentLoad;
+ 27
+ 28 			var definition =
+ 29 			{
+ 30 				title : title,
+ 31 				minWidth : width,
+ 32 				minHeight : height,
+ 33 				contents :
+ 34 				[
+ 35 					{
+ 36 						id : 'iframe',
+ 37 						label : title,
+ 38 						expand : true,
+ 39 						elements : [ element ]
+ 40 					}
+ 41 				]
+ 42 			};
+ 43
+ 44 			return this.add( name, function(){ return definition; } );
+ 45 		};
+ 46
+ 47 		(function()
+ 48 		{
+ 49 			/**
+ 50 			 * An iframe element.
+ 51 			 * @extends CKEDITOR.ui.dialog.uiElement
+ 52 			 * @example
+ 53 			 * @constructor
+ 54 			 * @param {CKEDITOR.dialog} dialog
+ 55 			 * Parent dialog object.
+ 56 			 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
+ 57 			 * The element definition. Accepted fields:
+ 58 			 * <ul>
+ 59 			 * 	<li><strong>src</strong> (Required) The src field of the iframe. </li>
+ 60 			 * 	<li><strong>width</strong> (Required) The iframe's width.</li>
+ 61 			 * 	<li><strong>height</strong> (Required) The iframe's height.</li>
+ 62 			 * 	<li><strong>onContentLoad</strong> (Optional) A function to be executed
+ 63 			 * 	after the iframe's contents has finished loading.</li>
+ 64 			 * </ul>
+ 65 			 * @param {Array} htmlList
+ 66 			 * List of HTML code to output to.
+ 67 			 */
+ 68 			var iframeElement = function( dialog, elementDefinition, htmlList )
+ 69 			{
+ 70 				if ( arguments.length < 3 )
+ 71 					return;
+ 72
+ 73 				var _ = ( this._ || ( this._ = {} ) ),
+ 74 					contentLoad = elementDefinition.onContentLoad && CKEDITOR.tools.bind( elementDefinition.onContentLoad, this ),
+ 75 					cssWidth = CKEDITOR.tools.cssLength( elementDefinition.width ),
+ 76 					cssHeight = CKEDITOR.tools.cssLength( elementDefinition.height );
+ 77 				_.frameId = CKEDITOR.tools.getNextNumber() + '_iframe';
+ 78
+ 79 				// IE BUG: Parent container does not resize to contain the iframe automatically.
+ 80 				dialog.on( 'load', function()
+ 81 					{
+ 82 						var iframe = CKEDITOR.document.getById( _.frameId ),
+ 83 							parentContainer = iframe.getParent();
+ 84
+ 85 						parentContainer.setStyles(
+ 86 							{
+ 87 								width : cssWidth,
+ 88 								height : cssHeight
+ 89 							} );
+ 90 					} );
+ 91
+ 92 				var attributes =
+ 93 				{
+ 94 					src : '%2',
+ 95 					id : _.frameId,
+ 96 					frameborder : 0,
+ 97 					allowtransparency : true
+ 98 				};
+ 99 				var myHtml = [];
+100
+101 				if ( typeof( elementDefinition.onContentLoad ) == 'function' )
+102 					attributes.onload = 'CKEDITOR.tools.callFunction(%1);';
+103
+104 				CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtml, 'iframe',
+105 						{
+106 							width : cssWidth,
+107 							height : cssHeight
+108 						}, attributes, '' );
+109
+110 				// Put a placeholder for the first time.
+111 				htmlList.push( '<div style="width:' + cssWidth + ';height:' + cssHeight + ';" id="' + this.domId + '"></div>' );
+112
+113 				// Iframe elements should be refreshed whenever it is shown.
+114 				myHtml = myHtml.join( '' );
+115 				dialog.on( 'show', function()
+116 					{
+117 						var iframe = CKEDITOR.document.getById( _.frameId ),
+118 							parentContainer = iframe.getParent(),
+119 							callIndex = CKEDITOR.tools.addFunction( contentLoad ),
+120 							html = myHtml.replace( '%1', callIndex ).replace( '%2', CKEDITOR.tools.htmlEncode( elementDefinition.src ) );
+121 						parentContainer.setHtml( html );
+122 					} );
+123 			};
+124
+125 			iframeElement.prototype = new CKEDITOR.ui.dialog.uiElement;
+126
+127 			CKEDITOR.dialog.addUIElement( 'iframe',
+128 				{
+129 					build : function( dialog, elementDefinition, output )
+130 					{
+131 						return new iframeElement( dialog, elementDefinition, output );
+132 					}
+133 				} );
+134 		})();
+135 	}
+136 } );
+137 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_image_dialogs_image.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_image_dialogs_image.js.html new file mode 100644 index 000000000..b33ad6ec2 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_image_dialogs_image.js.html @@ -0,0 +1,1217 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	// Load image preview.
+  9 	var IMAGE = 1,
+ 10 		LINK = 2,
+ 11 		PREVIEW = 4,
+ 12 		CLEANUP = 8,
+ 13 		regexGetSize = /^\s*(\d+)((px)|\%)?\s*$/i,
+ 14 		regexGetSizeOrEmpty = /(^\s*(\d+)((px)|\%)?\s*$)|^$/i;
+ 15
+ 16 	var onSizeChange = function()
+ 17 	{
+ 18 		var value = this.getValue(),	// This = input element.
+ 19 			dialog = this.getDialog(),
+ 20 			aMatch  =  value.match( regexGetSize );	// Check value
+ 21 		if ( aMatch )
+ 22 		{
+ 23 			if ( aMatch[2] == '%' )			// % is allowed - > unlock ratio.
+ 24 				switchLockRatio( dialog, false );	// Unlock.
+ 25 			value = aMatch[1];
+ 26 		}
+ 27
+ 28 		// Only if ratio is locked
+ 29 		if ( dialog.lockRatio )
+ 30 		{
+ 31 			var oImageOriginal = dialog.originalElement;
+ 32 			if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' )
+ 33 			{
+ 34 				if ( this.id == 'txtHeight' )
+ 35 				{
+ 36 					if ( value && value != '0' )
+ 37 						value = Math.round( oImageOriginal.$.width * ( value  / oImageOriginal.$.height ) );
+ 38 					if ( !isNaN( value ) )
+ 39 						dialog.setValueOf( 'info', 'txtWidth', value );
+ 40 				}
+ 41 				else		//this.id = txtWidth.
+ 42 				{
+ 43 					if ( value && value != '0' )
+ 44 						value = Math.round( oImageOriginal.$.height * ( value  / oImageOriginal.$.width ) );
+ 45 					if ( !isNaN( value ) )
+ 46 						dialog.setValueOf( 'info', 'txtHeight', value );
+ 47 				}
+ 48 			}
+ 49 		}
+ 50 		updatePreview( dialog );
+ 51 	};
+ 52
+ 53 	var updatePreview = function( dialog )
+ 54 	{
+ 55 		//Don't load before onShow.
+ 56 		if ( !dialog.originalElement || !dialog.preview )
+ 57 			return 1;
+ 58
+ 59 		// Read attributes and update imagePreview;
+ 60 		dialog.commitContent( PREVIEW, dialog.preview );
+ 61 		return 0;
+ 62 	};
+ 63
+ 64 	var switchLockRatio = function( dialog, value )
+ 65 	{
+ 66 		var oImageOriginal = dialog.originalElement,
+ 67 			ratioButton = CKEDITOR.document.getById( 'btnLockSizes' );
+ 68
+ 69 		if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' )
+ 70 		{
+ 71 			if ( value == 'check' )			// Check image ratio and original image ratio.
+ 72 			{
+ 73 				var width = dialog.getValueOf( 'info', 'txtWidth' ),
+ 74 					height = dialog.getValueOf( 'info', 'txtHeight' ),
+ 75 					originalRatio = oImageOriginal.$.width * 1000 / oImageOriginal.$.height,
+ 76 					thisRatio = width * 1000 / height;
+ 77 				dialog.lockRatio  = false;		// Default: unlock ratio
+ 78
+ 79 				if ( !width && !height )
+ 80 					dialog.lockRatio = true;
+ 81 				else if ( !isNaN( originalRatio ) && !isNaN( thisRatio ) )
+ 82 				{
+ 83 					if ( Math.round( originalRatio ) == Math.round( thisRatio ) )
+ 84 						dialog.lockRatio = true;
+ 85 				}
+ 86 			}
+ 87 			else if ( value != undefined )
+ 88 				dialog.lockRatio = value;
+ 89 			else
+ 90 				dialog.lockRatio = !dialog.lockRatio;
+ 91 		}
+ 92 		else if ( value != 'check' )		// I can't lock ratio if ratio is unknown.
+ 93 			dialog.lockRatio = false;
+ 94
+ 95 		if ( dialog.lockRatio )
+ 96 			ratioButton.removeClass( 'cke_btn_unlocked' );
+ 97 		else
+ 98 			ratioButton.addClass( 'cke_btn_unlocked' );
+ 99
+100 		return dialog.lockRatio;
+101 	};
+102
+103 	var resetSize = function( dialog )
+104 	{
+105 		var oImageOriginal = dialog.originalElement;
+106 		if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' )
+107 		{
+108 			dialog.setValueOf( 'info', 'txtWidth', oImageOriginal.$.width );
+109 			dialog.setValueOf( 'info', 'txtHeight', oImageOriginal.$.height );
+110 		}
+111 		updatePreview( dialog );
+112 	};
+113
+114 	var setupDimension = function( type, element )
+115 	{
+116 		if ( type != IMAGE )
+117 			return;
+118
+119 		function checkDimension( size, defaultValue )
+120 		{
+121 			var aMatch  =  size.match( regexGetSize );
+122 			if ( aMatch )
+123 			{
+124 				if ( aMatch[2] == '%' )				// % is allowed.
+125 				{
+126 					aMatch[1] += '%';
+127 					switchLockRatio( dialog, false );	// Unlock ratio
+128 				}
+129 				return aMatch[1];
+130 			}
+131 			return defaultValue;
+132 		}
+133
+134 		var dialog = this.getDialog(),
+135 			value = '',
+136 			dimension = (( this.id == 'txtWidth' )? 'width' : 'height' ),
+137 			size = element.getAttribute( dimension );
+138
+139 		if ( size )
+140 			value = checkDimension( size, value );
+141 		value = checkDimension( element.$.style[ dimension ], value );
+142
+143 		this.setValue( value );
+144 	};
+145
+146 	var imageDialog = function( editor, dialogType )
+147 	{
+148 		var onImgLoadEvent = function()
+149 		{
+150 			// Image is ready.
+151 			var original = this.originalElement;
+152 			original.setCustomData( 'isReady', 'true' );
+153 			original.removeListener( 'load', onImgLoadEvent );
+154 			original.removeListener( 'error', onImgLoadErrorEvent );
+155 			original.removeListener( 'abort', onImgLoadErrorEvent );
+156
+157 			// Hide loader
+158 			CKEDITOR.document.getById( 'ImagePreviewLoader' ).setStyle( 'display', 'none' );
+159
+160 			// New image -> new domensions
+161 			if ( !this.dontResetSize )
+162 				resetSize( this );
+163
+164 			if ( this.firstLoad )
+165 				switchLockRatio( this, 'check' );
+166 			this.firstLoad = false;
+167 			this.dontResetSize = false;
+168 		};
+169
+170 		var onImgLoadErrorEvent = function()
+171 		{
+172 			// Error. Image is not loaded.
+173 			var original = this.originalElement;
+174 			original.removeListener( 'load', onImgLoadEvent );
+175 			original.removeListener( 'error', onImgLoadErrorEvent );
+176 			original.removeListener( 'abort', onImgLoadErrorEvent );
+177
+178 			// Set Error image.
+179 			var noimage = CKEDITOR.getUrl( editor.skinPath + 'images/noimage.png' );
+180
+181 			if ( this.preview )
+182 				this.preview.setAttribute( 'src', noimage );
+183
+184 			// Hide loader
+185 			CKEDITOR.document.getById( 'ImagePreviewLoader' ).setStyle( 'display', 'none' );
+186 			switchLockRatio( this, false );	// Unlock.
+187 		};
+188 		return {
+189 			title : ( dialogType == 'image' ) ? editor.lang.image.title : editor.lang.image.titleButton,
+190 			minWidth : 420,
+191 			minHeight : 310,
+192 			onShow : function()
+193 			{
+194 				this.imageElement = false;
+195 				this.linkElement = false;
+196
+197 				// Default: create a new element.
+198 				this.imageEditMode = false;
+199 				this.linkEditMode = false;
+200
+201 				this.lockRatio = true;
+202 				this.dontResetSize = false;
+203 				this.firstLoad = true;
+204 				this.addLink = false;
+205
+206 				//Hide loader.
+207 				CKEDITOR.document.getById( 'ImagePreviewLoader' ).setStyle( 'display', 'none' );
+208 				// Preview
+209 				this.preview = CKEDITOR.document.getById( 'previewImage' );
+210
+211 				var editor = this.getParentEditor(),
+212 					element = this.getParentEditor().getSelection().getSelectedElement();
+213
+214 				// Copy of the image
+215 				this.originalElement = editor.document.createElement( 'img' );
+216 				this.originalElement.setAttribute( 'alt', '' );
+217 				this.originalElement.setCustomData( 'isReady', 'false' );
+218
+219 				if ( element && element.getName() == 'a' )
+220 				{
+221 					this.linkElement = element;
+222 					this.linkEditMode = true;
+223
+224 					// Look for Image element.
+225 					var linkChildren = element.getChildren();
+226 					if ( linkChildren.count() == 1 )			// 1 child.
+227 					{
+228 						var childTagName = linkChildren.getItem( 0 ).getName();
+229 						if ( childTagName == 'img' || childTagName == 'input' )
+230 						{
+231 							this.imageElement = linkChildren.getItem( 0 );
+232 							if ( this.imageElement.getName() == 'img' )
+233 								this.imageEditMode = 'img';
+234 							else if ( this.imageElement.getName() == 'input' )
+235 								this.imageEditMode = 'input';
+236 						}
+237 					}
+238 					// Fill out all fields.
+239 					if ( dialogType == 'image' )
+240 						this.setupContent( LINK, element );
+241 				}
+242 				else if ( element && element.getName() == 'img' && !element.getAttribute( '_cke_protected_html' ) )
+243 					this.imageEditMode = 'img';
+244 				else if ( element && element.getName() == 'input' && element.getAttribute( 'type' ) && element.getAttribute( 'type' ) == 'image' )
+245 					this.imageEditMode = 'input';
+246
+247 				if ( this.imageEditMode || this.imageElement )
+248 				{
+249 					if ( !this.imageElement )
+250 						this.imageElement = element;
+251
+252 					// Fill out all fields.
+253 					this.setupContent( IMAGE, this.imageElement );
+254
+255 					// Refresh LockRatio button
+256 					switchLockRatio ( this, true );
+257 				}
+258 			},
+259 			onOk : function()
+260 			{
+261 				// Edit existing Image.
+262 				if ( this.imageEditMode )
+263 				{
+264 					var imgTagName = this.imageEditMode,
+265 						removeObj = this.imageElement;
+266
+267 					// Image dialog and Input element.
+268 					if ( dialogType == 'image' && imgTagName == 'input' && confirm( editor.lang.image.button2Img ) )
+269 					{
+270 						// Replace INPUT-> IMG
+271 						imgTagName = 'img';
+272 						this.imageElement = editor.document.createElement( 'img' );
+273 						this.imageElement.setAttribute( 'alt', '' );
+274 						removeObj.insertBeforeMe( this.imageElement );
+275 						removeObj.remove( false );
+276
+277 					}
+278 					// ImageButton dialog and Image element.
+279 					else if ( dialogType != 'image' && imgTagName == 'img' && confirm( editor.lang.image.img2Button ))
+280 					{
+281 						// Replace IMG -> INPUT
+282 						imgTagName = 'input';
+283 						this.imageElement = editor.document.createElement( 'input' );
+284 						this.imageElement.setAttributes(
+285 							{
+286 								type : 'image',
+287 								alt : ''
+288 							}
+289 						);
+290 						removeObj.insertBeforeMe( this.imageElement );
+291 						removeObj.remove( false );
+292 					}
+293 				}
+294 				else	// Create a new image.
+295 				{
+296 					// Image dialog -> create IMG element.
+297 					if ( dialogType == 'image' )
+298 						this.imageElement = editor.document.createElement( 'img' );
+299 					else
+300 					{
+301 						this.imageElement = editor.document.createElement( 'input' );
+302 						this.imageElement.setAttribute ( 'type' ,'image' );
+303 					}
+304 					this.imageElement.setAttribute( 'alt', '' );
+305 				}
+306
+307 				// Create a new link.
+308 				if ( !this.linkEditMode )
+309 					this.linkElement = editor.document.createElement( 'a' );
+310
+311 				// Set attributes.
+312 				this.commitContent( IMAGE, this.imageElement );
+313 				this.commitContent( LINK, this.linkElement );
+314
+315 				// Insert a new Image.
+316 				if ( !this.imageEditMode )
+317 				{
+318 					if ( this.addLink )
+319 					{
+320 						//Insert a new Link.
+321 						if ( !this.linkEditMode )
+322 						{
+323 							this.linkElement.append( this.imageElement, false );
+324 							editor.insertElement( this.linkElement );
+325 						}
+326 						else 	//Link already exists, image not.
+327 							this.linkElement.append( this.imageElement, false );
+328 					}
+329 					else
+330 						editor.insertElement( this.imageElement );
+331 				}
+332 				else		// Image already exists.
+333 				{
+334 					//Add a new link element.
+335 					if ( !this.linkEditMode && this.addLink )
+336 					{
+337 						this.imageElement.insertBeforeMe( this.linkElement );
+338 						this.imageElement.appendTo( this.linkElement );
+339 					}
+340 					//Remove Link, Image exists.
+341 					else if ( this.linkEditMode && !this.addLink )
+342 						this.linkElement.remove( true );
+343 				}
+344 			},
+345 			onLoad : function()
+346 			{
+347 				if ( dialogType != 'image' )
+348 					this.hidePage( 'Link' );		//Hide Link tab.
+349 			},
+350 			onHide : function()
+351 			{
+352 				if ( this.preview )
+353 					this.commitContent( CLEANUP, this.preview );
+354
+355 				if ( this.originalElement )
+356 				{
+357 					this.originalElement.removeListener( 'load', onImgLoadEvent );
+358 					this.originalElement.removeListener( 'error', onImgLoadErrorEvent );
+359 					this.originalElement.removeListener( 'abort', onImgLoadErrorEvent );
+360 					this.originalElement.remove();
+361 					this.originalElement = false;		// Dialog is closed.
+362 				}
+363 			},
+364 			contents : [
+365 				{
+366 					id : 'info',
+367 					label : editor.lang.image.infoTab,
+368 					accessKey : 'I',
+369 					elements :
+370 					[
+371 						{
+372 							type : 'vbox',
+373 							padding : 0,
+374 							children :
+375 							[
+376 								{
+377 									type : 'html',
+378 									html : '<span>' + CKEDITOR.tools.htmlEncode( editor.lang.image.url ) + '</span>'
+379 								},
+380 								{
+381 									type : 'hbox',
+382 									widths : [ '280px', '110px' ],
+383 									align : 'right',
+384 									children :
+385 									[
+386 										{
+387 											id : 'txtUrl',
+388 											type : 'text',
+389 											label : '',
+390 											onChange : function()
+391 											{
+392 												var dialog = this.getDialog(),
+393 													newUrl = this.getValue();
+394
+395 												//Update original image
+396 												if ( newUrl.length > 0 )	//Prevent from load before onShow
+397 												{
+398 													dialog = this.getDialog();
+399 													var original = dialog.originalElement;
+400
+401 													original.setCustomData( 'isReady', 'false' );
+402 													// Show loader
+403 													var loader = CKEDITOR.document.getById( 'ImagePreviewLoader' );
+404 													if ( loader )
+405 														loader.setStyle( 'display', '' );
+406
+407 													original.on( 'load', onImgLoadEvent, dialog );
+408 													original.on( 'error', onImgLoadErrorEvent, dialog );
+409 													original.on( 'abort', onImgLoadErrorEvent, dialog );
+410 													original.setAttribute( 'src', newUrl );
+411 													dialog.preview.setAttribute( 'src', newUrl );
+412
+413 													updatePreview( dialog );
+414 												}
+415 											},
+416 											setup : function( type, element )
+417 											{
+418 												if ( type == IMAGE )
+419 												{
+420 													var dialog = this.getDialog();
+421 													var url = element.getAttribute( '_cke_saved_src' );
+422 													if ( !url )
+423 														url = element.getAttribute( 'src' );
+424 													dialog.dontResetSize = true;
+425 													this.setValue( url );		// And call this.onChange()
+426 													this.focus();
+427 												}
+428 											},
+429 											commit : function( type, element )
+430 											{
+431 												if ( type == IMAGE && ( this.getValue() || this.isChanged() ) )
+432 												{
+433 													element.setAttribute( '_cke_saved_src', decodeURI( this.getValue() ) );
+434 													element.setAttribute( 'src', decodeURI( this.getValue() ) );
+435 												}
+436 												else if ( type == CLEANUP )
+437 												{
+438 													element.setAttribute( 'src', '' );	// If removeAttribute doesn't work.
+439 													element.removeAttribute( 'src' );
+440 												}
+441 											}
+442 										},
+443 										{
+444 											type : 'button',
+445 											id : 'browse',
+446 											align : 'center',
+447 											label : editor.lang.common.browseServer,
+448 											hidden : true,
+449 											filebrowser : 'info:txtUrl'
+450 										}
+451 									]
+452 								}
+453 							]
+454 						},
+455 						{
+456 							id : 'txtAlt',
+457 							type : 'text',
+458 							label : editor.lang.image.alt,
+459 							accessKey : 'A',
+460 							'default' : '',
+461 							onChange : function()
+462 							{
+463 								updatePreview( this.getDialog() );
+464 							},
+465 							setup : function( type, element )
+466 							{
+467 								if ( type == IMAGE )
+468 									this.setValue( element.getAttribute( 'alt' ) );
+469 							},
+470 							commit : function( type, element )
+471 							{
+472 								if ( type == IMAGE )
+473 								{
+474 									if ( this.getValue() || this.isChanged() )
+475 										element.setAttribute( 'alt', this.getValue() );
+476 								}
+477 								else if ( type == PREVIEW )
+478 								{
+479 									element.setAttribute( 'alt', this.getValue() );
+480 								}
+481 								else if ( type == CLEANUP )
+482 								{
+483 									element.removeAttribute( 'alt' );
+484 								}
+485 							}
+486 						},
+487 						{
+488 							type : 'hbox',
+489 							widths : [ '140px', '240px' ],
+490 							children :
+491 							[
+492 								{
+493 									type : 'vbox',
+494 									padding : 10,
+495 									children :
+496 									[
+497 										{
+498 											type : 'hbox',
+499 											widths : [ '70%', '30%' ],
+500 											children :
+501 											[
+502 												{
+503 													type : 'vbox',
+504 													padding : 1,
+505 													children :
+506 													[
+507 														{
+508 															type : 'text',
+509 															id : 'txtWidth',
+510 															labelLayout : 'horizontal',
+511 															label : editor.lang.image.width,
+512 															onKeyUp : onSizeChange,
+513 															validate: function()
+514 															{
+515 																var aMatch  =  this.getValue().match( regexGetSizeOrEmpty );
+516 																if ( !aMatch )
+517 																	alert( editor.lang.common.validateNumberFailed );
+518 																return !!aMatch;
+519 															},
+520 															setup : setupDimension,
+521 															commit : function( type, element )
+522 															{
+523 																if ( type == IMAGE )
+524 																{
+525 																	var value = this.getValue();
+526 																	if ( value )
+527 																		element.setAttribute( 'width', value );
+528 																	else if ( !value && this.isChanged() )
+529 																		element.removeAttribute( 'width' );
+530 																}
+531 																else if ( type == PREVIEW )
+532 																{
+533 																	value = this.getValue();
+534 																	var aMatch = value.match( regexGetSize );
+535 																	if ( !aMatch )
+536 																	{
+537 																		var oImageOriginal = this.getDialog().originalElement;
+538 																		if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' )
+539 																			element.setStyle( 'width',  oImageOriginal.$.width + 'px');
+540 																	}
+541 																	else
+542 																		element.setStyle( 'width', value + 'px');
+543 																}
+544 																else if ( type == CLEANUP )
+545 																{
+546 																	element.setStyle( 'width', '0px' );	// If removeAttribute doesn't work.
+547 																	element.removeAttribute( 'width' );
+548 																	element.removeStyle( 'width' );
+549 																}
+550 															}
+551 														},
+552 														{
+553 															type : 'text',
+554 															id : 'txtHeight',
+555 															labelLayout : 'horizontal',
+556 															label : editor.lang.image.height,
+557 															onKeyUp : onSizeChange,
+558 															validate: function()
+559 															{
+560 																var aMatch = this.getValue().match( regexGetSizeOrEmpty );
+561 																if ( !aMatch )
+562 																	alert( editor.lang.common.validateNumberFailed );
+563 																return !!aMatch;
+564 															},
+565 															setup : setupDimension,
+566 															commit : function( type, element )
+567 															{
+568 																if ( type == IMAGE )
+569 																{
+570 																	var value = this.getValue();
+571 																	if ( value )
+572 																		element.setAttribute( 'height', value );
+573 																	else if ( !value && this.isChanged() )
+574 																		element.removeAttribute( 'height' );
+575 																}
+576 																else if ( type == PREVIEW )
+577 																{
+578 																	value = this.getValue();
+579 																	var aMatch = value.match( regexGetSize );
+580 																	if ( !aMatch )
+581 																	{
+582 																		var oImageOriginal = this.getDialog().originalElement;
+583 																		if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' )
+584 																			element.setStyle( 'height',  oImageOriginal.$.height + 'px');
+585 																	}
+586 																	else
+587 																		element.setStyle( 'height', value + 'px');
+588 																}
+589 																else if ( type == CLEANUP )
+590 																{
+591 																	element.setStyle( 'height', '0px' );	// If removeAttribute doesn't work.
+592 																	element.removeAttribute( 'height' );
+593 																	element.removeStyle( 'height' );
+594 																}
+595 															}
+596 														}
+597 													]
+598 												},
+599 												{
+600 													type : 'html',
+601 													style : 'position:relative;top:10px;height:50px;',
+602 													onLoad : function()
+603 													{
+604 														// Activate Reset button
+605 														var	resetButton = CKEDITOR.document.getById( 'btnResetSize' ),
+606 															ratioButton = CKEDITOR.document.getById( 'btnLockSizes' );
+607 														if ( resetButton )
+608 														{
+609 															resetButton.on( 'click', function()
+610 																{
+611 																	resetSize( this );
+612 																}, this.getDialog() );
+613 															resetButton.on( 'mouseover', function()
+614 																{
+615 																	this.addClass( 'BtnOver' );
+616 																}, resetButton );
+617 															resetButton.on( 'mouseout', function()
+618 																{
+619 																	this.removeClass( 'BtnOver' );
+620 																}, resetButton );
+621 														}
+622 														// Activate (Un)LockRatio button
+623 														if ( ratioButton )
+624 														{
+625 															ratioButton.on( 'click', function()
+626 																{
+627 																	var locked = switchLockRatio( this ),
+628 																		oImageOriginal = this.originalElement,
+629 																		width = this.getValueOf( 'info', 'txtWidth' );
+630
+631 																	if ( oImageOriginal.getCustomData( 'isReady' ) == 'true' && width )
+632 																	{
+633 																		var height = oImageOriginal.$.height / oImageOriginal.$.width * width;
+634 																		if ( !isNaN( height ) )
+635 																		{
+636 																			this.setValueOf( 'info', 'txtHeight', Math.round( height ) );
+637 																			updatePreview( this );
+638 																		}
+639 																	}
+640 																}, this.getDialog() );
+641 															ratioButton.on( 'mouseover', function()
+642 																{
+643 																	this.addClass( 'BtnOver' );
+644 																}, ratioButton );
+645 															ratioButton.on( 'mouseout', function()
+646 																{
+647 																	this.removeClass( 'BtnOver' );
+648 																}, ratioButton );
+649 														}
+650 													},
+651 													html : '<div>'+
+652 														'<div title="' + editor.lang.image.lockRatio +
+653 														'" class="cke_btn_locked" id="btnLockSizes"></div>' +
+654 														'<div title="' + editor.lang.image.resetSize +
+655 														'" class="cke_btn_reset" id="btnResetSize"></div>'+
+656 														'</div>'
+657 												}
+658 											]
+659 										},
+660 										{
+661 											type : 'vbox',
+662 											padding : 1,
+663 											children :
+664 											[
+665 												{
+666 													type : 'text',
+667 													id : 'txtBorder',
+668 													labelLayout : 'horizontal',
+669 													label : editor.lang.image.border,
+670 													'default' : '',
+671 													onKeyUp : function()
+672 													{
+673 														updatePreview( this.getDialog() );
+674 													},
+675 													validate: function()
+676 													{
+677 														var func = CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed );
+678 														return func.apply( this );
+679 													},
+680 													setup : function( type, element )
+681 													{
+682 														if ( type == IMAGE )
+683 															this.setValue( element.getAttribute( 'border' ) );
+684 													},
+685 													commit : function( type, element )
+686 													{
+687 														if ( type == IMAGE )
+688 														{
+689 															if ( this.getValue() || this.isChanged() )
+690 																element.setAttribute( 'border', this.getValue() );
+691 														}
+692 														else if ( type == PREVIEW )
+693 														{
+694 															var value = parseInt( this.getValue(), 10 );
+695 															value = isNaN( value ) ? 0 : value;
+696 															element.setAttribute( 'border', value );
+697 															element.setStyle( 'border', value + 'px solid black' );
+698 														}
+699 														else if ( type == CLEANUP )
+700 														{
+701 															element.removeAttribute( 'border' );
+702 															element.removeStyle( 'border' );
+703 														}
+704 													}
+705 												},
+706 												{
+707 													type : 'text',
+708 													id : 'txtHSpace',
+709 													labelLayout : 'horizontal',
+710 													label : editor.lang.image.hSpace,
+711 													'default' : '',
+712 													onKeyUp : function()
+713 													{
+714 														updatePreview( this.getDialog() );
+715 													},
+716 													validate: function()
+717 													{
+718 														var func = CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed );
+719 														return func.apply( this );
+720 													},
+721 													setup : function( type, element )
+722 													{
+723 														if ( type == IMAGE )
+724 														{
+725 															var value = element.getAttribute( 'hspace' );
+726 															if ( value != -1 )				// In IE empty = -1.
+727 																this.setValue( value );
+728 														}
+729 													},
+730 													commit : function( type, element )
+731 													{
+732 														if ( type == IMAGE )
+733 														{
+734 															if ( this.getValue() || this.isChanged() )
+735 																element.setAttribute( 'hspace', this.getValue() );
+736 														}
+737 														else if ( type == PREVIEW )
+738 														{
+739 															var value = parseInt( this.getValue(), 10 );
+740 															value = isNaN( value ) ? 0 : value;
+741 															element.setAttribute( 'hspace', value );
+742 															element.setStyle( 'margin-left', value + 'px' );
+743 															element.setStyle( 'margin-right', value + 'px' );
+744 														}
+745 														else if ( type == CLEANUP )
+746 														{
+747 															element.removeAttribute( 'hspace' );
+748 															element.removeStyle( 'margin-left' );
+749 															element.removeStyle( 'margin-right' );
+750 														}
+751 													}
+752 												},
+753 												{
+754 													type : 'text',
+755 													id : 'txtVSpace',
+756 													labelLayout : 'horizontal',
+757 													label : editor.lang.image.vSpace,
+758 													'default' : '',
+759 													onKeyUp : function()
+760 													{
+761 														updatePreview( this.getDialog() );
+762 													},
+763 													validate: function()
+764 													{
+765 														var func = CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed );
+766 														return func.apply( this );
+767 													},
+768 													setup : function( type, element )
+769 													{
+770 														if ( type == IMAGE )
+771 															this.setValue( element.getAttribute( 'vspace' ) );
+772 													},
+773 													commit : function( type, element )
+774 													{
+775 														if ( type == IMAGE )
+776 														{
+777 															if ( this.getValue() || this.isChanged() )
+778 																element.setAttribute( 'vspace', this.getValue() );
+779 														}
+780 														else if ( type == PREVIEW )
+781 														{
+782 															var value = parseInt( this.getValue(), 10 );
+783 															value = isNaN( value ) ? 0 : value;
+784 															element.setAttribute( 'vspace', this.getValue() );
+785 															element.setStyle( 'margin-top', value + 'px' );
+786 															element.setStyle( 'margin-bottom', value + 'px' );
+787 														}
+788 														else if ( type == CLEANUP )
+789 														{
+790 															element.removeAttribute( 'vspace' );
+791 															element.removeStyle( 'margin-top' );
+792 															element.removeStyle( 'margin-bottom' );
+793 														}
+794 													}
+795 												},
+796 												{
+797 													id : 'cmbAlign',
+798 													type : 'select',
+799 													labelLayout : 'horizontal',
+800 													widths : [ '35%','65%' ],
+801 													style : 'width:100%',
+802 													label : editor.lang.image.align,
+803 													'default' : '',
+804 													items :
+805 													[
+806 														[ editor.lang.common.notSet , ''],
+807 														[ editor.lang.image.alignLeft , 'left'],
+808 														[ editor.lang.image.alignAbsBottom , 'absBottom'],
+809 														[ editor.lang.image.alignAbsMiddle , 'absMiddle'],
+810 														[ editor.lang.image.alignBaseline , 'baseline'],
+811 														[ editor.lang.image.alignBottom , 'bottom'],
+812 														[ editor.lang.image.alignMiddle , 'middle'],
+813 														[ editor.lang.image.alignRight , 'right'],
+814 														[ editor.lang.image.alignTextTop , 'textTop'],
+815 														[ editor.lang.image.alignTop , 'top']
+816 													],
+817 													onChange : function()
+818 													{
+819 														updatePreview( this.getDialog() );
+820 													},
+821 													setup : function( type, element )
+822 													{
+823 														if ( type == IMAGE )
+824 															this.setValue( element.getAttribute( 'align' ) );
+825 													},
+826 													commit : function( type, element )
+827 													{
+828 														var value = this.getValue();
+829 														if ( type == IMAGE )
+830 														{
+831 															if ( value || this.isChanged() )
+832 																element.setAttribute( 'align', value );
+833 														}
+834 														else if ( type == PREVIEW )
+835 														{
+836 															element.setAttribute( 'align', this.getValue() );
+837
+838 															if ( value == 'absMiddle' || value == 'middle' )
+839 																element.setStyle( 'vertical-align', 'middle' );
+840 															else if ( value == 'top' || value == 'textTop' )
+841 																element.setStyle( 'vertical-align', 'top' );
+842 															else
+843 																element.removeStyle( 'vertical-align' );
+844
+845 															if ( value == 'right' || value == 'left' )
+846 																element.setStyle( 'styleFloat', value );
+847 															else
+848 																element.removeStyle( 'styleFloat' );
+849
+850 														}
+851 														else if ( type == CLEANUP )
+852 														{
+853 															element.removeAttribute( 'align' );
+854 														}
+855 													}
+856 												}
+857 											]
+858 										}
+859 									]
+860 								},
+861 								{
+862 									type : 'vbox',
+863 									height : '250px',
+864 									children :
+865 									[
+866 										{
+867 											type : 'html',
+868 											style : 'width:95%;',
+869 											html : '<div>' + CKEDITOR.tools.htmlEncode( editor.lang.image.preview ) +'<br>'+
+870 											'<div id="ImagePreviewLoader" style="display:none"><div class="loading"> </div></div>'+
+871 											'<div id="ImagePreviewBox">'+
+872 											'<a href="javascript:void(0)" target="_blank" onclick="return false;" id="previewLink">'+
+873 											'<img id="previewImage" src="" alt="" /></a>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. '+
+874 											'Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, '+
+875 											'nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.' +
+876 											'</div>'+'</div>'
+877 										}
+878 									]
+879 								}
+880 							]
+881 						}
+882 					]
+883 				},
+884 				{
+885 					id : 'Link',
+886 					label : editor.lang.link.title,
+887 					padding : 0,
+888 					elements :
+889 					[
+890 						{
+891 							id : 'txtUrl',
+892 							type : 'text',
+893 							label : editor.lang.image.url,
+894 							style : 'width: 100%',
+895 							'default' : '',
+896 							setup : function( type, element )
+897 							{
+898 								if ( type == LINK )
+899 								{
+900 									var href = element.getAttribute( '_cke_saved_href' );
+901 									if ( !href )
+902 										href = element.getAttribute( 'href' );
+903 									this.setValue( href );
+904 								}
+905 							},
+906 							commit : function( type, element )
+907 							{
+908 								if ( type == LINK )
+909 								{
+910 									if ( this.getValue() || this.isChanged() )
+911 									{
+912 										element.setAttribute( '_cke_saved_href', decodeURI( this.getValue() ) );
+913 										element.setAttribute( 'href', 'javascript:void(0)/*' +
+914 											CKEDITOR.tools.getNextNumber() + '*/' );
+915
+916 										if ( this.getValue() || !editor.config.image_removeLinkByEmptyURL )
+917 											this.getDialog().addLink = true;
+918 									}
+919 								}
+920 							}
+921 						},
+922 						{
+923 							type : 'button',
+924 							id : 'browse',
+925 							filebrowser : 'Link:txtUrl',
+926 							style : 'float:right',
+927 							hidden : true,
+928 							label : editor.lang.common.browseServer
+929 						},
+930 						{
+931 							id : 'cmbTarget',
+932 							type : 'select',
+933 							label : editor.lang.link.target,
+934 							'default' : '',
+935 							items :
+936 							[
+937 								[ editor.lang.link.targetNotSet , ''],
+938 								[ editor.lang.link.targetNew , '_blank'],
+939 								[ editor.lang.link.targetTop , '_top'],
+940 								[ editor.lang.link.targetSelf , '_self'],
+941 								[ editor.lang.link.targetParent , '_parent']
+942 							],
+943 							setup : function( type, element )
+944 							{
+945 								if ( type == LINK )
+946 									this.setValue( element.getAttribute( 'target' ) );
+947 							},
+948 							commit : function( type, element )
+949 							{
+950 								if ( type == LINK )
+951 								{
+952 									if ( this.getValue() || this.isChanged() )
+953 										element.setAttribute( 'target', this.getValue() );
+954 								}
+955 							}
+956 						}
+957 					]
+958 				},
+959 				{
+960 					id : 'Upload',
+961 					hidden : true,
+962 					filebrowser : 'uploadButton',
+963 					label : editor.lang.image.upload,
+964 					elements :
+965 					[
+966 						{
+967 							type : 'file',
+968 							id : 'upload',
+969 							label : editor.lang.image.btnUpload,
+970 							size : 38
+971 						},
+972 						{
+973 							type : 'fileButton',
+974 							id : 'uploadButton',
+975 							filebrowser : 'info:txtUrl',
+976 							label : editor.lang.image.btnUpload,
+977 							'for' : [ 'Upload', 'upload' ]
+978 						}
+979 					]
+980 				},
+981 				{
+982 					id : 'advanced',
+983 					label : editor.lang.common.advancedTab,
+984 					elements :
+985 					[
+986 						{
+987 							type : 'hbox',
+988 							widths : [ '50%', '25%', '25%' ],
+989 							children :
+990 							[
+991 								{
+992 									type : 'text',
+993 									id : 'linkId',
+994 									label : editor.lang.common.id,
+995 									setup : function( type, element )
+996 									{
+997 										if ( type == IMAGE )
+998 											this.setValue( element.getAttribute( 'id' ) );
+999 									},
+1000 									commit : function( type, element )
+1001 									{
+1002 										if ( type == IMAGE )
+1003 										{
+1004 											if ( this.getValue() || this.isChanged() )
+1005 												element.setAttribute( 'id', this.getValue() );
+1006 										}
+1007 									}
+1008 								},
+1009 								{
+1010 									id : 'cmbLangDir',
+1011 									type : 'select',
+1012 									style : 'width : 100%;',
+1013 									label : editor.lang.common.langDir,
+1014 									'default' : '',
+1015 									items :
+1016 									[
+1017 										[ editor.lang.common.notSet, '' ],
+1018 										[ editor.lang.common.langDirLtr, 'ltr' ],
+1019 										[ editor.lang.common.langDirRtl, 'rtl' ]
+1020 									],
+1021 									setup : function( type, element )
+1022 									{
+1023 										if ( type == IMAGE )
+1024 											this.setValue( element.getAttribute( 'dir' ) );
+1025 									},
+1026 									commit : function( type, element )
+1027 									{
+1028 										if ( type == IMAGE )
+1029 										{
+1030 											if ( this.getValue() || this.isChanged() )
+1031 												element.setAttribute( 'dir', this.getValue() );
+1032 										}
+1033 									}
+1034 								},
+1035 								{
+1036 									type : 'text',
+1037 									id : 'txtLangCode',
+1038 									label : editor.lang.common.langCode,
+1039 									'default' : '',
+1040 									setup : function( type, element )
+1041 									{
+1042 										if ( type == IMAGE )
+1043 											this.setValue( element.getAttribute( 'lang' ) );
+1044 									},
+1045 									commit : function( type, element )
+1046 									{
+1047 										if ( type == IMAGE )
+1048 										{
+1049 											if ( this.getValue() || this.isChanged() )
+1050 												element.setAttribute( 'lang', this.getValue() );
+1051 										}
+1052 									}
+1053 								}
+1054 							]
+1055 						},
+1056 						{
+1057 							type : 'text',
+1058 							id : 'txtGenLongDescr',
+1059 							label : editor.lang.common.longDescr,
+1060 							setup : function( type, element )
+1061 							{
+1062 								if ( type == IMAGE )
+1063 									this.setValue( element.getAttribute( 'longDesc' ) );
+1064 							},
+1065 							commit : function( type, element )
+1066 							{
+1067 								if ( type == IMAGE )
+1068 								{
+1069 									if ( this.getValue() || this.isChanged() )
+1070 										element.setAttribute( 'longDesc', this.getValue() );
+1071 								}
+1072 							}
+1073 						},
+1074 						{
+1075 							type : 'hbox',
+1076 							widths : [ '50%', '50%' ],
+1077 							children :
+1078 							[
+1079 								{
+1080 									type : 'text',
+1081 									id : 'txtGenClass',
+1082 									label : editor.lang.common.cssClass,
+1083 									'default' : '',
+1084 									setup : function( type, element )
+1085 									{
+1086 										if ( type == IMAGE )
+1087 											this.setValue( element.getAttribute( 'class' ) );
+1088 									},
+1089 									commit : function( type, element )
+1090 									{
+1091 										if ( type == IMAGE )
+1092 										{
+1093 											if ( this.getValue() || this.isChanged() )
+1094 												element.setAttribute( 'class', this.getValue() );
+1095 										}
+1096 									}
+1097 								},
+1098 								{
+1099 									type : 'text',
+1100 									id : 'txtGenTitle',
+1101 									label : editor.lang.common.advisoryTitle,
+1102 									'default' : '',
+1103 									onChange : function()
+1104 									{
+1105 										updatePreview( this.getDialog() );
+1106 									},
+1107 									setup : function( type, element )
+1108 									{
+1109 										if ( type == IMAGE )
+1110 											this.setValue( element.getAttribute( 'title' ) );
+1111 									},
+1112 									commit : function( type, element )
+1113 									{
+1114 										if ( type == IMAGE )
+1115 										{
+1116 											if ( this.getValue() || this.isChanged() )
+1117 												element.setAttribute( 'title', this.getValue() );
+1118 										}
+1119 										else if ( type == PREVIEW )
+1120 										{
+1121 											element.setAttribute( 'title', this.getValue() );
+1122 										}
+1123 										else if ( type == CLEANUP )
+1124 										{
+1125 											element.removeAttribute( 'title' );
+1126 										}
+1127 									}
+1128 								}
+1129 							]
+1130 						},
+1131 						{
+1132 							type : 'text',
+1133 							id : 'txtdlgGenStyle',
+1134 							label : editor.lang.common.cssStyle,
+1135 							'default' : '',
+1136 							setup : function( type, element )
+1137 							{
+1138 								if ( type == IMAGE )
+1139 								{
+1140 									var genStyle = element.getAttribute( 'style' );
+1141 									if ( !genStyle && element.$.style.cssText )
+1142 										genStyle = element.$.style.cssText;
+1143 									this.setValue( genStyle );
+1144
+1145 									var height = element.$.style.height,
+1146 										width = element.$.style.width,
+1147 										aMatchH  = ( height ? height : '' ).match( regexGetSize ),
+1148 										aMatchW  = ( width ? width : '').match( regexGetSize );
+1149
+1150 									this.attributesInStyle =
+1151 									{
+1152 										height : !!aMatchH,
+1153 										width : !!aMatchW
+1154 									};
+1155 								}
+1156 							},
+1157 							commit : function( type, element )
+1158 							{
+1159 								if ( type == IMAGE && ( this.getValue() || this.isChanged() ) )
+1160 								{
+1161 									element.setAttribute( 'style', this.getValue() );
+1162
+1163 									// Set STYLE dimensions.
+1164 									var height = element.getAttribute( 'height' ),
+1165 										width = element.getAttribute( 'width' );
+1166
+1167 									if ( this.attributesInStyle && this.attributesInStyle.height )
+1168 									{
+1169 										if ( height )
+1170 										{
+1171 											if ( height.match( regexGetSize )[2] == '%' )			// % is allowed
+1172 												element.setStyle( 'height', height + '%' );
+1173 											else
+1174 												element.setStyle( 'height', height + 'px' );
+1175 										}
+1176 										else
+1177 											element.removeStyle( 'height' );
+1178 									}
+1179 									if ( this.attributesInStyle && this.attributesInStyle.width )
+1180 									{
+1181 										if ( width )
+1182 										{
+1183 											if ( width.match( regexGetSize )[2] == '%' )			// % is allowed
+1184 												element.setStyle( 'width', width + '%' );
+1185 											else
+1186 												element.setStyle( 'width', width + 'px' );
+1187 										}
+1188 										else
+1189 											element.removeStyle( 'width' );
+1190 									}
+1191 								}
+1192 							}
+1193 						}
+1194 					]
+1195 				}
+1196 			]
+1197 		};
+1198 	};
+1199
+1200 	CKEDITOR.dialog.add( 'image', function( editor )
+1201 		{
+1202 			return imageDialog( editor, 'image' );
+1203 		});
+1204
+1205 	CKEDITOR.dialog.add( 'imagebutton', function( editor )
+1206 		{
+1207 			return imageDialog( editor, 'imagebutton' );
+1208 		});
+1209 })();
+1210 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_image_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_image_plugin.js.html new file mode 100644 index 000000000..dc7a2117a --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_image_plugin.js.html @@ -0,0 +1,65 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Image plugin
+  8  */
+  9
+ 10 CKEDITOR.plugins.add( 'image',
+ 11 {
+ 12 	init : function( editor )
+ 13 	{
+ 14 		var pluginName = 'image';
+ 15
+ 16 		// Register the dialog.
+ 17 		CKEDITOR.dialog.add( pluginName, this.path + 'dialogs/image.js' );
+ 18
+ 19 		// Register the command.
+ 20 		editor.addCommand( pluginName, new CKEDITOR.dialogCommand( pluginName ) );
+ 21
+ 22 		// Register the toolbar button.
+ 23 		editor.ui.addButton( 'Image',
+ 24 			{
+ 25 				label : editor.lang.common.image,
+ 26 				command : pluginName
+ 27 			});
+ 28
+ 29 		// If the "menu" plugin is loaded, register the menu items.
+ 30 		if ( editor.addMenuItems )
+ 31 		{
+ 32 			editor.addMenuItems(
+ 33 				{
+ 34 					image :
+ 35 					{
+ 36 						label : editor.lang.image.menu,
+ 37 						command : 'image',
+ 38 						group : 'image'
+ 39 					}
+ 40 				});
+ 41 		}
+ 42
+ 43 		// If the "contextmenu" plugin is loaded, register the listeners.
+ 44 		if ( editor.contextMenu )
+ 45 		{
+ 46 			editor.contextMenu.addListener( function( element, selection )
+ 47 				{
+ 48 					if ( !element || !element.is( 'img' ) || element.getAttribute( '_cke_realelement' ) )
+ 49 						return null;
+ 50
+ 51 					return { image : CKEDITOR.TRISTATE_OFF };
+ 52 				});
+ 53 		}
+ 54 	}
+ 55 } );
+ 56
+ 57 CKEDITOR.config.image_removeLinkByEmptyURL = true;
+ 58 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_indent_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_indent_plugin.js.html new file mode 100644 index 000000000..15a232da9 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_indent_plugin.js.html @@ -0,0 +1,289 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Increse and decrease indent commands.
+  8  */
+  9
+ 10 (function()
+ 11 {
+ 12 	var listNodeNames = { ol : 1, ul : 1 };
+ 13
+ 14 	function setState( editor, state )
+ 15 	{
+ 16 		editor.getCommand( this.name ).setState( state );
+ 17 	}
+ 18
+ 19 	function onSelectionChange( evt )
+ 20 	{
+ 21 		var elements = evt.data.path.elements,
+ 22 			listNode, listItem,
+ 23 			editor = evt.editor;
+ 24
+ 25 		for ( var i = 0 ; i < elements.length ; i++ )
+ 26 		{
+ 27 			if ( elements[i].getName() == 'li' )
+ 28 			{
+ 29 				listItem = elements[i];
+ 30 				continue;
+ 31 			}
+ 32 			if ( listNodeNames[ elements[i].getName() ] )
+ 33 			{
+ 34 				listNode = elements[i];
+ 35 				break;
+ 36 			}
+ 37 		}
+ 38
+ 39 		if ( listNode )
+ 40 		{
+ 41 			if ( this.name == 'outdent' )
+ 42 				return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );
+ 43 			else
+ 44 			{
+ 45 				while ( listItem && ( listItem = listItem.getPrevious() ) )
+ 46 				{
+ 47 					if ( listItem.getName && listItem.getName() == 'li' )
+ 48 						return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );
+ 49 				}
+ 50 				return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED );
+ 51 			}
+ 52 		}
+ 53
+ 54 		if ( !this.useIndentClasses && this.name == 'indent' )
+ 55 			return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );
+ 56
+ 57 		var path = evt.data.path,
+ 58 			firstBlock = path.block || path.blockLimit;
+ 59 		if ( !firstBlock )
+ 60 			return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED );
+ 61
+ 62 		if ( this.useIndentClasses )
+ 63 		{
+ 64 			var indentClass = firstBlock.$.className.match( this.classNameRegex ),
+ 65 				indentStep = 0;
+ 66 			if ( indentClass )
+ 67 			{
+ 68 				indentClass = indentClass[1];
+ 69 				indentStep = this.indentClassMap[ indentClass ];
+ 70 			}
+ 71 			if ( ( this.name == 'outdent' && !indentStep ) ||
+ 72 					( this.name == 'indent' && indentStep == editor.config.indentClass.length ) )
+ 73 				return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED );
+ 74 			return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );
+ 75 		}
+ 76 		else
+ 77 		{
+ 78 			var indent = parseInt( firstBlock.getStyle( this.indentCssProperty ), 10 );
+ 79 			if ( isNaN( indent ) )
+ 80 				indent = 0;
+ 81 			if ( indent <= 0 )
+ 82 				return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED );
+ 83 			return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );
+ 84 		}
+ 85 	}
+ 86
+ 87 	function indentList( editor, range, listNode )
+ 88 	{
+ 89 		// Our starting and ending points of the range might be inside some blocks under a list item...
+ 90 		// So before playing with the iterator, we need to expand the block to include the list items.
+ 91 		var startContainer = range.startContainer,
+ 92 			endContainer = range.endContainer;
+ 93 		while ( startContainer && !startContainer.getParent().equals( listNode ) )
+ 94 			startContainer = startContainer.getParent();
+ 95 		while ( endContainer && !endContainer.getParent().equals( listNode ) )
+ 96 			endContainer = endContainer.getParent();
+ 97
+ 98 		if ( !startContainer || !endContainer )
+ 99 			return;
+100
+101 		// Now we can iterate over the individual items on the same tree depth.
+102 		var block = startContainer,
+103 			itemsToMove = [],
+104 			stopFlag = false;
+105 		while ( !stopFlag )
+106 		{
+107 			if ( block.equals( endContainer ) )
+108 				stopFlag = true;
+109 			itemsToMove.push( block );
+110 			block = block.getNext();
+111 		}
+112 		if ( itemsToMove.length < 1 )
+113 			return;
+114
+115 		// Do indent or outdent operations on the array model of the list, not the
+116 		// list's DOM tree itself. The array model demands that it knows as much as
+117 		// possible about the surrounding lists, we need to feed it the further
+118 		// ancestor node that is still a list.
+119 		var listParents = listNode.getParents();
+120 		for ( var i = 0 ; i < listParents.length ; i++ )
+121 		{
+122 			if ( listParents[i].getName && listNodeNames[ listParents[i].getName() ] )
+123 			{
+124 				listNode = listParents[i];
+125 				break;
+126 			}
+127 		}
+128 		var indentOffset = this.name == 'indent' ? 1 : -1,
+129 			startItem = itemsToMove[0],
+130 			lastItem = itemsToMove[ itemsToMove.length - 1 ],
+131 			database = {};
+132
+133 		// Convert the list DOM tree into a one dimensional array.
+134 		var listArray = CKEDITOR.plugins.list.listToArray( listNode, database );
+135
+136 		// Apply indenting or outdenting on the array.
+137 		var baseIndent = listArray[ lastItem.getCustomData( 'listarray_index' ) ].indent;
+138 		for ( i = startItem.getCustomData( 'listarray_index' ) ; i <= lastItem.getCustomData( 'listarray_index' ) ; i++ )
+139 			listArray[i].indent += indentOffset;
+140 		for ( i = lastItem.getCustomData( 'listarray_index' ) + 1 ;
+141 				i < listArray.length && listArray[i].indent > baseIndent ; i++ )
+142 			listArray[i].indent += indentOffset;
+143
+144 		// Convert the array back to a DOM forest (yes we might have a few subtrees now).
+145 		// And replace the old list with the new forest.
+146 		var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode, 0 );
+147 		if ( newList )
+148 			newList.listNode.replace( listNode );
+149
+150 		// Clean up the markers.
+151 		CKEDITOR.dom.element.clearAllMarkers( database );
+152 	}
+153
+154 	function indentBlock( editor, range )
+155 	{
+156 		var iterator = range.createIterator();
+157 		iterator.enforceRealBlocks = true;
+158
+159 		var block;
+160 		while ( ( block = iterator.getNextParagraph() ) )
+161 		{
+162
+163 			if ( this.useIndentClasses )
+164 			{
+165 				// Transform current class name to indent step index.
+166 				var indentClass = block.$.className.match( this.classNameRegex ),
+167 					indentStep = 0;
+168 				if ( indentClass )
+169 				{
+170 					indentClass = indentClass[1];
+171 					indentStep = this.indentClassMap[ indentClass ];
+172 				}
+173
+174 				// Operate on indent step index, transform indent step index back to class
+175 				// name.
+176 				if ( this.name == 'outdent' )
+177 					indentStep--;
+178 				else
+179 					indentStep++;
+180 				indentStep = Math.min( indentStep, editor.config.indentClasses.length );
+181 				indentStep = Math.max( indentStep, 0 );
+182 				var className = CKEDITOR.tools.ltrim( block.$.className.replace( this.classNameRegex, '' ) );
+183 				if ( indentStep < 1 )
+184 					block.$.className = className;
+185 				else
+186 					block.addClass( editor.config.indentClasses[ indentStep - 1 ] );
+187 			}
+188 			else
+189 			{
+190 				var currentOffset = parseInt( block.getStyle( this.indentCssProperty ), 10 );
+191 				if ( isNaN( currentOffset ) )
+192 					currentOffset = 0;
+193 				currentOffset += ( this.name == 'indent' ? 1 : -1 ) * editor.config.indentOffset;
+194 				currentOffset = Math.max( currentOffset, 0 );
+195 				currentOffset = Math.ceil( currentOffset / editor.config.indentOffset ) * editor.config.indentOffset;
+196 				block.setStyle( this.indentCssProperty, currentOffset ? currentOffset + editor.config.indentUnit : '' );
+197 				if ( block.getAttribute( 'style' ) === '' )
+198 					block.removeAttribute( 'style' );
+199 			}
+200 		}
+201 	}
+202
+203 	function indentCommand( editor, name )
+204 	{
+205 		this.name = name;
+206 		this.useIndentClasses = editor.config.indentClasses && editor.config.indentClasses.length > 0;
+207 		if ( this.useIndentClasses )
+208 		{
+209 			this.classNameRegex = new RegExp( '(?:^|\\s+)(' + editor.config.indentClasses.join( '|' ) + ')(?=$|\\s)' );
+210 			this.indentClassMap = {};
+211 			for ( var i = 0 ; i < editor.config.indentClasses.length ; i++ )
+212 				this.indentClassMap[ editor.config.indentClasses[i] ] = i + 1;
+213 		}
+214 		else
+215 			this.indentCssProperty = editor.config.contentsLangDirection == 'ltr' ? 'margin-left' : 'margin-right';
+216 	}
+217
+218 	indentCommand.prototype = {
+219 		exec : function( editor )
+220 		{
+221 			var selection = editor.getSelection(),
+222 				range = selection && selection.getRanges()[0];
+223
+224 			if ( !selection || !range )
+225 				return;
+226
+227 			var bookmarks = selection.createBookmarks( true ),
+228 				nearestListBlock = range.getCommonAncestor();
+229
+230 			while ( nearestListBlock && !( nearestListBlock.type == CKEDITOR.NODE_ELEMENT &&
+231 				listNodeNames[ nearestListBlock.getName() ] ) )
+232 				nearestListBlock = nearestListBlock.getParent();
+233
+234 			if ( nearestListBlock )
+235 				indentList.call( this, editor, range, nearestListBlock );
+236 			else
+237 				indentBlock.call( this, editor, range );
+238
+239 			editor.focus();
+240 			editor.forceNextSelectionCheck();
+241 			selection.selectBookmarks( bookmarks );
+242 		}
+243 	};
+244
+245 	CKEDITOR.plugins.add( 'indent',
+246 	{
+247 		init : function( editor )
+248 		{
+249 			// Register commands.
+250 			var indent = new indentCommand( editor, 'indent' ),
+251 				outdent = new indentCommand( editor, 'outdent' );
+252 			editor.addCommand( 'indent', indent );
+253 			editor.addCommand( 'outdent', outdent );
+254
+255 			// Register the toolbar buttons.
+256 			editor.ui.addButton( 'Indent',
+257 				{
+258 					label : editor.lang.indent,
+259 					command : 'indent'
+260 				});
+261 			editor.ui.addButton( 'Outdent',
+262 				{
+263 					label : editor.lang.outdent,
+264 					command : 'outdent'
+265 				});
+266
+267 			// Register the state changing handlers.
+268 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, indent ) );
+269 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, outdent ) );
+270 		},
+271
+272 		requires : [ 'domiterator', 'list' ]
+273 	} );
+274 })();
+275
+276 CKEDITOR.tools.extend( CKEDITOR.config,
+277 	{
+278 		indentOffset : 40,
+279 		indentUnit : 'px',
+280 		indentClasses : null
+281 	});
+282 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_justify_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_justify_plugin.js.html new file mode 100644 index 000000000..ca71bba02 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_justify_plugin.js.html @@ -0,0 +1,172 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Justify commands.
+  8  */
+  9
+ 10 (function()
+ 11 {
+ 12 	var alignRemoveRegex = /(-moz-|-webkit-|start|auto)/i;
+ 13
+ 14 	function getState( editor, path )
+ 15 	{
+ 16 		var firstBlock = path.block || path.blockLimit;
+ 17
+ 18 		if ( !firstBlock || firstBlock.getName() == 'body' )
+ 19 			return CKEDITOR.TRISTATE_OFF;
+ 20
+ 21 		var currentAlign = firstBlock.getComputedStyle( 'text-align' ).replace( alignRemoveRegex, '' );
+ 22 		if ( ( !currentAlign && this.isDefaultAlign ) || currentAlign == this.value )
+ 23 			return CKEDITOR.TRISTATE_ON;
+ 24 		return CKEDITOR.TRISTATE_OFF;
+ 25 	}
+ 26
+ 27 	function onSelectionChange( evt )
+ 28 	{
+ 29 		var command = evt.editor.getCommand( this.name );
+ 30 		command.state = getState.call( this, evt.editor, evt.data.path );
+ 31 		command.fire( 'state' );
+ 32 	}
+ 33
+ 34 	function justifyCommand( editor, name, value )
+ 35 	{
+ 36 		this.name = name;
+ 37 		this.value = value;
+ 38
+ 39 		var contentDir = editor.config.contentsLangDirection;
+ 40 		this.isDefaultAlign = ( value == 'left' && contentDir == 'ltr' ) ||
+ 41 			( value == 'right' && contentDir == 'rtl' );
+ 42
+ 43 		var classes = editor.config.justifyClasses;
+ 44 		if ( classes )
+ 45 		{
+ 46 			switch ( value )
+ 47 			{
+ 48 				case 'left' :
+ 49 					this.cssClassName = classes[0];
+ 50 					break;
+ 51 				case 'center' :
+ 52 					this.cssClassName = classes[1];
+ 53 					break;
+ 54 				case 'right' :
+ 55 					this.cssClassName = classes[2];
+ 56 					break;
+ 57 				case 'justify' :
+ 58 					this.cssClassName = classes[3];
+ 59 					break;
+ 60 			}
+ 61
+ 62 			this.cssClassRegex = new RegExp( '(?:^|\\s+)(?:' + classes.join( '|' ) + ')(?=$|\\s)' );
+ 63 		}
+ 64 	}
+ 65
+ 66 	justifyCommand.prototype = {
+ 67 		exec : function( editor )
+ 68 		{
+ 69 			var selection = editor.getSelection();
+ 70 			if ( !selection )
+ 71 				return;
+ 72
+ 73 			var bookmarks = selection.createBookmarks(),
+ 74 				ranges = selection.getRanges();
+ 75
+ 76
+ 77 			var cssClassName = this.cssClassName,
+ 78 				iterator,
+ 79 				block;
+ 80 			for ( var i = ranges.length - 1 ; i >= 0 ; i-- )
+ 81 			{
+ 82 				iterator = ranges[ i ].createIterator();
+ 83 				while ( ( block = iterator.getNextParagraph() ) )
+ 84 				{
+ 85 					block.removeAttribute( 'align' );
+ 86
+ 87 					if ( cssClassName )
+ 88 					{
+ 89 						// Remove any of the alignment classes from the className.
+ 90 						var className = block.$.className =
+ 91 							CKEDITOR.tools.ltrim( block.$.className.replace( this.cssClassRegex, '' ) );
+ 92
+ 93 						// Append the desired class name.
+ 94 						if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )
+ 95 							block.addClass( cssClassName );
+ 96 						else if ( !className )
+ 97 							block.removeAttribute( 'class' );
+ 98 					}
+ 99 					else
+100 					{
+101 						if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )
+102 							block.setStyle( 'text-align', this.value );
+103 						else
+104 							block.removeStyle( 'text-align' );
+105 					}
+106 				}
+107
+108 			}
+109
+110 			editor.focus();
+111 			editor.forceNextSelectionCheck();
+112 			selection.selectBookmarks( bookmarks );
+113 		}
+114 	};
+115
+116 	CKEDITOR.plugins.add( 'justify',
+117 	{
+118 		init : function( editor )
+119 		{
+120 			var left = new justifyCommand( editor, 'justifyleft', 'left' ),
+121 				center = new justifyCommand( editor, 'justifycenter', 'center' ),
+122 				right = new justifyCommand( editor, 'justifyright', 'right' ),
+123 				justify = new justifyCommand( editor, 'justifyblock', 'justify' );
+124
+125 			editor.addCommand( 'justifyleft', left );
+126 			editor.addCommand( 'justifycenter', center );
+127 			editor.addCommand( 'justifyright', right );
+128 			editor.addCommand( 'justifyblock', justify );
+129
+130 			editor.ui.addButton( 'JustifyLeft',
+131 				{
+132 					label : editor.lang.justify.left,
+133 					command : 'justifyleft'
+134 				} );
+135 			editor.ui.addButton( 'JustifyCenter',
+136 				{
+137 					label : editor.lang.justify.center,
+138 					command : 'justifycenter'
+139 				} );
+140 			editor.ui.addButton( 'JustifyRight',
+141 				{
+142 					label : editor.lang.justify.right,
+143 					command : 'justifyright'
+144 				} );
+145 			editor.ui.addButton( 'JustifyBlock',
+146 				{
+147 					label : editor.lang.justify.block,
+148 					command : 'justifyblock'
+149 				} );
+150
+151 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, left ) );
+152 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, right ) );
+153 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, center ) );
+154 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, justify ) );
+155 		},
+156
+157 		requires : [ 'domiterator' ]
+158 	});
+159 })();
+160
+161 CKEDITOR.tools.extend( CKEDITOR.config,
+162 	{
+163 		justifyClasses : null
+164 	} );
+165 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_keystrokes_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_keystrokes_plugin.js.html new file mode 100644 index 000000000..d55f319dd --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_keystrokes_plugin.js.html @@ -0,0 +1,196 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 // Register a plugin named "sample".
+  7 CKEDITOR.plugins.add( 'keystrokes',
+  8 {
+  9 	beforeInit : function( editor )
+ 10 	{
+ 11 		/**
+ 12 		 * Controls keystrokes typing in this editor instance.
+ 13 		 * @name CKEDITOR.editor.prototype.keystrokeHandler
+ 14 		 * @type CKEDITOR.keystrokeHandler
+ 15 		 * @example
+ 16 		 */
+ 17 		editor.keystrokeHandler = new CKEDITOR.keystrokeHandler( editor );
+ 18
+ 19 		editor.specialKeys = {};
+ 20 	},
+ 21
+ 22 	init : function( editor )
+ 23 	{
+ 24 		var keystrokesConfig	= editor.config.keystrokes,
+ 25 			blockedConfig		= editor.config.blockedKeystrokes;
+ 26
+ 27 		var keystrokes			= editor.keystrokeHandler.keystrokes,
+ 28 			blockedKeystrokes	= editor.keystrokeHandler.blockedKeystrokes;
+ 29
+ 30 		for ( var i = 0 ; i < keystrokesConfig.length ; i++ )
+ 31 		{
+ 32 			keystrokes[ keystrokesConfig[i][0] ] = keystrokesConfig[i][1];
+ 33 		}
+ 34
+ 35 		for ( i = 0 ; i < blockedConfig.length ; i++ )
+ 36 		{
+ 37 			blockedKeystrokes[ blockedConfig[i] ] = 1;
+ 38 		}
+ 39 	}
+ 40 });
+ 41
+ 42 /**
+ 43  * Controls keystrokes typing in an editor instance.
+ 44  * @constructor
+ 45  * @param {CKEDITOR.editor} editor The editor instance.
+ 46  * @example
+ 47  */
+ 48 CKEDITOR.keystrokeHandler = function( editor )
+ 49 {
+ 50 	if ( editor.keystrokeHandler )
+ 51 		return editor.keystrokeHandler;
+ 52
+ 53 	/**
+ 54 	 * List of keystrokes associated to commands. Each entry points to the
+ 55 	 * command to be executed.
+ 56 	 * @type Object
+ 57 	 * @example
+ 58 	 */
+ 59 	this.keystrokes = {};
+ 60
+ 61 	/**
+ 62 	 * List of keystrokes that should be blocked if not defined at
+ 63 	 * {@link keystrokes}. In this way it is possible to block the default
+ 64 	 * browser behavior for those keystrokes.
+ 65 	 * @type Object
+ 66 	 * @example
+ 67 	 */
+ 68 	this.blockedKeystrokes = {};
+ 69
+ 70 	this._ =
+ 71 	{
+ 72 		editor : editor
+ 73 	};
+ 74
+ 75 	return this;
+ 76 };
+ 77
+ 78 (function()
+ 79 {
+ 80 	var cancel;
+ 81
+ 82 	var onKeyDown = function( event )
+ 83 	{
+ 84 		// The DOM event object is passed by the "data" property.
+ 85 		event = event.data;
+ 86
+ 87 		var keyCombination = event.getKeystroke();
+ 88 		var command = this.keystrokes[ keyCombination ];
+ 89 		var editor = this._.editor;
+ 90
+ 91 		cancel = ( editor.fire( 'key', { keyCode : keyCombination } ) === true );
+ 92
+ 93 		if ( !cancel )
+ 94 		{
+ 95 			if ( command )
+ 96 			{
+ 97 				var data = { from : 'keystrokeHandler' };
+ 98 				cancel = ( editor.execCommand( command, data ) !== false );
+ 99 			}
+100
+101 			if  ( !cancel )
+102 			{
+103 				var handler = editor.specialKeys[ keyCombination ];
+104 				cancel = ( handler && handler( editor ) === true );
+105
+106 				if ( !cancel )
+107 					cancel = !!this.blockedKeystrokes[ keyCombination ];
+108 			}
+109 		}
+110
+111 		if ( cancel )
+112 			event.preventDefault( true );
+113
+114 		return !cancel;
+115 	};
+116
+117 	var onKeyPress = function( event )
+118 	{
+119 		if ( cancel )
+120 		{
+121 			cancel = false;
+122 			event.data.preventDefault( true );
+123 		}
+124 	};
+125
+126 	CKEDITOR.keystrokeHandler.prototype =
+127 	{
+128 		/**
+129 		 * Attaches this keystroke handle to a DOM object. Keystrokes typed
+130 		 ** over this object will get handled by this keystrokeHandler.
+131 		 * @param {CKEDITOR.dom.domObject} domObject The DOM object to attach
+132 		 *		to.
+133 		 * @example
+134 		 */
+135 		attach : function( domObject )
+136 		{
+137 			// For most browsers, it is enough to listen to the keydown event
+138 			// only.
+139 			domObject.on( 'keydown', onKeyDown, this );
+140
+141 			// Some browsers instead, don't cancel key events in the keydown, but in the
+142 			// keypress. So we must do a longer trip in those cases.
+143 			if ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.mac ) )
+144 				domObject.on( 'keypress', onKeyPress, this );
+145 		}
+146 	};
+147 })();
+148
+149 /**
+150  * A list of keystrokes to be blocked if not defined in the {@link #keystrokes}
+151  * setting. In this way it is possible to block the default browser behavior
+152  * for those keystrokes.
+153  * @type Array
+154  * @example
+155  */
+156 CKEDITOR.config.blockedKeystrokes =
+157 [
+158 	CKEDITOR.CTRL + 66 /*B*/,
+159 	CKEDITOR.CTRL + 73 /*I*/,
+160 	CKEDITOR.CTRL + 85 /*U*/
+161 ];
+162
+163 /**
+164  * A list associating keystrokes to editor commands. Each element in the list
+165  * is an array where the first item is the keystroke, and the second is the
+166  * command to be executed.
+167  * @type Array
+168  * @example
+169  */
+170 CKEDITOR.config.keystrokes =
+171 [
+172 	[ CKEDITOR.ALT + 121 /*F10*/, 'toolbarFocus' ],
+173 	[ CKEDITOR.ALT + 122 /*F11*/, 'elementsPathFocus' ],
+174
+175 	[ CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' ],
+176
+177 	[ CKEDITOR.CTRL + 90 /*Z*/, 'undo' ],
+178 	[ CKEDITOR.CTRL + 89 /*Y*/, 'redo' ],
+179 	[ CKEDITOR.CTRL + CKEDITOR.SHIFT + 90 /*Z*/, 'redo' ],
+180
+181 	[ CKEDITOR.CTRL + 76 /*L*/, 'link' ],
+182
+183 	[ CKEDITOR.CTRL + 66 /*B*/, 'bold' ],
+184 	[ CKEDITOR.CTRL + 73 /*I*/, 'italic' ],
+185 	[ CKEDITOR.CTRL + 85 /*U*/, 'underline' ],
+186
+187 	[ CKEDITOR.ALT + 109 /*-*/, 'toolbarCollapse' ]
+188 ];
+189 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_dialogs_anchor.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_dialogs_anchor.js.html new file mode 100644 index 000000000..46f8cdce9 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_dialogs_anchor.js.html @@ -0,0 +1,106 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dialog.add( 'anchor', function( editor )
+  7 {
+  8 	// Function called in onShow to load selected element.
+  9 	var loadElements = function( editor, selection, element )
+ 10 	{
+ 11 		this.editMode = true;
+ 12 		this.editObj = element;
+ 13
+ 14 		var attributeValue = this.editObj.getAttribute( 'name' );
+ 15 		if ( attributeValue )
+ 16 			this.setValueOf( 'info','txtName', attributeValue );
+ 17 		else
+ 18 			this.setValueOf( 'info','txtName', "" );
+ 19 	};
+ 20
+ 21 	return {
+ 22 		title : editor.lang.anchor.title,
+ 23 		minWidth : 300,
+ 24 		minHeight : 60,
+ 25 		onOk : function()
+ 26 		{
+ 27 			// Always create a new anchor, because of IE BUG.
+ 28 			var name = this.getValueOf( 'info', 'txtName' ),
+ 29 				element = CKEDITOR.env.ie ?
+ 30 				editor.document.createElement( '<a name="' + CKEDITOR.tools.htmlEncode( name ) + '">' ) :
+ 31 				editor.document.createElement( 'a' );
+ 32
+ 33 			// Move contents and attributes of old anchor to new anchor.
+ 34 			if ( this.editMode )
+ 35 			{
+ 36 				this.editObj.copyAttributes( element, { name : 1 } );
+ 37 				this.editObj.moveChildren( element );
+ 38 			}
+ 39
+ 40 			// Set name.
+ 41 			element.removeAttribute( '_cke_saved_name' );
+ 42 			element.setAttribute( 'name', name );
+ 43
+ 44 			// Insert a new anchor.
+ 45 			var fakeElement = editor.createFakeElement( element, 'cke_anchor', 'anchor' );
+ 46 			if ( !this.editMode )
+ 47 				editor.insertElement( fakeElement );
+ 48 			else
+ 49 			{
+ 50 				fakeElement.replace( this.fakeObj );
+ 51 				editor.getSelection().selectElement( fakeElement );
+ 52 			}
+ 53
+ 54 			return true;
+ 55 		},
+ 56 		onShow : function()
+ 57 		{
+ 58 			this.editObj = false;
+ 59 			this.fakeObj = false;
+ 60 			this.editMode = false;
+ 61
+ 62 			var selection = editor.getSelection();
+ 63 			var element = selection.getSelectedElement();
+ 64 			if ( element && element.getAttribute( '_cke_real_element_type' ) && element.getAttribute( '_cke_real_element_type' ) == 'anchor' )
+ 65 			{
+ 66 				this.fakeObj = element;
+ 67 				element = editor.restoreRealElement( this.fakeObj );
+ 68 				loadElements.apply( this, [ editor, selection, element ] );
+ 69 				selection.selectElement( this.fakeObj );
+ 70 			}
+ 71 			this.getContentElement( 'info', 'txtName' ).focus();
+ 72 		},
+ 73 		contents : [
+ 74 			{
+ 75 				id : 'info',
+ 76 				label : editor.lang.anchor.title,
+ 77 				accessKey : 'I',
+ 78 				elements :
+ 79 				[
+ 80 					{
+ 81 						type : 'text',
+ 82 						id : 'txtName',
+ 83 						label : editor.lang.anchor.name,
+ 84 						validate : function()
+ 85 						{
+ 86 							if ( !this.getValue() )
+ 87 							{
+ 88 								alert( editor.lang.anchor.errorName );
+ 89 								return false;
+ 90 							}
+ 91 							return true;
+ 92 						}
+ 93 					}
+ 94 				]
+ 95 			}
+ 96 		]
+ 97 	};
+ 98 } );
+ 99 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_dialogs_link.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_dialogs_link.js.html new file mode 100644 index 000000000..e65d6ddc8 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_dialogs_link.js.html @@ -0,0 +1,1221 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, 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 	// Handles the event when the "Target" selection box is changed.
+  9 	var targetChanged = function()
+ 10 	{
+ 11 		var dialog = this.getDialog(),
+ 12 			popupFeatures = dialog.getContentElement( 'target', 'popupFeatures' ),
+ 13 			targetName = dialog.getContentElement( 'target', 'linkTargetName' ),
+ 14 			value = this.getValue();
+ 15
+ 16 		if ( !popupFeatures || !targetName )
+ 17 			return;
+ 18
+ 19 		popupFeatures = popupFeatures.getElement();
+ 20
+ 21 		if ( value == 'popup' )
+ 22 		{
+ 23 			popupFeatures.show();
+ 24 			targetName.setLabel( editor.lang.link.targetPopupName );
+ 25 		}
+ 26 		else
+ 27 		{
+ 28 			popupFeatures.hide();
+ 29 			targetName.setLabel( editor.lang.link.targetFrameName );
+ 30 			this.getDialog().setValueOf( 'target', 'linkTargetName', value.charAt( 0 ) == '_' ? value : '' );
+ 31 		}
+ 32 	};
+ 33
+ 34 	// Handles the event when the "Type" selection box is changed.
+ 35 	var linkTypeChanged = function()
+ 36 	{
+ 37 		var dialog = this.getDialog(),
+ 38 			partIds = [ 'urlOptions', 'anchorOptions', 'emailOptions' ],
+ 39 			typeValue = this.getValue(),
+ 40 			uploadInitiallyHidden = dialog.definition.getContents( 'upload' ).hidden;
+ 41
+ 42 		if ( typeValue == 'url' )
+ 43 		{
+ 44 			if ( editor.config.linkShowTargetTab )
+ 45 				dialog.showPage( 'target' );
+ 46 			if ( !uploadInitiallyHidden )
+ 47 				dialog.showPage( 'upload' );
+ 48 		}
+ 49 		else
+ 50 		{
+ 51 			dialog.hidePage( 'target' );
+ 52 			if ( !uploadInitiallyHidden )
+ 53 				dialog.hidePage( 'upload' );
+ 54 		}
+ 55
+ 56 		for ( var i = 0 ; i < partIds.length ; i++ )
+ 57 		{
+ 58 			var element = dialog.getContentElement( 'info', partIds[i] );
+ 59 			if ( !element )
+ 60 				continue;
+ 61
+ 62 			element = element.getElement().getParent().getParent();
+ 63 			if ( partIds[i] == typeValue + 'Options' )
+ 64 				element.show();
+ 65 			else
+ 66 				element.hide();
+ 67 		}
+ 68 	};
+ 69
+ 70 	// Loads the parameters in a selected link to the link dialog fields.
+ 71 	var emailRegex = /^mailto:([^?]+)(?:\?(.+))?$/,
+ 72 		emailSubjectRegex = /subject=([^;?:@&=$,\/]*)/,
+ 73 		emailBodyRegex = /body=([^;?:@&=$,\/]*)/,
+ 74 		anchorRegex = /^#(.*)$/,
+ 75 		urlRegex = /^((?:http|https|ftp|news):\/\/)?(.*)$/,
+ 76 		selectableTargets = /^(_(?:self|top|parent|blank))$/;
+ 77
+ 78 	var popupRegex =
+ 79 		/\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*/;
+ 80 	var popupFeaturesRegex = /(?:^|,)([^=]+)=(\d+|yes|no)/gi;
+ 81
+ 82 	var parseLink = function( editor, element )
+ 83 	{
+ 84 		var href = element ? ( element.getAttribute( '_cke_saved_href' ) || element.getAttribute( 'href' ) ) : '',
+ 85 			emailMatch = '',
+ 86 			anchorMatch = '',
+ 87 			urlMatch = false,
+ 88 			retval = {};
+ 89
+ 90 		if ( href )
+ 91 		{
+ 92 			emailMatch = href.match( emailRegex );
+ 93 			anchorMatch = href.match( anchorRegex );
+ 94 			urlMatch = href.match( urlRegex );
+ 95 		}
+ 96
+ 97 		// Load the link type and URL.
+ 98 		if ( emailMatch )
+ 99 		{
+100 			var subjectMatch = href.match( emailSubjectRegex ),
+101 				bodyMatch = href.match( emailBodyRegex );
+102 			retval.type = 'email';
+103 			retval.email = {};
+104 			retval.email.address = emailMatch[1];
+105 			subjectMatch && ( retval.email.subject = decodeURIComponent( subjectMatch[1] ) );
+106 			bodyMatch && ( retval.email.body = decodeURIComponent( bodyMatch[1] ) );
+107 		}
+108 		else if ( anchorMatch )
+109 		{
+110 			retval.type = 'anchor';
+111 			retval.anchor = {};
+112 			retval.anchor.name = retval.anchor.id = anchorMatch[1];
+113 		}
+114 		else if ( href && urlMatch )		// urlRegex matches empty strings, so need to check for href as well.
+115 		{
+116 			retval.type = 'url';
+117 			retval.url = {};
+118 			retval.url.protocol = urlMatch[1];
+119 			retval.url.url = urlMatch[2];
+120 		}
+121 		else
+122 			retval.type = 'url';
+123
+124 		// Load target and popup settings.
+125 		if ( element )
+126 		{
+127 			var target = element.getAttribute( 'target' );
+128 			retval.target = {};
+129 			retval.adv = {};
+130
+131 			// IE BUG: target attribute is an empty string instead of null in IE if it's not set.
+132 			if ( !target )
+133 			{
+134 				var onclick = element.getAttribute( '_cke_pa_onclick' ) || element.getAttribute( 'onclick' ),
+135 					onclickMatch = onclick && onclick.match( popupRegex );
+136 				if ( onclickMatch )
+137 				{
+138 					retval.target.type = 'popup';
+139 					retval.target.name = onclickMatch[1];
+140
+141 					var featureMatch;
+142 					while ( ( featureMatch = popupFeaturesRegex.exec( onclickMatch[2] ) ) )
+143 					{
+144 						if ( featureMatch[2] == 'yes' || featureMatch[2] == '1' )
+145 							retval.target[ featureMatch[1] ] = true;
+146 						else if ( isFinite( featureMatch[2] ) )
+147 							retval.target[ featureMatch[1] ] = featureMatch[2];
+148 					}
+149 				}
+150 			}
+151 			else
+152 			{
+153 				var targetMatch = target.match( selectableTargets );
+154 				if ( targetMatch )
+155 					retval.target.type = retval.target.name = target;
+156 				else
+157 				{
+158 					retval.target.type = 'frame';
+159 					retval.target.name = target;
+160 				}
+161 			}
+162
+163 			var me = this;
+164 			var advAttr = function( inputName, attrName )
+165 			{
+166 				var value = element.getAttribute( attrName );
+167 				if ( value !== null )
+168 					retval.adv[ inputName ] = value || '';
+169 			};
+170 			advAttr( 'advId', 'id' );
+171 			advAttr( 'advLangDir', 'dir' );
+172 			advAttr( 'advAccessKey', 'accessKey' );
+173 			advAttr( 'advName', 'name' );
+174 			advAttr( 'advLangCode', 'lang' );
+175 			advAttr( 'advTabIndex', 'tabindex' );
+176 			advAttr( 'advTitle', 'title' );
+177 			advAttr( 'advContentType', 'type' );
+178 			advAttr( 'advCSSClasses', 'class' );
+179 			advAttr( 'advCharset', 'charset' );
+180 			advAttr( 'advStyles', 'style' );
+181 		}
+182
+183 		// Find out whether we have any anchors in the editor.
+184 		// Get all IMG elements in CK document.
+185 		var elements = editor.document.getElementsByTag( 'img' ),
+186 			realAnchors = new CKEDITOR.dom.nodeList( editor.document.$.anchors ),
+187 			anchors = retval.anchors = [];
+188
+189 		for( var i = 0; i < elements.count() ; i++ )
+190 		{
+191 			var item = elements.getItem( i );
+192 			if ( item.getAttribute( '_cke_realelement' ) && item.getAttribute( '_cke_real_element_type' ) == 'anchor' )
+193 			{
+194 				anchors.push( editor.restoreRealElement( item ) );
+195 			}
+196 		}
+197
+198 		for ( i = 0 ; i < realAnchors.count() ; i++ )
+199 			anchors.push( realAnchors.getItem( i ) );
+200
+201 		for ( i = 0 ; i < anchors.length ; i++ )
+202 		{
+203 			item = anchors[ i ];
+204 			anchors[ i ] = { name : item.getAttribute( 'name' ), id : item.getAttribute( 'id' ) };
+205 		}
+206
+207 		// Record down the selected element in the dialog.
+208 		this._.selectedElement = element;
+209
+210 		return retval;
+211 	};
+212
+213 	var setupParams = function( page, data )
+214 	{
+215 		if ( data[page] )
+216 			this.setValue( data[page][this.id] || '' );
+217 	};
+218
+219 	var setupPopupParams = function( data )
+220 	{
+221 		return setupParams.call( this, 'target', data );
+222 	};
+223
+224 	var setupAdvParams = function( data )
+225 	{
+226 		return setupParams.call( this, 'adv', data );
+227 	};
+228
+229 	var commitParams = function( page, data )
+230 	{
+231 		if ( !data[page] )
+232 			data[page] = {};
+233
+234 		data[page][this.id] = this.getValue() || '';
+235 	};
+236
+237 	var commitPopupParams = function( data )
+238 	{
+239 		return commitParams.call( this, 'target', data );
+240 	};
+241
+242 	var commitAdvParams = function( data )
+243 	{
+244 		return commitParams.call( this, 'adv', data );
+245 	};
+246
+247 	return {
+248 		title : editor.lang.link.title,
+249 		minWidth : 350,
+250 		minHeight : 230,
+251 		contents : [
+252 			{
+253 				id : 'info',
+254 				label : editor.lang.link.info,
+255 				title : editor.lang.link.info,
+256 				elements :
+257 				[
+258 					{
+259 						id : 'linkType',
+260 						type : 'select',
+261 						label : editor.lang.link.type,
+262 						'default' : 'url',
+263 						items :
+264 						[
+265 							[ editor.lang.common.url, 'url' ],
+266 							[ editor.lang.link.toAnchor, 'anchor' ],
+267 							[ editor.lang.link.toEmail, 'email' ]
+268 						],
+269 						onChange : linkTypeChanged,
+270 						setup : function( data )
+271 						{
+272 							if ( data.type )
+273 								this.setValue( data.type );
+274 						},
+275 						commit : function( data )
+276 						{
+277 							data.type = this.getValue();
+278 						}
+279 					},
+280 					{
+281 						type : 'vbox',
+282 						id : 'urlOptions',
+283 						children :
+284 						[
+285 							{
+286 								type : 'hbox',
+287 								widths : [ '25%', '75%' ],
+288 								children :
+289 								[
+290 									{
+291 										id : 'protocol',
+292 										type : 'select',
+293 										label : editor.lang.common.protocol,
+294 										'default' : 'http://',
+295 										style : 'width : 100%;',
+296 										items :
+297 										[
+298 											[ 'http://' ],
+299 											[ 'https://' ],
+300 											[ 'ftp://' ],
+301 											[ 'news://' ],
+302 											[ '<other>', '' ]
+303 										],
+304 										setup : function( data )
+305 										{
+306 											if ( data.url )
+307 												this.setValue( data.url.protocol );
+308 										},
+309 										commit : function( data )
+310 										{
+311 											if ( !data.url )
+312 												data.url = {};
+313
+314 											data.url.protocol = this.getValue();
+315 										}
+316 									},
+317 									{
+318 										type : 'text',
+319 										id : 'url',
+320 										label : editor.lang.common.url,
+321 										onLoad : function ()
+322 										{
+323 											this.allowOnChange = true;
+324 										},
+325 										onKeyUp : function()
+326 										{
+327 											this.allowOnChange = false;
+328 											var	protocolCmb = this.getDialog().getContentElement( 'info', 'protocol' ),
+329 												url = this.getValue(),
+330 												urlOnChangeProtocol = /^(http|https|ftp|news):\/\/(?=.)/gi,
+331 												urlOnChangeTestOther = /^((javascript:)|[#\/\.])/gi;
+332
+333 											var protocol = urlOnChangeProtocol.exec( url );
+334 											if ( protocol )
+335 											{
+336 												this.setValue( url.substr( protocol[ 0 ].length ) );
+337 												protocolCmb.setValue( protocol[ 0 ].toLowerCase() );
+338 											}
+339 											else if ( urlOnChangeTestOther.test( url ) )
+340 												protocolCmb.setValue( '' );
+341
+342 											this.allowOnChange = true;
+343 										},
+344 										onChange : function()
+345 										{
+346 											if ( this.allowOnChange )		// Dont't call on dialog load.
+347 												this.onKeyUp();
+348 										},
+349 										validate : function()
+350 										{
+351 											var dialog = this.getDialog();
+352
+353 											if ( dialog.getContentElement( 'info', 'linkType' ) &&
+354 													dialog.getValueOf( 'info', 'linkType' ) != 'url' )
+355 												return true;
+356
+357 											if ( this.getDialog().fakeObj )	// Edit Anchor.
+358 												return true;
+359
+360 											var func = CKEDITOR.dialog.validate.notEmpty( editor.lang.link.noUrl );
+361 											return func.apply( this );
+362 										},
+363 										setup : function( data )
+364 										{
+365 											this.allowOnChange = false;
+366 											if ( data.url )
+367 												this.setValue( data.url.url );
+368 											this.allowOnChange = true;
+369
+370 											var linkType = this.getDialog().getContentElement( 'info', 'linkType' );
+371 											if ( linkType && linkType.getValue() == 'url' )
+372 												this.select();
+373
+374 										},
+375 										commit : function( data )
+376 										{
+377 											if ( !data.url )
+378 												data.url = {};
+379
+380 											data.url.url = this.getValue();
+381 											this.allowOnChange = false;
+382 										}
+383 									}
+384 								],
+385 								setup : function( data )
+386 								{
+387 									if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
+388 										this.getElement().show();
+389 								}
+390 							},
+391 							{
+392 								type : 'button',
+393 								id : 'browse',
+394 								hidden : 'true',
+395 								filebrowser : 'info:url',
+396 								label : editor.lang.common.browseServer
+397 							}
+398 						]
+399 					},
+400 					{
+401 						type : 'vbox',
+402 						id : 'anchorOptions',
+403 						width : 260,
+404 						align : 'center',
+405 						padding : 0,
+406 						children :
+407 						[
+408 							{
+409 								type : 'html',
+410 								id : 'selectAnchorText',
+411 								html : CKEDITOR.tools.htmlEncode( editor.lang.link.selectAnchor ),
+412 								setup : function( data )
+413 								{
+414 									if ( data.anchors.length > 0 )
+415 										this.getElement().show();
+416 									else
+417 										this.getElement().hide();
+418 								}
+419 							},
+420 							{
+421 								type : 'html',
+422 								id : 'noAnchors',
+423 								style : 'text-align: center;',
+424 								html : '<div>' + CKEDITOR.tools.htmlEncode( editor.lang.link.noAnchors ) + '</div>',
+425 								setup : function( data )
+426 								{
+427 									if ( data.anchors.length < 1 )
+428 										this.getElement().show();
+429 									else
+430 										this.getElement().hide();
+431 								}
+432 							},
+433 							{
+434 								type : 'hbox',
+435 								id : 'selectAnchor',
+436 								children :
+437 								[
+438 									{
+439 										type : 'select',
+440 										id : 'anchorName',
+441 										'default' : '',
+442 										label : editor.lang.link.anchorName,
+443 										style : 'width: 100%;',
+444 										items :
+445 										[
+446 											[ '' ]
+447 										],
+448 										setup : function( data )
+449 										{
+450 											this.clear();
+451 											this.add( '' );
+452 											for ( var i = 0 ; i < data.anchors.length ; i++ )
+453 											{
+454 												if ( data.anchors[i].name )
+455 													this.add( data.anchors[i].name );
+456 											}
+457
+458 											if ( data.anchor )
+459 												this.setValue( data.anchor.name );
+460
+461 											var linkType = this.getDialog().getContentElement( 'info', 'linkType' );
+462 											if ( linkType && linkType.getValue() == 'email' )
+463 												this.focus();
+464 										},
+465 										commit : function( data )
+466 										{
+467 											if ( !data.anchor )
+468 												data.anchor = {};
+469
+470 											data.anchor.name = this.getValue();
+471 										}
+472 									},
+473 									{
+474 										type : 'select',
+475 										id : 'anchorId',
+476 										'default' : '',
+477 										label : editor.lang.link.anchorId,
+478 										style : 'width: 100%;',
+479 										items :
+480 										[
+481 											[ '' ]
+482 										],
+483 										setup : function( data )
+484 										{
+485 											this.clear();
+486 											this.add( '' );
+487 											for ( var i = 0 ; i < data.anchors.length ; i++ )
+488 											{
+489 												if ( data.anchors[i].id )
+490 													this.add( data.anchors[i].id );
+491 											}
+492
+493 											if ( data.anchor )
+494 												this.setValue( data.anchor.id );
+495 										},
+496 										commit : function( data )
+497 										{
+498 											if ( !data.anchor )
+499 												data.anchor = {};
+500
+501 											data.anchor.id = this.getValue();
+502 										}
+503 									}
+504 								],
+505 								setup : function( data )
+506 								{
+507 									if ( data.anchors.length > 0 )
+508 										this.getElement().show();
+509 									else
+510 										this.getElement().hide();
+511 								}
+512 							}
+513 						],
+514 						setup : function( data )
+515 						{
+516 							if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
+517 								this.getElement().hide();
+518 						}
+519 					},
+520 					{
+521 						type :  'vbox',
+522 						id : 'emailOptions',
+523 						padding : 1,
+524 						children :
+525 						[
+526 							{
+527 								type : 'text',
+528 								id : 'emailAddress',
+529 								label : editor.lang.link.emailAddress,
+530 								validate : function()
+531 								{
+532 									var dialog = this.getDialog();
+533
+534 									if ( !dialog.getContentElement( 'info', 'linkType' ) ||
+535 											dialog.getValueOf( 'info', 'linkType' ) != 'email' )
+536 										return true;
+537
+538 									var func = CKEDITOR.dialog.validate.notEmpty( editor.lang.link.noEmail );
+539 									return func.apply( this );
+540 								},
+541 								setup : function( data )
+542 								{
+543 									if ( data.email )
+544 										this.setValue( data.email.address );
+545
+546 									var linkType = this.getDialog().getContentElement( 'info', 'linkType' );
+547 									if ( linkType && linkType.getValue() == 'email' )
+548 										this.select();
+549 								},
+550 								commit : function( data )
+551 								{
+552 									if ( !data.email )
+553 										data.email = {};
+554
+555 									data.email.address = this.getValue();
+556 								}
+557 							},
+558 							{
+559 								type : 'text',
+560 								id : 'emailSubject',
+561 								label : editor.lang.link.emailSubject,
+562 								setup : function( data )
+563 								{
+564 									if ( data.email )
+565 										this.setValue( data.email.subject );
+566 								},
+567 								commit : function( data )
+568 								{
+569 									if ( !data.email )
+570 										data.email = {};
+571
+572 									data.email.subject = this.getValue();
+573 								}
+574 							},
+575 							{
+576 								type : 'textarea',
+577 								id : 'emailBody',
+578 								label : editor.lang.link.emailBody,
+579 								rows : 3,
+580 								'default' : '',
+581 								setup : function( data )
+582 								{
+583 									if ( data.email )
+584 										this.setValue( data.email.body );
+585 								},
+586 								commit : function( data )
+587 								{
+588 									if ( !data.email )
+589 										data.email = {};
+590
+591 									data.email.body = this.getValue();
+592 								}
+593 							}
+594 						],
+595 						setup : function( data )
+596 						{
+597 							if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
+598 								this.getElement().hide();
+599 						}
+600 					}
+601 				]
+602 			},
+603 			{
+604 				id : 'target',
+605 				label : editor.lang.link.target,
+606 				title : editor.lang.link.target,
+607 				elements :
+608 				[
+609 					{
+610 						type : 'hbox',
+611 						widths : [ '50%', '50%' ],
+612 						children :
+613 						[
+614 							{
+615 								type : 'select',
+616 								id : 'linkTargetType',
+617 								label : editor.lang.link.target,
+618 								'default' : 'notSet',
+619 								style : 'width : 100%;',
+620 								'items' :
+621 								[
+622 									[ editor.lang.link.targetNotSet, 'notSet' ],
+623 									[ editor.lang.link.targetFrame, 'frame' ],
+624 									[ editor.lang.link.targetPopup, 'popup' ],
+625 									[ editor.lang.link.targetNew, '_blank' ],
+626 									[ editor.lang.link.targetTop, '_top' ],
+627 									[ editor.lang.link.targetSelf, '_self' ],
+628 									[ editor.lang.link.targetParent, '_parent' ]
+629 								],
+630 								onChange : targetChanged,
+631 								setup : function( data )
+632 								{
+633 									if ( data.target )
+634 										this.setValue( data.target.type );
+635 								},
+636 								commit : function( data )
+637 								{
+638 									if ( !data.target )
+639 										data.target = {};
+640
+641 									data.target.type = this.getValue();
+642 								}
+643 							},
+644 							{
+645 								type : 'text',
+646 								id : 'linkTargetName',
+647 								label : editor.lang.link.targetFrameName,
+648 								'default' : '',
+649 								setup : function( data )
+650 								{
+651 									if ( data.target )
+652 										this.setValue( data.target.name );
+653 								},
+654 								commit : function( data )
+655 								{
+656 									if ( !data.target )
+657 										data.target = {};
+658
+659 									data.target.name = this.getValue();
+660 								}
+661 							}
+662 						]
+663 					},
+664 					{
+665 						type : 'vbox',
+666 						width : 260,
+667 						align : 'center',
+668 						padding : 2,
+669 						id : 'popupFeatures',
+670 						children :
+671 						[
+672 							{
+673 								type : 'html',
+674 								html : CKEDITOR.tools.htmlEncode( editor.lang.link.popupFeatures )
+675 							},
+676 							{
+677 								type : 'hbox',
+678 								children :
+679 								[
+680 									{
+681 										type : 'checkbox',
+682 										id : 'resizable',
+683 										label : editor.lang.link.popupResizable,
+684 										setup : setupPopupParams,
+685 										commit : commitPopupParams
+686 									},
+687 									{
+688 										type : 'checkbox',
+689 										id : 'status',
+690 										label : editor.lang.link.popupStatusBar,
+691 										setup : setupPopupParams,
+692 										commit : commitPopupParams
+693
+694 									}
+695 								]
+696 							},
+697 							{
+698 								type : 'hbox',
+699 								children :
+700 								[
+701 									{
+702 										type : 'checkbox',
+703 										id : 'location',
+704 										label : editor.lang.link.popupLocationBar,
+705 										setup : setupPopupParams,
+706 										commit : commitPopupParams
+707
+708 									},
+709 									{
+710 										type : 'checkbox',
+711 										id : 'toolbar',
+712 										label : editor.lang.link.popupToolbar,
+713 										setup : setupPopupParams,
+714 										commit : commitPopupParams
+715
+716 									}
+717 								]
+718 							},
+719 							{
+720 								type : 'hbox',
+721 								children :
+722 								[
+723 									{
+724 										type : 'checkbox',
+725 										id : 'menubar',
+726 										label : editor.lang.link.popupMenuBar,
+727 										setup : setupPopupParams,
+728 										commit : commitPopupParams
+729
+730 									},
+731 									{
+732 										type : 'checkbox',
+733 										id : 'fullscreen',
+734 										label : editor.lang.link.popupFullScreen,
+735 										setup : setupPopupParams,
+736 										commit : commitPopupParams
+737
+738 									}
+739 								]
+740 							},
+741 							{
+742 								type : 'hbox',
+743 								children :
+744 								[
+745 									{
+746 										type : 'checkbox',
+747 										id : 'scrollbars',
+748 										label : editor.lang.link.popupScrollBars,
+749 										setup : setupPopupParams,
+750 										commit : commitPopupParams
+751
+752 									},
+753 									{
+754 										type : 'checkbox',
+755 										id : 'dependent',
+756 										label : editor.lang.link.popupDependent,
+757 										setup : setupPopupParams,
+758 										commit : commitPopupParams
+759
+760 									}
+761 								]
+762 							},
+763 							{
+764 								type : 'hbox',
+765 								children :
+766 								[
+767 									{
+768 										type :  'text',
+769 										widths : [ '30%', '70%' ],
+770 										labelLayout : 'horizontal',
+771 										label : editor.lang.link.popupWidth,
+772 										id : 'width',
+773 										setup : setupPopupParams,
+774 										commit : commitPopupParams
+775
+776 									},
+777 									{
+778 										type :  'text',
+779 										labelLayout : 'horizontal',
+780 										widths : [ '55%', '45%' ],
+781 										label : editor.lang.link.popupLeft,
+782 										id : 'left',
+783 										setup : setupPopupParams,
+784 										commit : commitPopupParams
+785
+786 									}
+787 								]
+788 							},
+789 							{
+790 								type : 'hbox',
+791 								children :
+792 								[
+793 									{
+794 										type :  'text',
+795 										labelLayout : 'horizontal',
+796 										widths : [ '30%', '70%' ],
+797 										label : editor.lang.link.popupHeight,
+798 										id : 'height',
+799 										setup : setupPopupParams,
+800 										commit : commitPopupParams
+801
+802 									},
+803 									{
+804 										type :  'text',
+805 										labelLayout : 'horizontal',
+806 										label : editor.lang.link.popupTop,
+807 										widths : [ '55%', '45%' ],
+808 										id : 'top',
+809 										setup : setupPopupParams,
+810 										commit : commitPopupParams
+811
+812 									}
+813 								]
+814 							}
+815 						]
+816 					}
+817 				]
+818 			},
+819 			{
+820 				id : 'upload',
+821 				label : editor.lang.link.upload,
+822 				title : editor.lang.link.upload,
+823 				hidden : true,
+824 				filebrowser : 'uploadButton',
+825 				elements :
+826 				[
+827 					{
+828 						type : 'file',
+829 						id : 'upload',
+830 						label : editor.lang.common.upload,
+831 						size : 38
+832 					},
+833 					{
+834 						type : 'fileButton',
+835 						id : 'uploadButton',
+836 						label : editor.lang.common.uploadSubmit,
+837 						filebrowser : 'info:url',
+838 						'for' : [ 'upload', 'upload' ]
+839 					}
+840 				]
+841 			},
+842 			{
+843 				id : 'advanced',
+844 				label : editor.lang.link.advanced,
+845 				title : editor.lang.link.advanced,
+846 				elements :
+847 				[
+848 					{
+849 						type : 'vbox',
+850 						padding : 1,
+851 						children :
+852 						[
+853 							{
+854 								type : 'hbox',
+855 								widths : [ '45%', '35%', '20%' ],
+856 								children :
+857 								[
+858 									{
+859 										type : 'text',
+860 										id : 'advId',
+861 										label : editor.lang.link.id,
+862 										setup : setupAdvParams,
+863 										commit : commitAdvParams
+864 									},
+865 									{
+866 										type : 'select',
+867 										id : 'advLangDir',
+868 										label : editor.lang.link.langDir,
+869 										'default' : '',
+870 										style : 'width: 100%;',
+871 										items :
+872 										[
+873 											[ editor.lang.link.langDirNotSet, '' ],
+874 											[ editor.lang.link.langDirLTR, 'ltr' ],
+875 											[ editor.lang.link.langDirRTL, 'rtl' ]
+876 										],
+877 										setup : setupAdvParams,
+878 										commit : commitAdvParams
+879 									},
+880 									{
+881 										type : 'text',
+882 										id : 'advAccessKey',
+883 										label : editor.lang.link.acccessKey,
+884 										maxLength : 1,
+885 										setup : setupAdvParams,
+886 										commit : commitAdvParams
+887
+888 									}
+889 								]
+890 							},
+891 							{
+892 								type : 'hbox',
+893 								widths : [ '45%', '35%', '20%' ],
+894 								children :
+895 								[
+896 									{
+897 										type : 'text',
+898 										label : editor.lang.link.name,
+899 										id : 'advName',
+900 										setup : setupAdvParams,
+901 										commit : commitAdvParams
+902
+903 									},
+904 									{
+905 										type : 'text',
+906 										label : editor.lang.link.langCode,
+907 										id : 'advLangCode',
+908 										'default' : '',
+909 										setup : setupAdvParams,
+910 										commit : commitAdvParams
+911
+912 									},
+913 									{
+914 										type : 'text',
+915 										label : editor.lang.link.tabIndex,
+916 										id : 'advTabIndex',
+917 										maxLength : 5,
+918 										setup : setupAdvParams,
+919 										commit : commitAdvParams
+920
+921 									}
+922 								]
+923 							}
+924 						]
+925 					},
+926 					{
+927 						type : 'vbox',
+928 						padding : 1,
+929 						children :
+930 						[
+931 							{
+932 								type : 'hbox',
+933 								widths : [ '45%', '55%' ],
+934 								children :
+935 								[
+936 									{
+937 										type : 'text',
+938 										label : editor.lang.link.advisoryTitle,
+939 										'default' : '',
+940 										id : 'advTitle',
+941 										setup : setupAdvParams,
+942 										commit : commitAdvParams
+943
+944 									},
+945 									{
+946 										type : 'text',
+947 										label : editor.lang.link.advisoryContentType,
+948 										'default' : '',
+949 										id : 'advContentType',
+950 										setup : setupAdvParams,
+951 										commit : commitAdvParams
+952
+953 									}
+954 								]
+955 							},
+956 							{
+957 								type : 'hbox',
+958 								widths : [ '45%', '55%' ],
+959 								children :
+960 								[
+961 									{
+962 										type : 'text',
+963 										label : editor.lang.link.cssClasses,
+964 										'default' : '',
+965 										id : 'advCSSClasses',
+966 										setup : setupAdvParams,
+967 										commit : commitAdvParams
+968
+969 									},
+970 									{
+971 										type : 'text',
+972 										label : editor.lang.link.charset,
+973 										'default' : '',
+974 										id : 'advCharset',
+975 										setup : setupAdvParams,
+976 										commit : commitAdvParams
+977
+978 									}
+979 								]
+980 							},
+981 							{
+982 								type : 'hbox',
+983 								children :
+984 								[
+985 									{
+986 										type : 'text',
+987 										label : editor.lang.link.styles,
+988 										'default' : '',
+989 										id : 'advStyles',
+990 										setup : setupAdvParams,
+991 										commit : commitAdvParams
+992
+993 									}
+994 								]
+995 							}
+996 						]
+997 					}
+998 				]
+999 			}
+1000 		],
+1001 		onShow : function()
+1002 		{
+1003 			this.fakeObj = false;
+1004
+1005 			var editor = this.getParentEditor(),
+1006 				selection = editor.getSelection(),
+1007 				ranges = selection.getRanges(),
+1008 				element = null,
+1009 				me = this;
+1010 			// Fill in all the relevant fields if there's already one link selected.
+1011 			if ( ranges.length == 1 )
+1012 			{
+1013
+1014 				var rangeRoot = ranges[0].getCommonAncestor( true );
+1015 				element = rangeRoot.getAscendant( 'a', true );
+1016 				if ( element && element.getAttribute( 'href' ) )
+1017 				{
+1018 					selection.selectElement( element );
+1019 				}
+1020 				else
+1021 				{
+1022 					element = rangeRoot.getAscendant( 'img', true );
+1023 					if ( element && element.getAttribute( '_cke_real_element_type' ) && element.getAttribute( '_cke_real_element_type' ) == 'anchor' )
+1024 					{
+1025 						this.fakeObj = element;
+1026 						element = editor.restoreRealElement( this.fakeObj );
+1027 						selection.selectElement( this.fakeObj );
+1028 					}
+1029 				}
+1030 			}
+1031
+1032 			this.setupContent( parseLink.apply( this, [ editor, element ] ) );
+1033 		},
+1034 		onOk : function()
+1035 		{
+1036 			var attributes = { href : 'javascript:void(0)/*' + CKEDITOR.tools.getNextNumber() + '*/' },
+1037 				removeAttributes = [],
+1038 				data = { href : attributes.href },
+1039 				me = this, editor = this.getParentEditor();
+1040
+1041 			this.commitContent( data );
+1042
+1043 			// Compose the URL.
+1044 			switch ( data.type || 'url' )
+1045 			{
+1046 				case 'url':
+1047 					var protocol = ( data.url && data.url.protocol != undefined ) ? data.url.protocol : 'http://',
+1048 						url = ( data.url && data.url.url ) || '';
+1049 					attributes._cke_saved_href = ( url.indexOf( '/' ) === 0 ) ? url : protocol + url;
+1050 					break;
+1051 				case 'anchor':
+1052 					var name = ( data.anchor && data.anchor.name ),
+1053 						id = ( data.anchor && data.anchor.id );
+1054 					attributes._cke_saved_href = '#' + ( name || id || '' );
+1055 					break;
+1056 				case 'email':
+1057 					var address = ( data.email && data.email.address ),
+1058 						subject = ( data.email && encodeURIComponent( data.email.subject || '' ) ),
+1059 						body = ( data.email && encodeURIComponent( data.email.body || '' ) ),
+1060 						linkList = [ 'mailto:', address ];
+1061 					if ( subject || body )
+1062 					{
+1063 						var argList = [];
+1064 						linkList.push( '?' );
+1065 						subject && argList.push( 'subject=' + subject );
+1066 						body && argList.push( 'body=' + body );
+1067 						linkList.push( argList.join( '&' ) );
+1068 					}
+1069 					attributes._cke_saved_href = linkList.join( '' );
+1070 					break;
+1071 				default:
+1072 			}
+1073
+1074 			// Popups and target.
+1075 			if ( data.target )
+1076 			{
+1077 				if ( data.target.type == 'popup' )
+1078 				{
+1079 					var onclickList = [ 'window.open(this.href, \'',
+1080 							data.target.name || '', '\', \'' ];
+1081 					var featureList = [ 'resizable', 'status', 'location', 'toolbar', 'menubar', 'fullscreen',
+1082 							'scrollbars', 'dependent' ];
+1083 					var featureLength = featureList.length;
+1084 					var addFeature = function( featureName )
+1085 					{
+1086 						if ( data.target[ featureName ] )
+1087 							featureList.push( featureName + '=' + data.target[ featureName ] );
+1088 					};
+1089
+1090 					for ( var i = 0 ; i < featureLength ; i++ )
+1091 						featureList[i] = featureList[i] + ( data.target[ featureList[i] ] ? '=yes' : '=no' ) ;
+1092 					addFeature( 'width' );
+1093 					addFeature( 'left' );
+1094 					addFeature( 'height' );
+1095 					addFeature( 'top' );
+1096
+1097 					onclickList.push( featureList.join( ',' ), '\'); return false;' );
+1098 					attributes[ CKEDITOR.env.ie || CKEDITOR.env.webkit ? '_cke_pa_onclick' : 'onclick' ] = onclickList.join( '' );
+1099 				}
+1100 				else
+1101 				{
+1102 					if ( data.target.type != 'notSet' && data.target.name )
+1103 						attributes.target = data.target.name;
+1104 					removeAttributes.push( '_cke_pa_onclick', 'onclick' );
+1105 				}
+1106 			}
+1107
+1108 			// Advanced attributes.
+1109 			if ( data.adv )
+1110 			{
+1111 				var advAttr = function( inputName, attrName )
+1112 				{
+1113 					var value = data.adv[ inputName ];
+1114 					if ( value )
+1115 						attributes[attrName] = value;
+1116 					else
+1117 						removeAttributes.push( attrName );
+1118 				};
+1119
+1120 				if ( this._.selectedElement )
+1121 					advAttr( 'advId', 'id' );
+1122 				advAttr( 'advLangDir', 'dir' );
+1123 				advAttr( 'advAccessKey', 'accessKey' );
+1124 				advAttr( 'advName', 'name' );
+1125 				advAttr( 'advLangCode', 'lang' );
+1126 				advAttr( 'advTabIndex', 'tabindex' );
+1127 				advAttr( 'advTitle', 'title' );
+1128 				advAttr( 'advContentType', 'type' );
+1129 				advAttr( 'advCSSClasses', 'class' );
+1130 				advAttr( 'advCharset', 'charset' );
+1131 				advAttr( 'advStyles', 'style' );
+1132 			}
+1133
+1134 			if ( !this._.selectedElement )
+1135 			{
+1136 				// Create element if current selection is collapsed.
+1137 				var selection = editor.getSelection(),
+1138 					ranges = selection.getRanges();
+1139 				if ( ranges.length == 1 && ranges[0].collapsed )
+1140 				{
+1141 					var text = new CKEDITOR.dom.text( attributes._cke_saved_href, editor.document );
+1142 					ranges[0].insertNode( text );
+1143 					ranges[0].selectNodeContents( text );
+1144 					selection.selectRanges( ranges );
+1145 				}
+1146
+1147 				// Apply style.
+1148 				var style = new CKEDITOR.style( { element : 'a', attributes : attributes } );
+1149 				style.type = CKEDITOR.STYLE_INLINE;		// need to override... dunno why.
+1150 				style.apply( editor.document );
+1151
+1152 				// Id. Apply only to the first link.
+1153 				if ( data.adv && data.adv.advId )
+1154 				{
+1155 					var links = this.getParentEditor().document.$.getElementsByTagName( 'a' );
+1156 					for ( i = 0 ; i < links.length ; i++ )
+1157 					{
+1158 						if ( links[i].href == attributes.href )
+1159 						{
+1160 							links[i].id = data.adv.advId;
+1161 							break;
+1162 						}
+1163 					}
+1164 				}
+1165 			}
+1166 			else
+1167 			{
+1168 				// We're only editing an existing link, so just overwrite the attributes.
+1169 				var element = this._.selectedElement;
+1170
+1171 				// IE BUG: Setting the name attribute to an existing link doesn't work.
+1172 				// Must re-create the link from weired syntax to workaround.
+1173 				if ( CKEDITOR.env.ie && attributes.name != element.getAttribute( 'name' ) )
+1174 				{
+1175 					var newElement = new CKEDITOR.dom.element( '<a name="' + CKEDITOR.tools.htmlEncode( attributes.name ) + '">',
+1176 							editor.document );
+1177
+1178 					selection = editor.getSelection();
+1179
+1180 					element.moveChildren( newElement );
+1181 					element.copyAttributes( newElement, { name : 1 } );
+1182 					newElement.replace( element );
+1183 					element = newElement;
+1184
+1185 					selection.selectElement( element );
+1186 				}
+1187
+1188 				element.setAttributes( attributes );
+1189 				element.removeAttributes( removeAttributes );
+1190
+1191 				// Make the element display as an anchor if a name has been set.
+1192 				if ( element.getAttribute( 'name' ) )
+1193 					element.addClass( 'cke_anchor' );
+1194 				else
+1195 					element.removeClass( 'cke_anchor' );
+1196
+1197 				if ( this.fakeObj )
+1198 					editor.createFakeElement( element, 'cke_anchor', 'anchor' ).replace( this.fakeObj );
+1199
+1200 				delete this._.selectedElement;
+1201 			}
+1202 		},
+1203 		onLoad : function()
+1204 		{
+1205 			if ( !editor.config.linkShowAdvancedTab )
+1206 				this.hidePage( 'advanced' );		//Hide Advanded tab.
+1207
+1208 			if ( !editor.config.linkShowTargetTab )
+1209 				this.hidePage( 'target' );		//Hide Target tab.
+1210
+1211 		}
+1212 	};
+1213 } );
+1214 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_plugin.js.html new file mode 100644 index 000000000..42b87d065 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_link_plugin.js.html @@ -0,0 +1,196 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'link',
+  7 {
+  8 	init : function( editor )
+  9 	{
+ 10 		// Add the link and unlink buttons.
+ 11 		editor.addCommand( 'link', new CKEDITOR.dialogCommand( 'link' ) );
+ 12 		editor.addCommand( 'anchor', new CKEDITOR.dialogCommand( 'anchor' ) );
+ 13 		editor.addCommand( 'unlink', new CKEDITOR.unlinkCommand() );
+ 14 		editor.ui.addButton( 'Link',
+ 15 			{
+ 16 				label : editor.lang.link.toolbar,
+ 17 				command : 'link'
+ 18 			} );
+ 19 		editor.ui.addButton( 'Unlink',
+ 20 			{
+ 21 				label : editor.lang.unlink,
+ 22 				command : 'unlink'
+ 23 			} );
+ 24 		editor.ui.addButton( 'Anchor',
+ 25 			{
+ 26 				label : editor.lang.anchor.toolbar,
+ 27 				command : 'anchor'
+ 28 			} );
+ 29 		CKEDITOR.dialog.add( 'link', this.path + 'dialogs/link.js' );
+ 30 		CKEDITOR.dialog.add( 'anchor', this.path + 'dialogs/anchor.js' );
+ 31
+ 32 		// Add the CSS styles for anchor placeholders.
+ 33 		editor.addCss(
+ 34 			'img.cke_anchor' +
+ 35 			'{' +
+ 36 				'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/anchor.gif' ) + ');' +
+ 37 				'background-position: center center;' +
+ 38 				'background-repeat: no-repeat;' +
+ 39 				'border: 1px solid #a9a9a9;' +
+ 40 				'width: 18px;' +
+ 41 				'height: 18px;' +
+ 42 			'}\n' +
+ 43 			'a.cke_anchor' +
+ 44 			'{' +
+ 45 				'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/anchor.gif' ) + ');' +
+ 46 				'background-position: 0 center;' +
+ 47 				'background-repeat: no-repeat;' +
+ 48 				'border: 1px solid #a9a9a9;' +
+ 49 				'padding-left: 18px;' +
+ 50 			'}'
+ 51 		   	);
+ 52
+ 53 		// Register selection change handler for the unlink button.
+ 54 		 editor.on( 'selectionChange', function( evt )
+ 55 			{
+ 56 				/*
+ 57 				 * Despite our initial hope, document.queryCommandEnabled() does not work
+ 58 				 * for this in Firefox. So we must detect the state by element paths.
+ 59 				 */
+ 60 				var command = editor.getCommand( 'unlink' ),
+ 61 					element = evt.data.path.lastElement.getAscendant( 'a', true );
+ 62 				if ( element && element.getName() == 'a' && element.getAttribute( 'href' ) )
+ 63 					command.setState( CKEDITOR.TRISTATE_OFF );
+ 64 				else
+ 65 					command.setState( CKEDITOR.TRISTATE_DISABLED );
+ 66 			} );
+ 67
+ 68 		// If the "menu" plugin is loaded, register the menu items.
+ 69 		if ( editor.addMenuItems )
+ 70 		{
+ 71 			editor.addMenuItems(
+ 72 				{
+ 73 					anchor :
+ 74 					{
+ 75 						label : editor.lang.anchor.menu,
+ 76 						command : 'anchor',
+ 77 						group : 'anchor'
+ 78 					},
+ 79
+ 80 					link :
+ 81 					{
+ 82 						label : editor.lang.link.menu,
+ 83 						command : 'link',
+ 84 						group : 'link',
+ 85 						order : 1
+ 86 					},
+ 87
+ 88 					unlink :
+ 89 					{
+ 90 						label : editor.lang.unlink,
+ 91 						command : 'unlink',
+ 92 						group : 'link',
+ 93 						order : 5
+ 94 					}
+ 95 				});
+ 96 		}
+ 97
+ 98 		// If the "contextmenu" plugin is loaded, register the listeners.
+ 99 		if ( editor.contextMenu )
+100 		{
+101 			editor.contextMenu.addListener( function( element, selection )
+102 				{
+103 					if ( !element )
+104 						return null;
+105
+106 					var isAnchor = ( element.is( 'img' ) && element.getAttribute( '_cke_real_element_type' ) == 'anchor' );
+107
+108 					if ( !isAnchor )
+109 					{
+110 						if ( !( element = element.getAscendant( 'a', true ) ) )
+111 							return null;
+112
+113 						isAnchor = ( element.getAttribute( 'name' ) && !element.getAttribute( 'href' ) );
+114 					}
+115
+116 					return isAnchor ?
+117 							{ anchor : CKEDITOR.TRISTATE_OFF } :
+118 							{ link : CKEDITOR.TRISTATE_OFF, unlink : CKEDITOR.TRISTATE_OFF };
+119 				});
+120 		}
+121 	},
+122
+123 	afterInit : function( editor )
+124 	{
+125 		// Register a filter to displaying placeholders after mode change.
+126
+127 		var dataProcessor = editor.dataProcessor,
+128 			dataFilter = dataProcessor && dataProcessor.dataFilter;
+129
+130 		if ( dataFilter )
+131 		{
+132 			dataFilter.addRules(
+133 				{
+134 					elements :
+135 					{
+136 						a : function( element )
+137 						{
+138 							var attributes = element.attributes;
+139 							if ( attributes.name && !attributes.href )
+140 								return editor.createFakeParserElement( element, 'cke_anchor', 'anchor' );
+141 						}
+142 					}
+143 				});
+144 		}
+145 	},
+146
+147 	requires : [ 'fakeobjects' ]
+148 } );
+149
+150 CKEDITOR.unlinkCommand = function(){};
+151 CKEDITOR.unlinkCommand.prototype =
+152 {
+153 	/** @ignore */
+154 	exec : function( editor )
+155 	{
+156 		/*
+157 		 * execCommand( 'unlink', ... ) in Firefox leaves behind <span> tags at where
+158 		 * the <a> was, so again we have to remove the link ourselves. (See #430)
+159 		 *
+160 		 * TODO: Use the style system when it's complete. Let's use execCommand()
+161 		 * as a stopgap solution for now.
+162 		 */
+163 		var selection = editor.getSelection(),
+164 			bookmarks = selection.createBookmarks(),
+165 			ranges = selection.getRanges(),
+166 			rangeRoot,
+167 			element;
+168
+169 		for ( var i = 0 ; i < ranges.length ; i++ )
+170 		{
+171 			rangeRoot = ranges[i].getCommonAncestor( true );
+172 			element = rangeRoot.getAscendant( 'a', true );
+173 			if ( !element )
+174 				continue;
+175 			ranges[i].selectNodeContents( element );
+176 		}
+177
+178 		selection.selectRanges( ranges );
+179 		editor.document.$.execCommand( 'unlink', false, null );
+180 		selection.selectBookmarks( bookmarks );
+181 	}
+182 };
+183
+184 CKEDITOR.tools.extend( CKEDITOR.config,
+185 {
+186 	linkShowAdvancedTab : true,
+187 	linkShowTargetTab : true
+188 } );
+189 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_list_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_list_plugin.js.html new file mode 100644 index 000000000..c68cba715 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_list_plugin.js.html @@ -0,0 +1,544 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Insert and remove numbered and bulleted lists.
+  8  */
+  9
+ 10 (function()
+ 11 {
+ 12 	var listNodeNames = { ol : 1, ul : 1 },
+ 13 		emptyTextRegex = /^[\n\r\t ]*$/;
+ 14
+ 15 	CKEDITOR.plugins.list = {
+ 16 		/*
+ 17 		 * Convert a DOM list tree into a data structure that is easier to
+ 18 		 * manipulate. This operation should be non-intrusive in the sense that it
+ 19 		 * does not change the DOM tree, with the exception that it may add some
+ 20 		 * markers to the list item nodes when database is specified.
+ 21 		 */
+ 22 		listToArray : function( listNode, database, baseArray, baseIndentLevel, grandparentNode )
+ 23 		{
+ 24 			if ( !listNodeNames[ listNode.getName() ] )
+ 25 				return [];
+ 26
+ 27 			if ( !baseIndentLevel )
+ 28 				baseIndentLevel = 0;
+ 29 			if ( !baseArray )
+ 30 				baseArray = [];
+ 31
+ 32 			// Iterate over all list items to get their contents and look for inner lists.
+ 33 			for ( var i = 0, count = listNode.getChildCount() ; i < count ; i++ )
+ 34 			{
+ 35 				var listItem = listNode.getChild( i );
+ 36
+ 37 				// It may be a text node or some funny stuff.
+ 38 				if ( listItem.$.nodeName.toLowerCase() != 'li' )
+ 39 					continue;
+ 40 				var itemObj = { 'parent' : listNode, indent : baseIndentLevel, contents : [] };
+ 41 				if ( !grandparentNode )
+ 42 				{
+ 43 					itemObj.grandparent = listNode.getParent();
+ 44 					if ( itemObj.grandparent && itemObj.grandparent.$.nodeName.toLowerCase() == 'li' )
+ 45 						itemObj.grandparent = itemObj.grandparent.getParent();
+ 46 				}
+ 47 				else
+ 48 					itemObj.grandparent = grandparentNode;
+ 49
+ 50 				if ( database )
+ 51 					CKEDITOR.dom.element.setMarker( database, listItem, 'listarray_index', baseArray.length );
+ 52 				baseArray.push( itemObj );
+ 53
+ 54 				for ( var j = 0, itemChildCount = listItem.getChildCount() ; j < itemChildCount ; j++ )
+ 55 				{
+ 56 					var child = listItem.getChild( j );
+ 57 					if ( child.type == CKEDITOR.NODE_ELEMENT && listNodeNames[ child.getName() ] )
+ 58 						// Note the recursion here, it pushes inner list items with
+ 59 						// +1 indentation in the correct order.
+ 60 						CKEDITOR.plugins.list.listToArray( child, database, baseArray, baseIndentLevel + 1, itemObj.grandparent );
+ 61 					else
+ 62 						itemObj.contents.push( child );
+ 63 				}
+ 64 			}
+ 65 			return baseArray;
+ 66 		},
+ 67
+ 68 		// Convert our internal representation of a list back to a DOM forest.
+ 69 		arrayToList : function( listArray, database, baseIndex, paragraphMode )
+ 70 		{
+ 71 			if ( !baseIndex )
+ 72 				baseIndex = 0;
+ 73 			if ( !listArray || listArray.length < baseIndex + 1 )
+ 74 				return null;
+ 75 			var doc = listArray[ baseIndex ].parent.getDocument(),
+ 76 				retval = new CKEDITOR.dom.documentFragment( doc ),
+ 77 				rootNode = null,
+ 78 				currentIndex = baseIndex,
+ 79 				indentLevel = Math.max( listArray[ baseIndex ].indent, 0 ),
+ 80 				currentListItem = null,
+ 81 				paragraphName = ( paragraphMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
+ 82 			while ( true )
+ 83 			{
+ 84 				var item = listArray[ currentIndex ];
+ 85 				if ( item.indent == indentLevel )
+ 86 				{
+ 87 					if ( !rootNode || listArray[ currentIndex ].parent.getName() != rootNode.getName() )
+ 88 					{
+ 89 						rootNode = listArray[ currentIndex ].parent.clone( false, true );
+ 90 						retval.append( rootNode );
+ 91 					}
+ 92 					currentListItem = rootNode.append( doc.createElement( 'li' ) );
+ 93 					for ( var i = 0 ; i < item.contents.length ; i++ )
+ 94 						currentListItem.append( item.contents[i].clone( true, true ) );
+ 95 					currentIndex++;
+ 96 				}
+ 97 				else if ( item.indent == Math.max( indentLevel, 0 ) + 1 )
+ 98 				{
+ 99 					var listData = CKEDITOR.plugins.list.arrayToList( listArray, null, currentIndex, paragraphMode );
+100 					currentListItem.append( listData.listNode );
+101 					currentIndex = listData.nextIndex;
+102 				}
+103 				else if ( item.indent == -1 && !baseIndex && item.grandparent )
+104 				{
+105 					currentListItem;
+106 					if ( listNodeNames[ item.grandparent.getName() ] )
+107 						currentListItem = doc.createElement( 'li' );
+108 					else
+109 					{
+110 						if ( paragraphMode != CKEDITOR.ENTER_BR && item.grandparent.getName() != 'td' )
+111 							currentListItem = doc.createElement( paragraphName );
+112 						else
+113 							currentListItem = new CKEDITOR.dom.documentFragment( doc );
+114 					}
+115
+116 					for ( i = 0 ; i < item.contents.length ; i++ )
+117 						currentListItem.append( item.contents[i].clone( true, true ) );
+118
+119 					if ( currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT )
+120 					{
+121 						if ( currentListItem.getLast()
+122 								&& currentListItem.getLast().type == CKEDITOR.NODE_ELEMENT
+123 								&& currentListItem.getLast().getAttribute( 'type' ) == '_moz' )
+124 							currentListItem.getLast().remove();
+125 						currentListItem.appendBogus();
+126 					}
+127
+128 					if ( currentListItem.type == CKEDITOR.NODE_ELEMENT &&
+129 							currentListItem.getName() == paragraphName &&
+130 							currentListItem.$.firstChild )
+131 					{
+132 						currentListItem.trim();
+133 						var firstChild = currentListItem.getFirst();
+134 						if ( firstChild.type == CKEDITOR.NODE_ELEMENT && firstChild.isBlockBoundary() )
+135 						{
+136 							var tmp = new CKEDITOR.dom.documentFragment( doc );
+137 							currentListItem.moveChildren( tmp );
+138 							currentListItem = tmp;
+139 						}
+140 					}
+141
+142 					var currentListItemName = currentListItem.$.nodeName.toLowerCase();
+143 					if ( !CKEDITOR.env.ie && ( currentListItemName == 'div' || currentListItemName == 'p' ) )
+144 						currentListItem.appendBogus();
+145 					retval.append( currentListItem );
+146 					rootNode = null;
+147 					currentIndex++;
+148 				}
+149 				else
+150 					return null;
+151
+152 				if ( listArray.length <= currentIndex || Math.max( listArray[ currentIndex ].indent, 0 ) < indentLevel )
+153 					break;
+154 			}
+155
+156 			// Clear marker attributes for the new list tree made of cloned nodes, if any.
+157 			if ( database )
+158 			{
+159 				var currentNode = retval.getFirst();
+160 				while ( currentNode )
+161 				{
+162 					if ( currentNode.type == CKEDITOR.NODE_ELEMENT )
+163 						CKEDITOR.dom.element.clearMarkers( database, currentNode );
+164 					currentNode = currentNode.getNextSourceNode();
+165 				}
+166 			}
+167
+168 			return { listNode : retval, nextIndex : currentIndex };
+169 		}
+170 	};
+171
+172 	function setState( editor, state )
+173 	{
+174 		editor.getCommand( this.name ).setState( state );
+175 	}
+176
+177 	function onSelectionChange( evt )
+178 	{
+179 		var elements = evt.data.path.elements;
+180
+181 		for ( var i = 0 ; i < elements.length ; i++ )
+182 		{
+183 			if ( listNodeNames[ elements[i].getName() ] )
+184 			{
+185 				return setState.call( this, evt.editor,
+186 						this.type == elements[i].getName() ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
+187 			}
+188 		}
+189
+190 		return setState.call( this, evt.editor, CKEDITOR.TRISTATE_OFF );
+191 	}
+192
+193 	function changeListType( editor, groupObj, database, listsCreated )
+194 	{
+195 		// This case is easy...
+196 		// 1. Convert the whole list into a one-dimensional array.
+197 		// 2. Change the list type by modifying the array.
+198 		// 3. Recreate the whole list by converting the array to a list.
+199 		// 4. Replace the original list with the recreated list.
+200 		var listArray = CKEDITOR.plugins.list.listToArray( groupObj.root, database ),
+201 			selectedListItems = [];
+202
+203 		for ( var i = 0 ; i < groupObj.contents.length ; i++ )
+204 		{
+205 			var itemNode = groupObj.contents[i];
+206 			itemNode = itemNode.getAscendant( 'li', true );
+207 			if ( !itemNode || itemNode.getCustomData( 'list_item_processed' ) )
+208 				continue;
+209 			selectedListItems.push( itemNode );
+210 			CKEDITOR.dom.element.setMarker( database, itemNode, 'list_item_processed', true );
+211 		}
+212
+213 		var fakeParent = groupObj.root.getDocument().createElement( this.type );
+214 		for ( i = 0 ; i < selectedListItems.length ; i++ )
+215 		{
+216 			var listIndex = selectedListItems[i].getCustomData( 'listarray_index' );
+217 			listArray[listIndex].parent = fakeParent;
+218 		}
+219 		var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode );
+220 		var child, length = newList.listNode.getChildCount();
+221 		for ( i = 0 ; i < length && ( child = newList.listNode.getChild( i ) ) ; i++ )
+222 		{
+223 			if ( child.getName() == this.type )
+224 				listsCreated.push( child );
+225 		}
+226 		newList.listNode.replace( groupObj.root );
+227 	}
+228
+229 	function createList( editor, groupObj, listsCreated )
+230 	{
+231 		var contents = groupObj.contents,
+232 			doc = groupObj.root.getDocument(),
+233 			listContents = [];
+234
+235 		// It is possible to have the contents returned by DomRangeIterator to be the same as the root.
+236 		// e.g. when we're running into table cells.
+237 		// In such a case, enclose the childNodes of contents[0] into a <div>.
+238 		if ( contents.length == 1 && contents[0].equals( groupObj.root ) )
+239 		{
+240 			var divBlock = doc.createElement( 'div' );
+241 			contents[0].moveChildren && contents[0].moveChildren( divBlock );
+242 			contents[0].append( divBlock );
+243 			contents[0] = divBlock;
+244 		}
+245
+246 		// Calculate the common parent node of all content blocks.
+247 		var commonParent = groupObj.contents[0].getParent();
+248 		for ( var i = 0 ; i < contents.length ; i++ )
+249 			commonParent = commonParent.getCommonAncestor( contents[i].getParent() );
+250
+251 		// We want to insert things that are in the same tree level only, so calculate the contents again
+252 		// by expanding the selected blocks to the same tree level.
+253 		for ( i = 0 ; i < contents.length ; i++ )
+254 		{
+255 			var contentNode = contents[i],
+256 				parentNode;
+257 			while ( ( parentNode = contentNode.getParent() ) )
+258 			{
+259 				if ( parentNode.equals( commonParent ) )
+260 				{
+261 					listContents.push( contentNode );
+262 					break;
+263 				}
+264 				contentNode = parentNode;
+265 			}
+266 		}
+267
+268 		if ( listContents.length < 1 )
+269 			return;
+270
+271 		// Insert the list to the DOM tree.
+272 		var insertAnchor = listContents[ listContents.length - 1 ].getNext(),
+273 			listNode = doc.createElement( this.type );
+274
+275 		listsCreated.push( listNode );
+276 		while ( listContents.length )
+277 		{
+278 			var contentBlock = listContents.shift(),
+279 				listItem = doc.createElement( 'li' );
+280 			contentBlock.moveChildren( listItem );
+281 			contentBlock.remove();
+282 			listItem.appendTo( listNode );
+283
+284 			// Append a bogus BR to force the LI to render at full height
+285 			if ( !CKEDITOR.env.ie )
+286 				listItem.appendBogus();
+287 		}
+288 		if ( insertAnchor )
+289 			listNode.insertBefore( insertAnchor );
+290 		else
+291 			listNode.appendTo( commonParent );
+292 	}
+293
+294 	function removeList( editor, groupObj, database )
+295 	{
+296 		// This is very much like the change list type operation.
+297 		// Except that we're changing the selected items' indent to -1 in the list array.
+298 		var listArray = CKEDITOR.plugins.list.listToArray( groupObj.root, database ),
+299 			selectedListItems = [];
+300
+301 		for ( var i = 0 ; i < groupObj.contents.length ; i++ )
+302 		{
+303 			var itemNode = groupObj.contents[i];
+304 			itemNode = itemNode.getAscendant( 'li', true );
+305 			if ( !itemNode || itemNode.getCustomData( 'list_item_processed' ) )
+306 				continue;
+307 			selectedListItems.push( itemNode );
+308 			CKEDITOR.dom.element.setMarker( database, itemNode, 'list_item_processed', true );
+309 		}
+310
+311 		var lastListIndex = null;
+312 		for ( i = 0 ; i < selectedListItems.length ; i++ )
+313 		{
+314 			var listIndex = selectedListItems[i].getCustomData( 'listarray_index' );
+315 			listArray[listIndex].indent = -1;
+316 			lastListIndex = listIndex;
+317 		}
+318
+319 		// After cutting parts of the list out with indent=-1, we still have to maintain the array list
+320 		// model's nextItem.indent <= currentItem.indent + 1 invariant. Otherwise the array model of the
+321 		// list cannot be converted back to a real DOM list.
+322 		for ( i = lastListIndex + 1 ; i < listArray.length ; i++ )
+323 		{
+324 			if ( listArray[i].indent > listArray[i-1].indent + 1 )
+325 			{
+326 				var indentOffset = listArray[i-1].indent + 1 - listArray[i].indent;
+327 				var oldIndent = listArray[i].indent;
+328 				while ( listArray[i] && listArray[i].indent >= oldIndent )
+329 				{
+330 					listArray[i].indent += indentOffset;
+331 					i++;
+332 				}
+333 				i--;
+334 			}
+335 		}
+336
+337 		var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode );
+338 		// If groupObj.root is the last element in its parent, or its nextSibling is a <br>, then we should
+339 		// not add a <br> after the final item. So, check for the cases and trim the <br>.
+340 		if ( !groupObj.root.getNext() || groupObj.root.getNext().$.nodeName.toLowerCase() == 'br' )
+341 		{
+342 			if ( newList.listNode.getLast().$.nodeName.toLowerCase() == 'br' )
+343 				newList.listNode.getLast().remove();
+344 		}
+345 		newList.listNode.replace( groupObj.root );
+346 	}
+347
+348 	function listCommand( name, type )
+349 	{
+350 		this.name = name;
+351 		this.type = type;
+352 	}
+353
+354 	listCommand.prototype = {
+355 		exec : function( editor )
+356 		{
+357 			editor.focus();
+358
+359 			var doc = editor.document,
+360 				selection = editor.getSelection(),
+361 				ranges = selection && selection.getRanges();
+362
+363 			// There should be at least one selected range.
+364 			if ( !ranges || ranges.length < 1 )
+365 				return;
+366
+367 			// Midas lists rule #1 says we can create a list even in an empty document.
+368 			// But DOM iterator wouldn't run if the document is really empty.
+369 			// So create a paragraph if the document is empty and we're going to create a list.
+370 			if ( this.state == CKEDITOR.TRISTATE_OFF )
+371 			{
+372 				var body = doc.getBody();
+373 				body.trim();
+374 				if ( !body.getFirst() )
+375 				{
+376 					var paragraph = doc.createElement( editor.config.enterMode == CKEDITOR.ENTER_P ? 'p' :
+377 							( editor.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'br' ) );
+378 					paragraph.appendTo( body );
+379 					ranges = [ new CKEDITOR.dom.range( doc ) ];
+380 					// IE exception on inserting anything when anchor inside <br>.
+381 					if ( paragraph.is( 'br' ) )
+382 					{
+383 						ranges[ 0 ].setStartBefore( paragraph );
+384 						ranges[ 0 ].setEndAfter( paragraph );
+385 					}
+386 					else
+387 						ranges[ 0 ].selectNodeContents( paragraph );
+388 					selection.selectRanges( ranges );
+389 				}
+390 			}
+391
+392 			var bookmarks = selection.createBookmarks( true );
+393
+394 			// Group the blocks up because there are many cases where multiple lists have to be created,
+395 			// or multiple lists have to be cancelled.
+396 			var listGroups = [],
+397 				database = {};
+398
+399 			while ( ranges.length > 0 )
+400 			{
+401 				var range = ranges.shift(),
+402 					boundaryNodes = range.getBoundaryNodes(),
+403 					startNode = boundaryNodes.startNode,
+404 					endNode = boundaryNodes.endNode;
+405 				if ( startNode.type == CKEDITOR.NODE_ELEMENT && startNode.getName() == 'td' )
+406 					range.setStartAt( boundaryNodes.startNode, CKEDITOR.POSITION_AFTER_START );
+407 				if ( endNode.type == CKEDITOR.NODE_ELEMENT && endNode.getName() == 'td' )
+408 					range.setEndAt( boundaryNodes.endNode, CKEDITOR.POSITION_BEFORE_END );
+409
+410 				var iterator = range.createIterator(),
+411 					block;
+412 				iterator.forceBrBreak = ( this.state == CKEDITOR.TRISTATE_OFF );
+413
+414 				while ( ( block = iterator.getNextParagraph() ) )
+415 				{
+416 					var path = new CKEDITOR.dom.elementPath( block ),
+417 						listNode = null,
+418 						processedFlag = false,
+419 						blockLimit = path.blockLimit;
+420
+421 					// First, try to group by a list ancestor.
+422 					for ( var i = 0 ; i < path.elements.length ; i++ )
+423 					{
+424 						var element = path.elements[i];
+425 						if ( listNodeNames[ element.getName() ] )
+426 						{
+427 							// If we've encountered a list inside a block limit
+428 							// The last group object of the block limit element should
+429 							// no longer be valid. Since paragraphs after the list
+430 							// should belong to a different group of paragraphs before
+431 							// the list. (Bug #1309)
+432 							blockLimit.removeCustomData( 'list_group_object' );
+433
+434 							var groupObj = element.getCustomData( 'list_group_object' );
+435 							if ( groupObj )
+436 								groupObj.contents.push( block );
+437 							else
+438 							{
+439 								groupObj = { root : element, contents : [ block ] };
+440 								listGroups.push( groupObj );
+441 								CKEDITOR.dom.element.setMarker( database, element, 'list_group_object', groupObj );
+442 							}
+443 							processedFlag = true;
+444 							break;
+445 						}
+446 					}
+447
+448 					if ( processedFlag )
+449 						continue;
+450
+451 					// No list ancestor? Group by block limit.
+452 					var root = blockLimit;
+453 					if ( root.getCustomData( 'list_group_object' ) )
+454 						root.getCustomData( 'list_group_object' ).contents.push( block );
+455 					else
+456 					{
+457 						groupObj = { root : root, contents : [ block ] };
+458 						CKEDITOR.dom.element.setMarker( database, root, 'list_group_object', groupObj );
+459 						listGroups.push( groupObj );
+460 					}
+461 				}
+462 			}
+463
+464 			// Now we have two kinds of list groups, groups rooted at a list, and groups rooted at a block limit element.
+465 			// We either have to build lists or remove lists, for removing a list does not makes sense when we are looking
+466 			// at the group that's not rooted at lists. So we have three cases to handle.
+467 			var listsCreated = [];
+468 			while ( listGroups.length > 0 )
+469 			{
+470 				groupObj = listGroups.shift();
+471 				if ( this.state == CKEDITOR.TRISTATE_OFF )
+472 				{
+473 					if ( listNodeNames[ groupObj.root.getName() ] )
+474 						changeListType.call( this, editor, groupObj, database, listsCreated );
+475 					else
+476 						createList.call( this, editor, groupObj, listsCreated );
+477 				}
+478 				else if ( this.state == CKEDITOR.TRISTATE_ON && listNodeNames[ groupObj.root.getName() ] )
+479 					removeList.call( this, editor, groupObj, database );
+480 			}
+481
+482 			// For all new lists created, merge adjacent, same type lists.
+483 			for ( i = 0 ; i < listsCreated.length ; i++ )
+484 			{
+485 				listNode = listsCreated[i];
+486 				var mergeSibling, listCommand = this;
+487 				( mergeSibling = function( rtl ){
+488
+489 					var sibling = listNode[ rtl ? 'getPrevious' : 'getNext' ].call( listNode, true );
+490 					if ( sibling && sibling.getName &&
+491 					     sibling.getName() == listCommand.type )
+492 					{
+493 						sibling.remove();
+494 						sibling.moveChildren( listNode );
+495 					}
+496 				} )();
+497 				mergeSibling( true );
+498 			}
+499
+500 			// Clean up, restore selection and update toolbar button states.
+501 			CKEDITOR.dom.element.clearAllMarkers( database );
+502 			selection.selectBookmarks( bookmarks );
+503 			editor.focus();
+504 		}
+505 	};
+506
+507 	CKEDITOR.plugins.add( 'list',
+508 	{
+509 		init : function( editor )
+510 		{
+511 			// Register commands.
+512 			var numberedListCommand = new listCommand( 'numberedlist', 'ol' ),
+513 				bulletedListCommand = new listCommand( 'bulletedlist', 'ul' );
+514 			editor.addCommand( 'numberedlist', numberedListCommand );
+515 			editor.addCommand( 'bulletedlist', bulletedListCommand );
+516
+517 			// Register the toolbar button.
+518 			editor.ui.addButton( 'NumberedList',
+519 				{
+520 					label : editor.lang.numberedlist,
+521 					command : 'numberedlist'
+522 				} );
+523 			editor.ui.addButton( 'BulletedList',
+524 				{
+525 					label : editor.lang.bulletedlist,
+526 					command : 'bulletedlist'
+527 				} );
+528
+529 			// Register the state changing handlers.
+530 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, numberedListCommand ) );
+531 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, bulletedListCommand ) );
+532 		},
+533
+534 		requires : [ 'domiterator' ]
+535 	} );
+536 })();
+537 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_listblock_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_listblock_plugin.js.html new file mode 100644 index 000000000..bbc911f39 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_listblock_plugin.js.html @@ -0,0 +1,239 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'listblock',
+  7 {
+  8 	requires : [ 'panel' ],
+  9
+ 10 	onLoad : function()
+ 11 	{
+ 12 		CKEDITOR.ui.panel.prototype.addListBlock = function( name, multiSelect )
+ 13 		{
+ 14 			return this.addBlock( name, new CKEDITOR.ui.listBlock( this.getHolderElement(), multiSelect ) );
+ 15 		};
+ 16
+ 17 		CKEDITOR.ui.listBlock = CKEDITOR.tools.createClass(
+ 18 			{
+ 19 				base : CKEDITOR.ui.panel.block,
+ 20
+ 21 				$ : function( blockHolder, multiSelect )
+ 22 				{
+ 23 					// Call the base contructor.
+ 24 					this.base( blockHolder );
+ 25
+ 26 					this.multiSelect = !!multiSelect;
+ 27
+ 28 					var keys = this.keys;
+ 29 					keys[ 40 ]	= 'next';					// ARROW-DOWN
+ 30 					keys[ 9 ]	= 'next';					// TAB
+ 31 					keys[ 38 ]	= 'prev';					// ARROW-UP
+ 32 					keys[ CKEDITOR.SHIFT + 9 ]	= 'prev';	// SHIFT + TAB
+ 33 					keys[ 32 ]	= 'click';					// SPACE
+ 34
+ 35 					this._.pendingHtml = [];
+ 36 					this._.items = {};
+ 37 					this._.groups = {};
+ 38 				},
+ 39
+ 40 				_ :
+ 41 				{
+ 42 					close : function()
+ 43 					{
+ 44 						if ( this._.started )
+ 45 						{
+ 46 							this._.pendingHtml.push( '</ul>' );
+ 47 							delete this._.started;
+ 48 						}
+ 49 					},
+ 50
+ 51 					getClick : function()
+ 52 					{
+ 53 						if ( !this._.click )
+ 54 						{
+ 55 							this._.click = CKEDITOR.tools.addFunction( function( value )
+ 56 								{
+ 57 									var marked = true;
+ 58
+ 59 									if ( this.multiSelect )
+ 60 										marked = this.toggle( value );
+ 61 									else
+ 62 										this.mark( value );
+ 63
+ 64 									if ( this.onClick )
+ 65 										this.onClick( value, marked );
+ 66 								},
+ 67 								this );
+ 68 						}
+ 69 						return this._.click;
+ 70 					}
+ 71 				},
+ 72
+ 73 				proto :
+ 74 				{
+ 75 					add : function( value, html, title )
+ 76 					{
+ 77 						var pendingHtml = this._.pendingHtml,
+ 78 							id = 'cke_' + CKEDITOR.tools.getNextNumber();
+ 79
+ 80 						if ( !this._.started )
+ 81 						{
+ 82 							pendingHtml.push( '<ul class=cke_panel_list>' );
+ 83 							this._.started = 1;
+ 84 						}
+ 85
+ 86 						this._.items[ value ] = id;
+ 87
+ 88 						pendingHtml.push(
+ 89 							'<li id=', id, ' class=cke_panel_listItem>' +
+ 90 								'<a _cke_focus=1 hidefocus=true' +
+ 91 									' title="', title || value, '"' +
+ 92 									' href="javascript:void(\'', value, '\')"' +
+ 93 									' onclick="CKEDITOR.tools.callFunction(', this._.getClick(), ',\'', value, '\'); return false;">',
+ 94 									html || value,
+ 95 								'</a>' +
+ 96 							'</li>' );
+ 97 					},
+ 98
+ 99 					startGroup : function( title )
+100 					{
+101 						this._.close();
+102
+103 						var id = 'cke_' + CKEDITOR.tools.getNextNumber();
+104
+105 						this._.groups[ title ] = id;
+106
+107 						this._.pendingHtml.push( '<h1 id=', id, ' class=cke_panel_grouptitle>', title, '</h1>' );
+108 					},
+109
+110 					commit : function()
+111 					{
+112 						this._.close();
+113 						this.element.appendHtml( this._.pendingHtml.join( '' ) );
+114 						this._.pendingHtml = [];
+115 					},
+116
+117 					toggle : function( value )
+118 					{
+119 						var isMarked = this.isMarked( value );
+120
+121 						if ( isMarked )
+122 							this.unmark( value );
+123 						else
+124 							this.mark( value );
+125
+126 						return !isMarked;
+127 					},
+128
+129 					hideGroup : function( groupTitle )
+130 					{
+131 						var group = this.element.getDocument().getById( this._.groups[ groupTitle ] ),
+132 							list = group && group.getNext();
+133
+134 						if ( group )
+135 						{
+136 							group.setStyle( 'display', 'none' );
+137
+138 							if ( list && list.getName() == 'ul' )
+139 								list.setStyle( 'display', 'none' );
+140 						}
+141 					},
+142
+143 					hideItem : function( value )
+144 					{
+145 						this.element.getDocument().getById( this._.items[ value ] ).setStyle( 'display', 'none' );
+146 					},
+147
+148 					showAll : function()
+149 					{
+150 						var items = this._.items,
+151 							groups = this._.groups,
+152 							doc = this.element.getDocument();
+153
+154 						for ( var value in items )
+155 						{
+156 							doc.getById( items[ value ] ).setStyle( 'display', '' );
+157 						}
+158
+159 						for ( var title in groups )
+160 						{
+161 							var group = doc.getById( groups[ title ] ),
+162 								list = group.getNext();
+163
+164 							group.setStyle( 'display', '' );
+165
+166 							if ( list && list.getName() == 'ul' )
+167 								list.setStyle( 'display', '' );
+168 						}
+169 					},
+170
+171 					mark : function( value )
+172 					{
+173 						if ( !this.multiSelect )
+174 							this.unmarkAll();
+175
+176 						this.element.getDocument().getById( this._.items[ value ] ).addClass( 'cke_selected' );
+177 					},
+178
+179 					unmark : function( value )
+180 					{
+181 						this.element.getDocument().getById( this._.items[ value ] ).removeClass( 'cke_selected' );
+182 					},
+183
+184 					unmarkAll : function()
+185 					{
+186 						var items = this._.items,
+187 							doc = this.element.getDocument();
+188
+189 						for ( var value in items )
+190 						{
+191 							doc.getById( items[ value ] ).removeClass( 'cke_selected' );
+192 						}
+193 					},
+194
+195 					isMarked : function( value )
+196 					{
+197 						return this.element.getDocument().getById( this._.items[ value ] ).hasClass( 'cke_selected' );
+198 					},
+199
+200 					focus : function( value )
+201 					{
+202 						this._.focusIndex = -1;
+203
+204 						if ( value )
+205 						{
+206 							var selected = this.element.getDocument().getById( this._.items[ value ] ).getFirst();
+207
+208 							var links = this.element.getElementsByTag( 'a' ),
+209 								link,
+210 								i = -1;
+211
+212 							while( ( link = links.getItem( ++i ) ) )
+213 							{
+214 								if ( link.equals( selected ) )
+215 								{
+216 									this._.focusIndex = i;
+217 									break;
+218 								}
+219 							}
+220
+221 							setTimeout( function()
+222 								{
+223 									selected.focus();
+224 								},
+225 								0 );
+226 						}
+227 					}
+228 				}
+229 			});
+230 	}
+231 });
+232 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_maximize_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_maximize_plugin.js.html new file mode 100644 index 000000000..69e58f2ff --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_maximize_plugin.js.html @@ -0,0 +1,275 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	function protectFormStyles( formElement )
+  9 	{
+ 10 		if ( !formElement || formElement.type != CKEDITOR.NODE_ELEMENT || formElement.getName() != 'form' )
+ 11 			return [];
+ 12
+ 13 		var hijackRecord = [];
+ 14 		var hijackNames = [ 'style', 'className' ];
+ 15 		for ( var i = 0 ; i < hijackNames.length ; i++ )
+ 16 		{
+ 17 			var name = hijackNames[i];
+ 18 			var $node = formElement.$.elements.namedItem( name );
+ 19 			if ( $node )
+ 20 			{
+ 21 				var hijackNode = new CKEDITOR.dom.element( $node );
+ 22 				hijackRecord.push( [ hijackNode, hijackNode.nextSibling ] );
+ 23 				hijackNode.remove();
+ 24 			}
+ 25 		}
+ 26
+ 27 		return hijackRecord;
+ 28 	}
+ 29
+ 30 	function restoreFormStyles( formElement, hijackRecord )
+ 31 	{
+ 32 		if ( !formElement || formElement.type != CKEDITOR.NODE_ELEMENT || formElement.getName() != 'form' )
+ 33 			return;
+ 34
+ 35 		if ( hijackRecord.length > 0 )
+ 36 		{
+ 37 			for ( var i = hijackRecord.length - 1 ; i >= 0 ; i-- )
+ 38 			{
+ 39 				var node = hijackRecord[i][0];
+ 40 				var sibling = hijackRecord[i][1];
+ 41 				if ( sibling )
+ 42 					node.insertBefore( sibling );
+ 43 				else
+ 44 					node.appendTo( formElement );
+ 45 			}
+ 46 		}
+ 47 	}
+ 48
+ 49 	function saveStyles( element, isInsideEditor )
+ 50 	{
+ 51 		var data = protectFormStyles( element );
+ 52 		var retval = {};
+ 53
+ 54 		var $element = element.$;
+ 55
+ 56 		if ( !isInsideEditor )
+ 57 		{
+ 58 			retval[ 'class' ] = $element.className || '';
+ 59 			$element.className = '';
+ 60 		}
+ 61
+ 62 		retval.inline = $element.style.cssText || '';
+ 63 		if ( !isInsideEditor )		// Reset any external styles that might interfere. (#2474)
+ 64 			$element.style.cssText = 'position: static; overflow: visible';
+ 65
+ 66 		restoreFormStyles( data );
+ 67 		return retval;
+ 68 	}
+ 69
+ 70 	function restoreStyles( element, savedStyles )
+ 71 	{
+ 72 		var data = protectFormStyles( element );
+ 73 		var $element = element.$;
+ 74 		if ( 'class' in savedStyles )
+ 75 			$element.className = savedStyles[ 'class' ];
+ 76 		if ( 'inline' in savedStyles )
+ 77 			$element.style.cssText = savedStyles.inline;
+ 78 		restoreFormStyles( data );
+ 79 	}
+ 80
+ 81 	function getResizeHandler( mainWindow, editor )
+ 82 	{
+ 83 		return function()
+ 84 		{
+ 85 			var viewPaneSize = mainWindow.getViewPaneSize();
+ 86 			editor.resize( viewPaneSize.width, viewPaneSize.height, null, true );
+ 87 		};
+ 88 	}
+ 89
+ 90 	CKEDITOR.plugins.add( 'maximize',
+ 91 	{
+ 92 		init : function( editor )
+ 93 		{
+ 94 			var lang = editor.lang;
+ 95 			var mainDocument = CKEDITOR.document;
+ 96 			var mainWindow = mainDocument.getWindow();
+ 97
+ 98 			// Saved selection and scroll position for the editing area.
+ 99 			var savedSelection;
+100 			var savedScroll;
+101
+102 			// Saved scroll position for the outer window.
+103 			var outerScroll;
+104
+105 			// Saved resize handler function.
+106 			var resizeHandler = getResizeHandler( mainWindow, editor );
+107
+108 			// Retain state after mode switches.
+109 			var savedState = CKEDITOR.TRISTATE_OFF;
+110
+111 			editor.addCommand( 'maximize',
+112 				{
+113 					modes : { wysiwyg : 1, source : 1 },
+114
+115 					exec : function()
+116 					{
+117 						var container = editor.container.getChild( [ 0, 0 ] );
+118 						var contents = editor.getThemeSpace( 'contents' );
+119
+120 						// Save current selection and scroll position in editing area.
+121 						if ( editor.mode == 'wysiwyg' )
+122 						{
+123 							savedSelection = editor.getSelection().getRanges();
+124 							savedScroll = mainWindow.getScrollPosition();
+125 						}
+126 						else
+127 						{
+128 							var $textarea = editor.textarea.$;
+129 							savedSelection = !CKEDITOR.env.ie && [ $textarea.selectionStart, $textarea.selectionEnd ];
+130 							savedScroll = [ $textarea.scrollLeft, $textarea.scrollTop ];
+131 						}
+132
+133 						if ( this.state == CKEDITOR.TRISTATE_OFF )		// Go fullscreen if the state is off.
+134 						{
+135 							// Add event handler for resizing.
+136 							mainWindow.on( 'resize', resizeHandler );
+137
+138 							// Save the scroll bar position.
+139 							outerScroll = mainWindow.getScrollPosition();
+140
+141 							// Save and reset the styles for the entire node tree.
+142 							var currentNode = editor.container;
+143 							while ( ( currentNode = currentNode.getParent() ) )
+144 							{
+145 								currentNode.setCustomData( 'maximize_saved_styles', saveStyles( currentNode ) );
+146 								currentNode.setStyle( 'z-index', editor.config.baseFloatZIndex - 1 );
+147 							}
+148 							contents.setCustomData( 'maximize_saved_styles', saveStyles( contents, true ) );
+149 							container.setCustomData( 'maximize_saved_styles', saveStyles( container, true ) );
+150
+151 							// Hide scroll bars.
+152 							if ( CKEDITOR.env.ie )
+153 							{
+154 								mainDocument.$.documentElement.style.overflow =
+155 									mainDocument.getBody().$.style.overflow = 'hidden';
+156 							}
+157 							else
+158 							{
+159 								mainDocument.getBody().setStyles(
+160 									{
+161 										overflow : 'hidden',
+162 										width : '0px',
+163 										height : '0px'
+164 									} );
+165 							}
+166
+167 							// Scroll to the top left.
+168 							mainWindow.$.scrollTo( 0, 0 );
+169
+170 							// Resize and move to top left.
+171 							var viewPaneSize = mainWindow.getViewPaneSize();
+172 							container.setStyle( 'position', 'absolute' );
+173 							container.$.offsetLeft;			// SAFARI BUG: See #2066.
+174 							container.setStyles(
+175 								{
+176 									'z-index' : editor.config.baseFloatZIndex - 1,
+177 									left : '0px',
+178 									top : '0px'
+179 								} );
+180 							editor.resize( viewPaneSize.width, viewPaneSize.height, null, true );
+181
+182 							// Still not top left? Fix it. (Bug #174)
+183 							var offset = container.getDocumentPosition();
+184 							container.setStyles(
+185 								{
+186 									left : ( -1 * offset.x ) + 'px',
+187 									top : ( -1 * offset.y ) + 'px'
+188 								} );
+189
+190 							// Add cke_maximized class.
+191 							container.addClass( 'cke_maximized' );
+192 						}
+193 						else if ( this.state == CKEDITOR.TRISTATE_ON )	// Restore from fullscreen if the state is on.
+194 						{
+195 							// Remove event handler for resizing.
+196 							mainWindow.removeListener( 'resize', resizeHandler );
+197
+198 							// Restore CSS styles for the entire node tree.
+199 							var editorElements = [ contents, container ];
+200 							for ( var i = 0 ; i < editorElements.length ; i++ )
+201 							{
+202 								restoreStyles( editorElements[i], editorElements[i].getCustomData( 'maximize_saved_styles' ) );
+203 								editorElements[i].removeCustomData( 'maximize_saved_styles' );
+204 							}
+205
+206 							currentNode = editor.container;
+207 							while ( ( currentNode = currentNode.getParent() ) )
+208 							{
+209 								restoreStyles( currentNode, currentNode.getCustomData( 'maximize_saved_styles' ) );
+210 								currentNode.removeCustomData( 'maximize_saved_styles' );
+211 							}
+212
+213 							// Restore the window scroll position.
+214 							mainWindow.$.scrollTo( outerScroll.x, outerScroll.y );
+215
+216 							// Remove cke_maximized class.
+217 							container.removeClass( 'cke_maximized' );
+218
+219 							// Emit a resize event, because this time the size is modified in
+220 							// restoreStyles.
+221 							editor.fire( 'resize' );
+222 						}
+223
+224 						this.toggleState();
+225
+226 						// Restore selection and scroll position in editing area.
+227 						if ( editor.mode == 'wysiwyg' )
+228 						{
+229 							editor.getSelection().selectRanges( savedSelection );
+230
+231 							var element = editor.getSelection().getStartElement();
+232 							if ( element )
+233 								element.scrollIntoView( true );
+234 							else
+235 								mainWindow.$.scrollTo( savedScroll.x, savedScroll.y );
+236 						}
+237 						else
+238 						{
+239 							if ( savedSelection )
+240 							{
+241 								$textarea.selectionStart = savedSelection[0];
+242 								$textarea.selectionEnd = savedSelection[1];
+243 							}
+244 							$textarea.scrollLeft = savedScroll[0];
+245 							$textarea.scrollTop = savedScroll[1];
+246 						}
+247
+248 						savedSelection = savedScroll = null;
+249 						savedState = this.state;
+250 					},
+251 					canUndo : false
+252 				} );
+253
+254 			editor.ui.addButton( 'Maximize',
+255 				{
+256 					label : lang.maximize,
+257 					command : 'maximize'
+258 				} );
+259
+260 			// Restore the command state after mode change.
+261 			editor.on( 'mode', function()
+262 				{
+263 					editor.getCommand( 'maximize' ).setState( savedState );
+264 				}, null, null, 100 );
+265 		}
+266 	} );
+267 })();
+268 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_menu_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_menu_plugin.js.html new file mode 100644 index 000000000..ef3b2d511 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_menu_plugin.js.html @@ -0,0 +1,359 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'menu',
+  7 {
+  8 	beforeInit : function( editor )
+  9 	{
+ 10 		var groups = editor.config.menu_groups.split( ',' ),
+ 11 			groupsOrder = {};
+ 12
+ 13 		for ( var i = 0 ; i < groups.length ; i++ )
+ 14 			groupsOrder[ groups[ i ] ] = i + 1;
+ 15
+ 16 		editor._.menuGroups = groupsOrder;
+ 17 		editor._.menuItems = {};
+ 18 	},
+ 19
+ 20 	requires : [ 'floatpanel' ]
+ 21 });
+ 22
+ 23 CKEDITOR.tools.extend( CKEDITOR.editor.prototype,
+ 24 {
+ 25 	addMenuGroup : function( name, order )
+ 26 	{
+ 27 		this._.menuGroups[ name ] = order || 100;
+ 28 	},
+ 29
+ 30 	addMenuItem : function( name, definition )
+ 31 	{
+ 32 		if ( this._.menuGroups[ definition.group ] )
+ 33 			this._.menuItems[ name ] = new CKEDITOR.menuItem( this, name, definition );
+ 34 	},
+ 35
+ 36 	addMenuItems : function( definitions )
+ 37 	{
+ 38 		for ( var itemName in definitions )
+ 39 		{
+ 40 			this.addMenuItem( itemName, definitions[ itemName ] );
+ 41 		}
+ 42 	},
+ 43
+ 44 	getMenuItem : function( name )
+ 45 	{
+ 46 		return this._.menuItems[ name ];
+ 47 	}
+ 48 });
+ 49
+ 50 (function()
+ 51 {
+ 52 	CKEDITOR.menu = CKEDITOR.tools.createClass(
+ 53 	{
+ 54 		$ : function( editor, level )
+ 55 		{
+ 56 			this.id = 'cke_' + CKEDITOR.tools.getNextNumber();
+ 57
+ 58 			this.editor = editor;
+ 59 			this.items = [];
+ 60
+ 61 			this._.level = level || 1;
+ 62 		},
+ 63
+ 64 		_ :
+ 65 		{
+ 66 			showSubMenu : function( index )
+ 67 			{
+ 68 				var menu = this._.subMenu,
+ 69 					item = this.items[ index ],
+ 70 					subItems = item.getItems && item.getItems();
+ 71
+ 72 				// If this item has no subitems, we just hide the submenu, if
+ 73 				// available, and return back.
+ 74 				if ( !subItems )
+ 75 				{
+ 76 					this._.panel.hideChild();
+ 77 					return;
+ 78 				}
+ 79
+ 80 				// Create the submenu, if not available, or clean the existing
+ 81 				// one.
+ 82 				if ( menu )
+ 83 					menu.removeAll();
+ 84 				else
+ 85 				{
+ 86 					menu = this._.subMenu = new CKEDITOR.menu( this.editor, this._.level + 1 );
+ 87 					menu.parent = this;
+ 88 					menu.onClick = CKEDITOR.tools.bind( this.onClick, this );
+ 89 				}
+ 90
+ 91 				// Add all submenu items to the menu.
+ 92 				for ( var itemName in subItems )
+ 93 				{
+ 94 					menu.add( this.editor.getMenuItem( itemName ) );
+ 95 				}
+ 96
+ 97 				// Get the element representing the current item.
+ 98 				var element = this._.panel.getBlock( this.id ).element.getDocument().getById( this.id + String( index ) );
+ 99
+100 				// Show the submenu.
+101 				menu.show( element, 2 );
+102 			}
+103 		},
+104
+105 		proto :
+106 		{
+107 			add : function( item )
+108 			{
+109 				this.items.push( item );
+110 			},
+111
+112 			removeAll : function()
+113 			{
+114 				this.items = [];
+115 			},
+116
+117 			show : function( offsetParent, corner, offsetX, offsetY )
+118 			{
+119 				var items = this.items,
+120 					editor = this.editor,
+121 					panel = this._.panel,
+122 					element = this._.element;
+123
+124 				// Create the floating panel for this menu.
+125 				if ( !panel )
+126 				{
+127 					panel = this._.panel = new CKEDITOR.ui.floatPanel( this.editor, CKEDITOR.document.getBody(),
+128 						{
+129 							css : [ CKEDITOR.getUrl( editor.skinPath + 'editor.css' ) ],
+130 							level : this._.level - 1,
+131 							className : editor.skinClass + ' cke_contextmenu'
+132 						},
+133 						this._.level);
+134
+135 					panel.onEscape = CKEDITOR.tools.bind( function()
+136 					{
+137 						this.onEscape && this.onEscape();
+138 						this.hide();
+139 					},
+140 					this );
+141
+142 					panel.onHide = CKEDITOR.tools.bind( function()
+143 					{
+144 						this.onHide && this.onHide();
+145 					},
+146 					this );
+147
+148 					// Create an autosize block inside the panel.
+149 					var block = panel.addBlock( this.id );
+150 					block.autoSize = true;
+151
+152 					var keys = block.keys;
+153 					keys[ 40 ]	= 'next';					// ARROW-DOWN
+154 					keys[ 9 ]	= 'next';					// TAB
+155 					keys[ 38 ]	= 'prev';					// ARROW-UP
+156 					keys[ CKEDITOR.SHIFT + 9 ]	= 'prev';	// SHIFT + TAB
+157 					keys[ 32 ]	= 'click';					// SPACE
+158 					keys[ 39 ]	= 'click';					// ARROW-RIGHT
+159
+160 					element = this._.element = block.element;
+161 					element.addClass( editor.skinClass );
+162
+163 					var elementDoc = element.getDocument();
+164 					elementDoc.getBody().setStyle( 'overflow', 'hidden' );
+165 					elementDoc.getElementsByTag( 'html' ).getItem( 0 ).setStyle( 'overflow', 'hidden' );
+166
+167 					this._.itemOverFn = CKEDITOR.tools.addFunction( function( index )
+168 						{
+169 							clearTimeout( this._.showSubTimeout );
+170 							this._.showSubTimeout = CKEDITOR.tools.setTimeout( this._.showSubMenu, editor.config.menu_subMenuDelay, this, [ index ] );
+171 						},
+172 						this);
+173
+174 					this._.itemOutFn = CKEDITOR.tools.addFunction( function( index )
+175 						{
+176 							clearTimeout( this._.showSubTimeout );
+177 						},
+178 						this);
+179
+180 					this._.itemClickFn = CKEDITOR.tools.addFunction( function( index )
+181 						{
+182 							var item = this.items[ index ];
+183
+184 							if ( item.state == CKEDITOR.TRISTATE_DISABLED )
+185 							{
+186 								this.hide();
+187 								return;
+188 							}
+189
+190 							if ( item.getItems )
+191 								this._.showSubMenu( index );
+192 							else
+193 								this.onClick && this.onClick( item );
+194 						},
+195 						this);
+196 				}
+197
+198 				// Put the items in the right order.
+199 				sortItems( items );
+200
+201 				// Build the HTML that composes the menu and its items.
+202 				var output = [ '<div class="cke_menu">' ];
+203
+204 				var length = items.length,
+205 					lastGroup = length && items[ 0 ].group;
+206
+207 				for ( var i = 0 ; i < length ; i++ )
+208 				{
+209 					var item = items[ i ];
+210 					if ( lastGroup != item.group )
+211 					{
+212 						output.push( '<div class="cke_menuseparator"></div>' );
+213 						lastGroup = item.group;
+214 					}
+215
+216 					item.render( this, i, output );
+217 				}
+218
+219 				output.push( '</div>' );
+220
+221 				// Inject the HTML inside the panel.
+222 				element.setHtml( output.join( '' ) );
+223
+224 				// Show the panel.
+225 				if ( this.parent )
+226 					this.parent._.panel.showAsChild( panel, this.id, offsetParent, corner, offsetX, offsetY );
+227 				else
+228 					panel.showBlock( this.id, offsetParent, corner, offsetX, offsetY );
+229 			},
+230
+231 			hide : function()
+232 			{
+233 				this._.panel && this._.panel.hide();
+234 			}
+235 		}
+236 	});
+237
+238 	function sortItems( items )
+239 	{
+240 		items.sort( function( itemA, itemB )
+241 			{
+242 				if ( itemA.group < itemB.group )
+243 					return -1;
+244 				else if ( itemA.group > itemB.group )
+245 					return 1;
+246
+247 				return itemA.order < itemB.order ? -1 :
+248 					itemA.order > itemB.order ? 1 :
+249 					0;
+250 			});
+251 	}
+252 })();
+253
+254 CKEDITOR.menuItem = CKEDITOR.tools.createClass(
+255 {
+256 	$ : function( editor, name, definition )
+257 	{
+258 		CKEDITOR.tools.extend( this, definition,
+259 			// Defaults
+260 			{
+261 				order : 0,
+262 				className : 'cke_button_' + name
+263 			});
+264
+265 		// Transform the group name into its order number.
+266 		this.group = editor._.menuGroups[ this.group ];
+267
+268 		this.editor = editor;
+269 		this.name = name;
+270 	},
+271
+272 	proto :
+273 	{
+274 		render : function( menu, index, output )
+275 		{
+276 			var id = menu.id + String( index ),
+277 				state = ( typeof this.state == 'undefined' ) ? CKEDITOR.TRISTATE_OFF : this.state;
+278
+279 			var classes = ' cke_' + (
+280 				state == CKEDITOR.TRISTATE_ON ? 'on' :
+281 				state == CKEDITOR.TRISTATE_DISABLED ? 'disabled' :
+282 				'off' );
+283
+284 			var htmlLabel = this.label;
+285 			if ( state == CKEDITOR.TRISTATE_DISABLED )
+286 				htmlLabel = this.editor.lang.common.unavailable.replace( '%1', htmlLabel );
+287
+288 			if ( this.className )
+289 				classes += ' ' + this.className;
+290
+291 			output.push(
+292 				'<span class="cke_menuitem">' +
+293 				'<a id="', id, '"' +
+294 					' class="', classes, '" href="javascript:void(\'', ( this.label || '' ).replace( "'", '' ), '\')"' +
+295 					' title="', this.label, '"' +
+296 					' tabindex="-1"' +
+297 					'_cke_focus=1' +
+298 					' hidefocus="true"' );
+299
+300 			// Some browsers don't cancel key events in the keydown but in the
+301 			// keypress.
+302 			// TODO: Check if really needed for Gecko+Mac.
+303 			if ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.mac ) )
+304 			{
+305 				output.push(
+306 					' onkeypress="return false;"' );
+307 			}
+308
+309 			// With Firefox, we need to force the button to redraw, otherwise it
+310 			// will remain in the focus state.
+311 			if ( CKEDITOR.env.gecko )
+312 			{
+313 				output.push(
+314 					' onblur="this.style.cssText = this.style.cssText;"' );
+315 			}
+316
+317 			var offset = ( this.iconOffset || 0 ) * -16;
+318 			output.push(
+319 //					' onkeydown="return CKEDITOR.ui.button._.keydown(', index, ', event);"' +
+320 					' onmouseover="CKEDITOR.tools.callFunction(', menu._.itemOverFn, ',', index, ');"' +
+321 					' onmouseout="CKEDITOR.tools.callFunction(', menu._.itemOutFn, ',', index, ');"' +
+322 					' onclick="CKEDITOR.tools.callFunction(', menu._.itemClickFn, ',', index, '); return false;"' +
+323 					'>' +
+324 						'<span class="cke_icon_wrapper"><span class="cke_icon"' +
+325 							( this.icon ? ' style="background-image:url(' + CKEDITOR.getUrl( this.icon ) + ');background-position:0 ' + offset + 'px;"></span>'
+326 							: '' ) +
+327 							'></span></span>' +
+328 						'<span class="cke_label">' );
+329
+330 			if ( this.getItems )
+331 			{
+332 				output.push(
+333 							'<span class="cke_menuarrow"></span>' );
+334 			}
+335
+336 			output.push(
+337 							htmlLabel,
+338 						'</span>' +
+339 				'</a>' +
+340 				'</span>' );
+341 		}
+342 	}
+343 });
+344
+345 CKEDITOR.config.menu_subMenuDelay = 400;
+346 CKEDITOR.config.menu_groups =
+347 	'clipboard,' +
+348 	'form,' +
+349 	'tablecell,tablecellproperties,tablerow,tablecolumn,table,'+
+350 	'anchor,link,image,flash,' +
+351 	'checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea';
+352 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_menubutton_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_menubutton_plugin.js.html new file mode 100644 index 000000000..9f2a61522 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_menubutton_plugin.js.html @@ -0,0 +1,101 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'menubutton',
+  7 {
+  8 	requires : [ 'button' ],
+  9 	beforeInit : function( editor )
+ 10 	{
+ 11 		editor.ui.addHandler( CKEDITOR.UI_MENUBUTTON, CKEDITOR.ui.menuButton.handler );
+ 12 	}
+ 13 });
+ 14
+ 15 /**
+ 16  * Button UI element.
+ 17  * @constant
+ 18  * @example
+ 19  */
+ 20 CKEDITOR.UI_MENUBUTTON = 5;
+ 21
+ 22 (function()
+ 23 {
+ 24 	var clickFn = function( editor )
+ 25 	{
+ 26 		var _ = this._;
+ 27
+ 28 		// Do nothing if this button is disabled.
+ 29 		if ( _.state === CKEDITOR.TRISTATE_DISABLED )
+ 30 			return;
+ 31
+ 32 		_.previousState = _.state;
+ 33
+ 34 		// Check if we already have a menu for it, otherwise just create it.
+ 35 		var menu = _.menu;
+ 36 		if ( !menu )
+ 37 		{
+ 38 			menu = _.menu = new CKEDITOR.plugins.contextMenu( editor );
+ 39
+ 40 			menu.onHide = CKEDITOR.tools.bind( function()
+ 41 				{
+ 42 					this.setState( _.previousState );
+ 43 				},
+ 44 				this );
+ 45
+ 46 			// Initialize the menu items at this point.
+ 47 			if ( this.onMenu )
+ 48 			{
+ 49 				menu.addListener( this.onMenu );
+ 50 			}
+ 51 		}
+ 52
+ 53 		if ( _.on )
+ 54 		{
+ 55 			menu.hide();
+ 56 			return;
+ 57 		}
+ 58
+ 59 		this.setState( CKEDITOR.TRISTATE_ON );
+ 60
+ 61 		menu.show( CKEDITOR.document.getById( this._.id ), 4 );
+ 62 	};
+ 63
+ 64
+ 65 	CKEDITOR.ui.menuButton = CKEDITOR.tools.createClass(
+ 66 	{
+ 67 		base : CKEDITOR.ui.button,
+ 68
+ 69 		$ : function( definition )
+ 70 		{
+ 71 			// We don't want the panel definition in this object.
+ 72 			var panelDefinition = definition.panel;
+ 73 			delete definition.panel;
+ 74
+ 75 			this.base( definition );
+ 76
+ 77 			this.hasArrow = true;
+ 78
+ 79 			this.click = clickFn;
+ 80 		},
+ 81
+ 82 		statics :
+ 83 		{
+ 84 			handler :
+ 85 			{
+ 86 				create : function( definition )
+ 87 				{
+ 88 					return new CKEDITOR.ui.menuButton( definition );
+ 89 				}
+ 90 			}
+ 91 		}
+ 92 	});
+ 93 })();
+ 94 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_newpage_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_newpage_plugin.js.html new file mode 100644 index 000000000..f7dfe64d3 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_newpage_plugin.js.html @@ -0,0 +1,67 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Horizontal Page Break
+  8  */
+  9
+ 10 // Register a plugin named "newpage".
+ 11 CKEDITOR.plugins.add( 'newpage',
+ 12 {
+ 13 	init : function( editor )
+ 14 	{
+ 15 		editor.addCommand( 'newpage',
+ 16 			{
+ 17 				modes : { wysiwyg:1, source:1 },
+ 18
+ 19 				exec : function( editor )
+ 20 				{
+ 21 					var command = this;
+ 22 					function afterCommand()
+ 23 					{
+ 24 						// Defer to happen after 'selectionChange'.
+ 25 						setTimeout( function()
+ 26 						{
+ 27 							editor.fire( 'afterCommandExec',
+ 28 							{
+ 29 								name: command.name,
+ 30 								command: command
+ 31 							} );
+ 32 						}, 500 );
+ 33 					}
+ 34 					if ( editor.mode == 'wysiwyg')
+ 35 						editor.on( 'contentDom', function( evt ){
+ 36
+ 37 							evt.removeListener();
+ 38 	                        afterCommand();
+ 39 						} );
+ 40
+ 41 					editor.setData( editor.config.newpage_html );
+ 42 					editor.focus();
+ 43
+ 44 					if( editor.mode == 'source' )
+ 45 						afterCommand();
+ 46
+ 47 				},
+ 48 				async : true
+ 49 			});
+ 50
+ 51 		editor.ui.addButton( 'NewPage',
+ 52 			{
+ 53 				label : editor.lang.newPage,
+ 54 				command : 'newpage'
+ 55 			});
+ 56 	}
+ 57 });
+ 58
+ 59 CKEDITOR.config.newpage_html = '';
+ 60 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pagebreak_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pagebreak_plugin.js.html new file mode 100644 index 000000000..a7895862f --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pagebreak_plugin.js.html @@ -0,0 +1,104 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Horizontal Page Break
+  8  */
+  9
+ 10 // Register a plugin named "pagebreak".
+ 11 CKEDITOR.plugins.add( 'pagebreak',
+ 12 {
+ 13 	init : function( editor )
+ 14 	{
+ 15 		// Register the command.
+ 16 		editor.addCommand( 'pagebreak', CKEDITOR.plugins.pagebreakCmd );
+ 17
+ 18 		// Register the toolbar button.
+ 19 		editor.ui.addButton( 'PageBreak',
+ 20 			{
+ 21 				label : editor.lang.pagebreak,
+ 22 				command : 'pagebreak'
+ 23 			});
+ 24
+ 25 		// Add the style that renders our placeholder.
+ 26 		editor.addCss(
+ 27 			'img.cke_pagebreak' +
+ 28 			'{' +
+ 29 				'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/pagebreak.gif' ) + ');' +
+ 30 				'background-position: center center;' +
+ 31 				'background-repeat: no-repeat;' +
+ 32 				'clear: both;' +
+ 33 				'display: block;' +
+ 34 				'float: none;' +
+ 35 				'width: 100%;' +
+ 36 				'border-top: #999999 1px dotted;' +
+ 37 				'border-bottom: #999999 1px dotted;' +
+ 38 				'height: 5px;' +
+ 39
+ 40 			'}' );
+ 41 	},
+ 42
+ 43 	afterInit : function( editor )
+ 44 	{
+ 45 		// Register a filter to displaying placeholders after mode change.
+ 46
+ 47 		var dataProcessor = editor.dataProcessor,
+ 48 			dataFilter = dataProcessor && dataProcessor.dataFilter;
+ 49
+ 50 		if ( dataFilter )
+ 51 		{
+ 52 			dataFilter.addRules(
+ 53 				{
+ 54 					elements :
+ 55 					{
+ 56 						div : function( element )
+ 57 						{
+ 58 							var style = element.attributes.style,
+ 59 								child = style && element.children.length == 1 && element.children[ 0 ],
+ 60 								childStyle = child && ( child.name == 'span' ) && child.attributes.style;
+ 61
+ 62 							if ( childStyle && ( /page-break-after\s*:\s*always/i ).test( style ) && ( /display\s*:\s*none/i ).test( childStyle ) )
+ 63 								return editor.createFakeParserElement( element, 'cke_pagebreak', 'div' );
+ 64 						}
+ 65 					}
+ 66 				});
+ 67 		}
+ 68 	},
+ 69
+ 70 	requires : [ 'fakeobjects' ]
+ 71 });
+ 72
+ 73 CKEDITOR.plugins.pagebreakCmd =
+ 74 {
+ 75 	exec : function( editor )
+ 76 	{
+ 77 		// Create the element that represents a print break.
+ 78 		var breakObject = CKEDITOR.dom.element.createFromHtml( '<div style="page-break-after: always;"><span style="display: none;"> </span></div>' );
+ 79
+ 80 		// Creates the fake image used for this element.
+ 81 		breakObject = editor.createFakeElement( breakObject, 'cke_pagebreak', 'div' );
+ 82
+ 83 		var ranges = editor.getSelection().getRanges();
+ 84
+ 85 		for ( var range, i = 0 ; i < ranges.length ; i++ )
+ 86 		{
+ 87 			range = ranges[ i ];
+ 88
+ 89 			if ( i > 0 )
+ 90 				breakObject = breakObject.clone( true );
+ 91
+ 92 			range.splitBlock( 'p' );
+ 93 			range.insertNode( breakObject );
+ 94 		}
+ 95 	}
+ 96 };
+ 97 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_panel_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_panel_plugin.js.html new file mode 100644 index 000000000..139520a8d --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_panel_plugin.js.html @@ -0,0 +1,338 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'panel',
+  7 {
+  8 	beforeInit : function( editor )
+  9 	{
+ 10 		editor.ui.addHandler( CKEDITOR.UI_PANEL, CKEDITOR.ui.panel.handler );
+ 11 	}
+ 12 });
+ 13
+ 14 /**
+ 15  * Panel UI element.
+ 16  * @constant
+ 17  * @example
+ 18  */
+ 19 CKEDITOR.UI_PANEL = 2;
+ 20
+ 21 CKEDITOR.ui.panel = function( document, definition )
+ 22 {
+ 23 	// Copy all definition properties to this object.
+ 24 	if ( definition )
+ 25 		CKEDITOR.tools.extend( this, definition );
+ 26
+ 27 	// Set defaults.
+ 28 	CKEDITOR.tools.extend( this,
+ 29 		{
+ 30 			className : '',
+ 31 			css : []
+ 32 		});
+ 33
+ 34 	this.id = CKEDITOR.tools.getNextNumber();
+ 35 	this.document = document;
+ 36
+ 37 	this._ =
+ 38 	{
+ 39 		blocks : {}
+ 40 	};
+ 41 };
+ 42
+ 43 /**
+ 44  * Transforms a rich combo definition in a {@link CKEDITOR.ui.richCombo}
+ 45  * instance.
+ 46  * @type Object
+ 47  * @example
+ 48  */
+ 49 CKEDITOR.ui.panel.handler =
+ 50 {
+ 51 	create : function( definition )
+ 52 	{
+ 53 		return new CKEDITOR.ui.panel( definition );
+ 54 	}
+ 55 };
+ 56
+ 57 CKEDITOR.ui.panel.prototype =
+ 58 {
+ 59 	renderHtml : function( editor )
+ 60 	{
+ 61 		var output = [];
+ 62 		this.render( editor, output );
+ 63 		return output.join( '' );
+ 64 	},
+ 65
+ 66 	/**
+ 67 	 * Renders the combo.
+ 68 	 * @param {CKEDITOR.editor} editor The editor instance which this button is
+ 69 	 *		to be used by.
+ 70 	 * @param {Array} output The output array to which append the HTML relative
+ 71 	 *		to this button.
+ 72 	 * @example
+ 73 	 */
+ 74 	render : function( editor, output )
+ 75 	{
+ 76 		var id = 'cke_' + this.id;
+ 77
+ 78 		output.push(
+ 79 			'<div class="', editor.skinClass ,'"' +
+ 80 				' lang="', editor.langCode, '"' +
+ 81 				' style="z-index:' + ( editor.config.baseFloatZIndex + 1 ) + '">' +
+ 82 				'<div' +
+ 83 					' id=', id,
+ 84 					' dir=', editor.lang.dir,
+ 85 					' class="cke_panel cke_', editor.lang.dir );
+ 86
+ 87 		if ( this.className )
+ 88 			output.push( ' ', this.className );
+ 89
+ 90 		output.push(
+ 91 				'">' );
+ 92
+ 93 		if ( this.forceIFrame || this.css.length )
+ 94 		{
+ 95 			output.push(
+ 96 						'<iframe id="', id, '_frame"' +
+ 97 							' frameborder="0"' +
+ 98 							' src="javascript:void(' );
+ 99
+100 			output.push(
+101 							// Support for custom document.domain in IE.
+102 							CKEDITOR.env.isCustomDomain() ?
+103 								'(function(){' +
+104 									'document.open();' +
+105 									'document.domain=\'' + document.domain + '\';' +
+106 									'document.close();' +
+107 								'})()'
+108 							:
+109 								'0' );
+110
+111 			output.push(
+112 						')"></iframe>' );
+113 		}
+114
+115 		output.push(
+116 				'</div>' +
+117 			'</div>' );
+118
+119 		return id;
+120 	},
+121
+122 	getHolderElement : function()
+123 	{
+124 		var holder = this._.holder;
+125
+126 		if ( !holder )
+127 		{
+128 			if ( this.forceIFrame || this.css.length )
+129 			{
+130 				var iframe = this.document.getById( 'cke_' + this.id + '_frame' ),
+131 					parentDiv = iframe.getParent(),
+132 					dir = parentDiv.getAttribute( 'dir' ),
+133 					className = parentDiv.getParent().getAttribute( 'class' ),
+134 					langCode = parentDiv.getParent().getAttribute( 'lang' ),
+135 					doc = iframe.getFrameDocument();
+136
+137 				// Initialize the IFRAME document body.
+138 				doc.$.open();
+139
+140 				// Support for custom document.domain in IE.
+141 				if ( CKEDITOR.env.isCustomDomain() )
+142 					doc.$.domain = document.domain;
+143
+144 				doc.$.write(
+145 					'<!DOCTYPE html>' +
+146 					'<html dir="' + dir + '" class="' + className + '_container" lang="' + langCode + '">' +
+147 						'<head>' +
+148 							'<style>.' + className + '_container{visibility:hidden}</style>' +
+149 						'</head>' +
+150 						'<body class="cke_' + dir + ' cke_panel_frame ' + CKEDITOR.env.cssClass + '" style="margin:0;padding:0">' +
+151 						'</body>' +
+152 						// It looks strange, but for FF2, the styles must go
+153 						// after <body>, so it (body) becames immediatelly
+154 						// available. (#3031)
+155 						'<link type="text/css" rel=stylesheet href="' + this.css.join( '"><link type="text/css" rel="stylesheet" href="' ) + '">' +
+156 					'<\/html>' );
+157 				doc.$.close();
+158
+159 				var win = doc.getWindow();
+160
+161 				// Register the CKEDITOR global.
+162 				win.$.CKEDITOR = CKEDITOR;
+163
+164 				win.on( 'load', function( ev )
+165 					{
+166 						this.isLoaded = true;
+167 						if ( this.onLoad )
+168 							this.onLoad();
+169 					},
+170 					this);
+171
+172 				doc.on( 'keydown', function( evt )
+173 					{
+174 						var keystroke = evt.data.getKeystroke();
+175
+176 						// Delegate key processing to block.
+177 						if ( this._.onKeyDown && this._.onKeyDown( keystroke ) === false )
+178 						{
+179 							evt.data.preventDefault();
+180 							return;
+181 						}
+182
+183 						if ( keystroke == 27 )		// ESC
+184 							this.onEscape && this.onEscape();
+185 					},
+186 					this );
+187
+188 				holder = doc.getBody();
+189 			}
+190 			else
+191 				holder = this.document.getById( 'cke_' + this.id );
+192
+193 			this._.holder = holder;
+194 		}
+195
+196 		return holder;
+197 	},
+198
+199 	addBlock : function( name, block )
+200 	{
+201 		block = this._.blocks[ name ] = block || new CKEDITOR.ui.panel.block( this.getHolderElement() );
+202
+203 		if ( !this._.currentBlock )
+204 			this.showBlock( name );
+205
+206 		return block;
+207 	},
+208
+209 	getBlock : function( name )
+210 	{
+211 		return this._.blocks[ name ];
+212 	},
+213
+214 	showBlock : function( name )
+215 	{
+216 		var blocks = this._.blocks,
+217 			block = blocks[ name ],
+218 			current = this._.currentBlock;
+219
+220 		if ( current )
+221 			current.hide();
+222
+223 		this._.currentBlock = block;
+224
+225 		// Reset the focus index, so it will always go into the first one.
+226 		block._.focusIndex = -1;
+227
+228 		this._.onKeyDown = block.onKeyDown && CKEDITOR.tools.bind( block.onKeyDown, block );
+229
+230 		block.show();
+231
+232 		return block;
+233 	}
+234 };
+235
+236 CKEDITOR.ui.panel.block = CKEDITOR.tools.createClass(
+237 {
+238 	$ : function( blockHolder )
+239 	{
+240 		this.element = blockHolder.append(
+241 			blockHolder.getDocument().createElement( 'div',
+242 				{
+243 					attributes :
+244 					{
+245 						'class' : 'cke_panel_block'
+246 					},
+247 					styles :
+248 					{
+249 						display : 'none'
+250 					}
+251 				}) );
+252
+253 		this.keys = {};
+254
+255 		this._.focusIndex = -1;
+256 	},
+257
+258 	_ : {},
+259
+260 	proto :
+261 	{
+262 		show : function()
+263 		{
+264 			this.element.setStyle( 'display', '' );
+265 		},
+266
+267 		hide : function()
+268 		{
+269 			if ( !this.onHide || this.onHide.call( this )  !== true )
+270 				this.element.setStyle( 'display', 'none' );
+271 		},
+272
+273 		onKeyDown : function( keystroke )
+274 		{
+275 			var keyAction = this.keys[ keystroke ];
+276 			switch ( keyAction )
+277 			{
+278 				// Move forward.
+279 				case 'next' :
+280 					var index = this._.focusIndex,
+281 						links = this.element.getElementsByTag( 'a' ),
+282 						link;
+283
+284 					while ( ( link = links.getItem( ++index ) ) )
+285 					{
+286 						// Move the focus only if the element is marked with
+287 						// the _cke_focus and it it's visible (check if it has
+288 						// width).
+289 						if ( link.getAttribute( '_cke_focus' ) && link.$.offsetWidth )
+290 						{
+291 							this._.focusIndex = index;
+292 							link.focus();
+293 							break;
+294 						}
+295 					}
+296 					return false;
+297
+298 				// Move backward.
+299 				case 'prev' :
+300 					index = this._.focusIndex;
+301 					links = this.element.getElementsByTag( 'a' );
+302
+303 					while ( index > 0 && ( link = links.getItem( --index ) ) )
+304 					{
+305 						// Move the focus only if the element is marked with
+306 						// the _cke_focus and it it's visible (check if it has
+307 						// width).
+308 						if ( link.getAttribute( '_cke_focus' ) && link.$.offsetWidth )
+309 						{
+310 							this._.focusIndex = index;
+311 							link.focus();
+312 							break;
+313 						}
+314 					}
+315 					return false;
+316
+317 				case 'click' :
+318 					index = this._.focusIndex;
+319 					link = index >= 0 && this.element.getElementsByTag( 'a' ).getItem( index );
+320
+321 					if ( link )
+322 						link.$.click ? link.$.click() : link.$.onclick();
+323
+324 					return false;
+325 			}
+326
+327 			return true;
+328 		}
+329 	}
+330 });
+331 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_panelbutton_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_panelbutton_plugin.js.html new file mode 100644 index 000000000..7671681fb --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_panelbutton_plugin.js.html @@ -0,0 +1,148 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'panelbutton',
+  7 {
+  8 	requires : [ 'button' ],
+  9 	beforeInit : function( editor )
+ 10 	{
+ 11 		editor.ui.addHandler( CKEDITOR.UI_PANELBUTTON, CKEDITOR.ui.panelButton.handler );
+ 12 	}
+ 13 });
+ 14
+ 15 /**
+ 16  * Button UI element.
+ 17  * @constant
+ 18  * @example
+ 19  */
+ 20 CKEDITOR.UI_PANELBUTTON = 4;
+ 21
+ 22 (function()
+ 23 {
+ 24 	var clickFn = function( editor )
+ 25 	{
+ 26 		var _ = this._;
+ 27
+ 28 		if ( _.state == CKEDITOR.TRISTATE_DISABLED )
+ 29 			return;
+ 30
+ 31 		this.createPanel( editor );
+ 32
+ 33 		if ( _.on )
+ 34 		{
+ 35 			_.panel.hide();
+ 36 			return;
+ 37 		}
+ 38
+ 39 		_.panel.showBlock( this._.id, this.document.getById( this._.id ), 4 );
+ 40 	};
+ 41
+ 42
+ 43 	CKEDITOR.ui.panelButton = CKEDITOR.tools.createClass(
+ 44 	{
+ 45 		base : CKEDITOR.ui.button,
+ 46
+ 47 		$ : function( definition )
+ 48 		{
+ 49 			// We don't want the panel definition in this object.
+ 50 			var panelDefinition = definition.panel;
+ 51 			delete definition.panel;
+ 52
+ 53 			this.base( definition );
+ 54
+ 55 			this.document = ( panelDefinition
+ 56 								&& panelDefinition.parent
+ 57 								&& panelDefinition.parent.getDocument() )
+ 58 							|| CKEDITOR.document;
+ 59
+ 60 			this.hasArrow = true;
+ 61
+ 62 			this.click = clickFn;
+ 63
+ 64 			this._ =
+ 65 			{
+ 66 				panelDefinition : panelDefinition
+ 67 			};
+ 68 		},
+ 69
+ 70 		statics :
+ 71 		{
+ 72 			handler :
+ 73 			{
+ 74 				create : function( definition )
+ 75 				{
+ 76 					return new CKEDITOR.ui.panelButton( definition );
+ 77 				}
+ 78 			}
+ 79 		},
+ 80
+ 81 		proto :
+ 82 		{
+ 83 			createPanel : function( editor )
+ 84 			{
+ 85 				var _ = this._;
+ 86
+ 87 				if ( _.panel )
+ 88 					return;
+ 89
+ 90 				var panelDefinition = this._.panelDefinition || {},
+ 91 					panelParentElement = panelDefinition.parent || CKEDITOR.document.getBody(),
+ 92 					panel = this._.panel = new CKEDITOR.ui.floatPanel( editor, panelParentElement, panelDefinition ),
+ 93 					me = this;
+ 94
+ 95 				panel.onShow = function()
+ 96 					{
+ 97 						if ( me.className )
+ 98 							this.element.getFirst().addClass( me.className + '_panel' );
+ 99
+100 						_.oldState = me._.state;
+101 						me.setState( CKEDITOR.TRISTATE_ON );
+102
+103 						_.on = 1;
+104
+105 						if ( me.onOpen )
+106 							me.onOpen();
+107 					};
+108
+109 				panel.onHide = function()
+110 					{
+111 						if ( me.className )
+112 							this.element.getFirst().removeClass( me.className + '_panel' );
+113
+114 						me.setState( _.oldState );
+115
+116 						_.on = 0;
+117
+118 						if ( me.onClose )
+119 							me.onClose();
+120 					};
+121
+122 				panel.onEscape = function()
+123 					{
+124 						panel.hide();
+125 						me.document.getById( _.id ).focus();
+126 					};
+127
+128 				if ( this.onBlock )
+129 					this.onBlock( panel, _.id );
+130
+131 				panel.getBlock( _.id ).onHide = function()
+132 						{
+133 								_.on = 0;
+134 								me.setState( CKEDITOR.TRISTATE_OFF );
+135 						};
+136 			}
+137 		}
+138 	});
+139
+140 })();
+141 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastefromword_dialogs_pastefromword.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastefromword_dialogs_pastefromword.js.html new file mode 100644 index 000000000..e7f94753b --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastefromword_dialogs_pastefromword.js.html @@ -0,0 +1,303 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dialog.add( 'pastefromword', function( editor )
+  7 {
+  8 	return {
+  9 		title : editor.lang.pastefromword.title,
+ 10 		minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350,
+ 11 		minHeight : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 270 : 260,
+ 12 		htmlToLoad : '<!doctype html><script type="text/javascript">'
+ 13 				+ 'window.onload = function()'
+ 14 				+ '{'
+ 15 					+ 'if ( ' + CKEDITOR.env.ie + ' ) '
+ 16 						+ 'document.body.contentEditable = "true";'
+ 17 					+ 'else '
+ 18 						+ 'document.designMode = "on";'
+ 19 					+ 'var iframe = new window.parent.CKEDITOR.dom.element( frameElement );'
+ 20 					+ 'var dialog = iframe.getCustomData( "dialog" );'
+ 21 					+ 'dialog.fire( "iframeAdded", { iframe : iframe } );'
+ 22 				+ '};'
+ 23 				+ '</script><style>body { margin: 3px; height: 95%; } </style><body></body>',
+ 24 		cleanWord : function( editor, html, ignoreFont, removeStyles )
+ 25 		{
+ 26 			html = html.replace(/<o:p>\s*<\/o:p>/g, '') ;
+ 27 			html = html.replace(/<o:p>[\s\S]*?<\/o:p>/g, ' ') ;
+ 28
+ 29 			// Remove mso-xxx styles.
+ 30 			html = html.replace( /\s*mso-[^:]+:[^;"]+;?/gi, '' ) ;
+ 31
+ 32 			// Remove margin styles.
+ 33 			html = html.replace( /\s*MARGIN: 0cm 0cm 0pt\s*;/gi, '' ) ;
+ 34 			html = html.replace( /\s*MARGIN: 0cm 0cm 0pt\s*"/gi, "\"" ) ;
+ 35
+ 36 			html = html.replace( /\s*TEXT-INDENT: 0cm\s*;/gi, '' ) ;
+ 37 			html = html.replace( /\s*TEXT-INDENT: 0cm\s*"/gi, "\"" ) ;
+ 38
+ 39 			html = html.replace( /\s*TEXT-ALIGN: [^\s;]+;?"/gi, "\"" ) ;
+ 40
+ 41 			html = html.replace( /\s*PAGE-BREAK-BEFORE: [^\s;]+;?"/gi, "\"" ) ;
+ 42
+ 43 			html = html.replace( /\s*FONT-VARIANT: [^\s;]+;?"/gi, "\"" ) ;
+ 44
+ 45 			html = html.replace( /\s*tab-stops:[^;"]*;?/gi, '' ) ;
+ 46 			html = html.replace( /\s*tab-stops:[^"]*/gi, '' ) ;
+ 47
+ 48 			// Remove FONT face attributes.
+ 49 			if ( ignoreFont )
+ 50 			{
+ 51 				html = html.replace( /\s*face="[^"]*"/gi, '' ) ;
+ 52 				html = html.replace( /\s*face=[^ >]*/gi, '' ) ;
+ 53
+ 54 				html = html.replace( /\s*FONT-FAMILY:[^;"]*;?/gi, '' ) ;
+ 55 			}
+ 56
+ 57 			// Remove Class attributes
+ 58 			html = html.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3") ;
+ 59
+ 60 			// Remove styles.
+ 61 			if ( removeStyles )
+ 62 				html = html.replace( /<(\w[^>]*) style="([^\"]*)"([^>]*)/gi, "<$1$3" ) ;
+ 63
+ 64 			// Remove style, meta and link tags
+ 65 			html = html.replace( /<STYLE[^>]*>[\s\S]*?<\/STYLE[^>]*>/gi, '' ) ;
+ 66 			html = html.replace( /<(?:META|LINK)[^>]*>\s*/gi, '' ) ;
+ 67
+ 68 			// Remove empty styles.
+ 69 			html =  html.replace( /\s*style="\s*"/gi, '' ) ;
+ 70
+ 71 			html = html.replace( /<SPAN\s*[^>]*>\s* \s*<\/SPAN>/gi, ' ' ) ;
+ 72
+ 73 			html = html.replace( /<SPAN\s*[^>]*><\/SPAN>/gi, '' ) ;
+ 74
+ 75 			// Remove Lang attributes
+ 76 			html = html.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;
+ 77
+ 78 			html = html.replace( /<SPAN\s*>([\s\S]*?)<\/SPAN>/gi, '$1' ) ;
+ 79
+ 80 			html = html.replace( /<FONT\s*>([\s\S]*?)<\/FONT>/gi, '$1' ) ;
+ 81
+ 82 			// Remove XML elements and declarations
+ 83 			html = html.replace(/<\\?\?xml[^>]*>/gi, '' ) ;
+ 84
+ 85 			// Remove w: tags with contents.
+ 86 			html = html.replace( /<w:[^>]*>[\s\S]*?<\/w:[^>]*>/gi, '' ) ;
+ 87
+ 88 			// Remove Tags with XML namespace declarations: <o:p><\/o:p>
+ 89 			html = html.replace(/<\/?\w+:[^>]*>/gi, '' ) ;
+ 90
+ 91 			// Remove comments [SF BUG-1481861].
+ 92 			html = html.replace(/<\!--[\s\S]*?-->/g, '' ) ;
+ 93
+ 94 			html = html.replace( /<(U|I|STRIKE)> <\/\1>/g, ' ' ) ;
+ 95
+ 96 			html = html.replace( /<H\d>\s*<\/H\d>/gi, '' ) ;
+ 97
+ 98 			// Remove "display:none" tags.
+ 99 			html = html.replace( /<(\w+)[^>]*\sstyle="[^"]*DISPLAY\s?:\s?none[\s\S]*?<\/\1>/ig, '' ) ;
+100
+101 			// Remove language tags
+102 			html = html.replace( /<(\w[^>]*) language=([^ |>]*)([^>]*)/gi, "<$1$3") ;
+103
+104 			// Remove onmouseover and onmouseout events (from MS Word comments effect)
+105 			html = html.replace( /<(\w[^>]*) onmouseover="([^\"]*)"([^>]*)/gi, "<$1$3") ;
+106 			html = html.replace( /<(\w[^>]*) onmouseout="([^\"]*)"([^>]*)/gi, "<$1$3") ;
+107
+108 			if ( editor.config.pasteFromWordKeepsStructure )
+109 			{
+110 				// The original <Hn> tag send from Word is something like this: <Hn style="margin-top:0px;margin-bottom:0px">
+111 				html = html.replace( /<H(\d)([^>]*)>/gi, '<h$1>' ) ;
+112
+113 				// Word likes to insert extra <font> tags, when using MSIE. (Wierd).
+114 				html = html.replace( /<(H\d)><FONT[^>]*>([\s\S]*?)<\/FONT><\/\1>/gi, '<$1>$2<\/$1>' );
+115 				html = html.replace( /<(H\d)><EM>([\s\S]*?)<\/EM><\/\1>/gi, '<$1>$2<\/$1>' );
+116 			}
+117 			else
+118 			{
+119 				html = html.replace( /<H1([^>]*)>/gi, '<div$1><b><font size="6">' ) ;
+120 				html = html.replace( /<H2([^>]*)>/gi, '<div$1><b><font size="5">' ) ;
+121 				html = html.replace( /<H3([^>]*)>/gi, '<div$1><b><font size="4">' ) ;
+122 				html = html.replace( /<H4([^>]*)>/gi, '<div$1><b><font size="3">' ) ;
+123 				html = html.replace( /<H5([^>]*)>/gi, '<div$1><b><font size="2">' ) ;
+124 				html = html.replace( /<H6([^>]*)>/gi, '<div$1><b><font size="1">' ) ;
+125
+126 				html = html.replace( /<\/H\d>/gi, '<\/font><\/b><\/div>' ) ;
+127
+128 				// Transform <P> to <DIV>
+129 				var re = new RegExp( '(<P)([^>]*>[\\s\\S]*?)(<\/P>)', 'gi' ) ;	// Different because of a IE 5.0 error
+130 				html = html.replace( re, '<div$2<\/div>' ) ;
+131
+132 				// Remove empty tags (three times, just to be sure).
+133 				// This also removes any empty anchor
+134 				html = html.replace( /<([^\s>]+)(\s[^>]*)?>\s*<\/\1>/g, '' ) ;
+135 				html = html.replace( /<([^\s>]+)(\s[^>]*)?>\s*<\/\1>/g, '' ) ;
+136 				html = html.replace( /<([^\s>]+)(\s[^>]*)?>\s*<\/\1>/g, '' ) ;
+137 			}
+138
+139 			return html ;
+140 		},
+141 		onShow : function()
+142 		{
+143 			// To avoid JAWS putting virtual cursor back to the editor document,
+144 			// disable main document 'contentEditable' during dialog opening.
+145 			if ( CKEDITOR.env.ie )
+146 				this.getParentEditor().document.getBody().$.contentEditable = 'false';
+147
+148 			// FIREFOX BUG: Force the browser to render the dialog to make the to-be-
+149 			// inserted iframe editable. (#3366)
+150 			this.parts.dialog.$.offsetHeight;
+151
+152 			var container = this.getContentElement( 'general', 'editing_area' ).getElement(),
+153 				iframe = CKEDITOR.dom.element.createFromHtml( '<iframe src="javascript:void(0)" frameborder="0" allowtransparency="1"></iframe>' );
+154
+155 			var lang = this.getParentEditor().lang;
+156
+157 			iframe.setStyles(
+158 				{
+159 					width : '346px',
+160 					height : '152px',
+161 					'background-color' : 'white',
+162 					border : '1px solid black'
+163 				} );
+164 			iframe.setCustomData( 'dialog', this );
+165
+166 			var accTitle = lang.editorTitle.replace( '%1', lang.pastefromword.title );
+167
+168 			if ( CKEDITOR.env.ie )
+169 				container.setHtml( '<legend style="position:absolute;top:-1000000px;left:-1000000px;">'
+170 						+ CKEDITOR.tools.htmlEncode( accTitle )
+171 						+ '</legend>' );
+172 			else
+173 			{
+174 				container.setHtml( '' );
+175 				container.setAttributes(
+176 					{
+177 						role : 'region',
+178 						title : accTitle
+179 					} );
+180 				iframe.setAttributes(
+181 					{
+182 						role : 'region',
+183 						title : ' '
+184 					} );
+185 			}
+186 			container.append( iframe );
+187 			if ( CKEDITOR.env.ie )
+188 				container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' );
+189
+190 			var isCustomDomain = CKEDITOR.env.ie && document.domain != window.location.hostname;
+191 			if ( isCustomDomain )
+192 			{
+193 				CKEDITOR._cke_htmlToLoad = this.definition.htmlToLoad;
+194 				iframe.setAttribute( 'src',
+195 					'javascript:void( (function(){' +
+196 						   'document.open();' +
+197 						   'document.domain="' + document.domain + '";' +
+198 						   'document.write( window.parent.CKEDITOR._cke_htmlToLoad );' +
+199 						   'delete window.parent.CKEDITOR._cke_htmlToLoad;' +
+200 						   'document.close();' +
+201 					'})() )' );
+202 			}
+203 			else
+204 			{
+205 				var doc = iframe.$.contentWindow.document;
+206 				doc.open();
+207 				doc.write( this.definition.htmlToLoad );
+208 				doc.close();
+209 			}
+210 		},
+211 		onOk : function()
+212 		{
+213 			var container = this.getContentElement( 'general', 'editing_area' ).getElement(),
+214 				iframe = container.getElementsByTag( 'iframe' ).getItem( 0 ),
+215 				editor = this.getParentEditor(),
+216 				html = this.definition.cleanWord( editor, iframe.$.contentWindow.document.body.innerHTML,
+217 						this.getValueOf( 'general', 'ignoreFontFace' ),
+218 						this.getValueOf( 'general', 'removeStyle' ) );
+219
+220 				// Insertion should happen after main document design mode turned on.
+221 				setTimeout( function(){
+222 					editor.insertHtml( html );
+223 				}, 0 );
+224 		},
+225 		onHide : function()
+226 		{
+227 			if ( CKEDITOR.env.ie )
+228 				this.getParentEditor().document.getBody().$.contentEditable = 'true';
+229 		},
+230 		contents :
+231 		[
+232 			{
+233 				id : 'general',
+234 				label : editor.lang.pastefromword.title,
+235 				elements :
+236 				[
+237 					{
+238 						type : 'html',
+239 						style : 'white-space: normal;',
+240 						onShow : function()
+241 						{
+242 							/*
+243 							 * SAFARI BUG: The advice label would overflow if the table layout
+244 							 * isn't fixed.
+245 							 */
+246 							if ( CKEDITOR.env.webkit )
+247 								this.getElement().getAscendant( 'table' ).setStyle( 'table-layout', 'fixed' );
+248 						},
+249 						html : editor.lang.pastefromword.advice
+250 					},
+251 					{
+252 						type : 'html',
+253 						id : 'editing_area',
+254 						style : 'width: 100%; height: 100%;',
+255 						html : '<fieldset></fieldset>',
+256 						focus : function()
+257 						{
+258 							var div = this.getElement();
+259 							var iframe = div.getElementsByTag( 'iframe' );
+260 							if ( iframe.count() < 1 )
+261 								return;
+262 							iframe = iframe.getItem( 0 );
+263
+264 							// #3291 : JAWS needs the 500ms delay to detect that the editor iframe
+265 							// iframe is no longer editable. So that it will put the focus into the
+266 							// Paste from Word dialog's editable area instead.
+267 							setTimeout( function()
+268 							{
+269 								iframe.$.contentWindow.focus();
+270 							}, 500 );
+271 						}
+272 					},
+273 					{
+274 						type : 'vbox',
+275 						padding : 0,
+276 						children :
+277 						[
+278 							{
+279 								type : 'checkbox',
+280 								id : 'ignoreFontFace',
+281 								label : editor.lang.pastefromword.ignoreFontFace,
+282 								'default' : true
+283 							},
+284 							{
+285 								type : 'checkbox',
+286 								id : 'removeStyle',
+287 								label : editor.lang.pastefromword.removeStyle
+288 							}
+289 						]
+290 					}
+291 				]
+292 			}
+293 		]
+294 	};
+295 } );
+296 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastefromword_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastefromword_plugin.js.html new file mode 100644 index 000000000..12949533f --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastefromword_plugin.js.html @@ -0,0 +1,35 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'pastefromword',
+  7 {
+  8 	init : function( editor )
+  9 	{
+ 10 		// Register the command.
+ 11 		editor.addCommand( 'pastefromword', new CKEDITOR.dialogCommand( 'pastefromword' ) );
+ 12
+ 13 		// Register the toolbar button.
+ 14 		editor.ui.addButton( 'PasteFromWord',
+ 15 			{
+ 16 				label : editor.lang.pastefromword.toolbar,
+ 17 				command : 'pastefromword'
+ 18 			} );
+ 19
+ 20 		// Register the dialog.
+ 21 		CKEDITOR.dialog.add( 'pastefromword', this.path + 'dialogs/pastefromword.js' );
+ 22 	}
+ 23 } );
+ 24
+ 25 CKEDITOR.config.pasteFromWordIgnoreFontFace = true;
+ 26 CKEDITOR.config.pasteFromWordRemoveStyle = false;
+ 27 CKEDITOR.config.pasteFromWordKeepsStructure = false;
+ 28 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastetext_dialogs_pastetext.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastetext_dialogs_pastetext.js.html new file mode 100644 index 000000000..e5b036f25 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastetext_dialogs_pastetext.js.html @@ -0,0 +1,73 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	CKEDITOR.dialog.add( 'pastetext', function( editor )
+  9 		{
+ 10 			return {
+ 11 				title : editor.lang.pasteText.title,
+ 12
+ 13 				minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 368 : 350,
+ 14 				minHeight : 240,
+ 15
+ 16 				onShow : function()
+ 17 				{
+ 18 					// Reset the textarea value.
+ 19 					this.getContentElement( 'general', 'content' ).getInputElement().setValue( '' );
+ 20 				},
+ 21
+ 22 				onOk : function()
+ 23 				{
+ 24 					// Get the textarea value.
+ 25 					var text = this.getContentElement( 'general', 'content' ).getInputElement().getValue();
+ 26
+ 27 					// Inserts the text.
+ 28 					this.getParentEditor().insertText( text );
+ 29 				},
+ 30
+ 31 				contents :
+ 32 				[
+ 33 					{
+ 34 						label : editor.lang.common.generalTab,
+ 35 						id : 'general',
+ 36 						elements :
+ 37 						[
+ 38 							{
+ 39 								type : 'html',
+ 40 								id : 'pasteMsg',
+ 41 								html : '<div style="white-space:normal;width:340px;">' + editor.lang.clipboard.pasteMsg + '</div>'
+ 42 							},
+ 43 							{
+ 44 								type : 'html',
+ 45 								id : 'content',
+ 46 								style : 'width:340px;height:170px',
+ 47 								html :
+ 48 									'<textarea style="' +
+ 49 										'width:346px;' +
+ 50 										'height:170px;' +
+ 51 										'resize: none;' +
+ 52 										'border:1px solid black;' +
+ 53 										'background-color:white">' +
+ 54 									'</textarea>',
+ 55 								focus : function()
+ 56 								{
+ 57 									this.getElement().focus();
+ 58 								}
+ 59 							}
+ 60 						]
+ 61 					}
+ 62 				]
+ 63 			};
+ 64 		});
+ 65 })();
+ 66 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastetext_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastetext_plugin.js.html new file mode 100644 index 000000000..3eaff991a --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_pastetext_plugin.js.html @@ -0,0 +1,138 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Paste as plain text plugin
+  8  */
+  9
+ 10 (function()
+ 11 {
+ 12 	// The pastetext command definition.
+ 13 	var pasteTextCmd =
+ 14 	{
+ 15 		exec : function( editor )
+ 16 		{
+ 17 			// We use getClipboardData just to test if the clipboard access has
+ 18 			// been granted by the user.
+ 19 			if ( CKEDITOR.getClipboardData() === false || !window.clipboardData )
+ 20 			{
+ 21 				editor.openDialog( 'pastetext' );
+ 22 				return;
+ 23 			}
+ 24
+ 25 			editor.insertText( window.clipboardData.getData( 'Text' ) );
+ 26 		}
+ 27 	};
+ 28
+ 29 	// Register the plugin.
+ 30 	CKEDITOR.plugins.add( 'pastetext',
+ 31 	{
+ 32 		init : function( editor )
+ 33 		{
+ 34 			var commandName = 'pastetext',
+ 35 				command = editor.addCommand( commandName, pasteTextCmd );
+ 36
+ 37 			editor.ui.addButton( 'PasteText',
+ 38 				{
+ 39 					label : editor.lang.pasteText.button,
+ 40 					command : commandName
+ 41 				});
+ 42
+ 43 			CKEDITOR.dialog.add( commandName, CKEDITOR.getUrl( this.path + 'dialogs/pastetext.js' ) );
+ 44
+ 45 			if ( editor.config.forcePasteAsPlainText )
+ 46 			{
+ 47 				editor.on( 'beforePaste', function( event )
+ 48 					{
+ 49 						setTimeout( function() { command.exec(); }, 0 );
+ 50 						event.cancel();
+ 51 					},
+ 52 					null, null, 20 );
+ 53 			}
+ 54 		},
+ 55 		requires : [ 'clipboard' ]
+ 56 	});
+ 57
+ 58 	var clipboardDiv;
+ 59
+ 60 	CKEDITOR.getClipboardData = function()
+ 61 	{
+ 62 		if ( !CKEDITOR.env.ie )
+ 63 			return false;
+ 64
+ 65 		var doc = CKEDITOR.document,
+ 66 			body = doc.getBody();
+ 67
+ 68 		if ( !clipboardDiv )
+ 69 		{
+ 70 			clipboardDiv = doc.createElement( 'div',
+ 71 				{
+ 72 					attributes :
+ 73 						{
+ 74 							id: 'cke_hiddenDiv'
+ 75 						},
+ 76 					styles :
+ 77 						{
+ 78 							position : 'absolute',
+ 79 							visibility : 'hidden',
+ 80 							overflow : 'hidden',
+ 81 							width : '1px',
+ 82 							height : '1px'
+ 83 						}
+ 84 				});
+ 85
+ 86 			clipboardDiv.setHtml( '' );
+ 87
+ 88 			clipboardDiv.appendTo( body );
+ 89 		}
+ 90
+ 91 		// The "enabled" flag is used to check whether the paste operation has
+ 92 		// been completed (the onpaste event has been fired).
+ 93 		var	enabled = false;
+ 94 		var setEnabled = function()
+ 95 		{
+ 96 			enabled = true;
+ 97 		};
+ 98
+ 99 		body.on( 'paste', setEnabled );
+100
+101 		// Create a text range and move it inside the div.
+102 		var textRange = body.$.createTextRange();
+103 		textRange.moveToElementText( clipboardDiv.$ );
+104
+105 		// The execCommand in will fire the "onpaste", only if the
+106 		// security settings are enabled.
+107 		textRange.execCommand( 'Paste' );
+108
+109 		// Get the DIV html and reset it.
+110 		var html = clipboardDiv.getHtml();
+111 		clipboardDiv.setHtml( '' );
+112
+113 		body.removeListener( 'paste', setEnabled );
+114
+115 		// Return the HTML or false if not enabled.
+116 		return enabled && html;
+117 	};
+118 })();
+119
+120 CKEDITOR.editor.prototype.insertText = function( text )
+121 {
+122 	text = CKEDITOR.tools.htmlEncode( text );
+123
+124 	// TODO: Replace the following with fill line break processing (see V2).
+125 	text = text.replace( /(?:\r\n)|\n|\r/g, '<br>' );
+126
+127 	this.insertHtml( text );
+128 };
+129
+130 CKEDITOR.config.forcePasteAsPlainText = false;
+131 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_popup_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_popup_plugin.js.html new file mode 100644 index 000000000..643b4495a --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_popup_plugin.js.html @@ -0,0 +1,70 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'popup');
+  7
+  8 CKEDITOR.tools.extend( CKEDITOR.editor.prototype,
+  9 {
+ 10 	/**
+ 11 	 * Opens Browser in a popup. The "width" and "height" parameters accept
+ 12 	 * numbers (pixels) or percent (of screen size) values.
+ 13 	 * @param {String} url The url of the external file browser.
+ 14 	 * @param {String} width Popup window width.
+ 15 	 * @param {String} height Popup window height.
+ 16 	 */
+ 17 	popup : function( url, width, height )
+ 18 	{
+ 19 		width = width || '80%';
+ 20 		height = height || '70%';
+ 21
+ 22 		if ( typeof width == 'string' && width.length > 1 && width.substr( width.length - 1, 1 ) == '%' )
+ 23 			width = parseInt( window.screen.width * parseInt( width, 10 ) / 100, 10 );
+ 24
+ 25 		if ( typeof height == 'string' && height.length > 1 && height.substr( height.length - 1, 1 ) == '%' )
+ 26 			height = parseInt( window.screen.height * parseInt( height, 10 ) / 100, 10 );
+ 27
+ 28 		if ( width < 640 )
+ 29 			width = 640;
+ 30
+ 31 		if ( height < 420 )
+ 32 			height = 420;
+ 33
+ 34 		var top = parseInt( ( window.screen.height - height ) / 2, 10 ),
+ 35 			left = parseInt( ( window.screen.width  - width ) / 2, 10 ),
+ 36 			options = 'location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes' +
+ 37 			',width='  + width +
+ 38 			',height=' + height +
+ 39 			',top='  + top +
+ 40 			',left=' + left;
+ 41
+ 42 		var popupWindow = window.open( '', null, options, true );
+ 43
+ 44 		// Blocked by a popup blocker.
+ 45 		if ( !popupWindow )
+ 46 			return false;
+ 47
+ 48 		try
+ 49 		{
+ 50 			popupWindow.moveTo( left, top );
+ 51 			popupWindow.resizeTo( width, height );
+ 52 			popupWindow.focus();
+ 53 			popupWindow.location.href = url;
+ 54 		}
+ 55 		catch (e)
+ 56 		{
+ 57 			popupWindow = window.open( url, null, options, true );
+ 58 		}
+ 59
+ 60 		return true ;
+ 61 	}
+ 62 });
+ 63 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_preview_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_preview_plugin.js.html new file mode 100644 index 000000000..4d6572b79 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_preview_plugin.js.html @@ -0,0 +1,105 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Preview plugin.
+  8  */
+  9
+ 10 (function()
+ 11 {
+ 12 	var previewCmd =
+ 13 	{
+ 14 		modes : { wysiwyg:1, source:1 },
+ 15 		canUndo : false,
+ 16 		exec : function( editor )
+ 17 		{
+ 18 			var sHTML,
+ 19 				isCustomDomain = CKEDITOR.env.ie && document.domain != window.location.hostname;
+ 20 			if ( editor.config.fullPage )
+ 21 				sHTML = editor.getData();
+ 22 			else
+ 23 			{
+ 24 				var bodyHtml = '<body ',
+ 25 					body = CKEDITOR.document.getBody(),
+ 26 					baseTag = ( editor.config.baseHref.length > 0 ) ? '<base href="' + editor.config.baseHref + '" _cktemp="true"></base>' : '';
+ 27
+ 28 				if ( body.getAttribute( 'id' ) )
+ 29 					bodyHtml += 'id="' + body.getAttribute( 'id' ) + '" ';
+ 30 				if ( body.getAttribute( 'class' ) )
+ 31 					bodyHtml += 'class="' + body.getAttribute( 'class' ) + '" ';
+ 32 				bodyHtml += '>';
+ 33
+ 34 				sHTML =
+ 35 					editor.config.docType +
+ 36 					'<html dir="' + editor.config.contentsLangDirection + '">' +
+ 37 					'<head>' +
+ 38 					baseTag +
+ 39 					'<title>' + editor.lang.preview + '</title>' +
+ 40 					'<link href="' + editor.config.contentsCss + '" type="text/css" rel="stylesheet" _cktemp="true"/>' +
+ 41 					'</head>' + bodyHtml +
+ 42 					editor.getData() +
+ 43 					'</body></html>';
+ 44 			}
+ 45
+ 46 			var iWidth	= 640,	// 800 * 0.8,
+ 47 				iHeight	= 420,	// 600 * 0.7,
+ 48 				iLeft	= 80;	// (800 - 0.8 * 800) /2 = 800 * 0.1.
+ 49 			try
+ 50 			{
+ 51 				var screen = window.screen;
+ 52 				iWidth = Math.round( screen.width * 0.8 );
+ 53 				iHeight = Math.round( screen.height * 0.7 );
+ 54 				iLeft = Math.round( screen.width * 0.1 );
+ 55 			}
+ 56 			catch ( e ){}
+ 57
+ 58 			var sOpenUrl = '';
+ 59 			if ( isCustomDomain )
+ 60 			{
+ 61 				window._cke_htmlToLoad = sHTML;
+ 62 				sOpenUrl = 'javascript:void( (function(){' +
+ 63 					'document.open();' +
+ 64 					'document.domain="' + document.domain + '";' +
+ 65 					'document.write( window.opener._cke_htmlToLoad );' +
+ 66 					'document.close();' +
+ 67 					'window.opener._cke_htmlToLoad = null;' +
+ 68 					'})() )';
+ 69 			}
+ 70
+ 71 			var oWindow = window.open( sOpenUrl, null, 'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width=' +
+ 72 				iWidth + ',height=' + iHeight + ',left=' + iLeft );
+ 73
+ 74 			if ( !isCustomDomain )
+ 75 			{
+ 76 				oWindow.document.write( sHTML );
+ 77 				oWindow.document.close();
+ 78 			}
+ 79 		}
+ 80 	};
+ 81
+ 82 	var pluginName = 'preview';
+ 83
+ 84 	// Register a plugin named "preview".
+ 85 	CKEDITOR.plugins.add( pluginName,
+ 86 	{
+ 87 		init : function( editor )
+ 88 		{
+ 89 			editor.addCommand( pluginName, previewCmd );
+ 90 			editor.ui.addButton( 'Preview',
+ 91 				{
+ 92 					label : editor.lang.preview,
+ 93 					command : pluginName
+ 94 				});
+ 95 		}
+ 96 	});
+ 97 })();
+ 98 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_print_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_print_plugin.js.html new file mode 100644 index 000000000..af24170e6 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_print_plugin.js.html @@ -0,0 +1,49 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Print Plugin
+  8  */
+  9
+ 10 CKEDITOR.plugins.add( 'print',
+ 11 {
+ 12 	init : function( editor )
+ 13 	{
+ 14 		var pluginName = 'print';
+ 15
+ 16 		// Register the command.
+ 17 		var command = editor.addCommand( pluginName, CKEDITOR.plugins.print );
+ 18
+ 19 		// Register the toolbar button.
+ 20 		editor.ui.addButton( 'Print',
+ 21 			{
+ 22 				label : editor.lang.print,
+ 23 				command : pluginName
+ 24 			});
+ 25 	}
+ 26 } );
+ 27
+ 28 CKEDITOR.plugins.print =
+ 29 {
+ 30 	exec : function( editor )
+ 31 	{
+ 32 		if ( CKEDITOR.env.opera )
+ 33 			return;
+ 34 		else if ( CKEDITOR.env.gecko )
+ 35 			editor.window.$.print();
+ 36 		else
+ 37 			editor.document.$.execCommand( "Print" );
+ 38 	},
+ 39 	canUndo : false,
+ 40 	modes : { wysiwyg : !( CKEDITOR.env.opera ) }		// It is imposible to print the inner document in Opera.
+ 41 };
+ 42 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_removeformat_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_removeformat_plugin.js.html new file mode 100644 index 000000000..aad279aff --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_removeformat_plugin.js.html @@ -0,0 +1,127 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'removeformat',
+  7 {
+  8 	requires : [ 'selection' ],
+  9
+ 10 	init : function( editor )
+ 11 	{
+ 12 		editor.addCommand( 'removeFormat', CKEDITOR.plugins.removeformat.commands.removeformat );
+ 13 		editor.ui.addButton( 'RemoveFormat',
+ 14 			{
+ 15 				label : editor.lang.removeFormat,
+ 16 				command : 'removeFormat'
+ 17 			});
+ 18 	}
+ 19 });
+ 20
+ 21 CKEDITOR.plugins.removeformat =
+ 22 {
+ 23 	commands :
+ 24 	{
+ 25 		removeformat :
+ 26 		{
+ 27 			exec : function( editor )
+ 28 			{
+ 29 				var tagsRegex = editor._.removeFormatRegex ||
+ 30 					( editor._.removeFormatRegex = new RegExp( '^(?:' + editor.config.removeFormatTags.replace( /,/g,'|' ) + ')$', 'i' ) );
+ 31
+ 32 				var removeAttributes = editor._.removeAttributes ||
+ 33 					( editor._.removeAttributes = editor.config.removeFormatAttributes.split( ',' ) );
+ 34
+ 35 				var ranges = editor.getSelection().getRanges();
+ 36
+ 37 				for ( var i = 0, range ; range = ranges[ i ] ; i++ )
+ 38 				{
+ 39 					if ( range.collapsed )
+ 40 						continue;
+ 41
+ 42 					range.enlarge( CKEDITOR.ENLARGE_ELEMENT );
+ 43
+ 44 					// Bookmark the range so we can re-select it after processing.
+ 45 					var bookmark = range.createBookmark();
+ 46
+ 47 					// The style will be applied within the bookmark boundaries.
+ 48 					var startNode	= bookmark.startNode;
+ 49 					var endNode		= bookmark.endNode;
+ 50
+ 51 					// We need to check the selection boundaries (bookmark spans) to break
+ 52 					// the code in a way that we can properly remove partially selected nodes.
+ 53 					// For example, removing a <b> style from
+ 54 					//		<b>This is [some text</b> to show <b>the] problem</b>
+ 55 					// ... where [ and ] represent the selection, must result:
+ 56 					//		<b>This is </b>[some text to show the]<b> problem</b>
+ 57 					// The strategy is simple, we just break the partial nodes before the
+ 58 					// removal logic, having something that could be represented this way:
+ 59 					//		<b>This is </b>[<b>some text</b> to show <b>the</b>]<b> problem</b>
+ 60
+ 61 					var breakParent = function( node )
+ 62 					{
+ 63 						// Let's start checking the start boundary.
+ 64 						var path = new CKEDITOR.dom.elementPath( node );
+ 65 						var pathElements = path.elements;
+ 66
+ 67 						for ( var i = 1, pathElement ; pathElement = pathElements[ i ] ; i++ )
+ 68 						{
+ 69 							if ( pathElement.equals( path.block ) || pathElement.equals( path.blockLimit ) )
+ 70 								break;
+ 71
+ 72 							// If this element can be removed (even partially).
+ 73 							if ( tagsRegex.test( pathElement.getName() ) )
+ 74 								node.breakParent( pathElement );
+ 75 						}
+ 76 					};
+ 77
+ 78 					breakParent( startNode );
+ 79 					breakParent( endNode );
+ 80
+ 81 					// Navigate through all nodes between the bookmarks.
+ 82 					var currentNode = startNode.getNextSourceNode( true, CKEDITOR.NODE_ELEMENT );
+ 83
+ 84 					while ( currentNode )
+ 85 					{
+ 86 						// If we have reached the end of the selection, stop looping.
+ 87 						if ( currentNode.equals( endNode ) )
+ 88 							break;
+ 89
+ 90 						// Cache the next node to be processed. Do it now, because
+ 91 						// currentNode may be removed.
+ 92 						var nextNode = currentNode.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT );
+ 93
+ 94 						// This node must not be a fake element.
+ 95 						if ( currentNode.getName() != 'img' || !currentNode.getAttribute( '_cke_protected_html' ) )
+ 96 						{
+ 97 							// Remove elements nodes that match with this style rules.
+ 98 							if ( tagsRegex.test( currentNode.getName() ) )
+ 99 								currentNode.remove( true );
+100 							else
+101 								currentNode.removeAttributes( removeAttributes );
+102 						}
+103
+104 						currentNode = nextNode;
+105 					}
+106
+107 					range.moveToBookmark( bookmark );
+108 				}
+109
+110 				editor.getSelection().selectRanges( ranges );
+111 			}
+112 		}
+113 	}
+114 };
+115
+116 // Only inline elements are valid.
+117 CKEDITOR.config.removeFormatTags = 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var';
+118
+119 CKEDITOR.config.removeFormatAttributes = 'class,style,lang,width,height,align,hspace,valign';
+120 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_resize_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_resize_plugin.js.html new file mode 100644 index 000000000..936bf4e38 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_resize_plugin.js.html @@ -0,0 +1,84 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'resize',
+  7 {
+  8 	init : function( editor )
+  9 	{
+ 10 		var config = editor.config;
+ 11
+ 12 		if ( config.resize_enabled )
+ 13 		{
+ 14 			var container = null;
+ 15 			var origin, startSize;
+ 16
+ 17 			function dragHandler( evt )
+ 18 			{
+ 19 				var dx = evt.data.$.screenX - origin.x;
+ 20 				var dy = evt.data.$.screenY - origin.y;
+ 21 				var internalWidth = startSize.width + dx * ( editor.lang.dir == 'rtl' ? -1 : 1 );
+ 22 				var internalHeight = startSize.height + dy;
+ 23
+ 24 				editor.resize( Math.max( config.resize_minWidth, Math.min( internalWidth, config.resize_maxWidth ) ),
+ 25 						Math.max( config.resize_minHeight, Math.min( internalHeight, config.resize_maxHeight ) ) );
+ 26 			}
+ 27
+ 28 			function dragEndHandler ( evt )
+ 29 			{
+ 30 				CKEDITOR.document.removeListener( 'mousemove', dragHandler );
+ 31 				CKEDITOR.document.removeListener( 'mouseup', dragEndHandler );
+ 32
+ 33 				if ( editor.document )
+ 34 				{
+ 35 					editor.document.removeListener( 'mousemove', dragHandler );
+ 36 					editor.document.removeListener( 'mouseup', dragEndHandler );
+ 37 				}
+ 38 			}
+ 39
+ 40 			var mouseDownFn = CKEDITOR.tools.addFunction( function( $event )
+ 41 				{
+ 42 					if ( !container )
+ 43 						container = editor.getResizable();
+ 44
+ 45 					startSize = { width : container.$.offsetWidth || 0, height : container.$.offsetHeight || 0 };
+ 46 					origin = { x : $event.screenX, y : $event.screenY };
+ 47
+ 48 					CKEDITOR.document.on( 'mousemove', dragHandler );
+ 49 					CKEDITOR.document.on( 'mouseup', dragEndHandler );
+ 50
+ 51 					if ( editor.document )
+ 52 					{
+ 53 						editor.document.on( 'mousemove', dragHandler );
+ 54 						editor.document.on( 'mouseup', dragEndHandler );
+ 55 					}
+ 56 				} );
+ 57
+ 58 			editor.on( 'themeSpace', function( event )
+ 59 				{
+ 60 					if ( event.data.space == 'bottom' )
+ 61 					{
+ 62 						event.data.html += '<div class="cke_resizer"' +
+ 63 							' title="' + CKEDITOR.tools.htmlEncode( editor.lang.resize ) + '"' +
+ 64 							' onmousedown="CKEDITOR.tools.callFunction(' + mouseDownFn + ', event)"' +
+ 65 							'></div>';
+ 66 					}
+ 67 				}, editor, null, 100 );
+ 68 		}
+ 69 	}
+ 70 } );
+ 71
+ 72 CKEDITOR.config.resize_minWidth = 750;
+ 73 CKEDITOR.config.resize_minHeight = 250;
+ 74 CKEDITOR.config.resize_maxWidth = 3000;
+ 75 CKEDITOR.config.resize_maxHeight = 3000;
+ 76 CKEDITOR.config.resize_enabled = true;
+ 77 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_richcombo_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_richcombo_plugin.js.html new file mode 100644 index 000000000..06c7cc048 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_richcombo_plugin.js.html @@ -0,0 +1,365 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'richcombo',
+  7 {
+  8 	requires : [ 'floatpanel', 'listblock', 'button' ],
+  9
+ 10 	beforeInit : function( editor )
+ 11 	{
+ 12 		editor.ui.addHandler( CKEDITOR.UI_RICHCOMBO, CKEDITOR.ui.richCombo.handler );
+ 13 	}
+ 14 });
+ 15
+ 16 /**
+ 17  * Button UI element.
+ 18  * @constant
+ 19  * @example
+ 20  */
+ 21 CKEDITOR.UI_RICHCOMBO = 3;
+ 22
+ 23 CKEDITOR.ui.richCombo = CKEDITOR.tools.createClass(
+ 24 {
+ 25 	$ : function( definition )
+ 26 	{
+ 27 		// Copy all definition properties to this object.
+ 28 		CKEDITOR.tools.extend( this, definition,
+ 29 			// Set defaults.
+ 30 			{
+ 31 				title : definition.label,
+ 32 				modes : { wysiwyg : 1 }
+ 33 			});
+ 34
+ 35 		// We don't want the panel definition in this object.
+ 36 		var panelDefinition = this.panel || {};
+ 37 		delete this.panel;
+ 38
+ 39 		this.id = CKEDITOR.tools.getNextNumber();
+ 40
+ 41 		this.document = ( panelDefinition
+ 42 							&& panelDefinition.parent
+ 43 							&& panelDefinition.parent.getDocument() )
+ 44 						|| CKEDITOR.document;
+ 45
+ 46 		panelDefinition.className = ( panelDefinition.className || '' ) + ' cke_rcombopanel';
+ 47
+ 48 		this._ =
+ 49 		{
+ 50 			panelDefinition : panelDefinition,
+ 51 			items : {},
+ 52 			state : CKEDITOR.TRISTATE_OFF
+ 53 		};
+ 54 	},
+ 55
+ 56 	statics :
+ 57 	{
+ 58 		handler :
+ 59 		{
+ 60 			create : function( definition )
+ 61 			{
+ 62 				return new CKEDITOR.ui.richCombo( definition );
+ 63 			}
+ 64 		}
+ 65 	},
+ 66
+ 67 	proto :
+ 68 	{
+ 69 		renderHtml : function( editor )
+ 70 		{
+ 71 			var output = [];
+ 72 			this.render( editor, output );
+ 73 			return output.join( '' );
+ 74 		},
+ 75
+ 76 		/**
+ 77 		 * Renders the combo.
+ 78 		 * @param {CKEDITOR.editor} editor The editor instance which this button is
+ 79 		 *		to be used by.
+ 80 		 * @param {Array} output The output array to which append the HTML relative
+ 81 		 *		to this button.
+ 82 		 * @example
+ 83 		 */
+ 84 		render : function( editor, output )
+ 85 		{
+ 86 			var id = 'cke_' + this.id;
+ 87 			var clickFn = CKEDITOR.tools.addFunction( function( $element )
+ 88 				{
+ 89 					var _ = this._;
+ 90
+ 91 					if ( _.state == CKEDITOR.TRISTATE_DISABLED )
+ 92 						return;
+ 93
+ 94 					this.createPanel( editor );
+ 95
+ 96 					if ( _.on )
+ 97 					{
+ 98 						_.panel.hide();
+ 99 						return;
+100 					}
+101
+102 					if ( !_.committed )
+103 					{
+104 						_.list.commit();
+105 						_.committed = 1;
+106 					}
+107
+108 					var value = this.getValue();
+109 					if ( value )
+110 						_.list.mark( value );
+111 					else
+112 						_.list.unmarkAll();
+113
+114 					_.panel.showBlock( this.id, new CKEDITOR.dom.element( $element ), 4 );
+115 				},
+116 				this );
+117
+118 			var instance = {
+119 				id : id,
+120 				combo : this,
+121 				focus : function()
+122 				{
+123 					var element = CKEDITOR.document.getById( id ).getChild( 1 );
+124 					element.focus();
+125 				},
+126 				execute : clickFn
+127 			};
+128
+129 			editor.on( 'mode', function()
+130 				{
+131 					this.setState( this.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
+132 				},
+133 				this );
+134
+135 			var keyDownFn = CKEDITOR.tools.addFunction( function( ev, element )
+136 				{
+137 					ev = new CKEDITOR.dom.event( ev );
+138
+139 					var keystroke = ev.getKeystroke();
+140 					switch ( keystroke )
+141 					{
+142 						case 13 :	// ENTER
+143 						case 32 :	// SPACE
+144 						case 40 :	// ARROW-DOWN
+145 							// Show panel
+146 							CKEDITOR.tools.callFunction( clickFn, element );
+147 							break;
+148 						default :
+149 							// Delegate the default behavior to toolbar button key handling.
+150 							instance.onkey( instance,  keystroke );
+151 					}
+152
+153 					// Avoid subsequent focus grab on editor document.
+154 					ev.preventDefault();
+155 				});
+156
+157 			output.push(
+158 				'<span class="cke_rcombo">',
+159 				'<span id=', id );
+160
+161 			if ( this.className )
+162 				output.push( ' class="', this.className, ' cke_off"');
+163
+164 			output.push(
+165 				'>' +
+166 					'<span class=cke_label>', this.label, '</span>' +
+167 					'<a hidefocus=true title="', this.title, '" tabindex="-1" href="javascript:void(\'', this.label, '\')"' );
+168
+169 			// Some browsers don't cancel key events in the keydown but in the
+170 			// keypress.
+171 			// TODO: Check if really needed for Gecko+Mac.
+172 			if ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.mac ) )
+173 			{
+174 				output.push(
+175 					' onkeypress="return false;"' );
+176 			}
+177
+178 			// With Firefox, we need to force it to redraw, otherwise it
+179 			// will remain in the focus state.
+180 			if ( CKEDITOR.env.gecko )
+181 			{
+182 				output.push(
+183 					' onblur="this.style.cssText = this.style.cssText;"' );
+184 			}
+185
+186 			output.push(
+187 					' onkeydown="CKEDITOR.tools.callFunction( ', keyDownFn, ', event, this );"' +
+188 					' onclick="CKEDITOR.tools.callFunction(', clickFn, ', this); return false;">' +
+189 						'<span>' +
+190 							'<span class="cke_accessibility">' + ( this.voiceLabel ? this.voiceLabel + ' ' : '' ) + '</span>' +
+191 							'<span id="' + id + '_text" class="cke_text cke_inline_label">' + this.label + '</span>' +
+192 						'</span>' +
+193 						'<span class=cke_openbutton></span>' +
+194 					'</a>' +
+195 				'</span>' +
+196 				'</span>' );
+197
+198 			if ( this.onRender )
+199 				this.onRender();
+200
+201 			return instance;
+202 		},
+203
+204 		createPanel : function( editor )
+205 		{
+206 			if ( this._.panel )
+207 				return;
+208
+209 			var panelDefinition = this._.panelDefinition,
+210 				panelParentElement = panelDefinition.parent || CKEDITOR.document.getBody(),
+211 				panel = new CKEDITOR.ui.floatPanel( editor, panelParentElement, panelDefinition ),
+212 				list = panel.addListBlock( this.id, this.multiSelect ),
+213 				me = this;
+214
+215 			panel.onShow = function()
+216 				{
+217 					if ( me.className )
+218 						this.element.getFirst().addClass( me.className + '_panel' );
+219
+220 					me.setState( CKEDITOR.TRISTATE_ON );
+221
+222 					list.focus( !me.multiSelect && me.getValue() );
+223
+224 					me._.on = 1;
+225
+226 					if ( me.onOpen )
+227 						me.onOpen();
+228 				};
+229
+230 			panel.onHide = function()
+231 				{
+232 					if ( me.className )
+233 						this.element.getFirst().removeClass( me.className + '_panel' );
+234
+235 					me.setState( CKEDITOR.TRISTATE_OFF );
+236
+237 					me._.on = 0;
+238
+239 					if ( me.onClose )
+240 						me.onClose();
+241 				};
+242
+243 			panel.onEscape = function()
+244 				{
+245 					panel.hide();
+246 					me.document.getById( 'cke_' + me.id ).getFirst().getNext().focus();
+247 				};
+248
+249 			list.onClick = function( value, marked )
+250 				{
+251 					// Move the focus to the main windows, otherwise it will stay
+252 					// into the floating panel, even if invisible, and Safari and
+253 					// Opera will go a bit crazy.
+254 					me.document.getWindow().focus();
+255
+256 					if ( me.onClick )
+257 						me.onClick.call( me, value, marked );
+258
+259 					if ( marked )
+260 						me.setValue( value, me._.items[ value ] );
+261 					else
+262 						me.setValue( '' );
+263
+264 					panel.hide();
+265 				};
+266
+267 			this._.panel = panel;
+268 			this._.list = list;
+269
+270 			panel.getBlock( this.id ).onHide = function()
+271 				{
+272 					me._.on = 0;
+273 					me.setState( CKEDITOR.TRISTATE_OFF );
+274 				};
+275
+276 			if ( this.init )
+277 				this.init();
+278 		},
+279
+280 		setValue : function( value, text )
+281 		{
+282 			this._.value = value;
+283
+284 			var textElement = this.document.getById( 'cke_' + this.id + '_text' );
+285
+286 			if ( !value )
+287 			{
+288 				text = this.label;
+289 				textElement.addClass( 'cke_inline_label' );
+290 			}
+291 			else
+292 				textElement.removeClass( 'cke_inline_label' );
+293 			textElement.setHtml( typeof text != 'undefined' ? text : value );
+294 		},
+295
+296 		getValue : function()
+297 		{
+298 			return this._.value || '';
+299 		},
+300
+301 		unmarkAll : function()
+302 		{
+303 			this._.list.unmarkAll();
+304 		},
+305
+306 		mark : function( value )
+307 		{
+308 			this._.list.mark( value );
+309 		},
+310
+311 		hideItem : function( value )
+312 		{
+313 			this._.list.hideItem( value );
+314 		},
+315
+316 		hideGroup : function( groupTitle )
+317 		{
+318 			this._.list.hideGroup( groupTitle );
+319 		},
+320
+321 		showAll : function()
+322 		{
+323 			this._.list.showAll();
+324 		},
+325
+326 		add : function( value, html, text )
+327 		{
+328 			this._.items[ value ] = text || value;
+329 			this._.list.add( value, html, text );
+330 		},
+331
+332 		startGroup : function( title )
+333 		{
+334 			this._.list.startGroup( title );
+335 		},
+336
+337 		commit : function()
+338 		{
+339 			this._.list.commit();
+340 		},
+341
+342 		setState : function( state )
+343 		{
+344 			if ( this._.state == state )
+345 				return;
+346
+347 			this.document.getById( 'cke_' + this.id ).setState( state );
+348
+349 			this._.state = state;
+350 		}
+351 	}
+352 });
+353
+354 CKEDITOR.ui.prototype.addRichCombo = function( name, definition )
+355 {
+356 	this.add( name, CKEDITOR.UI_RICHCOMBO, definition );
+357 };
+358 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_save_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_save_plugin.js.html new file mode 100644 index 000000000..294c538b5 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_save_plugin.js.html @@ -0,0 +1,63 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileSave plugin.
+  8  */
+  9
+ 10 (function()
+ 11 {
+ 12 	var saveCmd =
+ 13 	{
+ 14 		modes : { wysiwyg:1, source:1 },
+ 15
+ 16 		exec : function( editor )
+ 17 		{
+ 18 			var $form = editor.element.$.form;
+ 19
+ 20 			if ( $form )
+ 21 			{
+ 22 				try
+ 23 				{
+ 24 					$form.submit();
+ 25 				}
+ 26 				catch( e )
+ 27 				{
+ 28 					// If there's a button named "submit" then the form.submit
+ 29 					// function is masked and can't be called in IE/FF, so we
+ 30 					// call the click() method of that button.
+ 31 					if ( $form.submit.click )
+ 32 						$form.submit.click();
+ 33 				}
+ 34 			}
+ 35 		}
+ 36 	};
+ 37
+ 38 	var pluginName = 'save';
+ 39
+ 40 	// Register a plugin named "save".
+ 41 	CKEDITOR.plugins.add( pluginName,
+ 42 	{
+ 43 		init : function( editor )
+ 44 		{
+ 45 			var command = editor.addCommand( pluginName, saveCmd );
+ 46 			command.modes = { wysiwyg : !!( editor.element.$.form ) };
+ 47
+ 48 			editor.ui.addButton( 'Save',
+ 49 				{
+ 50 					label : editor.lang.save,
+ 51 					command : pluginName
+ 52 				});
+ 53 		}
+ 54 	});
+ 55 })();
+ 56 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_scayt_dialogs_options.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_scayt_dialogs_options.js.html new file mode 100644 index 000000000..818172f7e --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_scayt_dialogs_options.js.html @@ -0,0 +1,476 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dialog.add( 'scaytcheck', function( editor )
+  7 {
+  8 	var firstLoad = true,
+  9 		captions,
+ 10 		doc = CKEDITOR.document,
+ 11 		fckLang = 'en';
+ 12 	var dic_buttons = [
+ 13 		// [0] contains buttons for creating
+ 14 		"dic_create,dic_restore",
+ 15 		// [1] contains buton for manipulation
+ 16 		"dic_rename,dic_delete"
+ 17 	];
+ 18
+ 19 	var init_with_captions = function()
+ 20 	{
+ 21 		var dialog = this,
+ 22 			lang_list = dialog.data.scayt.getLangList(),
+ 23 			buttons = [ 'dic_create','dic_delete','dic_rename','dic_restore' ],
+ 24 			labels = [ 'mixedCase','mixedWithDigits','allCaps','ignoreDomainNames' ],
+ 25 			i;
+ 26
+ 27 		// Add buttons titles
+ 28 		for ( i in buttons )
+ 29 		{
+ 30 			var button = buttons[ i ];
+ 31 			doc.getById( button ).setHtml( '<span class="cke_dialog_ui_button">' + captions[ 'button_' + button]  +'</span>' );
+ 32 		}
+ 33 		doc.getById( 'dic_info' ).setHtml( captions[ 'dic_info' ] );
+ 34
+ 35 		// Fill options and dictionary labels.
+ 36 		for ( i in labels )
+ 37 		{
+ 38 			var label = 'label_' + labels[ i ],
+ 39 				labelElement = doc.getById( label );
+ 40
+ 41 			if (  'undefined' != typeof labelElement
+ 42 			   && 'undefined' != typeof captions[ label ]
+ 43 			   && 'undefined' != typeof dialog.options[labels[ i ]] )
+ 44 			{
+ 45 				labelElement.setHtml( captions[ label ] );
+ 46 				var labelParent = labelElement.getParent();
+ 47 				labelParent.$.style.display = "block";
+ 48 			}
+ 49 		}
+ 50
+ 51 		var about = '<p>' + captions[ 'about_throwt_image' ] + '</p>'+
+ 52 					'<p>' + captions[ 'version' ]  + dialog.data.scayt.version.toString() + '</p>' +
+ 53 					'<p>' + captions[ 'about_throwt_copy' ] + '</p>';
+ 54
+ 55 		doc.getById( 'scayt_about' ).setHtml( about );
+ 56
+ 57 		// Create languages tab.
+ 58 		var createOption = function( option, list )
+ 59 		{
+ 60 			var label = doc.createElement( 'label' );
+ 61 			label.setAttribute( 'for', 'cke_option' + option );
+ 62 			label.setHtml( list[ option ] );
+ 63
+ 64 			if ( dialog.sLang == option )	// Current.
+ 65 				dialog.chosed_lang = option;
+ 66
+ 67 			var div = doc.createElement( 'div' );
+ 68 			var radio = CKEDITOR.dom.element.createFromHtml( '<input id="cke_option' +
+ 69 					option + '" type="radio" ' +
+ 70 					( dialog.sLang == option ? 'checked="checked"' : '' ) +
+ 71 					' value="' + option + '" name="scayt_lang" />' );
+ 72
+ 73 			radio.on( 'click', function()
+ 74 				{
+ 75 					this.$.checked = true;
+ 76 					dialog.chosed_lang = option;
+ 77 				});
+ 78
+ 79 			div.append( radio );
+ 80 			div.append( label );
+ 81
+ 82 			return {
+ 83 				lang : list[ option ],
+ 84 				code : option,
+ 85 				radio : div
+ 86 			};
+ 87 		};
+ 88
+ 89 		var langList = [];
+ 90 		for ( i in lang_list.rtl )
+ 91 			langList[ langList.length ] = createOption( i, lang_list.ltr );
+ 92
+ 93 		for ( i in lang_list.ltr )
+ 94 			langList[ langList.length  ] = createOption( i, lang_list.ltr );
+ 95
+ 96 		langList.sort( 	function( lang1, lang2 )
+ 97 			{
+ 98 				return ( lang2.lang > lang1.lang ) ? -1 : 1 ;
+ 99 			});
+100
+101 		var fieldL = doc.getById( 'scayt_lcol' ),
+102 			fieldR = doc.getById( 'scayt_rcol' );
+103 		for ( i=0; i < langList.length; i++ )
+104 		{
+105 			var field = ( i < langList.length / 2 ) ? fieldL : fieldR;
+106 			field.append( langList[ i ].radio );
+107 		}
+108
+109 		// user dictionary handlers
+110 		var dic = {};
+111 		dic.dic_create = function( el, dic_name , dic_buttons )
+112 			{
+113 				// comma separated button's ids include repeats if exists
+114 				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
+115
+116 				var err_massage = captions["err_dic_create"];
+117 				var suc_massage = captions["succ_dic_create"];
+118 				//console.info("--plugin ");
+119
+120 				scayt.createUserDictionary(dic_name,
+121 					function(arg)
+122 						{
+123 							//console.info( "dic_create callback called with args" , arg );
+124 							hide_dic_buttons ( all_buttons );
+125 							display_dic_buttons ( dic_buttons[1] );
+126 							suc_massage = suc_massage.replace("%s" , arg.dname );
+127 							dic_success_message (suc_massage);
+128 						},
+129 					function(arg)
+130 						{
+131 							//console.info( "dic_create errorback called with args" , arg )
+132 							err_massage = err_massage.replace("%s" ,arg.dname );
+133 							dic_error_message ( err_massage + "( "+ (arg.message || "") +")");
+134 						});
+135
+136 			};
+137
+138 		dic.dic_rename = function( el, dic_name , dic_buttons )
+139 			{
+140 				//
+141 				// try to rename dictionary
+142 				// @TODO: rename dict
+143 				//console.info ( captions["err_dic_rename"] )
+144 				var err_massage = captions["err_dic_rename"] || "";
+145 				var suc_massage = captions["succ_dic_rename"] || "";
+146 				scayt.renameUserDictionary(dic_name,
+147 					function(arg)
+148 						{
+149 							//console.info( "dic_rename callback called with args" , arg );
+150 							suc_massage = suc_massage.replace("%s" , arg.dname );
+151 							set_dic_name( dic_name );
+152 							dic_success_message ( suc_massage );
+153 						},
+154 					function(arg)
+155 						{
+156 							//console.info( "dic_rename errorback called with args" , arg )
+157 							err_massage = err_massage.replace("%s" , arg.dname  );
+158 							set_dic_name( dic_name );
+159 							dic_error_message( err_massage + "( " + ( arg.message || "" ) + " )" );
+160 						});
+161 			};
+162
+163 		dic.dic_delete = function ( el, dic_name , dic_buttons )
+164 			{
+165 				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
+166 				var err_massage = captions["err_dic_delete"];
+167 				var suc_massage = captions["succ_dic_delete"];
+168
+169 				// try to delete dictionary
+170 				// @TODO: delete dict
+171 				scayt.deleteUserDictionary(
+172 					function(arg)
+173 						{
+174 							//console.info( "dic_delete callback " , dic_name ,arg );
+175 							suc_massage = suc_massage.replace("%s" , arg.dname );
+176 							hide_dic_buttons ( all_buttons );
+177 							display_dic_buttons ( dic_buttons[0] );
+178 							set_dic_name( "" ); // empty input field
+179 							dic_success_message( suc_massage );
+180 						},
+181 					function(arg)
+182 						{
+183 							//console.info( " dic_delete errorback called with args" , arg )
+184 							err_massage = err_massage.replace("%s" , arg.dname );
+185 							dic_error_message(err_massage);
+186 						});
+187 			};
+188
+189 		dic.dic_restore = dialog.dic_restore || function ( el, dic_name , dic_buttons )
+190 			{
+191 				// try to restore existing dictionary
+192 				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
+193 				var err_massage = captions["err_dic_restore"];
+194 				var suc_massage = captions["succ_dic_restore"];
+195
+196 				scayt.restoreUserDictionary(dic_name,
+197 					function(arg)
+198 						{
+199 							//console.info( "dic_restore callback called with args" , arg );
+200 							suc_massage = suc_massage.replace("%s" , arg.dname );
+201 							hide_dic_buttons ( all_buttons );
+202 							display_dic_buttons(dic_buttons[1]);
+203 							dic_success_message( suc_massage );
+204 						},
+205 					function(arg)
+206 						{
+207 							//console.info( " dic_restore errorback called with args" , arg )
+208 							err_massage = err_massage.replace("%s" , arg.dname );
+209 							dic_error_message( err_massage );
+210 						});
+211 			};
+212
+213 		// ** bind event listeners
+214 		var arr_buttons = ( dic_buttons[0] + ',' + dic_buttons[1] ).split( ',' ),
+215 			l;
+216
+217 		for ( i = 0, l = arr_buttons.length ; i < l ; i += 1 )
+218 		{
+219 		 	var dic_button = doc.getById(arr_buttons[i]);
+220
+221 			dic_button.on( 'click', function ()
+222 				{
+223 					var dic_name = doc.getById('dic_name').getValue();
+224 					if ( !dic_name )
+225 					{
+226 						dic_error_message(" Dictionary name should not be empty. ");
+227 						return false;
+228 					}
+229 					//apply handler
+230 					dic[ this.getId() ].apply( null, [ this, dic_name, dic_buttons ] );
+231
+232 					return true;
+233 				});
+234 		}
+235 	};
+236 	var reload = function()
+237 	{
+238 		var dialog = this;
+239
+240 		// Animate options.
+241 		for ( var i in dialog.options )
+242 		{
+243 			var checkbox = doc.getById( i );
+244 			if ( checkbox )
+245 			{
+246 				checkbox.removeAttribute( 'checked' );
+247 				if ( dialog.options[ i ] == 1 )
+248 					checkbox.setAttribute( 'checked', 'checked' );
+249
+250 				// Bind events. Do it only once.
+251 				if ( firstLoad )
+252 				{
+253 					checkbox.on( 'click', function()
+254 						{
+255 							dialog.options[ this.getId() ] = this.$.checked ? 1 : 0 ;
+256 						} );
+257 				}
+258 			}
+259 		}
+260
+261 		// * user dictionary
+262 		scayt.getNameUserDictionary(
+263 			function( o )
+264 			{
+265 				var dic_name = o.dname;
+266 				if ( dic_name )
+267 				{
+268 					doc.getById( 'dic_name' ).setValue(dic_name);
+269 					display_dic_buttons( dic_buttons[1] );
+270 				}
+271 				else
+272 					display_dic_buttons( dic_buttons[0] );
+273
+274 			},
+275 			function ()
+276 				{
+277 					doc.getById( 'dic_name' ).setValue("");
+278 				});
+279
+280 		dic_success_message("");
+281 	};
+282
+283 	function dic_error_message ( m )
+284 		{
+285 			doc.getById('dic_message').setHtml('<span style="color:red;">' + m + '</span>' );
+286 		}
+287         function dic_success_message ( m )
+288 		{
+289 			doc.getById('dic_message').setHtml('<span style="color:blue;">' + m + '</span>') ;
+290 		}
+291 	function display_dic_buttons ( sIds )
+292 		{
+293
+294 			sIds = new String( sIds );
+295 			var aIds = sIds.split(',');
+296 			for ( var i=0, l = aIds.length; i < l ; i+=1)
+297 			{
+298 				doc.getById( aIds[i] ).$.style.display = "inline";
+299 			}
+300
+301 		}
+302 	function hide_dic_buttons ( sIds )
+303 		{
+304 			sIds = new String( sIds );
+305 			var aIds = sIds.split(',');
+306 			for ( var i = 0, l = aIds.length; i < l ; i += 1 )
+307 			{
+308 				doc.getById( aIds[i] ).$.style.display = "none";
+309 			}
+310 		}
+311 	function set_dic_name ( dic_name )
+312 		{
+313 			doc.getById('dic_name').$.value= dic_name;
+314 		}
+315
+316 	return {
+317 		title : editor.lang.scayt.title,
+318 		minWidth : 340,
+319 		minHeight : 200,
+320 		onShow : function()
+321 			{
+322 				var dialog = this;
+323 				dialog.data = editor.fire( 'scaytDialog', {} );
+324 				dialog.options = dialog.data.scayt_control.option();
+325 				dialog.sLang = dialog.data.scayt_control.sLang;
+326
+327 				if ( !dialog.data || !dialog.data.scayt || !dialog.data.scayt_control )
+328 				{
+329 					alert( 'Error loading application service' );
+330 					dialog.hide();
+331 					return;
+332 				}
+333
+334 				var stop = 0;
+335 				if ( firstLoad )
+336 				{
+337 					dialog.data.scayt.getCaption( 'en', function( caps )
+338 						{
+339 							if ( stop++ > 0 )	// Once only
+340 								return;
+341 							captions = caps;
+342 							init_with_captions.apply( dialog );
+343 							reload.apply( dialog );
+344 							firstLoad = false;
+345 						});
+346 				}
+347 				else
+348 					reload.apply( dialog );
+349
+350 				dialog.selectPage( dialog.data.tab );
+351 			},
+352 			onOk : function()
+353 			{
+354 				var scayt_control =  this.data.scayt_control,
+355 					o = scayt_control.option(),
+356 					c = 0;
+357
+358 				// Set up options if any was set.
+359 				for ( var oN in this.options )
+360 				{
+361 					if (o[oN] != this.options[ oN ] && c === 0 )
+362 					{
+363 						scayt_control.option( this.options );
+364 						c++;
+365 					}
+366 				}
+367
+368 				// Setup languge if it was changed.
+369 				var csLang = this.chosed_lang;
+370 				if ( csLang && this.data.sLang != csLang )
+371 				{
+372 					scayt_control.setLang( csLang );
+373 					c++;
+374 				}
+375 				if ( c > 0 )
+376 					scayt_control.refresh();
+377 			},
+378 			contents : [
+379 				{
+380 					id : 'options',
+381 					label : editor.lang.scayt.optionsTab,
+382 					elements : [
+383 						{
+384 							type : 'html',
+385 							id : 'options',
+386 							html : 	'<div class="inner_options">' +
+387 									'	<div class="messagebox"></div>' +
+388 									'	<div style="display:none;">' +
+389 									'		<input type="checkbox" value="0" id="allCaps" />' +
+390 									'		<label for="allCaps" id="label_allCaps"></label>' +
+391 									'	</div>' +
+392 									'	<div style="display:none;">' +
+393 									'		<input type="checkbox" value="0" id="ignoreDomainNames" />' +
+394 									'		<label for="ignoreDomainNames" id="label_ignoreDomainNames"></label>' +
+395 									'	</div>' +
+396 									'	<div style="display:none;">' +
+397 									'	<input type="checkbox" value="0" id="mixedCase" />' +
+398 									'		<label for="mixedCase" id="label_mixedCase"></label>' +
+399 									'	</div>' +
+400 									'	<div style="display:none;">' +
+401 									'		<input type="checkbox" value="0" id="mixedWithDigits" />' +
+402 									'		<label for="mixedWithDigits" id="label_mixedWithDigits"></label>' +
+403 									'	</div>' +
+404 									'</div>'
+405 						}
+406 					]
+407 				},
+408 				{
+409 					id : 'langs',
+410 					label : editor.lang.scayt.languagesTab,
+411 					elements : [
+412 						{
+413 							type : 'html',
+414 							id : 'langs',
+415 							html : 	'<div class="inner_langs">' +
+416 									'	<div class="messagebox"></div>	' +
+417 									'   <div style="float:left;width:47%;margin-left:5px;" id="scayt_lcol" ></div>' +
+418 									'   <div style="float:left;width:47%;margin-left:15px;" id="scayt_rcol"></div>' +
+419 									'</div>'
+420 						}
+421 					]
+422 				},
+423 				{
+424 					id : 'dictionaries',
+425 					label : editor.lang.scayt.dictionariesTab,
+426 					elements : [
+427 						{
+428 							type : 'html',
+429 							style: '',
+430 							id : 'dic',
+431 							html : 	'<div class="inner_dictionary" style="text-align:left; white-space:normal;">' +
+432 									'	<div style="margin:5px auto; width:80%;white-space:normal; overflow:hidden;" id="dic_message"> </div>' +
+433 									'	<div style="margin:5px auto; width:80%;white-space:normal;"> ' +
+434 									'       <span class="cke_dialog_ui_labeled_label" >Dictionary name</span><br>'+
+435 									'		<span class="cke_dialog_ui_labeled_content" >'+
+436 									'			<div class="cke_dialog_ui_input_text">'+
+437 									'				<input id="dic_name" type="text" class="cke_dialog_ui_input_text"/>'+
+438 									'		</div></span></div>'+
+439 									'		<div style="margin:5px auto; width:80%;white-space:normal;">'+
+440 									'			<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_create">'+
+441 									'				</a>' +
+442 									'			<a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_delete">'+
+443 									'				</a>' +
+444 									'			<a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_rename">'+
+445 									'				</a>' +
+446 									'			<a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_restore">'+
+447 									'				</a>' +
+448 									'		</div>' +
+449 									'	<div style="margin:5px auto; width:95%;white-space:normal;" id="dic_info"></div>' +
+450 									'</div>'
+451 						}
+452 					]
+453 				},
+454 				{
+455 					id : 'about',
+456 					label : editor.lang.scayt.aboutTab,
+457 					elements : [
+458 						{
+459 							type : 'html',
+460 							id : 'about',
+461 							style : 'margin: 10px 40px;',
+462 							html : '<div id="scayt_about"></div>'
+463 						}
+464 					]
+465 				}
+466 			]
+467         };
+468 });
+469 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_scayt_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_scayt_plugin.js.html new file mode 100644 index 000000000..250ddaaf3 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_scayt_plugin.js.html @@ -0,0 +1,493 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Spell Check As You Type (SCAYT).
+  8  * Button name : Scayt.
+  9  */
+ 10
+ 11 (function()
+ 12 {
+ 13 	var commandName 	= 'scaytcheck',
+ 14 		sc_on_cssclass 	= 'scayt_enabled',
+ 15 		sc_off_cssclass = 'scayt_disabled',
+ 16 		openPage		= '';
+ 17
+ 18 	var onEngineLoad = function()
+ 19 	{
+ 20 		var editor = this;
+ 21 		dojo.requireLocalization( 'scayt', 'caption', '', 'ROOT' );
+ 22
+ 23 		var createInstance = function()	// Create new instance every time Document is created.
+ 24 		{
+ 25 			// Initialise Scayt instance.
+ 26 			var oParams = CKEDITOR.config.scaytParams || {};
+ 27 			oParams.srcNodeRef = editor.document.getWindow().$.frameElement; 		// Get the iframe.
+ 28 			// syntax : AppName.AppVersion@AppRevision
+ 29 			oParams.assocApp  = "CKEDITOR." + CKEDITOR.version + "@" + CKEDITOR.revision;
+ 30 			var scayt_control = new scayt( oParams );
+ 31
+ 32 			// Copy config.
+ 33 			var	lastInstance = plugin.instances[ editor.name ];
+ 34 			if ( lastInstance )
+ 35 			{
+ 36 				scayt_control.sLang = lastInstance.sLang;
+ 37 				scayt_control.option( lastInstance.option() );
+ 38 				scayt_control.paused = lastInstance.paused;
+ 39 			}
+ 40
+ 41 			plugin.instances[ editor.name ] = scayt_control;
+ 42
+ 43 			try {
+ 44 				scayt_control.setDisabled( scayt_control.paused === false );				// I really don't know why it causes JS error in IE
+ 45 			} catch (e) {}
+ 46 			editor.fire( 'showScaytState' );
+ 47 		};
+ 48
+ 49 		editor.on( 'contentDom', createInstance );
+ 50 		editor.on( 'contentDomUnload', function()
+ 51 			{
+ 52 				// Remove scripts.
+ 53 				var scripts = CKEDITOR.document.getElementsByTag( 'script' ),
+ 54 					scaytIdRegex =  /^dojoIoScript(\d+)$/i,
+ 55 					scaytSrcRegex =  /^https?:\/\/svc\.spellchecker\.net\/spellcheck\/script\/ssrv\.cgi/i;
+ 56
+ 57 				for ( var i=0; i < scripts.count(); i++ )
+ 58 				{
+ 59 					var script = scripts.getItem( i ),
+ 60 						id = script.getId(),
+ 61 						src = script.getAttribute( 'src' );
+ 62
+ 63 					if ( id && src && id.match( scaytIdRegex ) && src.match( scaytSrcRegex ))
+ 64 						script.remove();
+ 65 				}
+ 66 			});
+ 67
+ 68 		editor.on( 'beforeCommandExec', function( ev )		// Disable SCAYT before Source command execution.
+ 69 			{
+ 70 				if ( ev.data.name == 'source' && editor.mode == 'wysiwyg' )
+ 71 				{
+ 72 					var scayt = plugin.getScayt( editor );
+ 73 					if ( scayt )
+ 74 					{
+ 75 						scayt.paused = !scayt.disabled;
+ 76 						scayt.setDisabled( true );
+ 77 					}
+ 78 				}
+ 79 			});
+ 80
+ 81 		// Listen to data manipulation to reflect scayt markup.
+ 82 		editor.on( 'afterSetData', function()
+ 83 			{
+ 84 				if ( plugin.isScaytEnabled( editor ) )
+ 85 					plugin.getScayt( editor ).refresh();
+ 86 			});
+ 87
+ 88 		editor.on( 'scaytDialog', function( ev )	// Communication with dialog.
+ 89 			{
+ 90 				ev.data.djConfig = djConfig;
+ 91 				ev.data.scayt_control = plugin.getScayt( editor );
+ 92 				ev.data.tab = openPage;
+ 93 				ev.data.scayt = scayt;
+ 94 			});
+ 95
+ 96 		var dataProcessor = editor.dataProcessor,
+ 97 			htmlFilter = dataProcessor && dataProcessor.htmlFilter;
+ 98 		if ( htmlFilter )
+ 99 		{
+100 			htmlFilter.addRules(
+101 				{
+102 					elements :
+103 					{
+104 						span : function( element )
+105 						{
+106 							if ( element.attributes.scayt_word && element.attributes.scaytid )
+107 							{
+108 								delete element.name;	// Write children, but don't write this node.
+109 								return element;
+110 							}
+111 						}
+112 					}
+113 				}
+114 			);
+115 		}
+116
+117 		if ( editor.document )
+118 			createInstance();
+119 	};
+120
+121 	CKEDITOR.plugins.scayt =
+122 	{
+123 		engineLoaded : false,
+124 		instances : {},
+125 		getScayt : function( editor )
+126 		{
+127 			var instance = this.instances[ editor.name ];
+128 			return instance;
+129 		},
+130 		isScaytReady : function( editor )
+131 		{
+132 			return this.engineLoaded === true &&
+133 				'undefined' !== typeof scayt && this.getScayt( editor );
+134 		},
+135 		isScaytEnabled : function( editor )
+136 		{
+137 			var scayt = this.getScayt( editor );
+138 			return ( scayt ) ? scayt.disabled === false : false;
+139 		},
+140 		loadEngine : function( editor )
+141 		{
+142 			if ( this.engineLoaded === true )
+143 				return onEngineLoad.apply( editor );	// Add new instance.
+144 			else if ( this.engineLoaded == -1 )			// We are waiting.
+145 				return CKEDITOR.on( 'scaytReady', function(){ onEngineLoad.apply( editor );} );	// Use function(){} to avoid rejection as duplicate.
+146
+147 			CKEDITOR.on( 'scaytReady', onEngineLoad, editor );
+148 			CKEDITOR.on( 'scaytReady', function()
+149 				{
+150 					this.engineLoaded = true;
+151 				},
+152 				this,
+153 				null,
+154 				0 );	// First to run.
+155
+156 			this.engineLoaded = -1;	// Loading in progress.
+157 			// assign diojo configurable vars
+158 			var parseUrl =  function(data)
+159 				{
+160 					var m = data.match(/(.*)[\/\\]([^\/\\]+\.\w+)$/);
+161 					return { path: m[1], file: m[2] };
+162 				};
+163
+164 			// compose scayt url
+165 			var protocol = document.location.protocol;
+166 			var baseUrl  = "svc.spellchecker.net/spellcheck/lf/scayt/scayt.js";
+167 			var scaytUrl  =  editor.config.scaytParams.srcScayt ||
+168 				(protocol + "//" + baseUrl);
+169 			var scaytConfigBaseUrl = parseUrl(scaytUrl).path +  "/";
+170
+171 			djScaytConfig =
+172 			{
+173 				baseUrl: scaytConfigBaseUrl,
+174 				addOnLoad:
+175 				[
+176 					function()
+177 					{
+178 						CKEDITOR.fireOnce( "scaytReady" );
+179 					}
+180 				],
+181 				isDebug: false
+182 			};
+183 			// Append javascript code.
+184 			CKEDITOR.document.getHead().append(
+185 				CKEDITOR.document.createElement( 'script',
+186 					{
+187 						attributes :
+188 							{
+189 								type : 'text/javascript',
+190 								src : scaytUrl
+191 							}
+192 					})
+193 			);
+194
+195 			return null;
+196 		}
+197 	};
+198
+199 	var plugin = CKEDITOR.plugins.scayt;
+200
+201 	// Context menu constructing.
+202 	var addButtonCommand = function( editor, buttonName, buttonLabel, commandName, command, menugroup, menuOrder )
+203 	{
+204 		editor.addCommand( commandName, command );
+205
+206 		// If the "menu" plugin is loaded, register the menu item.
+207 		editor.addMenuItem( commandName,
+208 			{
+209 				label : buttonLabel,
+210 				command : commandName,
+211 				group : menugroup,
+212 				order : menuOrder
+213 			});
+214 	};
+215
+216 	var commandDefinition =
+217 	{
+218 		preserveState : true,
+219
+220 		exec: function( editor )
+221 		{
+222 			if ( plugin.isScaytReady( editor ) )
+223 			{
+224 				var isEnabled = plugin.isScaytEnabled( editor );
+225
+226 				this.setState( isEnabled ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_ON );
+227
+228 				var scayt_control = plugin.getScayt( editor );
+229 				scayt_control.setDisabled( isEnabled );
+230 			}
+231 			else if ( !editor.config.scayt_autoStartup && plugin.engineLoaded >= 0 )	// Load first time
+232 			{
+233 				this.setState( CKEDITOR.TRISTATE_DISABLED );
+234
+235 				editor.on( 'showScaytState', function()
+236 					{
+237 						this.removeListener();
+238 						this.setState( plugin.isScaytEnabled( editor ) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
+239 					},
+240 					this);
+241
+242 				plugin.loadEngine( editor );
+243 			}
+244 		}
+245 	};
+246
+247 	// Add scayt plugin.
+248 	CKEDITOR.plugins.add( 'scayt',
+249 	{
+250 		requires : [ 'menubutton' ],
+251
+252 		beforeInit : function( editor )
+253 		{
+254 			// Register own rbc menu group.
+255 			editor.config.menu_groups = 'scayt_suggest,scayt_moresuggest,scayt_control,' + editor.config.menu_groups;
+256 		},
+257
+258 		init : function( editor )
+259 		{
+260 			var moreSuggestions = {};
+261 			var mainSuggestions = {};
+262
+263 			// Scayt command.
+264 			var command = editor.addCommand( commandName, commandDefinition );
+265
+266 			// Add Options dialog.
+267 			CKEDITOR.dialog.add( commandName, CKEDITOR.getUrl( this.path + 'dialogs/options.js' ) );
+268
+269 			var menuGroup = 'scaytButton';
+270 			editor.addMenuGroup( menuGroup );
+271 			editor.addMenuItems(
+272 				{
+273 					scaytToggle :
+274 					{
+275 						label : editor.lang.scayt.enable,
+276 						command : commandName,
+277 						group : menuGroup
+278 					},
+279
+280 					scaytOptions :
+281 					{
+282 						label : editor.lang.scayt.options,
+283 						group : menuGroup,
+284 						onClick : function()
+285 						{
+286 							openPage = 'options';
+287 							editor.openDialog( commandName );
+288 						}
+289 					},
+290
+291 					scaytLangs :
+292 					{
+293 						label : editor.lang.scayt.langs,
+294 						group : menuGroup,
+295 						onClick : function()
+296 						{
+297 							openPage = 'langs';
+298 							editor.openDialog( commandName );
+299 						}
+300 					},
+301
+302 					scaytAbout :
+303 					{
+304 						label : editor.lang.scayt.about,
+305 						group : menuGroup,
+306 						onClick : function()
+307 						{
+308 							openPage = 'about';
+309 							editor.openDialog( commandName );
+310 						}
+311 					}
+312 				});
+313
+314 			// Disabling it on IE for now, as it's blocking the browser (#3802).
+315 			if ( !CKEDITOR.env.ie )
+316 			{
+317 				editor.ui.add( 'Scayt', CKEDITOR.UI_MENUBUTTON,
+318 					{
+319 						label : editor.lang.scayt.title,
+320 						title : editor.lang.scayt.title,
+321 						className : 'cke_button_scayt',
+322 						onRender: function()
+323 						{
+324 							command.on( 'state', function()
+325 								{
+326 									this.setState( command.state );
+327 								},
+328 								this);
+329 						},
+330 						onMenu : function()
+331 						{
+332 							var isEnabled = plugin.isScaytEnabled( editor );
+333
+334 							editor.getMenuItem( 'scaytToggle' ).label = editor.lang.scayt[ isEnabled ? 'disable' : 'enable' ];
+335
+336 							return {
+337 								scaytToggle : CKEDITOR.TRISTATE_OFF,
+338 								scaytOptions : isEnabled ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
+339 								scaytLangs : isEnabled ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
+340 								scaytAbout : isEnabled ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
+341 							};
+342 						}
+343 					});
+344 			}
+345
+346 			// If the "contextmenu" plugin is loaded, register the listeners.
+347 			if ( editor.contextMenu && editor.addMenuItems )
+348 			{
+349 				editor.contextMenu.addListener( function( element, selection )
+350 					{
+351 						var scayt_control = plugin.getScayt( editor );
+352 						if ( !plugin.isScaytEnabled( editor ) || !element || !element.$ )
+353 							return null;
+354
+355 						var word = scayt_control.getWord( element.$ );
+356
+357 						if ( !word )
+358 							return null;
+359
+360 						var sLang = scayt_control.getLang(),
+361 							_r = {},
+362 							items_suggestion = scayt.getSuggestion( word, sLang );
+363 						if (!items_suggestion || !items_suggestion.length )
+364 							return null;
+365 						// Remove unused commands and menuitems
+366 						for ( i in moreSuggestions )
+367 						{
+368 							delete editor._.menuItems[ i ];
+369 							delete editor._.commands[ i ];
+370 						}
+371 						for ( i in mainSuggestions )
+372 						{
+373 							delete editor._.menuItems[ i ];
+374 							delete editor._.commands[ i ];
+375 						}
+376 						moreSuggestions = {};		// Reset items.
+377 						mainSuggestions = {};
+378
+379 						var moreSuggestionsUnable = false;
+380
+381 						for ( var i = 0, l = items_suggestion.length; i < l; i += 1 )
+382 						{
+383 							var commandName = 'scayt_suggestion_' + items_suggestion[i].replace( ' ', '_' );
+384 							var exec = ( function( el, s )
+385 								{
+386 									return {
+387 										exec: function( editor )
+388 										{
+389 											scayt_control.replace(el, s);
+390 										}
+391 									};
+392 								})( element.$, items_suggestion[i] );
+393
+394 							if ( i < editor.config.scayt_maxSuggestions )
+395 							{
+396 								addButtonCommand( editor, 'button_' + commandName, items_suggestion[i],
+397 									commandName, exec, 'scayt_suggest', i + 1 );
+398 								_r[ commandName ] = CKEDITOR.TRISTATE_OFF;
+399 								mainSuggestions[ commandName ] = CKEDITOR.TRISTATE_OFF;
+400 							}
+401 							else
+402 							{
+403 								addButtonCommand( editor, 'button_' + commandName, items_suggestion[i],
+404 									commandName, exec, 'scayt_moresuggest', i + 1 );
+405 								moreSuggestions[ commandName ] = CKEDITOR.TRISTATE_OFF;
+406 								moreSuggestionsUnable = true;
+407 							}
+408 						}
+409 						if ( moreSuggestionsUnable )
+410 							// Rgister the More suggestions group;
+411 							editor.addMenuItem( 'scayt_moresuggest',
+412 								{
+413 									label : editor.lang.scayt.moreSuggestions,
+414 									group : 'scayt_moresuggest',
+415 									order : 10,
+416 									getItems : function()
+417 									{
+418 										return moreSuggestions;
+419 									}
+420 								});
+421
+422
+423 						var ignore_command =
+424 						{
+425 							exec: function()
+426 							{
+427 								scayt_control.ignore( element.$ );
+428 							}
+429 						};
+430 						var ignore_all_command =
+431 						{
+432 							exec: function()
+433 							{
+434 								scayt_control.ignoreAll( element.$ );
+435 							}
+436 						};
+437 						var addword_command =
+438 						{
+439 							exec: function()
+440 							{
+441 								scayt.addWordToUserDictionary( element.$ );
+442 							}
+443 						};
+444
+445 						addButtonCommand( editor, 'ignore', editor.lang.scayt.ignore,
+446 							'scayt_ignore', ignore_command, 'scayt_control', 1);
+447 						addButtonCommand( editor, 'ignore_all', editor.lang.scayt.ignoreAll,
+448 							'scayt_ignore_all', ignore_all_command, 'scayt_control', 2);
+449 						addButtonCommand( editor, 'add_word', editor.lang.scayt.addWord,
+450 							'scayt_add_word', addword_command, 'scayt_control', 3);
+451
+452 						mainSuggestions[ 'scayt_moresuggest' ] = CKEDITOR.TRISTATE_OFF;
+453 						mainSuggestions[ 'scayt_ignore' ] = CKEDITOR.TRISTATE_OFF;
+454 						mainSuggestions[ 'scayt_ignore_all' ] = CKEDITOR.TRISTATE_OFF;
+455 						mainSuggestions[ 'scayt_add_word' ] = CKEDITOR.TRISTATE_OFF;
+456
+457 						// ** ahow ads entry point
+458 						// ** hide ads listener register
+459 //						try{
+460 							//scayt_control.showBanner( editor )
+461 //						}catch(err){}
+462
+463 						return mainSuggestions;
+464 					});
+465 			}
+466
+467 			// Start plugin
+468 			if ( editor.config.scayt_autoStartup )
+469 			{
+470 				var showInitialState = function()
+471 				{
+472 					editor.removeListener( 'showScaytState', showInitialState );
+473 					command.setState( plugin.isScaytEnabled( editor ) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
+474 				};
+475 				editor.on( 'showScaytState', showInitialState );
+476
+477 				plugin.loadEngine( editor );
+478 			}
+479 		}
+480 	});
+481 })();
+482
+483 CKEDITOR.config.scaytParams = CKEDITOR.config.scaytParams || {};
+484 CKEDITOR.config.scayt_maxSuggestions = 5;
+485 CKEDITOR.config.scayt_autoStartup = false;
+486 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_selection_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_selection_plugin.js.html new file mode 100644 index 000000000..59f79dd0b --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_selection_plugin.js.html @@ -0,0 +1,1069 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	// #### checkSelectionChange : START
+  9
+ 10 	// The selection change check basically saves the element parent tree of
+ 11 	// the current node and check it on successive requests. If there is any
+ 12 	// change on the tree, then the selectionChange event gets fired.
+ 13 	function checkSelectionChange()
+ 14 	{
+ 15 		try
+ 16 		{
+ 17 			// In IE, the "selectionchange" event may still get thrown when
+ 18 			// releasing the WYSIWYG mode, so we need to check it first.
+ 19 			var sel = this.getSelection();
+ 20 			if ( !sel )
+ 21 				return;
+ 22
+ 23 			var firstElement = sel.getStartElement();
+ 24 			var currentPath = new CKEDITOR.dom.elementPath( firstElement );
+ 25
+ 26 			if ( !currentPath.compare( this._.selectionPreviousPath ) )
+ 27 			{
+ 28 				this._.selectionPreviousPath = currentPath;
+ 29 				this.fire( 'selectionChange', { selection : sel, path : currentPath, element : firstElement } );
+ 30 			}
+ 31 		}
+ 32 		catch (e)
+ 33 		{}
+ 34 	}
+ 35
+ 36 	var checkSelectionChangeTimer,
+ 37 		checkSelectionChangeTimeoutPending;
+ 38
+ 39 	function checkSelectionChangeTimeout()
+ 40 	{
+ 41 		// Firing the "OnSelectionChange" event on every key press started to
+ 42 		// be too slow. This function guarantees that there will be at least
+ 43 		// 200ms delay between selection checks.
+ 44
+ 45 		checkSelectionChangeTimeoutPending = true;
+ 46
+ 47 		if ( checkSelectionChangeTimer )
+ 48 			return;
+ 49
+ 50 		checkSelectionChangeTimeoutExec.call( this );
+ 51
+ 52 		checkSelectionChangeTimer = CKEDITOR.tools.setTimeout( checkSelectionChangeTimeoutExec, 200, this );
+ 53 	}
+ 54
+ 55 	function checkSelectionChangeTimeoutExec()
+ 56 	{
+ 57 		checkSelectionChangeTimer = null;
+ 58
+ 59 		if ( checkSelectionChangeTimeoutPending )
+ 60 		{
+ 61 			// Call this with a timeout so the browser properly moves the
+ 62 			// selection after the mouseup. It happened that the selection was
+ 63 			// being moved after the mouseup when clicking inside selected text
+ 64 			// with Firefox.
+ 65 			CKEDITOR.tools.setTimeout( checkSelectionChange, 0, this );
+ 66
+ 67 			checkSelectionChangeTimeoutPending = false;
+ 68 		}
+ 69 	}
+ 70
+ 71 	// #### checkSelectionChange : END
+ 72
+ 73 	var selectAllCmd =
+ 74 	{
+ 75 		exec : function( editor )
+ 76 		{
+ 77 			switch ( editor.mode )
+ 78 			{
+ 79 				case 'wysiwyg' :
+ 80 					editor.document.$.execCommand( 'SelectAll', false, null );
+ 81 					break;
+ 82 				case 'source' :
+ 83 					// TODO
+ 84 			}
+ 85 		},
+ 86 		canUndo : false
+ 87 	};
+ 88
+ 89 	CKEDITOR.plugins.add( 'selection',
+ 90 	{
+ 91 		init : function( editor )
+ 92 		{
+ 93 			editor.on( 'contentDom', function()
+ 94 				{
+ 95 					var doc = editor.document;
+ 96
+ 97 					if ( CKEDITOR.env.ie )
+ 98 					{
+ 99 						// Other browsers don't loose the selection if the
+100 						// editor document loose the focus. In IE, we don't
+101 						// have support for it, so we reproduce it here, other
+102 						// than firing the selection change event.
+103
+104 						var savedRange,
+105 							saveEnabled;
+106
+107 						// "onfocusin" is fired before "onfocus". It makes it
+108 						// possible to restore the selection before click
+109 						// events get executed.
+110 						doc.on( 'focusin', function()
+111 							{
+112 								// If we have saved a range, restore it at this
+113 								// point.
+114 								if ( savedRange )
+115 								{
+116 									// Well not break because of this.
+117 									try
+118 									{
+119 										savedRange.select();
+120 									}
+121 									catch (e)
+122 									{}
+123
+124 									savedRange = null;
+125 								}
+126 							});
+127
+128 						editor.window.on( 'focus', function()
+129 							{
+130 								// Enable selections to be saved.
+131 								saveEnabled = true;
+132
+133 								saveSelection();
+134 							});
+135
+136 						editor.window.on( 'blur', function()
+137 							{
+138 								// Disable selections from being saved.
+139 								saveEnabled = false;
+140
+141 								// IE may leave the selection still inside the
+142 								// document. Let's force it to be removed.
+143 								// TODO: The following has effect for
+144 								// collapsed selections.
+145 								editor.document.$.execCommand( 'Unselect' );
+146 							});
+147
+148 						// IE fires the "selectionchange" event when clicking
+149 						// inside a selection. We don't want to capture that.
+150 						doc.on( 'mousedown', disableSave );
+151 						doc.on( 'mouseup',
+152 							function()
+153 							{
+154 								saveEnabled = true;
+155 								setTimeout( function()
+156 									{
+157 										saveSelection( true );
+158 									},
+159 									0 );
+160 							});
+161
+162 						doc.on( 'keydown', disableSave );
+163 						doc.on( 'keyup',
+164 							function()
+165 							{
+166 								saveEnabled = true;
+167 								saveSelection();
+168 							});
+169
+170
+171 						// IE is the only to provide the "selectionchange"
+172 						// event.
+173 						doc.on( 'selectionchange', saveSelection );
+174
+175 						function disableSave()
+176 						{
+177 							saveEnabled = false;
+178 						}
+179
+180 						function saveSelection( testIt )
+181 						{
+182 							if ( saveEnabled )
+183 							{
+184 								var doc = editor.document,
+185 									sel = doc && doc.$.selection;
+186
+187 								// There is a very specific case, when clicking
+188 								// inside a text selection. In that case, the
+189 								// selection collapses at the clicking point,
+190 								// but the selection object remains in an
+191 								// unknown state, making createRange return a
+192 								// range at the very start of the document. In
+193 								// such situation we have to test the range, to
+194 								// be sure it's valid.
+195 								if ( testIt && sel && sel.type == 'None' )
+196 								{
+197 									// The "InsertImage" command can be used to
+198 									// test whether the selection is good or not.
+199 									// If not, it's enough to give some time to
+200 									// IE to put things in order for us.
+201 									if ( !doc.$.queryCommandEnabled( 'InsertImage' ) )
+202 									{
+203 										CKEDITOR.tools.setTimeout( saveSelection, 50, this, true );
+204 										return;
+205 									}
+206 								}
+207
+208 								savedRange = sel && sel.createRange();
+209
+210 								checkSelectionChangeTimeout.call( editor );
+211 							}
+212 						}
+213 					}
+214 					else
+215 					{
+216 						// In other browsers, we make the selection change
+217 						// check based on other events, like clicks or keys
+218 						// press.
+219
+220 						doc.on( 'mouseup', checkSelectionChangeTimeout, editor );
+221 						doc.on( 'keyup', checkSelectionChangeTimeout, editor );
+222 					}
+223 				});
+224
+225 			editor.addCommand( 'selectAll', selectAllCmd );
+226 			editor.ui.addButton( 'SelectAll',
+227 				{
+228 					label : editor.lang.selectAll,
+229 					command : 'selectAll'
+230 				});
+231
+232 			editor.selectionChange = checkSelectionChangeTimeout;
+233 		}
+234 	});
+235
+236 	/**
+237 	 * Gets the current selection from the editing area when in WYSIWYG mode.
+238 	 * @returns {CKEDITOR.dom.selection} A selection object or null if not on
+239 	 *		WYSIWYG mode or no selection is available.
+240 	 * @example
+241 	 * var selection = CKEDITOR.instances.editor1.<b>getSelection()</b>;
+242 	 * alert( selection.getType() );
+243 	 */
+244 	CKEDITOR.editor.prototype.getSelection = function()
+245 	{
+246 		return this.document && this.document.getSelection();
+247 	};
+248
+249 	CKEDITOR.editor.prototype.forceNextSelectionCheck = function()
+250 	{
+251 		delete this._.selectionPreviousPath;
+252 	};
+253
+254 	/**
+255 	 * Gets the current selection from the document.
+256 	 * @returns {CKEDITOR.dom.selection} A selection object.
+257 	 * @example
+258 	 * var selection = CKEDITOR.instances.editor1.document.<b>getSelection()</b>;
+259 	 * alert( selection.getType() );
+260 	 */
+261 	CKEDITOR.dom.document.prototype.getSelection = function()
+262 	{
+263 		var sel = new CKEDITOR.dom.selection( this );
+264 		return ( !sel || sel.isInvalid ) ? null : sel;
+265 	};
+266
+267 	/**
+268 	 * No selection.
+269 	 * @constant
+270 	 * @example
+271 	 * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_NONE )
+272 	 *     alert( 'Nothing is selected' );
+273 	 */
+274 	CKEDITOR.SELECTION_NONE		= 1;
+275
+276 	/**
+277 	 * Text or collapsed selection.
+278 	 * @constant
+279 	 * @example
+280 	 * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_TEXT )
+281 	 *     alert( 'Text is selected' );
+282 	 */
+283 	CKEDITOR.SELECTION_TEXT		= 2;
+284
+285 	/**
+286 	 * Element selection.
+287 	 * @constant
+288 	 * @example
+289 	 * if ( editor.getSelection().getType() == CKEDITOR.SELECTION_ELEMENT )
+290 	 *     alert( 'An element is selected' );
+291 	 */
+292 	CKEDITOR.SELECTION_ELEMENT	= 3;
+293
+294 	/**
+295 	 * Manipulates the selection in a DOM document.
+296 	 * @constructor
+297 	 * @example
+298 	 */
+299 	CKEDITOR.dom.selection = function( document )
+300 	{
+301 		var lockedSelection = document.getCustomData( 'cke_locked_selection' );
+302
+303 		if ( lockedSelection )
+304 			return lockedSelection;
+305
+306 		this.document = document;
+307 		this.isLocked = false;
+308 		this._ =
+309 		{
+310 			cache : {}
+311 		};
+312
+313 		/**
+314 		 * IE BUG: The selection's document may be a different document than the
+315 		 * editor document. Return null if that's the case.
+316 		 */
+317 		if ( CKEDITOR.env.ie )
+318 		{
+319 			var range = this.getNative().createRange();
+320 			if ( !range
+321 				|| ( range.item && range.item(0).ownerDocument != this.document.$ )
+322 				|| ( range.parentElement && range.parentElement().ownerDocument != this.document.$ ) )
+323 			{
+324 				this.isInvalid = true;
+325 			}
+326 		}
+327
+328 		return this;
+329 	};
+330
+331 	var styleObjectElements =
+332 	{
+333 		img:1,hr:1,li:1,table:1,tr:1,td:1,embed:1,object:1,ol:1,ul:1,
+334 		a:1, input:1, form:1, select:1, textarea:1, button:1, fieldset:1, th:1, thead:1, tfoot:1
+335 	};
+336
+337 	CKEDITOR.dom.selection.prototype =
+338 	{
+339 		/**
+340 		 * Gets the native selection object from the browser.
+341 		 * @function
+342 		 * @returns {Object} The native selection object.
+343 		 * @example
+344 		 * var selection = editor.getSelection().<b>getNative()</b>;
+345 		 */
+346 		getNative :
+347 			CKEDITOR.env.ie ?
+348 				function()
+349 				{
+350 					return this._.cache.nativeSel || ( this._.cache.nativeSel = this.document.$.selection );
+351 				}
+352 			:
+353 				function()
+354 				{
+355 					return this._.cache.nativeSel || ( this._.cache.nativeSel = this.document.getWindow().$.getSelection() );
+356 				},
+357
+358 		/**
+359 		 * Gets the type of the current selection. The following values are
+360 		 * available:
+361 		 * <ul>
+362 		 *		<li>{@link CKEDITOR.SELECTION_NONE} (1): No selection.</li>
+363 		 *		<li>{@link CKEDITOR.SELECTION_TEXT} (2): Text is selected or
+364 		 *			collapsed selection.</li>
+365 		 *		<li>{@link CKEDITOR.SELECTION_ELEMENT} (3): A element
+366 		 *			selection.</li>
+367 		 * </ul>
+368 		 * @function
+369 		 * @returns {Number} One of the following constant values:
+370 		 *		{@link CKEDITOR.SELECTION_NONE}, {@link CKEDITOR.SELECTION_TEXT} or
+371 		 *		{@link CKEDITOR.SELECTION_ELEMENT}.
+372 		 * @example
+373 		 * if ( editor.getSelection().<b>getType()</b> == CKEDITOR.SELECTION_TEXT )
+374 		 *     alert( 'Text is selected' );
+375 		 */
+376 		getType :
+377 			CKEDITOR.env.ie ?
+378 				function()
+379 				{
+380 					var cache = this._.cache;
+381 					if ( cache.type )
+382 						return cache.type;
+383
+384 					var type = CKEDITOR.SELECTION_NONE;
+385
+386 					try
+387 					{
+388 						var sel = this.getNative(),
+389 							ieType = sel.type;
+390
+391 						if ( ieType == 'Text' )
+392 							type = CKEDITOR.SELECTION_TEXT;
+393
+394 						if ( ieType == 'Control' )
+395 							type = CKEDITOR.SELECTION_ELEMENT;
+396
+397 						// It is possible that we can still get a text range
+398 						// object even when type == 'None' is returned by IE.
+399 						// So we'd better check the object returned by
+400 						// createRange() rather than by looking at the type.
+401 						if ( sel.createRange().parentElement )
+402 							type = CKEDITOR.SELECTION_TEXT;
+403 					}
+404 					catch(e) {}
+405
+406 					return ( cache.type = type );
+407 				}
+408 			:
+409 				function()
+410 				{
+411 					var cache = this._.cache;
+412 					if ( cache.type )
+413 						return cache.type;
+414
+415 					var type = CKEDITOR.SELECTION_TEXT;
+416
+417 					var sel = this.getNative();
+418
+419 					if ( !sel )
+420 						type = CKEDITOR.SELECTION_NONE;
+421 					else if ( sel.rangeCount == 1 )
+422 					{
+423 						// Check if the actual selection is a control (IMG,
+424 						// TABLE, HR, etc...).
+425
+426 						var range = sel.getRangeAt(0),
+427 							startContainer = range.startContainer;
+428
+429 						if ( startContainer == range.endContainer
+430 							&& startContainer.nodeType == 1
+431 							&& ( range.endOffset - range.startOffset ) == 1
+432 							&& styleObjectElements[ startContainer.childNodes[ range.startOffset ].nodeName.toLowerCase() ] )
+433 						{
+434 							type = CKEDITOR.SELECTION_ELEMENT;
+435 						}
+436 					}
+437
+438 					return ( cache.type = type );
+439 				},
+440
+441 		getRanges :
+442 			CKEDITOR.env.ie ?
+443 				( function()
+444 				{
+445 					// Finds the container and offset for a specific boundary
+446 					// of an IE range.
+447 					var getBoundaryInformation = function( range, start )
+448 					{
+449 						// Creates a collapsed range at the requested boundary.
+450 						range = range.duplicate();
+451 						range.collapse( start );
+452
+453 						// Gets the element that encloses the range entirely.
+454 						var parent = range.parentElement();
+455 						var siblings = parent.childNodes;
+456
+457 						var testRange;
+458
+459 						for ( var i = 0 ; i < siblings.length ; i++ )
+460 						{
+461 							var child = siblings[ i ];
+462 							if ( child.nodeType == 1 )
+463 							{
+464 								testRange = range.duplicate();
+465
+466 								testRange.moveToElementText( child );
+467 								testRange.collapse();
+468
+469 								var comparison = testRange.compareEndPoints( 'StartToStart', range );
+470
+471 								if ( comparison > 0 )
+472 									break;
+473 								else if ( comparison === 0 )
+474 									return {
+475 										container : parent,
+476 										offset : i
+477 									};
+478
+479 								testRange = null;
+480 							}
+481 						}
+482
+483 						if ( !testRange )
+484 						{
+485 							testRange = range.duplicate();
+486 							testRange.moveToElementText( parent );
+487 							testRange.collapse( false );
+488 						}
+489
+490 						testRange.setEndPoint( 'StartToStart', range );
+491 						var distance = testRange.text.length;
+492
+493 						while ( distance > 0 )
+494 							distance -= siblings[ --i ].nodeValue.length;
+495
+496 						if ( distance === 0 )
+497 						{
+498 							return {
+499 								container : parent,
+500 								offset : i
+501 							};
+502 						}
+503 						else
+504 						{
+505 							return {
+506 								container : siblings[ i ],
+507 								offset : -distance
+508 							};
+509 						}
+510 					};
+511
+512 					return function()
+513 					{
+514 						var cache = this._.cache;
+515 						if ( cache.ranges )
+516 							return cache.ranges;
+517
+518 						// IE doesn't have range support (in the W3C way), so we
+519 						// need to do some magic to transform selections into
+520 						// CKEDITOR.dom.range instances.
+521
+522 						var sel = this.getNative(),
+523 							nativeRange = sel && sel.createRange(),
+524 							type = this.getType(),
+525 							range;
+526
+527 						if ( !sel )
+528 							return [];
+529
+530 						if ( type == CKEDITOR.SELECTION_TEXT )
+531 						{
+532 							range = new CKEDITOR.dom.range( this.document );
+533
+534 							var boundaryInfo = getBoundaryInformation( nativeRange, true );
+535 							range.setStart( new CKEDITOR.dom.node( boundaryInfo.container ), boundaryInfo.offset );
+536
+537 							boundaryInfo = getBoundaryInformation( nativeRange );
+538 							range.setEnd( new CKEDITOR.dom.node( boundaryInfo.container ), boundaryInfo.offset );
+539
+540 							return ( cache.ranges = [ range ] );
+541 						}
+542 						else if ( type == CKEDITOR.SELECTION_ELEMENT )
+543 						{
+544 							var retval = this._.cache.ranges = [];
+545
+546 							for ( var i = 0 ; i < nativeRange.length ; i++ )
+547 							{
+548 								var element = nativeRange.item( i ),
+549 									parentElement = element.parentNode,
+550 									j = 0;
+551
+552 								range = new CKEDITOR.dom.range( this.document );
+553
+554 								for (; j < parentElement.childNodes.length && parentElement.childNodes[j] != element ; j++ )
+555 								{ /*jsl:pass*/ }
+556
+557 								range.setStart( new CKEDITOR.dom.node( parentElement ), j );
+558 								range.setEnd( new CKEDITOR.dom.node( parentElement ), j + 1 );
+559 								retval.push( range );
+560 							}
+561
+562 							return retval;
+563 						}
+564
+565 						return ( cache.ranges = [] );
+566 					};
+567 				})()
+568 			:
+569 				function()
+570 				{
+571 					var cache = this._.cache;
+572 					if ( cache.ranges )
+573 						return cache.ranges;
+574
+575 					// On browsers implementing the W3C range, we simply
+576 					// tranform the native ranges in CKEDITOR.dom.range
+577 					// instances.
+578
+579 					var ranges = [];
+580 					var sel = this.getNative();
+581
+582 					if ( !sel )
+583 						return [];
+584
+585 					for ( var i = 0 ; i < sel.rangeCount ; i++ )
+586 					{
+587 						var nativeRange = sel.getRangeAt( i );
+588 						var range = new CKEDITOR.dom.range( this.document );
+589
+590 						range.setStart( new CKEDITOR.dom.node( nativeRange.startContainer ), nativeRange.startOffset );
+591 						range.setEnd( new CKEDITOR.dom.node( nativeRange.endContainer ), nativeRange.endOffset );
+592 						ranges.push( range );
+593 					}
+594
+595 					return ( cache.ranges = ranges );
+596 				},
+597
+598 		/**
+599 		 * Gets the DOM element in which the selection starts.
+600 		 * @returns {CKEDITOR.dom.element} The element at the beginning of the
+601 		 *		selection.
+602 		 * @example
+603 		 * var element = editor.getSelection().<b>getStartElement()</b>;
+604 		 * alert( element.getName() );
+605 		 */
+606 		getStartElement : function()
+607 		{
+608 			var cache = this._.cache;
+609 			if ( cache.startElement !== undefined )
+610 				return cache.startElement;
+611
+612 			var node,
+613 				sel = this.getNative();
+614
+615 			switch ( this.getType() )
+616 			{
+617 				case CKEDITOR.SELECTION_ELEMENT :
+618 					return this.getSelectedElement();
+619
+620 				case CKEDITOR.SELECTION_TEXT :
+621
+622 					var range = this.getRanges()[0];
+623
+624 					if ( range )
+625 					{
+626 						if ( !range.collapsed )
+627 						{
+628 							range.optimize();
+629
+630 							// Decrease the range content to exclude particial
+631 							// selected node on the start which doesn't have
+632 							// visual impact. ( #3231 )
+633 							while( true )
+634 							{
+635 								var startContainer = range.startContainer,
+636 									startOffset = range.startOffset;
+637 								if ( startOffset == ( startContainer.getChildCount ?
+638 									startContainer.getChildCount() : startContainer.getLength() ) )
+639 									range.setStartAfter( startContainer );
+640 								else break;
+641 							}
+642
+643 							node = range.startContainer;
+644
+645 							if ( node.type != CKEDITOR.NODE_ELEMENT )
+646 								return node.getParent();
+647
+648 							node = node.getChild( range.startOffset );
+649
+650 							if ( !node || node.type != CKEDITOR.NODE_ELEMENT )
+651 								return range.startContainer;
+652
+653 							var child = node.getFirst();
+654 							while (  child && child.type == CKEDITOR.NODE_ELEMENT )
+655 							{
+656 								node = child;
+657 								child = child.getFirst();
+658 							}
+659
+660 							return node;
+661 						}
+662 					}
+663
+664 					if ( CKEDITOR.env.ie )
+665 					{
+666 						range = sel.createRange();
+667 						range.collapse( true );
+668
+669 						node = range.parentElement();
+670 					}
+671 					else
+672 					{
+673 						node = sel.anchorNode;
+674
+675 						if ( node.nodeType != 1 )
+676 							node = node.parentNode;
+677 					}
+678 			}
+679
+680 			return cache.startElement = ( node ? new CKEDITOR.dom.element( node ) : null );
+681 		},
+682
+683 		/**
+684 		 * Gets the current selected element.
+685 		 * @returns {CKEDITOR.dom.element} The selected element. Null if no
+686 		 *		selection is available or the selection type is not
+687 		 *		{@link CKEDITOR.SELECTION_ELEMENT}.
+688 		 * @example
+689 		 * var element = editor.getSelection().<b>getSelectedElement()</b>;
+690 		 * alert( element.getName() );
+691 		 */
+692 		getSelectedElement : function()
+693 		{
+694 			var cache = this._.cache;
+695 			if ( cache.selectedElement !== undefined )
+696 				return cache.selectedElement;
+697
+698 			var node;
+699
+700 			if ( this.getType() == CKEDITOR.SELECTION_ELEMENT )
+701 			{
+702 				var sel = this.getNative();
+703
+704 				if ( CKEDITOR.env.ie )
+705 				{
+706 					try
+707 					{
+708 						node = sel.createRange().item(0);
+709 					}
+710 					catch(e) {}
+711 				}
+712 				else
+713 				{
+714 					var range = sel.getRangeAt( 0 );
+715 					node = range.startContainer.childNodes[ range.startOffset ];
+716 				}
+717 			}
+718
+719 			return cache.selectedElement = ( node ? new CKEDITOR.dom.element( node ) : null );
+720 		},
+721
+722 		lock : function()
+723 		{
+724 			// Call all cacheable function.
+725 			this.getRanges();
+726 			this.getStartElement();
+727 			this.getSelectedElement();
+728
+729 			// The native selection is not available when locked.
+730 			this._.cache.nativeSel = {};
+731
+732 			this.isLocked = true;
+733
+734 			// Save this selection inside the DOM document.
+735 			this.document.setCustomData( 'cke_locked_selection', this );
+736 		},
+737
+738 		unlock : function( restore )
+739 		{
+740 			var doc = this.document,
+741 				lockedSelection = doc.getCustomData( 'cke_locked_selection' );
+742
+743 			if ( lockedSelection )
+744 			{
+745 				doc.setCustomData( 'cke_locked_selection', null );
+746
+747 				if ( restore )
+748 				{
+749 					var selectedElement = lockedSelection.getSelectedElement(),
+750 						ranges = !selectedElement && lockedSelection.getRanges();
+751
+752 					this.isLocked = false;
+753 					this.reset();
+754
+755 					doc.getBody().focus();
+756
+757 					if ( selectedElement )
+758 						this.selectElement( selectedElement );
+759 					else
+760 						this.selectRanges( ranges );
+761 				}
+762 			}
+763
+764 			if  ( !lockedSelection || !restore )
+765 			{
+766 				this.isLocked = false;
+767 				this.reset();
+768 			}
+769 		},
+770
+771 		reset : function()
+772 		{
+773 			this._.cache = {};
+774 		},
+775
+776 		selectElement : function( element )
+777 		{
+778 			if ( this.isLocked )
+779 			{
+780 				var range = new CKEDITOR.dom.range();
+781 				range.setStartBefore( element );
+782 				range.setEndAfter( element );
+783
+784 				this._.cache.selectedElement = element;
+785 				this._.cache.startElement = element;
+786 				this._.cache.ranges = [ range ];
+787 				this._.cache.type = CKEDITOR.SELECTION_ELEMENT;
+788
+789 				return;
+790 			}
+791
+792 			if ( CKEDITOR.env.ie )
+793 			{
+794 				this.getNative().empty();
+795
+796 				try
+797 				{
+798 					// Try to select the node as a control.
+799 					range = this.document.$.body.createControlRange();
+800 					range.addElement( element.$ );
+801 					range.select();
+802 				}
+803 				catch(e)
+804 				{
+805 					// If failed, select it as a text range.
+806 					range = this.document.$.body.createTextRange();
+807 					range.moveToElementText( element.$ );
+808 					range.select();
+809 				}
+810
+811 				this.reset();
+812 			}
+813 			else
+814 			{
+815 				// Create the range for the element.
+816 				range = this.document.$.createRange();
+817 				range.selectNode( element.$ );
+818
+819 				// Select the range.
+820 				var sel = this.getNative();
+821 				sel.removeAllRanges();
+822 				sel.addRange( range );
+823
+824 				this.reset();
+825 			}
+826 		},
+827
+828 		selectRanges : function( ranges )
+829 		{
+830 			if ( this.isLocked )
+831 			{
+832 				this._.cache.selectedElement = null;
+833 				this._.cache.startElement = ranges[ 0 ].getTouchedStartNode();
+834 				this._.cache.ranges = ranges;
+835 				this._.cache.type = CKEDITOR.SELECTION_TEXT;
+836
+837 				return;
+838 			}
+839
+840 			if ( CKEDITOR.env.ie )
+841 			{
+842 				// IE doesn't accept multiple ranges selection, so we just
+843 				// select the first one.
+844 				if ( ranges[ 0 ] )
+845 					ranges[ 0 ].select();
+846
+847 				this.reset();
+848 			}
+849 			else
+850 			{
+851 				var sel = this.getNative();
+852 				sel.removeAllRanges();
+853
+854 				for ( var i = 0 ; i < ranges.length ; i++ )
+855 				{
+856 					var range = ranges[ i ];
+857 					var nativeRange = this.document.$.createRange();
+858 					nativeRange.setStart( range.startContainer.$, range.startOffset );
+859 					nativeRange.setEnd( range.endContainer.$, range.endOffset );
+860
+861 					// Select the range.
+862 					sel.addRange( nativeRange );
+863 				}
+864
+865 				this.reset();
+866 			}
+867 		},
+868
+869 		createBookmarks : function( serializable )
+870 		{
+871 			var retval = [],
+872 				ranges = this.getRanges(),
+873 				length = ranges.length,
+874 				bookmark;
+875 			for ( var i = 0; i < length ; i++ )
+876 			{
+877 			    retval.push( bookmark = ranges[ i ].createBookmark( serializable, true ) );
+878
+879 				serializable = bookmark.serializable;
+880
+881 				var bookmarkStart = serializable ? this.document.getById( bookmark.startNode ) : bookmark.startNode,
+882 					bookmarkEnd = serializable ? this.document.getById( bookmark.endNode ) : bookmark.endNode;
+883
+884 			    // Updating the offset values for rest of ranges which have been mangled(#3256).
+885 			    for ( var j = i + 1 ; j < length ; j++ )
+886 			    {
+887 			        var dirtyRange = ranges[ j ],
+888 			               rangeStart = dirtyRange.startContainer,
+889 			               rangeEnd = dirtyRange.endContainer;
+890
+891 			       rangeStart.equals( bookmarkStart.getParent() ) && dirtyRange.startOffset++;
+892 			       rangeStart.equals( bookmarkEnd.getParent() ) && dirtyRange.startOffset++;
+893 			       rangeEnd.equals( bookmarkStart.getParent() ) && dirtyRange.endOffset++;
+894 			       rangeEnd.equals( bookmarkEnd.getParent() ) && dirtyRange.endOffset++;
+895 			    }
+896 			}
+897
+898 			return retval;
+899 		},
+900
+901 		createBookmarks2 : function( normalized )
+902 		{
+903 			var bookmarks = [],
+904 				ranges = this.getRanges();
+905
+906 			for ( var i = 0 ; i < ranges.length ; i++ )
+907 				bookmarks.push( ranges[i].createBookmark2( normalized ) );
+908
+909 			return bookmarks;
+910 		},
+911
+912 		selectBookmarks : function( bookmarks )
+913 		{
+914 			var ranges = [];
+915 			for ( var i = 0 ; i < bookmarks.length ; i++ )
+916 			{
+917 				var range = new CKEDITOR.dom.range( this.document );
+918 				range.moveToBookmark( bookmarks[i] );
+919 				ranges.push( range );
+920 			}
+921 			this.selectRanges( ranges );
+922 			return this;
+923 		}
+924 	};
+925 })();
+926
+927 CKEDITOR.dom.range.prototype.select =
+928 	CKEDITOR.env.ie ?
+929 		// V2
+930 		function()
+931 		{
+932 			var collapsed = this.collapsed;
+933 			var isStartMakerAlone;
+934 			var dummySpan;
+935
+936 			var bookmark = this.createBookmark();
+937
+938 			// Create marker tags for the start and end boundaries.
+939 			var startNode = bookmark.startNode;
+940
+941 			var endNode;
+942 			if ( !collapsed )
+943 				endNode = bookmark.endNode;
+944
+945 			// Create the main range which will be used for the selection.
+946 			var ieRange = this.document.$.body.createTextRange();
+947
+948 			// Position the range at the start boundary.
+949 			ieRange.moveToElementText( startNode.$ );
+950 			ieRange.moveStart( 'character', 1 );
+951
+952 			if ( endNode )
+953 			{
+954 				// Create a tool range for the end.
+955 				var ieRangeEnd = this.document.$.body.createTextRange();
+956
+957 				// Position the tool range at the end.
+958 				ieRangeEnd.moveToElementText( endNode.$ );
+959
+960 				// Move the end boundary of the main range to match the tool range.
+961 				ieRange.setEndPoint( 'EndToEnd', ieRangeEnd );
+962 				ieRange.moveEnd( 'character', -1 );
+963 			}
+964 			else
+965 			{
+966 // The isStartMakerAlone logic comes from V2. It guarantees that the lines
+967 // will expand and that the cursor will be blinking on the right place.
+968 // Actually, we are using this flag just to avoid using this hack in all
+969 // situations, but just on those needed.
+970
+971 // But, in V3, somehow it is not interested on working whe hitting SHIFT+ENTER
+972 // inside text. So, let's jsut leave the hack happen always.
+973
+974 // I'm still leaving the code here just in case. We may find some other IE
+975 // weirdness and uncommenting this stuff may be useful.
+976
+977 //				isStartMakerAlone = ( !startNode.hasPrevious() || ( startNode.getPrevious().is && startNode.getPrevious().is( 'br' ) ) )
+978 //					&& !startNode.hasNext();
+979
+980 				// Append a temporary <span></span> before the selection.
+981 				// This is needed to avoid IE destroying selections inside empty
+982 				// inline elements, like <b></b> (#253).
+983 				// It is also needed when placing the selection right after an inline
+984 				// element to avoid the selection moving inside of it.
+985 				dummySpan = this.document.createElement( 'span' );
+986 				dummySpan.setHtml( '' );	// Zero Width No-Break Space (U+FEFF). See #1359.
+987 				dummySpan.insertBefore( startNode );
+988
+989 //				if ( isStartMakerAlone )
+990 //				{
+991 					// To expand empty blocks or line spaces after <br>, we need
+992 					// instead to have any char, which will be later deleted using the
+993 					// selection.
+994 					// \ufeff = Zero Width No-Break Space (U+FEFF). (#1359)
+995 					this.document.createText( '\ufeff' ).insertBefore( startNode );
+996 //				}
+997 			}
+998
+999 			// Remove the markers (reset the position, because of the changes in the DOM tree).
+1000 			this.setStartBefore( startNode );
+1001 			startNode.remove();
+1002
+1003 			if ( collapsed )
+1004 			{
+1005 //				if ( isStartMakerAlone )
+1006 //				{
+1007 					// Move the selection start to include the temporary \ufeff.
+1008 					ieRange.moveStart( 'character', -1 );
+1009
+1010 					ieRange.select();
+1011
+1012 					// Remove our temporary stuff.
+1013 					this.document.$.selection.clear();
+1014 //				}
+1015 //				else
+1016 //					ieRange.select();
+1017
+1018 				dummySpan.remove();
+1019 			}
+1020 			else
+1021 			{
+1022 				this.setEndBefore( endNode );
+1023 				endNode.remove();
+1024 				ieRange.select();
+1025 			}
+1026 		}
+1027 	:
+1028 		function()
+1029 		{
+1030 			var startContainer = this.startContainer;
+1031
+1032 			// If we have a collapsed range, inside an empty element, we must add
+1033 			// something to it, otherwise the caret will not be visible.
+1034 			if ( this.collapsed && startContainer.type == CKEDITOR.NODE_ELEMENT && !startContainer.getChildCount() )
+1035 				startContainer.append( new CKEDITOR.dom.text( '' ) );
+1036
+1037 			var nativeRange = this.document.$.createRange();
+1038 			nativeRange.setStart( startContainer.$, this.startOffset );
+1039
+1040 			try
+1041 			{
+1042 				nativeRange.setEnd( this.endContainer.$, this.endOffset );
+1043 			}
+1044 			catch ( e )
+1045 			{
+1046 				// There is a bug in Firefox implementation (it would be too easy
+1047 				// otherwise). The new start can't be after the end (W3C says it can).
+1048 				// So, let's create a new range and collapse it to the desired point.
+1049 				if ( e.toString().indexOf( 'NS_ERROR_ILLEGAL_VALUE' ) >= 0 )
+1050 				{
+1051 					this.collapse( true );
+1052 					nativeRange.setEnd( this.endContainer.$, this.endOffset );
+1053 				}
+1054 				else
+1055 					throw( e );
+1056 			}
+1057
+1058 			var selection = this.document.getSelection().getNative();
+1059 			selection.removeAllRanges();
+1060 			selection.addRange( nativeRange );
+1061 		};
+1062 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_showblocks_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_showblocks_plugin.js.html new file mode 100644 index 000000000..8ddaa8b52 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_showblocks_plugin.js.html @@ -0,0 +1,153 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview The "showblocks" plugin. Enable it will make all block level
+  8  *               elements being decorated with a border and the element name
+  9  *               displayed on the left-right corner.
+ 10  */
+ 11
+ 12 (function()
+ 13 {
+ 14 	var cssTemplate = '.%2 p,'+
+ 15 		'.%2 div,'+
+ 16 		'.%2 pre,'+
+ 17 		'.%2 address,'+
+ 18 		'.%2 blockquote,'+
+ 19 		'.%2 h1,'+
+ 20 		'.%2 h2,'+
+ 21 		'.%2 h3,'+
+ 22 		'.%2 h4,'+
+ 23 		'.%2 h5,'+
+ 24 		'.%2 h6'+
+ 25 		'{'+
+ 26 			'background-repeat: no-repeat;'+
+ 27 			'border: 1px dotted gray;'+
+ 28 			'padding-top: 8px;'+
+ 29 			'padding-left: 8px;'+
+ 30 		'}'+
+ 31
+ 32 		'.%2 p'+
+ 33 		'{'+
+ 34 			'%1p.png);'+
+ 35 		'}'+
+ 36
+ 37 		'.%2 div'+
+ 38 		'{'+
+ 39 			'%1div.png);'+
+ 40 		'}'+
+ 41
+ 42 		'.%2 pre'+
+ 43 		'{'+
+ 44 			'%1pre.png);'+
+ 45 		'}'+
+ 46
+ 47 		'.%2 address'+
+ 48 		'{'+
+ 49 			'%1address.png);'+
+ 50 		'}'+
+ 51
+ 52 		'.%2 blockquote'+
+ 53 		'{'+
+ 54 			'%1blockquote.png);'+
+ 55 		'}'+
+ 56
+ 57 		'.%2 h1'+
+ 58 		'{'+
+ 59 			'%1h1.png);'+
+ 60 		'}'+
+ 61
+ 62 		'.%2 h2'+
+ 63 		'{'+
+ 64 			'%1h2.png);'+
+ 65 		'}'+
+ 66
+ 67 		'.%2 h3'+
+ 68 		'{'+
+ 69 			'%1h3.png);'+
+ 70 		'}'+
+ 71
+ 72 		'.%2 h4'+
+ 73 		'{'+
+ 74 			'%1h4.png);'+
+ 75 		'}'+
+ 76
+ 77 		'.%2 h5'+
+ 78 		'{'+
+ 79 			'%1h5.png);'+
+ 80 		'}'+
+ 81
+ 82 		'.%2 h6'+
+ 83 		'{'+
+ 84 			'%1h6.png);'+
+ 85 		'}';
+ 86
+ 87 	var cssTemplateRegex = /%1/g, cssClassRegex = /%2/g;
+ 88
+ 89 	var commandDefinition =
+ 90 	{
+ 91 		preserveState : true,
+ 92
+ 93 		exec : function ( editor )
+ 94 		{
+ 95 			this.toggleState();
+ 96 			this.refresh( editor );
+ 97 		},
+ 98
+ 99 		refresh : function( editor )
+100 		{
+101 			var funcName = ( this.state == CKEDITOR.TRISTATE_ON ) ? 'addClass' : 'removeClass';
+102 			editor.document.getBody()[ funcName ]( 'cke_show_blocks' );
+103 		}
+104 	};
+105
+106 	CKEDITOR.plugins.add( 'showblocks',
+107 	{
+108 		requires : [ 'wysiwygarea' ],
+109
+110 		init : function( editor )
+111 		{
+112 			var command = editor.addCommand( 'showblocks', commandDefinition );
+113 			command.canUndo = false;
+114
+115 			if ( editor.config.startupOutlineBlocks )
+116 				command.setState( CKEDITOR.TRISTATE_ON );
+117
+118 			editor.addCss( cssTemplate
+119 				.replace( cssTemplateRegex, 'background-image: url(' + CKEDITOR.getUrl( this.path ) + 'images/block_' )
+120 				.replace( cssClassRegex, 'cke_show_blocks ' ) );
+121
+122 			editor.ui.addButton( 'ShowBlocks',
+123 				{
+124 					label : editor.lang.showBlocks,
+125 					command : 'showblocks'
+126 				});
+127
+128 			// Refresh the command on setData.
+129 			editor.on( 'mode', function()
+130 				{
+131 					if ( command.state != CKEDITOR.TRISTATE_DISABLED )
+132 						command.refresh( editor );
+133 				});
+134
+135 			// Refresh the command on setData.
+136 			editor.on( 'contentDom', function()
+137 				{
+138 					if ( command.state != CKEDITOR.TRISTATE_DISABLED )
+139 						command.refresh( editor );
+140 				});
+141 		}
+142 	});
+143 } )();
+144
+145 CKEDITOR.config.startupOutlineBlocks = false;
+146 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_smiley_dialogs_smiley.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_smiley_dialogs_smiley.js.html new file mode 100644 index 000000000..d1ccc613e --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_smiley_dialogs_smiley.js.html @@ -0,0 +1,227 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dialog.add( 'smiley', function( editor )
+  7 {
+  8 	var config = editor.config,
+  9 		images = config.smiley_images,
+ 10 		columns = config.smiley_columns,
+ 11 		i;
+ 12
+ 13 	/**
+ 14 	 * Simulate "this" of a dialog for non-dialog events.
+ 15 	 * @type {CKEDITOR.dialog}
+ 16 	 */
+ 17 	var dialog;
+ 18 	var onClick = function( evt )
+ 19 	{
+ 20 		var target = evt.data.getTarget(),
+ 21 			targetName = target.getName();
+ 22
+ 23 		if ( targetName == 'td' )
+ 24 			target = target.getChild( [ 0, 0 ] );
+ 25 		else if ( targetName == 'a' )
+ 26 			target = target.getChild( 0 );
+ 27 		else if ( targetName != 'img' )
+ 28 			return;
+ 29
+ 30 		var src = target.getAttribute( 'cke_src' ),
+ 31 			title = target.getAttribute( 'title' );
+ 32
+ 33 		var img = editor.document.createElement( 'img',
+ 34 			{
+ 35 				attributes :
+ 36 				{
+ 37 					src : src,
+ 38 					_cke_saved_src : src,
+ 39 					title : title,
+ 40 					alt : title
+ 41 				}
+ 42 			});
+ 43
+ 44 		editor.insertElement( img );
+ 45
+ 46 		dialog.hide();
+ 47 	};
+ 48
+ 49 	var onKeydown = CKEDITOR.tools.addFunction( function( ev, element )
+ 50 	{
+ 51 		ev = new CKEDITOR.dom.event( ev );
+ 52 		element = new CKEDITOR.dom.element( element );
+ 53 		var relative, nodeToMove;
+ 54
+ 55 		var keystroke = ev.getKeystroke();
+ 56 		switch ( keystroke )
+ 57 		{
+ 58 			// RIGHT-ARROW
+ 59 			case 39 :
+ 60 				// relative is TD
+ 61 				if ( ( relative = element.getParent().getNext() ) )
+ 62 				{
+ 63 					nodeToMove = relative.getChild( 0 );
+ 64 					nodeToMove.focus();
+ 65 				}
+ 66 				ev.preventDefault();
+ 67 				break;
+ 68 			// LEFT-ARROW
+ 69 			case 37 :
+ 70 				// relative is TD
+ 71 				if ( ( relative = element.getParent().getPrevious() ) )
+ 72 				{
+ 73 					nodeToMove = relative.getChild( 0 );
+ 74 					nodeToMove.focus();
+ 75 				}
+ 76 				ev.preventDefault();
+ 77 				break;
+ 78 			// UP-ARROW
+ 79 			case 38 :
+ 80 				// relative is TR
+ 81 				if ( ( relative = element.getParent().getParent().getPrevious() ) )
+ 82 				{
+ 83 					nodeToMove = relative.getChild( [element.getParent().getIndex(), 0] );
+ 84 					nodeToMove.focus();
+ 85 				}
+ 86 				ev.preventDefault();
+ 87 				break;
+ 88 			// DOWN-ARROW
+ 89 			case 40 :
+ 90 				// relative is TR
+ 91 				if ( ( relative = element.getParent().getParent().getNext() ) )
+ 92 				{
+ 93 					nodeToMove = relative.getChild( [element.getParent().getIndex(), 0] );
+ 94 					if ( nodeToMove )
+ 95 						nodeToMove.focus();
+ 96 				}
+ 97 				ev.preventDefault();
+ 98 				break;
+ 99 			// ENTER
+100 			// SPACE
+101 			case 32 :
+102 				onClick( { data: ev } );
+103 				ev.preventDefault();
+104 				break;
+105 			// TAB
+106 			case 9 :
+107 				// relative is TD
+108 				if ( ( relative = element.getParent().getNext() ) )
+109 				{
+110 					nodeToMove = relative.getChild( 0 );
+111 					nodeToMove.focus();
+112 					ev.preventDefault(true);
+113 				}
+114 				// relative is TR
+115 				else if ( ( relative = element.getParent().getParent().getNext() ) )
+116 				{
+117 					nodeToMove = relative.getChild( [0, 0] );
+118 					if ( nodeToMove )
+119 						nodeToMove.focus();
+120 					ev.preventDefault(true);
+121 				}
+122 				break;
+123 			// SHIFT + TAB
+124 			case CKEDITOR.SHIFT + 9 :
+125 				// relative is TD
+126 				if ( ( relative = element.getParent().getPrevious() ) )
+127 				{
+128 					nodeToMove = relative.getChild( 0 );
+129 					nodeToMove.focus();
+130 					ev.preventDefault(true);
+131 				}
+132 				// relative is TR
+133 				else if ( ( relative = element.getParent().getParent().getPrevious() ) )
+134 				{
+135 					nodeToMove = relative.getLast().getChild( 0 );
+136 					nodeToMove.focus();
+137 					ev.preventDefault(true);
+138 				}
+139 				break;
+140 			default :
+141 				// Do not stop not handled events.
+142 				return;
+143 		}
+144 	});
+145
+146 	// Build the HTML for the smiley images table.
+147 	var html =
+148 	[
+149 		'<table cellspacing="2" cellpadding="2"',
+150 		CKEDITOR.env.ie && CKEDITOR.env.quirks ? ' style="position:absolute;"' : '',
+151 		'><tbody>'
+152 	];
+153
+154 	for ( i = 0 ; i < images.length ; i++ )
+155 	{
+156 		if ( i % columns === 0 )
+157 			html.push( '<tr>' );
+158
+159 		html.push(
+160 			'<td class="cke_dark_background cke_hand cke_centered" style="vertical-align: middle;">' +
+161 				'<a href="javascript:void(0)" class="cke_smile" tabindex="-1" onkeydown="CKEDITOR.tools.callFunction( ', onKeydown, ', event, this );">',
+162 					'<img class="hand" title="', config.smiley_descriptions[i], '"' +
+163 						' cke_src="', CKEDITOR.tools.htmlEncode( config.smiley_path + images[ i ] ), '" alt="', config.smiley_descriptions[i], '"',
+164 						' src="', CKEDITOR.tools.htmlEncode( config.smiley_path + images[ i ] ), '"',
+165 						// IE BUG: Below is a workaround to an IE image loading bug to ensure the image sizes are correct.
+166 						( CKEDITOR.env.ie ? ' onload="this.setAttribute(\'width\', 2); this.removeAttribute(\'width\');" ' : '' ),
+167 					'>' +
+168 				'</a>',
+169  			'</td>' );
+170
+171 		if ( i % columns == columns - 1 )
+172 			html.push( '</tr>' );
+173 	}
+174
+175 	if ( i < columns - 1 )
+176 	{
+177 		for ( ; i < columns - 1 ; i++ )
+178 			html.push( '<td></td>' );
+179 		html.push( '</tr>' );
+180 	}
+181
+182 	html.push( '</tbody></table>' );
+183
+184 	var smileySelector =
+185 	{
+186 		type : 'html',
+187 		html : html.join( '' ),
+188 		onLoad : function( event )
+189 		{
+190 			dialog = event.sender;
+191 		},
+192 		focus : function()
+193  		{
+194 			var firstSmile = this.getElement().getChild( [0, 0, 0, 0] );
+195 			firstSmile.focus();
+196  		},
+197 		onClick : onClick,
+198 		style : 'width: 100%; height: 100%; border-collapse: separate;'
+199 	};
+200
+201 	return {
+202 		title : editor.lang.smiley.title,
+203 		minWidth : 270,
+204 		minHeight : 120,
+205 		contents : [
+206 			{
+207 				id : 'tab1',
+208 				label : '',
+209 				title : '',
+210 				expand : true,
+211 				padding : 0,
+212 				elements : [
+213 						smileySelector
+214 					]
+215 			}
+216 		],
+217 		buttons : [ CKEDITOR.dialog.cancelButton ]
+218 	};
+219 } );
+220 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_smiley_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_smiley_plugin.js.html new file mode 100644 index 000000000..f7260759c --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_smiley_plugin.js.html @@ -0,0 +1,39 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'smiley',
+  7 {
+  8 	requires : [ 'dialog' ],
+  9
+ 10 	init : function( editor )
+ 11 	{
+ 12 		editor.addCommand( 'smiley', new CKEDITOR.dialogCommand( 'smiley' ) );
+ 13 		editor.ui.addButton( 'Smiley',
+ 14 			{
+ 15 				label : editor.lang.smiley.toolbar,
+ 16 				command : 'smiley'
+ 17 			});
+ 18 		CKEDITOR.dialog.add( 'smiley', this.path + 'dialogs/smiley.js' );
+ 19 	}
+ 20 } );
+ 21
+ 22 CKEDITOR.config.smiley_path = CKEDITOR.basePath +  '_source/plugins/smiley/images/';
+ 23
+ 24 CKEDITOR.config.smiley_images = [ 'regular_smile.gif','sad_smile.gif','wink_smile.gif','teeth_smile.gif','confused_smile.gif','tounge_smile.gif',
+ 25 	'embaressed_smile.gif','omg_smile.gif','whatchutalkingabout_smile.gif','angry_smile.gif','angel_smile.gif','shades_smile.gif',
+ 26 	'devil_smile.gif','cry_smile.gif','lightbulb.gif','thumbs_down.gif','thumbs_up.gif','heart.gif',
+ 27 	'broken_heart.gif','kiss.gif','envelope.gif'];
+ 28
+ 29 CKEDITOR.config.smiley_descriptions = [ ':)', ':(', ';)', ':D', ':/', ':P', '', '', '', '', '', '', '', ';(', '', '', '', '', ':kiss', '' ];
+ 30
+ 31 CKEDITOR.config.smiley_columns = 8;
+ 32 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_sourcearea_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_sourcearea_plugin.js.html new file mode 100644 index 000000000..78921f683 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_sourcearea_plugin.js.html @@ -0,0 +1,189 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview The "sourcearea" plugin. It registers the "source" editing
+  8  *		mode, which displays the raw data being edited in the editor.
+  9  */
+ 10
+ 11 CKEDITOR.plugins.add( 'sourcearea',
+ 12 {
+ 13 	requires : [ 'editingblock' ],
+ 14
+ 15 	init : function( editor )
+ 16 	{
+ 17 		var sourcearea = CKEDITOR.plugins.sourcearea;
+ 18
+ 19 		editor.on( 'editingBlockReady', function()
+ 20 			{
+ 21 				var textarea,
+ 22 					onResize;
+ 23
+ 24 				editor.addMode( 'source',
+ 25 					{
+ 26 						load : function( holderElement, data )
+ 27 						{
+ 28 							if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 )
+ 29 								holderElement.setStyle( 'position', 'relative' );
+ 30
+ 31 							// Create the source area <textarea>.
+ 32 							editor.textarea = textarea = new CKEDITOR.dom.element( 'textarea' );
+ 33 							textarea.setAttributes(
+ 34 								{
+ 35 									dir : 'ltr',
+ 36 									tabIndex : -1
+ 37 								});
+ 38 							textarea.addClass( 'cke_source' );
+ 39
+ 40 							var styles =
+ 41 							{
+ 42 								width	: '100%',
+ 43 								height	: '100%',
+ 44 								resize	: 'none',
+ 45 								outline	: 'none',
+ 46 								'text-align' : 'left'
+ 47 							};
+ 48
+ 49 							// The textarea height/width='100%' doesn't
+ 50 							// constraint to the 'td' in IE strick mode
+ 51 							if ( CKEDITOR.env.ie )
+ 52 							{
+ 53 								if ( !CKEDITOR.env.ie8Compat )
+ 54 								{
+ 55 									onResize = function()
+ 56 										{
+ 57 											// Holder rectange size is stretched by textarea,
+ 58 											// so hide it just for a moment.
+ 59 											textarea.hide();
+ 60 											textarea.setStyle( 'height', holderElement.$.clientHeight + 'px' );
+ 61 											// When we have proper holder size, show textarea again.
+ 62 											textarea.show();
+ 63 										};
+ 64 									editor.on( 'resize', onResize );
+ 65 									styles.height = holderElement.$.clientHeight + 'px';
+ 66 								}
+ 67 							}
+ 68 							else
+ 69 							{
+ 70 								// By some yet unknown reason, we must stop the
+ 71 								// mousedown propagation for the textarea,
+ 72 								// otherwise it's not possible to place the caret
+ 73 								// inside of it (non IE).
+ 74 								textarea.on( 'mousedown', function( evt )
+ 75 									{
+ 76 										evt = evt.data.$;
+ 77 										if ( evt.stopPropagation )
+ 78 											evt.stopPropagation();
+ 79 									} );
+ 80 							}
+ 81
+ 82 							// Reset the holder element and append the
+ 83 							// <textarea> to it.
+ 84 							holderElement.setHtml( '' );
+ 85 							holderElement.append( textarea );
+ 86 							textarea.setStyles( styles );
+ 87
+ 88 							// The editor data "may be dirty" after this point.
+ 89 							editor.mayBeDirty = true;
+ 90
+ 91 							// Set the <textarea> value.
+ 92 							this.loadData( data );
+ 93
+ 94 							var keystrokeHandler = editor.keystrokeHandler;
+ 95 							if ( keystrokeHandler )
+ 96 								keystrokeHandler.attach( textarea );
+ 97
+ 98 							setTimeout( function()
+ 99 							{
+100 								editor.mode = 'source';
+101 								editor.fire( 'mode' );
+102 							},
+103 							( CKEDITOR.env.gecko || CKEDITOR.env.webkit ) ? 100 : 0 );
+104 						},
+105
+106 						loadData : function( data )
+107 						{
+108 							textarea.setValue( data );
+109 						},
+110
+111 						getData : function()
+112 						{
+113 							return textarea.getValue();
+114 						},
+115
+116 						getSnapshotData : function()
+117 						{
+118 							return textarea.getValue();
+119 						},
+120
+121 						unload : function( holderElement )
+122 						{
+123 							editor.textarea = textarea = null;
+124
+125 							if ( onResize )
+126 								editor.removeListener( 'resize', onResize );
+127 						},
+128
+129 						focus : function()
+130 						{
+131 							textarea.focus();
+132 						}
+133 					});
+134 			});
+135
+136 		editor.addCommand( 'source', sourcearea.commands.source );
+137
+138 		if ( editor.ui.addButton )
+139 		{
+140 			editor.ui.addButton( 'Source',
+141 				{
+142 					label : editor.lang.source,
+143 					command : 'source'
+144 				});
+145 		}
+146
+147 		editor.on( 'mode', function()
+148 			{
+149 				editor.getCommand( 'source' ).setState(
+150 					editor.mode == 'source' ?
+151 						CKEDITOR.TRISTATE_ON :
+152 						CKEDITOR.TRISTATE_OFF );
+153 			});
+154 	}
+155 });
+156
+157 /**
+158  * Holds the definition of commands an UI elements included with the sourcearea
+159  * plugin.
+160  * @example
+161  */
+162 CKEDITOR.plugins.sourcearea =
+163 {
+164 	commands :
+165 	{
+166 		source :
+167 		{
+168 			modes : { wysiwyg:1, source:1 },
+169
+170 			exec : function( editor )
+171 			{
+172 				if ( editor.mode == 'wysiwyg' )
+173 					editor.fire( 'saveSnapshot' );
+174 				editor.getCommand( 'source' ).setState( CKEDITOR.TRISTATE_DISABLED );
+175 				editor.setMode( editor.mode == 'source' ? 'wysiwyg' : 'source' );
+176 			},
+177
+178 			canUndo : false
+179 		}
+180 	}
+181 };
+182 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_specialchar_dialogs_specialchar.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_specialchar_dialogs_specialchar.js.html new file mode 100644 index 000000000..fe9fc6668 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_specialchar_dialogs_specialchar.js.html @@ -0,0 +1,370 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dialog.add( 'specialchar', function( editor )
+  7 {
+  8 	/**
+  9 	 * Simulate "this" of a dialog for non-dialog events.
+ 10 	 * @type {CKEDITOR.dialog}
+ 11 	 */
+ 12 	var dialog;
+ 13 	var onChoice = function( evt )
+ 14 	{
+ 15 		var target, value;
+ 16 		if ( evt.data )
+ 17 			target = evt.data.getTarget();
+ 18 		else
+ 19 			target = new CKEDITOR.dom.element( evt );
+ 20
+ 21 		if ( target.getName() == 'a' && ( value = target.getChild( 0 ).getHtml() ) )
+ 22 		{
+ 23 			target.removeClass( "cke_light_background" );
+ 24 			dialog.hide();
+ 25 			editor.insertHtml( value );
+ 26 		}
+ 27 	};
+ 28
+ 29 	var onClick = CKEDITOR.tools.addFunction( onChoice );
+ 30
+ 31 	var focusedNode;
+ 32
+ 33 	var onFocus = function( evt, target )
+ 34 	{
+ 35 		var value;
+ 36 		target = target || evt.data.getTarget();
+ 37
+ 38 		if ( target.getName() == 'span' )
+ 39 			target = target.getParent();
+ 40
+ 41 		if ( target.getName() == 'a' && ( value = target.getChild( 0 ).getHtml() ) )
+ 42 		{
+ 43 			// Trigger blur manually if there is focused node.
+ 44 			if ( focusedNode )
+ 45 				onBlur( null, focusedNode );
+ 46
+ 47 			var htmlPreview = dialog.getContentElement( 'info', 'htmlPreview' ).getElement();
+ 48
+ 49 			dialog.getContentElement( 'info', 'charPreview' ).getElement().setHtml( value );
+ 50 			htmlPreview.setHtml( CKEDITOR.tools.htmlEncode( value ) );
+ 51 			target.getParent().addClass( "cke_light_background" );
+ 52
+ 53 			// Memorize focused node.
+ 54 			focusedNode = target;
+ 55 		}
+ 56 	};
+ 57
+ 58 	var onBlur = function( evt, target )
+ 59 	{
+ 60 		target = target || evt.data.getTarget();
+ 61
+ 62 		if ( target.getName() == 'span' )
+ 63 			target = target.getParent();
+ 64
+ 65 		if ( target.getName() == 'a' )
+ 66 		{
+ 67 			dialog.getContentElement( 'info', 'charPreview' ).getElement().setHtml( ' ' );
+ 68 			dialog.getContentElement( 'info', 'htmlPreview' ).getElement().setHtml( ' ' );
+ 69 			target.getParent().removeClass( "cke_light_background" );
+ 70
+ 71 			focusedNode = undefined;
+ 72 		}
+ 73 	};
+ 74
+ 75 	var onKeydown = CKEDITOR.tools.addFunction( function( ev )
+ 76 	{
+ 77 		ev = new CKEDITOR.dom.event( ev );
+ 78
+ 79 		// Get an Anchor element.
+ 80 		var element = ev.getTarget();
+ 81 		var relative, nodeToMove;
+ 82 		var keystroke = ev.getKeystroke();
+ 83
+ 84 		switch ( keystroke )
+ 85 		{
+ 86 			// RIGHT-ARROW
+ 87 			case 39 :
+ 88 				// relative is TD
+ 89 				if ( ( relative = element.getParent().getNext() ) )
+ 90 				{
+ 91 					nodeToMove = relative.getChild( 0 );
+ 92 					if ( nodeToMove.type == 1 )
+ 93 					{
+ 94 						nodeToMove.focus();
+ 95 						onBlur( null, element );
+ 96 						onFocus( null, nodeToMove );
+ 97 					}
+ 98 				}
+ 99 				ev.preventDefault();
+100 				break;
+101 			// LEFT-ARROW
+102 			case 37 :
+103 				// relative is TD
+104 				if ( ( relative = element.getParent().getPrevious() ) )
+105 				{
+106 					nodeToMove = relative.getChild( 0 );
+107 					nodeToMove.focus();
+108 					onBlur( null, element );
+109 					onFocus( null, nodeToMove );
+110 				}
+111 				ev.preventDefault();
+112 				break;
+113 			// UP-ARROW
+114 			case 38 :
+115 				// relative is TR
+116 				if ( ( relative = element.getParent().getParent().getPrevious() ) )
+117 				{
+118 					nodeToMove = relative.getChild( [element.getParent().getIndex(), 0] );
+119 					nodeToMove.focus();
+120 					onBlur( null, element );
+121 					onFocus( null, nodeToMove );
+122 				}
+123 				ev.preventDefault();
+124 				break;
+125 			// DOWN-ARROW
+126 			case 40 :
+127 				// relative is TR
+128 				if ( ( relative = element.getParent().getParent().getNext() ) )
+129 				{
+130 					nodeToMove = relative.getChild( [ element.getParent().getIndex(), 0 ] );
+131 					if ( nodeToMove && nodeToMove.type == 1 )
+132 					{
+133 						nodeToMove.focus();
+134 						onBlur( null, element );
+135 						onFocus( null, nodeToMove );
+136 					}
+137 				}
+138 				ev.preventDefault();
+139 				break;
+140 			// SPACE
+141 			// ENTER is already handled as onClick
+142 			case 32 :
+143 				onChoice( { data: ev } );
+144 				ev.preventDefault();
+145 				break;
+146 			// TAB
+147 			case 9 :
+148 				// relative is TD
+149 				if ( ( relative = element.getParent().getNext() ) )
+150 				{
+151 					nodeToMove = relative.getChild( 0 );
+152 					if ( nodeToMove.type == 1 )
+153 					{
+154 						nodeToMove.focus();
+155 						onBlur( null, element );
+156 						onFocus( null, nodeToMove );
+157 						ev.preventDefault( true );
+158 					}
+159 					else
+160 						onBlur( null, element );
+161 				}
+162 				// relative is TR
+163 				else if ( ( relative = element.getParent().getParent().getNext() ) )
+164 				{
+165 					nodeToMove = relative.getChild( [ 0, 0 ] );
+166 					if ( nodeToMove && nodeToMove.type == 1 )
+167 					{
+168 						nodeToMove.focus();
+169 						onBlur( null, element );
+170 						onFocus( null, nodeToMove );
+171 						ev.preventDefault( true );
+172 					}
+173 					else
+174 						onBlur( null, element );
+175 				}
+176 				break;
+177 			// SHIFT + TAB
+178 			case CKEDITOR.SHIFT + 9 :
+179 				// relative is TD
+180 				if ( ( relative = element.getParent().getPrevious() ) )
+181 				{
+182 					nodeToMove = relative.getChild( 0 );
+183 					nodeToMove.focus();
+184 					onBlur( null, element );
+185 					onFocus( null, nodeToMove );
+186 					ev.preventDefault( true );
+187 				}
+188 				// relative is TR
+189 				else if ( ( relative = element.getParent().getParent().getPrevious() ) )
+190 				{
+191 					nodeToMove = relative.getLast().getChild( 0 );
+192 					nodeToMove.focus();
+193 					onBlur( null, element );
+194 					onFocus( null, nodeToMove );
+195 					ev.preventDefault( true );
+196 				}
+197 				else
+198 					onBlur( null, element );
+199 				break;
+200 			default :
+201 				// Do not stop not handled events.
+202 				return;
+203 		}
+204 	});
+205
+206 	return {
+207 		title : editor.lang.specialChar.title,
+208 		minWidth : 430,
+209 		minHeight : 280,
+210 		buttons : [ CKEDITOR.dialog.cancelButton ],
+211 		charColumns : 17,
+212 		chars :
+213 			[
+214 				'!','"','#','$','%','&',"'",'(',')','*','+','-','.','/',
+215 				'0','1','2','3','4','5','6','7','8','9',':',';',
+216 				'<','=','>','?','@',
+217 				'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
+218 				'P','Q','R','S','T','U','V','W','X','Y','Z',
+219 				'[',']','^','_','`',
+220 				'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p',
+221 				'q','r','s','t','u','v','w','x','y','z',
+222 				'{','|','}','~','€','‘','’','’','“',
+223 				'”','–','—','¡','¢','£',
+224 				'¤','¥','¦','§','¨','©','ª',
+225 				'«','¬','®','¯','°','±','²',
+226 				'³','´','µ','¶','·','¸',
+227 				'¹','º','»','¼','½','¾',
+228 				'¿','À','Á','Â','Ã','Ä',
+229 				'Å','Æ','Ç','È','É','Ê',
+230 				'Ë','Ì','Í','Î','Ï','Ð',
+231 				'Ñ','Ò','Ó','Ô','Õ','Ö',
+232 				'×','Ø','Ù','Ú','Û','Ü',
+233 				'Ý','Þ','ß','à','á','â',
+234 				'ã','ä','å','æ','ç','è',
+235 				'é','ê','ë','ì','í','î',
+236 				'ï','ð','ñ','ò','ó','ô',
+237 				'õ','ö','÷','ø','ù','ú',
+238 				'û','ü','ü','ý','þ','ÿ',
+239 				'Œ','œ','Ŵ','Ŷ','ŵ','ŷ','‚',
+240 				'‛','„','…','™','►','•',
+241 				'→','⇒','⇔','♦','≈'
+242 			],
+243 		onLoad :  function()
+244 		{
+245 			var columns = this.definition.charColumns,
+246 				chars = this.definition.chars;
+247
+248 			var html = [ '<table style="width: 320px; height: 100%; border-collapse: separate;" align="center" cellspacing="2" cellpadding="2" border="0">' ];
+249
+250 			var i = 0 ;
+251 			while ( i < chars.length )
+252 			{
+253 				html.push( '<tr>' ) ;
+254
+255 				for( var j = 0 ; j < columns ; j++, i++ )
+256 				{
+257 					if ( chars[ i ] )
+258 					{
+259 						html.push(
+260 							'<td class="cke_dark_background">' +
+261 							'<a href="javascript: void(0);" style="display: block; height: 1.25em; margin-top: 0.25em; text-align: center;" title="', chars[i].replace( /&/g, '&' ), '"' +
+262 							' onkeydown="CKEDITOR.tools.callFunction( ' + onKeydown + ', event, this )"' +
+263 							' onclick="CKEDITOR.tools.callFunction(' + onClick + ', this); return false;"' +
+264 							' tabindex="-1">' +
+265 							'<span style="margin: 0 auto;">' +
+266 							chars[i] +
+267 							'</span></a>');
+268 					}
+269 					else
+270 						html.push( '<td class="cke_dark_background"> ' );
+271
+272 					html.push( '</td>' );
+273 				}
+274 				html.push( '</tr>' );
+275 			}
+276
+277 			html.push( '</tbody></table>' );
+278
+279 			this.getContentElement( 'info', 'charContainer' ).getElement().setHtml( html.join( '' ) );
+280 		},
+281 		contents : [
+282 			{
+283 				id : 'info',
+284 				label : editor.lang.common.generalTab,
+285 				title : editor.lang.common.generalTab,
+286 				padding : 0,
+287 				align : 'top',
+288 				elements : [
+289 					{
+290 						type : 'hbox',
+291 						align : 'top',
+292 						widths : [ '320px', '90px' ],
+293 						children :
+294 						[
+295 							{
+296 								type : 'html',
+297 								id : 'charContainer',
+298 								html : '',
+299 								onMouseover : onFocus,
+300 								onMouseout : onBlur,
+301 								focus : function()
+302 								{
+303 									var firstChar = this.getElement().getChild( [0, 0, 0, 0, 0] );
+304 									setTimeout(function()
+305 									{
+306 										firstChar.focus();
+307 										onFocus( null, firstChar );
+308 									});
+309 								},
+310 								// Needed only for webkit.
+311 								onShow : function()
+312 								{
+313 									var firstChar = this.getElement().getChild( [0, 0, 0, 0, 0] );
+314 									setTimeout(function()
+315 									{
+316 										firstChar.focus();
+317 										onFocus( null, firstChar );
+318 									});
+319 								},
+320 								onLoad : function( event )
+321 								{
+322 									dialog = event.sender;
+323 								}
+324 							},
+325 							{
+326 								type : 'hbox',
+327 								align : 'top',
+328 								widths : [ '100%' ],
+329 								children :
+330 								[
+331 									{
+332 										type : 'vbox',
+333 										align : 'top',
+334 										children :
+335 										[
+336 											{
+337 												type : 'html',
+338 												html : '<div></div>'
+339 											},
+340 											{
+341 												type : 'html',
+342 												id : 'charPreview',
+343 												style : 'border:1px solid #eeeeee;background-color:#EAEAD1;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:\'Microsoft Sans Serif\',Arial,Helvetica,Verdana;text-align:center;',
+344 												html : '<div> </div>'
+345 											},
+346 											{
+347 												type : 'html',
+348 												id : 'htmlPreview',
+349 												style : 'border:1px solid #eeeeee;background-color:#EAEAD1;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:\'Microsoft Sans Serif\',Arial,Helvetica,Verdana;text-align:center;',
+350 												html : '<div> </div>'
+351 											}
+352 										]
+353 									}
+354 								]
+355 							}
+356 						]
+357 					}
+358 				]
+359 			}
+360 		]
+361 	};
+362 } );
+363 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_specialchar_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_specialchar_plugin.js.html new file mode 100644 index 000000000..c3bad9c40 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_specialchar_plugin.js.html @@ -0,0 +1,37 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Special Character plugin
+  8  */
+  9
+ 10 CKEDITOR.plugins.add( 'specialchar',
+ 11 {
+ 12 	init : function( editor )
+ 13 	{
+ 14 		var pluginName = 'specialchar';
+ 15
+ 16 		// Register the dialog.
+ 17 		CKEDITOR.dialog.add( pluginName, this.path + 'dialogs/specialchar.js' );
+ 18
+ 19 		// Register the command.
+ 20 		editor.addCommand( pluginName, new CKEDITOR.dialogCommand( pluginName ) );
+ 21
+ 22 		// Register the toolbar button.
+ 23 		editor.ui.addButton( 'SpecialChar',
+ 24 			{
+ 25 				label : editor.lang.specialChar.toolbar,
+ 26 				command : pluginName
+ 27 			});
+ 28 	}
+ 29 } );
+ 30 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_styles_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_styles_plugin.js.html new file mode 100644 index 000000000..bada0aa60 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_styles_plugin.js.html @@ -0,0 +1,1088 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'styles',
+  7 {
+  8 	requires : [ 'selection' ]
+  9 });
+ 10
+ 11 /**
+ 12  * Registers a function to be called whenever a style changes its state in the
+ 13  * editing area. The current state is passed to the function. The possible
+ 14  * states are {@link CKEDITOR.TRISTATE_ON} and {@link CKEDITOR.TRISTATE_OFF}.
+ 15  * @param {CKEDITOR.style} The style to be watched.
+ 16  * @param {Function} The function to be called when the style state changes.
+ 17  * @example
+ 18  * // Create a style object for the <b> element.
+ 19  * var style = new CKEDITOR.style( { element : 'b' } );
+ 20  * var editor = CKEDITOR.instances.editor1;
+ 21  * editor.attachStyleStateChange( style, function( state )
+ 22  *     {
+ 23  *         if ( state == CKEDITOR.TRISTATE_ON )
+ 24  *             alert( 'The current state for the B element is ON' );
+ 25  *         else
+ 26  *             alert( 'The current state for the B element is OFF' );
+ 27  *     });
+ 28  */
+ 29 CKEDITOR.editor.prototype.attachStyleStateChange = function( style, callback )
+ 30 {
+ 31 	// Try to get the list of attached callbacks.
+ 32 	var styleStateChangeCallbacks = this._.styleStateChangeCallbacks;
+ 33
+ 34 	// If it doesn't exist, it means this is the first call. So, let's create
+ 35 	// all the structure to manage the style checks and the callback calls.
+ 36 	if ( !styleStateChangeCallbacks )
+ 37 	{
+ 38 		// Create the callbacks array.
+ 39 		styleStateChangeCallbacks = this._.styleStateChangeCallbacks = [];
+ 40
+ 41 		// Attach to the selectionChange event, so we can check the styles at
+ 42 		// that point.
+ 43 		this.on( 'selectionChange', function( ev )
+ 44 			{
+ 45 				// Loop throw all registered callbacks.
+ 46 				for ( var i = 0 ; i < styleStateChangeCallbacks.length ; i++ )
+ 47 				{
+ 48 					var callback = styleStateChangeCallbacks[ i ];
+ 49
+ 50 					// Check the current state for the style defined for that
+ 51 					// callback.
+ 52 					var currentState = callback.style.checkActive( ev.data.path ) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF;
+ 53
+ 54 					// If the state changed since the last check.
+ 55 					if ( callback.state !== currentState )
+ 56 					{
+ 57 						// Call the callback function, passing the current
+ 58 						// state to it.
+ 59 						callback.fn.call( this, currentState );
+ 60
+ 61 						// Save the current state, so it can be compared next
+ 62 						// time.
+ 63 						callback.state !== currentState;
+ 64 					}
+ 65 				}
+ 66 			});
+ 67 	}
+ 68
+ 69 	// Save the callback info, so it can be checked on the next occurence of
+ 70 	// selectionChange.
+ 71 	styleStateChangeCallbacks.push( { style : style, fn : callback } );
+ 72 };
+ 73
+ 74 CKEDITOR.STYLE_BLOCK = 1;
+ 75 CKEDITOR.STYLE_INLINE = 2;
+ 76 CKEDITOR.STYLE_OBJECT = 3;
+ 77
+ 78 (function()
+ 79 {
+ 80 	var blockElements	= { address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1 };
+ 81 	var objectElements	= { a:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,ul:1 };
+ 82
+ 83 	var semicolonFixRegex = /\s*(?:;\s*|$)/;
+ 84
+ 85 	CKEDITOR.style = function( styleDefinition, variablesValues )
+ 86 	{
+ 87 		if ( variablesValues )
+ 88 		{
+ 89 			styleDefinition = CKEDITOR.tools.clone( styleDefinition );
+ 90
+ 91 			replaceVariables( styleDefinition.attributes, variablesValues );
+ 92 			replaceVariables( styleDefinition.styles, variablesValues );
+ 93 		}
+ 94
+ 95 		var element = this.element = ( styleDefinition.element || '*' ).toLowerCase();
+ 96
+ 97 		this.type =
+ 98 			( element == '#' || blockElements[ element ] ) ?
+ 99 				CKEDITOR.STYLE_BLOCK
+100 			: objectElements[ element ] ?
+101 				CKEDITOR.STYLE_OBJECT
+102 			:
+103 				CKEDITOR.STYLE_INLINE;
+104
+105 		this._ =
+106 		{
+107 			definition : styleDefinition
+108 		};
+109 	};
+110
+111 	CKEDITOR.style.prototype =
+112 	{
+113 		apply : function( document )
+114 		{
+115 			applyStyle.call( this, document, false );
+116 		},
+117
+118 		remove : function( document )
+119 		{
+120 			applyStyle.call( this, document, true );
+121 		},
+122
+123 		applyToRange : function( range )
+124 		{
+125 			return ( this.applyToRange =
+126 						this.type == CKEDITOR.STYLE_INLINE ?
+127 							applyInlineStyle
+128 						: this.type == CKEDITOR.STYLE_BLOCK ?
+129 							applyBlockStyle
+130 						: null ).call( this, range );
+131 		},
+132
+133 		removeFromRange : function( range )
+134 		{
+135 			return ( this.removeFromRange =
+136 						this.type == CKEDITOR.STYLE_INLINE ?
+137 							removeInlineStyle
+138 						: null ).call( this, range );
+139 		},
+140
+141 		applyToObject : function( element )
+142 		{
+143 			setupElement( element, this );
+144 		},
+145
+146 		/**
+147 		 * Get the style state inside an element path. Returns "true" if the
+148 		 * element is active in the path.
+149 		 */
+150 		checkActive : function( elementPath )
+151 		{
+152 			switch ( this.type )
+153 			{
+154 				case CKEDITOR.STYLE_BLOCK :
+155 					return this.checkElementRemovable( elementPath.block || elementPath.blockLimit, true );
+156
+157 				case CKEDITOR.STYLE_INLINE :
+158
+159 					var elements = elementPath.elements;
+160
+161 					for ( var i = 0, element ; i < elements.length ; i++ )
+162 					{
+163 						element = elements[i];
+164
+165 						if ( element == elementPath.block || element == elementPath.blockLimit )
+166 							continue;
+167
+168 						if ( this.checkElementRemovable( element, true ) )
+169 							return true;
+170 					}
+171 			}
+172 			return false;
+173 		},
+174
+175 		// Checks if an element, or any of its attributes, is removable by the
+176 		// current style definition.
+177 		checkElementRemovable : function( element, fullMatch )
+178 		{
+179 			if ( !element )
+180 				return false;
+181
+182 			var def = this._.definition,
+183 				attribs;
+184
+185 			// If the element name is the same as the style name.
+186 			if ( element.getName() == this.element )
+187 			{
+188 				// If no attributes are defined in the element.
+189 				if ( !fullMatch && !element.hasAttributes() )
+190 					return true;
+191
+192 				attribs = getAttributesForComparison( def );
+193
+194 				if ( attribs._length )
+195 				{
+196 					for ( var attName in attribs )
+197 					{
+198 						if ( attName == '_length' )
+199 							continue;
+200 						if ( attribs[attName] == element.getAttribute( attName ) )
+201 						{
+202 							if ( !fullMatch )
+203 								return true;
+204 						}
+205 						else if ( fullMatch )
+206 								return false;
+207 					}
+208 					if( fullMatch )
+209 						return true;
+210 				}
+211 				else
+212 					return true;
+213 			}
+214
+215 			// Check if the element can be somehow overriden.
+216 			var override = getOverrides( this )[ element.getName() ] ;
+217 			if ( override )
+218 			{
+219 				// If no attributes have been defined, remove the element.
+220 				if ( !( attribs = override.attributes ) )
+221 					return true;
+222
+223 				for ( var i = 0 ; i < attribs.length ; i++ )
+224 				{
+225 					attName = attribs[i][0];
+226 					var actualAttrValue = element.getAttribute( attName );
+227 					if ( actualAttrValue )
+228 					{
+229 						var attValue = attribs[i][1];
+230
+231 						// Remove the attribute if:
+232 						//    - The override definition value is null;
+233 						//    - The override definition value is a string that
+234 						//      matches the attribute value exactly.
+235 						//    - The override definition value is a regex that
+236 						//      has matches in the attribute value.
+237 						if ( attValue === null ||
+238 								( typeof attValue == 'string' && actualAttrValue == attValue ) ||
+239 								attValue.test( actualAttrValue ) )
+240 							return true;
+241 					}
+242 				}
+243 			}
+244 			return false;
+245 		}
+246 	};
+247
+248 	// Build the cssText based on the styles definition.
+249 	CKEDITOR.style.getStyleText = function( styleDefinition )
+250 	{
+251 		// If we have already computed it, just return it.
+252 		var stylesDef = styleDefinition._ST;
+253 		if ( stylesDef )
+254 			return stylesDef;
+255
+256 		stylesDef = styleDefinition.styles;
+257
+258 		// Builds the StyleText.
+259
+260 		var stylesText = ( styleDefinition.attributes && styleDefinition.attributes[ 'style' ] ) || '';
+261
+262 		if ( stylesText.length )
+263 			stylesText = stylesText.replace( semicolonFixRegex, ';' );
+264
+265 		for ( var style in stylesDef )
+266 			stylesText += style + ':' + stylesDef[ style ] + ';';
+267
+268 		// Browsers make some changes to the style when applying them. So, here
+269 		// we normalize it to the browser format.
+270 		if ( stylesText.length )
+271 			stylesText = normalizeCssText( stylesText );
+272
+273 		// Return it, saving it to the next request.
+274 		return ( styleDefinition._ST = stylesText );
+275 	};
+276
+277 	function applyInlineStyle( range )
+278 	{
+279 		var document = range.document;
+280
+281 		if ( range.collapsed )
+282 		{
+283 			// Create the element to be inserted in the DOM.
+284 			var collapsedElement = getElement( this, document );
+285
+286 			// Insert the empty element into the DOM at the range position.
+287 			range.insertNode( collapsedElement );
+288
+289 			// Place the selection right inside the empty element.
+290 			range.moveToPosition( collapsedElement, CKEDITOR.POSITION_BEFORE_END );
+291
+292 			return;
+293 		}
+294
+295 		var elementName = this.element;
+296 		var def = this._.definition;
+297 		var isUnknownElement;
+298
+299 		// Get the DTD definition for the element. Defaults to "span".
+300 		var dtd = CKEDITOR.dtd[ elementName ] || ( isUnknownElement = true, CKEDITOR.dtd.span );
+301
+302 		// Bookmark the range so we can re-select it after processing.
+303 		var bookmark = range.createBookmark();
+304
+305 		// Expand the range.
+306 		range.enlarge( CKEDITOR.ENLARGE_ELEMENT );
+307 		range.trim();
+308
+309 		// Get the first node to be processed and the last, which concludes the
+310 		// processing.
+311 		var boundaryNodes = range.getBoundaryNodes();
+312 		var firstNode = boundaryNodes.startNode;
+313 		var lastNode = boundaryNodes.endNode.getNextSourceNode( true );
+314
+315 		// Probably the document end is reached, we need a marker node.
+316 		if ( !lastNode )
+317 		{
+318 				lastNode = document.createText( '' );
+319 				lastNode.insertAfter( range.endContainer );
+320 		}
+321 		// The detection algorithm below skips the contents inside bookmark nodes, so
+322 		// we'll need to make sure lastNode isn't the   inside a bookmark node.
+323 		var lastParent = lastNode.getParent();
+324 		if ( lastParent && lastParent.getAttribute( '_fck_bookmark' ) )
+325 			lastNode = lastParent;
+326
+327 		if ( lastNode.equals( firstNode ) )
+328 		{
+329 			// If the last node is the same as the the first one, we must move
+330 			// it to the next one, otherwise the first one will not be
+331 			// processed.
+332 			lastNode = lastNode.getNextSourceNode( true );
+333
+334 			// It may happen that there are no more nodes after it (the end of
+335 			// the document), so we must add something there to make our code
+336 			// simpler.
+337 			if ( !lastNode )
+338 			{
+339 				lastNode = document.createText( '' );
+340 				lastNode.insertAfter( firstNode );
+341 			}
+342 		}
+343
+344 		var currentNode = firstNode;
+345
+346 		var styleRange;
+347
+348 		// Indicates that that some useful inline content has been found, so
+349 		// the style should be applied.
+350 		var hasContents;
+351
+352 		while ( currentNode )
+353 		{
+354 			var applyStyle = false;
+355
+356 			if ( currentNode.equals( lastNode ) )
+357 			{
+358 				currentNode = null;
+359 				applyStyle = true;
+360 			}
+361 			else
+362 			{
+363 				var nodeType = currentNode.type;
+364 				var nodeName = nodeType == CKEDITOR.NODE_ELEMENT ? currentNode.getName() : null;
+365
+366 				if ( nodeName && currentNode.getAttribute( '_fck_bookmark' ) )
+367 				{
+368 					currentNode = currentNode.getNextSourceNode( true );
+369 					continue;
+370 				}
+371
+372 				// Check if the current node can be a child of the style element.
+373 				if ( !nodeName || ( dtd[ nodeName ] && ( currentNode.getPosition( lastNode ) | CKEDITOR.POSITION_PRECEDING | CKEDITOR.POSITION_IDENTICAL | CKEDITOR.POSITION_IS_CONTAINED ) == ( CKEDITOR.POSITION_PRECEDING + CKEDITOR.POSITION_IDENTICAL + CKEDITOR.POSITION_IS_CONTAINED ) ) )
+374 				{
+375 					var currentParent = currentNode.getParent();
+376
+377 					// Check if the style element can be a child of the current
+378 					// node parent or if the element is not defined in the DTD.
+379 					if ( currentParent && ( ( currentParent.getDtd() || CKEDITOR.dtd.span )[ elementName ] || isUnknownElement ) )
+380 					{
+381 						// This node will be part of our range, so if it has not
+382 						// been started, place its start right before the node.
+383 						// In the case of an element node, it will be included
+384 						// only if it is entirely inside the range.
+385 						if ( !styleRange && ( !nodeName || !CKEDITOR.dtd.$removeEmpty[ nodeName ] || ( currentNode.getPosition( lastNode ) | CKEDITOR.POSITION_PRECEDING | CKEDITOR.POSITION_IDENTICAL | CKEDITOR.POSITION_IS_CONTAINED ) == ( CKEDITOR.POSITION_PRECEDING + CKEDITOR.POSITION_IDENTICAL + CKEDITOR.POSITION_IS_CONTAINED ) ) )
+386 						{
+387 							styleRange = new CKEDITOR.dom.range( document );
+388 							styleRange.setStartBefore( currentNode );
+389 						}
+390
+391 						// Non element nodes, or empty elements can be added
+392 						// completely to the range.
+393 						if ( nodeType == CKEDITOR.NODE_TEXT || ( nodeType == CKEDITOR.NODE_ELEMENT && !currentNode.getChildCount() ) )
+394 						{
+395 							var includedNode = currentNode;
+396 							var parentNode;
+397
+398 							// This node is about to be included completelly, but,
+399 							// if this is the last node in its parent, we must also
+400 							// check if the parent itself can be added completelly
+401 							// to the range.
+402 							while ( !includedNode.$.nextSibling
+403 								&& ( parentNode = includedNode.getParent(), dtd[ parentNode.getName() ] )
+404 								&& ( parentNode.getPosition( firstNode ) | CKEDITOR.POSITION_FOLLOWING | CKEDITOR.POSITION_IDENTICAL | CKEDITOR.POSITION_IS_CONTAINED ) == ( CKEDITOR.POSITION_FOLLOWING + CKEDITOR.POSITION_IDENTICAL + CKEDITOR.POSITION_IS_CONTAINED ) )
+405 							{
+406 								includedNode = parentNode;
+407 							}
+408
+409 							styleRange.setEndAfter( includedNode );
+410
+411 							// If the included node still is the last node in its
+412 							// parent, it means that the parent can't be included
+413 							// in this style DTD, so apply the style immediately.
+414 							if ( !includedNode.$.nextSibling )
+415 								applyStyle = true;
+416
+417 							if ( !hasContents )
+418 								hasContents = ( nodeType != CKEDITOR.NODE_TEXT || (/[^\s\ufeff]/).test( currentNode.getText() ) );
+419 						}
+420 					}
+421 					else
+422 						applyStyle = true;
+423 				}
+424 				else
+425 					applyStyle = true;
+426
+427 				// Get the next node to be processed.
+428 				currentNode = currentNode.getNextSourceNode();
+429 			}
+430
+431 			// Apply the style if we have something to which apply it.
+432 			if ( applyStyle && hasContents && styleRange && !styleRange.collapsed )
+433 			{
+434 				// Build the style element, based on the style object definition.
+435 				var styleNode = getElement( this, document );
+436
+437 				// Get the element that holds the entire range.
+438 				var parent = styleRange.getCommonAncestor();
+439
+440 				// Loop through the parents, removing the redundant attributes
+441 				// from the element to be applied.
+442 				while ( styleNode && parent )
+443 				{
+444 					if ( parent.getName() == elementName )
+445 					{
+446 						for ( var attName in def.attribs )
+447 						{
+448 							if ( styleNode.getAttribute( attName ) == parent.getAttribute( attName ) )
+449 								styleNode.removeAttribute( attName );
+450 						}
+451
+452 						for ( var styleName in def.styles )
+453 						{
+454 							if ( styleNode.getStyle( styleName ) == parent.getStyle( styleName ) )
+455 								styleNode.removeStyle( styleName );
+456 						}
+457
+458 						if ( !styleNode.hasAttributes() )
+459 						{
+460 							styleNode = null;
+461 							break;
+462 						}
+463 					}
+464
+465 					parent = parent.getParent();
+466 				}
+467
+468 				if ( styleNode )
+469 				{
+470 					// Move the contents of the range to the style element.
+471 					styleRange.extractContents().appendTo( styleNode );
+472
+473 					// Here we do some cleanup, removing all duplicated
+474 					// elements from the style element.
+475 					removeFromInsideElement( this, styleNode );
+476
+477 					// Insert it into the range position (it is collapsed after
+478 					// extractContents.
+479 					styleRange.insertNode( styleNode );
+480
+481 					// Let's merge our new style with its neighbors, if possible.
+482 					mergeSiblings( styleNode );
+483
+484 					// As the style system breaks text nodes constantly, let's normalize
+485 					// things for performance.
+486 					// With IE, some paragraphs get broken when calling normalize()
+487 					// repeatedly. Also, for IE, we must normalize body, not documentElement.
+488 					// IE is also known for having a "crash effect" with normalize().
+489 					// We should try to normalize with IE too in some way, somewhere.
+490 					if ( !CKEDITOR.env.ie )
+491 						styleNode.$.normalize();
+492 				}
+493
+494 				// Style applied, let's release the range, so it gets
+495 				// re-initialization in the next loop.
+496 				styleRange = null;
+497 			}
+498 		}
+499
+500 //		this._FixBookmarkStart( startNode );
+501
+502 		range.moveToBookmark( bookmark );
+503 	}
+504
+505 	function removeInlineStyle( range )
+506 	{
+507 		/*
+508 		 * Make sure our range has included all "collpased" parent inline nodes so
+509 		 * that our operation logic can be simpler.
+510 		 */
+511 		range.enlarge( CKEDITOR.ENLARGE_ELEMENT );
+512
+513 		var bookmark = range.createBookmark(),
+514 			startNode = bookmark.startNode;
+515
+516 		if ( range.collapsed )
+517 		{
+518
+519 			var startPath = new CKEDITOR.dom.elementPath( startNode.getParent() ),
+520 				// The topmost element in elementspatch which we should jump out of.
+521 				boundaryElement;
+522
+523
+524 			for ( var i = 0, element ; i < startPath.elements.length
+525 					&& ( element = startPath.elements[i] ) ; i++ )
+526 			{
+527 				/*
+528 				 * 1. If it's collaped inside text nodes, try to remove the style from the whole element.
+529 				 *
+530 				 * 2. Otherwise if it's collapsed on element boundaries, moving the selection
+531 				 *  outside the styles instead of removing the whole tag,
+532 				 *  also make sure other inner styles were well preserverd.(#3309)
+533 				 */
+534 				if ( element == startPath.block || element == startPath.blockLimit )
+535 					break;
+536
+537 				if ( this.checkElementRemovable( element ) )
+538 				{
+539 					var endOfElement = range.checkBoundaryOfElement( element, CKEDITOR.END ),
+540 							startOfElement = !endOfElement && range.checkBoundaryOfElement( element, CKEDITOR.START );
+541 					if ( startOfElement || endOfElement )
+542 					{
+543 						boundaryElement = element;
+544 						boundaryElement.match = startOfElement ? 'start' : 'end';
+545 					}
+546 					else
+547 					{
+548 						/*
+549 						 * Before removing the style node, there may be a sibling to the style node
+550 						 * that's exactly the same to the one to be removed. To the user, it makes
+551 						 * no difference that they're separate entities in the DOM tree. So, merge
+552 						 * them before removal.
+553 						 */
+554 						mergeSiblings( element );
+555 						removeFromElement( this, element );
+556
+557 					}
+558 				}
+559 			}
+560
+561 			// Re-create the style tree after/before the boundary element,
+562 			// the replication start from bookmark start node to define the
+563 			// new range.
+564 			if ( boundaryElement )
+565 			{
+566 				var clonedElement = startNode;
+567 				for ( i = 0 ;; i++ )
+568 				{
+569 					var newElement = startPath.elements[ i ];
+570 					if ( newElement.equals( boundaryElement ) )
+571 						break;
+572 					// Avoid copying any matched element.
+573 					else if( newElement.match )
+574 						continue;
+575 					else
+576 						newElement = newElement.clone();
+577 					newElement.append( clonedElement );
+578 					clonedElement = newElement;
+579 				}
+580 				clonedElement[ boundaryElement.match == 'start' ?
+581 							'insertBefore' : 'insertAfter' ]( boundaryElement );
+582 			}
+583 		}
+584 		else
+585 		{
+586 			/*
+587 			 * Now our range isn't collapsed. Lets walk from the start node to the end
+588 			 * node via DFS and remove the styles one-by-one.
+589 			 */
+590 			var endNode = bookmark.endNode,
+591 				me = this;
+592
+593 			/*
+594 			 * Find out the style ancestor that needs to be broken down at startNode
+595 			 * and endNode.
+596 			 */
+597 			function breakNodes()
+598 			{
+599 				var startPath = new CKEDITOR.dom.elementPath( startNode.getParent() ),
+600 					endPath = new CKEDITOR.dom.elementPath( endNode.getParent() ),
+601 					breakStart = null,
+602 					breakEnd = null;
+603 				for ( var i = 0 ; i < startPath.elements.length ; i++ )
+604 				{
+605 					var element = startPath.elements[ i ];
+606
+607 					if ( element == startPath.block || element == startPath.blockLimit )
+608 						break;
+609
+610 					if ( me.checkElementRemovable( element ) )
+611 						breakStart = element;
+612 				}
+613 				for ( i = 0 ; i < endPath.elements.length ; i++ )
+614 				{
+615 					element = endPath.elements[ i ];
+616
+617 					if ( element == endPath.block || element == endPath.blockLimit )
+618 						break;
+619
+620 					if ( me.checkElementRemovable( element ) )
+621 						breakEnd = element;
+622 				}
+623
+624 				if ( breakEnd )
+625 					endNode.breakParent( breakEnd );
+626 				if ( breakStart )
+627 					startNode.breakParent( breakStart );
+628 			}
+629 			breakNodes();
+630
+631 			// Now, do the DFS walk.
+632 			var currentNode = startNode.getNext();
+633 			while ( !currentNode.equals( endNode ) )
+634 			{
+635 				/*
+636 				 * Need to get the next node first because removeFromElement() can remove
+637 				 * the current node from DOM tree.
+638 				 */
+639 				var nextNode = currentNode.getNextSourceNode();
+640 				if ( currentNode.type == CKEDITOR.NODE_ELEMENT && this.checkElementRemovable( currentNode ) )
+641 				{
+642 					// Remove style from element or overriding element.
+643 					if( currentNode.getName() == this.element )
+644 						removeFromElement( this, currentNode );
+645 					else
+646 						removeOverrides( currentNode, getOverrides( this )[ currentNode.getName() ] );
+647
+648 					/*
+649 					 * removeFromElement() may have merged the next node with something before
+650 					 * the startNode via mergeSiblings(). In that case, the nextNode would
+651 					 * contain startNode and we'll have to call breakNodes() again and also
+652 					 * reassign the nextNode to something after startNode.
+653 					 */
+654 					if ( nextNode.type == CKEDITOR.NODE_ELEMENT && nextNode.contains( startNode ) )
+655 					{
+656 						breakNodes();
+657 						nextNode = startNode.getNext();
+658 					}
+659 				}
+660 				currentNode = nextNode;
+661 			}
+662 		}
+663
+664 		range.moveToBookmark( bookmark );
+665 	}
+666
+667 	function applyBlockStyle( range )
+668 	{
+669 		// Bookmark the range so we can re-select it after processing.
+670 		var bookmark = range.createBookmark();
+671
+672 		var iterator = range.createIterator();
+673 		iterator.enforceRealBlocks = true;
+674
+675 		var block;
+676 		var doc = range.document;
+677 		var previousPreBlock;
+678
+679 		while( ( block = iterator.getNextParagraph() ) )		// Only one =
+680 		{
+681 			// Create the new node right before the current one.
+682 			var newBlock = getElement( this, doc );
+683
+684 			// Check if we are changing from/to <pre>.
+685 //			var newBlockIsPre	= newBlock.nodeName.IEquals( 'pre' );
+686 //			var blockIsPre		= block.nodeName.IEquals( 'pre' );
+687
+688 //			var toPre	= newBlockIsPre && !blockIsPre;
+689 //			var fromPre	= !newBlockIsPre && blockIsPre;
+690
+691 			// Move everything from the current node to the new one.
+692 //			if ( toPre )
+693 //				newBlock = this._ToPre( doc, block, newBlock );
+694 //			else if ( fromPre )
+695 //				newBlock = this._FromPre( doc, block, newBlock );
+696 //			else	// Convering from a regular block to another regular block.
+697 				block.moveChildren( newBlock );
+698
+699 			// Replace the current block.
+700 			newBlock.insertBefore( block );
+701 			block.remove();
+702
+703 			// Complete other tasks after inserting the node in the DOM.
+704 //			if ( newBlockIsPre )
+705 //			{
+706 //				if ( previousPreBlock )
+707 //					this._CheckAndMergePre( previousPreBlock, newBlock ) ;	// Merge successive <pre> blocks.
+708 //				previousPreBlock = newBlock;
+709 //			}
+710 //			else if ( fromPre )
+711 //				this._CheckAndSplitPre( newBlock ) ;	// Split <br><br> in successive <pre>s.
+712 		}
+713
+714 		range.moveToBookmark( bookmark );
+715 	}
+716
+717 	// Removes a style from an element itself, don't care about its subtree.
+718 	function removeFromElement( style, element )
+719 	{
+720 		var def = style._.definition,
+721 			attributes = def.attributes,
+722 			styles = def.styles,
+723 			overrides = getOverrides( style );
+724
+725 		function removeAttrs()
+726 		{
+727 			for ( var attName in attributes )
+728 			{
+729 				// The 'class' element value must match (#1318).
+730 				if ( attName == 'class' && element.getAttribute( attName ) != attributes[ attName ] )
+731 					continue;
+732 				element.removeAttribute( attName );
+733 			}
+734 		}
+735
+736 		// Remove definition attributes/style from the elemnt.
+737 		removeAttrs();
+738 		for ( var styleName in styles )
+739 			element.removeStyle( styleName );
+740
+741 		// Now remove override styles on the element.
+742 		attributes = overrides[ element.getName() ];
+743 		if( attributes )
+744 			removeAttrs();
+745 		removeNoAttribsElement( element );
+746 	}
+747
+748 	// Removes a style from inside an element.
+749 	function removeFromInsideElement( style, element )
+750 	{
+751 		var def = style._.definition,
+752 			attribs = def.attributes,
+753 			styles = def.styles,
+754 			overrides = getOverrides( style );
+755
+756 		var innerElements = element.getElementsByTag( style.element );
+757
+758 		for ( var i = innerElements.count(); --i >= 0 ; )
+759 			removeFromElement( style,  innerElements.getItem( i ) );
+760
+761 		// Now remove any other element with different name that is
+762 		// defined to be overriden.
+763 		for ( var overrideElement in overrides )
+764 		{
+765 			if ( overrideElement != style.element )
+766 			{
+767 				innerElements = element.getElementsByTag( overrideElement ) ;
+768 				for ( i = innerElements.count() - 1 ; i >= 0 ; i-- )
+769 				{
+770 					var innerElement = innerElements.getItem( i );
+771 					removeOverrides( innerElement, overrides[ overrideElement ] ) ;
+772 				}
+773 			}
+774 		}
+775
+776 	}
+777
+778 	/**
+779 	 *  Remove overriding styles/attributes from the specific element.
+780 	 *  Note: Remove the element if no attributes remain.
+781 	 * @param {Object} element
+782 	 * @param {Object} overrides
+783 	 */
+784 	function removeOverrides( element, overrides )
+785 	{
+786 		var attributes = overrides && overrides.attributes ;
+787
+788 		if ( attributes )
+789 		{
+790 			for ( var i = 0 ; i < attributes.length ; i++ )
+791 			{
+792 				var attName = attributes[i][0], actualAttrValue ;
+793
+794 				if ( ( actualAttrValue = element.getAttribute( attName ) ) )
+795 				{
+796 					var attValue = attributes[i][1] ;
+797
+798 					// Remove the attribute if:
+799 					//    - The override definition value is null ;
+800 					//    - The override definition valie is a string that
+801 					//      matches the attribute value exactly.
+802 					//    - The override definition value is a regex that
+803 					//      has matches in the attribute value.
+804 					if ( attValue === null ||
+805 							( attValue.test && attValue.test( actualAttrValue ) ) ||
+806 							( typeof attValue == 'string' && actualAttrValue == attValue ) )
+807 						element.removeAttribute( attName ) ;
+808 				}
+809 			}
+810 		}
+811
+812 		removeNoAttribsElement( element );
+813 	}
+814
+815 	// If the element has no more attributes, remove it.
+816 	function removeNoAttribsElement( element )
+817 	{
+818 		// If no more attributes remained in the element, remove it,
+819 		// leaving its children.
+820 		if ( !element.hasAttributes() )
+821 		{
+822 			// Removing elements may open points where merging is possible,
+823 			// so let's cache the first and last nodes for later checking.
+824 			var firstChild	= element.getFirst();
+825 			var lastChild	= element.getLast();
+826
+827 			element.remove( true );
+828
+829 			if ( firstChild )
+830 			{
+831 				// Check the cached nodes for merging.
+832 				mergeSiblings( firstChild );
+833
+834 				if ( lastChild && !firstChild.equals( lastChild ) )
+835 					mergeSiblings( lastChild );
+836 			}
+837 		}
+838 	}
+839
+840 	function mergeSiblings( element )
+841 	{
+842 		if ( !element || element.type != CKEDITOR.NODE_ELEMENT || !CKEDITOR.dtd.$removeEmpty[ element.getName() ] )
+843 			return;
+844
+845 		mergeElements( element, element.getNext(), true );
+846 		mergeElements( element, element.getPrevious() );
+847 	}
+848
+849 	function mergeElements( element, sibling, isNext )
+850 	{
+851 		if ( sibling && sibling.type == CKEDITOR.NODE_ELEMENT )
+852 		{
+853 			var hasBookmark = sibling.getAttribute( '_fck_bookmark' );
+854
+855 			if ( hasBookmark )
+856 				sibling = isNext ? sibling.getNext() : sibling.getPrevious();
+857
+858 			if ( sibling && sibling.type == CKEDITOR.NODE_ELEMENT && element.isIdentical( sibling ) )
+859 			{
+860 				// Save the last child to be checked too, to merge things like
+861 				// <b><i></i></b><b><i></i></b> => <b><i></i></b>
+862 				var innerSibling = isNext ? element.getLast() : element.getFirst();
+863
+864 				if ( hasBookmark )
+865 					( isNext ? sibling.getPrevious() : sibling.getNext() ).move( element, !isNext );
+866
+867 				sibling.moveChildren( element, !isNext );
+868 				sibling.remove();
+869
+870 				// Now check the last inner child (see two comments above).
+871 				if ( innerSibling )
+872 					mergeSiblings( innerSibling );
+873 			}
+874 		}
+875 	}
+876
+877 	function getElement( style, targetDocument )
+878 	{
+879 		var el;
+880
+881 		var def = style._.definition;
+882
+883 		var elementName = style.element;
+884
+885 		// The "*" element name will always be a span for this function.
+886 		if ( elementName == '*' )
+887 			elementName = 'span';
+888
+889 		// Create the element.
+890 		el = new CKEDITOR.dom.element( elementName, targetDocument );
+891
+892 		return setupElement( el, style );
+893 	}
+894
+895 	function setupElement( el, style )
+896 	{
+897 		var def = style._.definition;
+898 		var attributes = def.attributes;
+899 		var styles = CKEDITOR.style.getStyleText( def );
+900
+901 		// Assign all defined attributes.
+902 		if ( attributes )
+903 		{
+904 			for ( var att in attributes )
+905 			{
+906 				el.setAttribute( att, attributes[ att ] );
+907 			}
+908 		}
+909
+910 		// Assign all defined styles.
+911 		if ( styles )
+912 			el.setAttribute( 'style', styles );
+913
+914 		return el;
+915 	}
+916
+917 	var varRegex = /#\((.+?)\)/g;
+918 	function replaceVariables( list, variablesValues )
+919 	{
+920 		for ( var item in list )
+921 		{
+922 			list[ item ] = list[ item ].replace( varRegex, function( match, varName )
+923 				{
+924 					return variablesValues[ varName ];
+925 				});
+926 		}
+927 	}
+928
+929
+930 	// Returns an object that can be used for style matching comparison.
+931 	// Attributes names and values are all lowercased, and the styles get
+932 	// merged with the style attribute.
+933 	function getAttributesForComparison( styleDefinition )
+934 	{
+935 		// If we have already computed it, just return it.
+936 		var attribs = styleDefinition._AC;
+937 		if ( attribs )
+938 			return attribs;
+939
+940 		attribs = {};
+941
+942 		var length = 0;
+943
+944 		// Loop through all defined attributes.
+945 		var styleAttribs = styleDefinition.attributes;
+946 		if ( styleAttribs )
+947 		{
+948 			for ( var styleAtt in styleAttribs )
+949 			{
+950 				length++;
+951 				attribs[ styleAtt ] = styleAttribs[ styleAtt ];
+952 			}
+953 		}
+954
+955 		// Includes the style definitions.
+956 		var styleText = CKEDITOR.style.getStyleText( styleDefinition );
+957 		if ( styleText )
+958 		{
+959 			if ( !attribs[ 'style' ] )
+960 				length++;
+961 			attribs[ 'style' ] = styleText;
+962 		}
+963
+964 		// Appends the "length" information to the object.
+965 		attribs._length = length;
+966
+967 		// Return it, saving it to the next request.
+968 		return ( styleDefinition._AC = attribs );
+969 	}
+970
+971 	/**
+972 	 * Get the the collection used to compare the elements and attributes,
+973 	 * defined in this style overrides, with other element. All information in
+974 	 * it is lowercased.
+975 	 * @param {CKEDITOR.style} style
+976 	 */
+977 	function getOverrides( style )
+978 	{
+979 		if( style._.overrides )
+980 			return style._.overrides;
+981
+982 		var overrides = ( style._.overrides = {} ),
+983 			definition = style._.definition.overrides;
+984
+985 		if ( definition )
+986 		{
+987 			// The override description can be a string, object or array.
+988 			// Internally, well handle arrays only, so transform it if needed.
+989 			if ( !CKEDITOR.tools.isArray( definition ) )
+990 				definition = [ definition ];
+991
+992 			// Loop through all override definitions.
+993 			for ( var i = 0 ; i < definition.length ; i++ )
+994 			{
+995 				var override = definition[i];
+996 				var elementName;
+997 				var overrideEl;
+998 				var attrs;
+999
+1000 				// If can be a string with the element name.
+1001 				if ( typeof override == 'string' )
+1002 					elementName = override.toLowerCase();
+1003 				// Or an object.
+1004 				else
+1005 				{
+1006 					elementName = override.element ? override.element.toLowerCase() : style.element;
+1007 					attrs = override.attributes;
+1008 				}
+1009
+1010 				// We can have more than one override definition for the same
+1011 				// element name, so we attempt to simply append information to
+1012 				// it if it already exists.
+1013 				overrideEl = overrides[ elementName ] || ( overrides[ elementName ] = {} );
+1014
+1015 				if ( attrs )
+1016 				{
+1017 					// The returning attributes list is an array, because we
+1018 					// could have different override definitions for the same
+1019 					// attribute name.
+1020 					var overrideAttrs = ( overrideEl.attributes = overrideEl.attributes || new Array() );
+1021 					for ( var attName in attrs )
+1022 					{
+1023 						// Each item in the attributes array is also an array,
+1024 						// where [0] is the attribute name and [1] is the
+1025 						// override value.
+1026 						overrideAttrs.push( [ attName.toLowerCase(), attrs[ attName ] ] );
+1027 					}
+1028 				}
+1029 			}
+1030 		}
+1031
+1032 		return overrides;
+1033 	}
+1034
+1035 	function normalizeCssText( unparsedCssText )
+1036 	{
+1037 		// Injects the style in a temporary span object, so the browser parses it,
+1038 		// retrieving its final format.
+1039 		var temp = new CKEDITOR.dom.element( 'span' );
+1040 		temp.setAttribute( 'style', unparsedCssText );
+1041 		return temp.getAttribute( 'style' );
+1042 	}
+1043
+1044 	function applyStyle( document, remove )
+1045 	{
+1046 		// Get all ranges from the selection.
+1047 		var selection = document.getSelection();
+1048 		var ranges = selection.getRanges();
+1049 		var func = remove ? this.removeFromRange : this.applyToRange;
+1050
+1051 		// Apply the style to the ranges.
+1052 		for ( var i = 0 ; i < ranges.length ; i++ )
+1053 			func.call( this, ranges[ i ] );
+1054
+1055 		// Select the ranges again.
+1056 		selection.selectRanges( ranges );
+1057 	}
+1058 })();
+1059
+1060 CKEDITOR.styleCommand = function( style )
+1061 {
+1062 	this.style = style;
+1063 };
+1064
+1065 CKEDITOR.styleCommand.prototype.exec = function( editor )
+1066 {
+1067 	editor.focus();
+1068
+1069 	var doc = editor.document;
+1070
+1071 	if ( doc )
+1072 	{
+1073 		if ( this.state == CKEDITOR.TRISTATE_OFF )
+1074 			this.style.apply( doc );
+1075 		else if ( this.state == CKEDITOR.TRISTATE_ON )
+1076 			this.style.remove( doc );
+1077 	}
+1078
+1079 	return !!doc;
+1080 };
+1081 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_stylescombo_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_stylescombo_plugin.js.html new file mode 100644 index 000000000..12840e321 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_stylescombo_plugin.js.html @@ -0,0 +1,283 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	CKEDITOR.plugins.add( 'stylescombo',
+  9 	{
+ 10 		requires : [ 'richcombo', 'styles' ],
+ 11
+ 12 		init : function( editor )
+ 13 		{
+ 14 			var config = editor.config,
+ 15 				lang = editor.lang.stylesCombo,
+ 16 				pluginPath = this.path,
+ 17 				styles;
+ 18
+ 19 			editor.ui.addRichCombo( 'Styles',
+ 20 				{
+ 21 					label : lang.label,
+ 22 					title : lang.panelTitle,
+ 23 					voiceLabel : lang.voiceLabel,
+ 24 					className : 'cke_styles',
+ 25 					multiSelect : true,
+ 26
+ 27 					panel :
+ 28 					{
+ 29 						css : [ config.contentsCss, CKEDITOR.getUrl( editor.skinPath + 'editor.css' ) ],
+ 30 						voiceLabel : lang.panelVoiceLabel
+ 31 					},
+ 32
+ 33 					init : function()
+ 34 					{
+ 35 						var combo = this,
+ 36 							stylesSet = config.stylesCombo_stylesSet.split( ':', 2 ),
+ 37 							stylesSetPath = stylesSet[ 1 ] || CKEDITOR.getUrl( pluginPath + 'styles/' + stylesSet[ 0 ] + '.js' ) ;
+ 38
+ 39 						stylesSet = stylesSet[ 0 ];
+ 40
+ 41 						CKEDITOR.loadStylesSet( stylesSet, stylesSetPath, function( stylesDefinitions )
+ 42 							{
+ 43 								var style,
+ 44 									styleName,
+ 45 									stylesList = [];
+ 46
+ 47 								styles = {};
+ 48
+ 49 								// Put all styles into an Array.
+ 50 								for ( var i = 0 ; i < stylesDefinitions.length ; i++ )
+ 51 								{
+ 52 									var styleDefinition = stylesDefinitions[ i ];
+ 53
+ 54 									styleName = styleDefinition.name;
+ 55
+ 56 									style = styles[ styleName ] = new CKEDITOR.style( styleDefinition );
+ 57 									style._name = styleName;
+ 58
+ 59 									stylesList.push( style );
+ 60 								}
+ 61
+ 62 								// Sorts the Array, so the styles get grouped
+ 63 								// by type.
+ 64 								stylesList.sort( sortStyles );
+ 65
+ 66 								// Loop over the Array, adding all items to the
+ 67 								// combo.
+ 68 								var lastType;
+ 69 								for ( i = 0 ; i < stylesList.length ; i++ )
+ 70 								{
+ 71 									style = stylesList[ i ];
+ 72 									styleName = style._name;
+ 73
+ 74 									var type = style.type;
+ 75
+ 76 									if ( type != lastType )
+ 77 									{
+ 78 										combo.startGroup( lang[ 'panelTitle' + String( type ) ] );
+ 79 										lastType = type;
+ 80 									}
+ 81
+ 82 									combo.add(
+ 83 										styleName,
+ 84 										style.type == CKEDITOR.STYLE_OBJECT ? styleName : buildPreview( style._.definition ),
+ 85 										styleName );
+ 86 								}
+ 87
+ 88 								combo.commit();
+ 89
+ 90 								combo.onOpen();
+ 91 							});
+ 92 					},
+ 93
+ 94 					onClick : function( value )
+ 95 					{
+ 96 						editor.focus();
+ 97 						editor.fire( 'saveSnapshot' );
+ 98
+ 99 						var style = styles[ value ],
+100 							selection = editor.getSelection();
+101
+102 						if ( style.type == CKEDITOR.STYLE_OBJECT )
+103 						{
+104 							var element = selection.getSelectedElement();
+105 							if ( element )
+106 								style.applyToObject( element );
+107
+108 							return;
+109 						}
+110
+111 						var elementPath = new CKEDITOR.dom.elementPath( selection.getStartElement() );
+112
+113 						if ( style.type == CKEDITOR.STYLE_INLINE && style.checkActive( elementPath ) )
+114 							style.remove( editor.document );
+115 						else
+116 							style.apply( editor.document );
+117
+118 						editor.fire( 'saveSnapshot' );
+119 					},
+120
+121 					onRender : function()
+122 					{
+123 						editor.on( 'selectionChange', function( ev )
+124 							{
+125 								var currentValue = this.getValue();
+126
+127 								var elementPath = ev.data.path,
+128 									elements = elementPath.elements;
+129
+130 								// For each element into the elements path.
+131 								for ( var i = 0, element ; i < elements.length ; i++ )
+132 								{
+133 									element = elements[i];
+134
+135 									// Check if the element is removable by any of
+136 									// the styles.
+137 									for ( var value in styles )
+138 									{
+139 										if ( styles[ value ].checkElementRemovable( element, true ) )
+140 										{
+141 											if ( value != currentValue )
+142 												this.setValue( value );
+143 											return;
+144 										}
+145 									}
+146 								}
+147
+148 								// If no styles match, just empty it.
+149 								this.setValue( '' );
+150 							},
+151 							this);
+152 					},
+153
+154 					onOpen : function()
+155 					{
+156 						if ( CKEDITOR.env.ie )
+157 							editor.focus();
+158
+159 						var selection = editor.getSelection();
+160
+161 						var element = selection.getSelectedElement(),
+162 							elementName = element && element.getName(),
+163 							elementPath = new CKEDITOR.dom.elementPath( element || selection.getStartElement() );
+164
+165 						var counter = [ 0, 0, 0, 0 ];
+166 						this.showAll();
+167 						this.unmarkAll();
+168 						for ( var name in styles )
+169 						{
+170 							var style = styles[ name ],
+171 								type = style.type;
+172
+173 							if ( type == CKEDITOR.STYLE_OBJECT )
+174 							{
+175 								if ( element && style.element == elementName )
+176 								{
+177 									if ( style.checkElementRemovable( element, true ) )
+178 										this.mark( name );
+179
+180 									counter[ type ]++;
+181 								}
+182 								else
+183 									this.hideItem( name );
+184 							}
+185 							else
+186 							{
+187 								if ( style.checkActive( elementPath ) )
+188 									this.mark( name );
+189
+190 								counter[ type ]++;
+191 							}
+192 						}
+193
+194 						if ( !counter[ CKEDITOR.STYLE_BLOCK ] )
+195 							this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_BLOCK ) ] );
+196
+197 						if ( !counter[ CKEDITOR.STYLE_INLINE ] )
+198 							this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_INLINE ) ] );
+199
+200 						if ( !counter[ CKEDITOR.STYLE_OBJECT ] )
+201 							this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_OBJECT ) ] );
+202 					}
+203 				});
+204 		}
+205 	});
+206
+207 	var stylesSets = {};
+208
+209 	CKEDITOR.addStylesSet = function( name, styles )
+210 	{
+211 		stylesSets[ name ] = styles;
+212 	};
+213
+214 	CKEDITOR.loadStylesSet = function( name, url, callback )
+215 	{
+216 		var stylesSet = stylesSets[ name ];
+217
+218 		if ( stylesSet )
+219 		{
+220 			callback( stylesSet );
+221 			return ;
+222 		}
+223
+224 		CKEDITOR.scriptLoader.load( url, function()
+225 			{
+226 				callback( stylesSets[ name ] );
+227 			});
+228 	};
+229
+230 	function buildPreview( styleDefinition )
+231 	{
+232 		var html = [];
+233
+234 		var elementName = styleDefinition.element;
+235
+236 		// Avoid <bdo> in the preview.
+237 		if ( elementName == 'bdo' )
+238 			elementName = 'span';
+239
+240 		html = [ '<', elementName ];
+241
+242 		// Assign all defined attributes.
+243 		var attribs	= styleDefinition.attributes;
+244 		if ( attribs )
+245 		{
+246 			for ( var att in attribs )
+247 			{
+248 				html.push( ' ', att, '="', attribs[ att ], '"' );
+249 			}
+250 		}
+251
+252 		// Assign the style attribute.
+253 		var cssStyle = CKEDITOR.style.getStyleText( styleDefinition );
+254 		if ( cssStyle )
+255 			html.push( ' style="', cssStyle, '"' );
+256
+257 		html.push( '>', styleDefinition.name, '</', elementName, '>' );
+258
+259 		return html.join( '' );
+260 	}
+261
+262 	function sortStyles( styleA, styleB )
+263 	{
+264 		var typeA = styleA.type,
+265 			typeB = styleB.type;
+266
+267 		return typeA == typeB ? 0 :
+268 			typeA == CKEDITOR.STYLE_OBJECT ? -1 :
+269 			typeB == CKEDITOR.STYLE_OBJECT ? 1 :
+270 			typeB == CKEDITOR.STYLE_BLOCK ? 1 :
+271 			-1;
+272 	}
+273 })();
+274
+275 CKEDITOR.config.stylesCombo_stylesSet = 'default';
+276 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_stylescombo_styles_default.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_stylescombo_styles_default.js.html new file mode 100644 index 000000000..3b563277e --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_stylescombo_styles_default.js.html @@ -0,0 +1,93 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.addStylesSet( 'default',
+  7 [
+  8 	/* Block Styles */
+  9
+ 10 	// These styles are already available in the "Format" combo, so they are
+ 11 	// not needed here by default. You may enable them to avoid placing the
+ 12 	// "Format" combo in the toolbar, maintaining the same features.
+ 13 	/*
+ 14 	{ name : 'Paragraph'		, element : 'p' },
+ 15 	{ name : 'Heading 1'		, element : 'h1' },
+ 16 	{ name : 'Heading 2'		, element : 'h2' },
+ 17 	{ name : 'Heading 3'		, element : 'h3' },
+ 18 	{ name : 'Heading 4'		, element : 'h4' },
+ 19 	{ name : 'Heading 5'		, element : 'h5' },
+ 20 	{ name : 'Heading 6'		, element : 'h6' },
+ 21 	{ name : 'Preformatted Text', element : 'pre' },
+ 22 	{ name : 'Address'			, element : 'address' },
+ 23 	*/
+ 24
+ 25 	{ name : 'Blue Title'		, element : 'h3', styles : { 'color' : 'Blue' } },
+ 26 	{ name : 'Red Title'		, element : 'h3', styles : { 'color' : 'Red' } },
+ 27
+ 28 	/* Inline Styles */
+ 29
+ 30 	// These are core styles available as toolbar buttons. You may opt enabling
+ 31 	// some of them in the Styles combo, removing them from the toolbar.
+ 32 	/*
+ 33 	{ name : 'Strong'			, element : 'strong', overrides : 'b' },
+ 34 	{ name : 'Emphasis'			, element : 'em'	, overrides : 'i' },
+ 35 	{ name : 'Underline'		, element : 'u' },
+ 36 	{ name : 'Strikethrough'	, element : 'strike' },
+ 37 	{ name : 'Subscript'		, element : 'sub' },
+ 38 	{ name : 'Superscript'		, element : 'sup' },
+ 39 	*/
+ 40
+ 41 	{ name : 'Marker: Yellow'	, element : 'span', styles : { 'background-color' : 'Yellow' } },
+ 42 	{ name : 'Marker: Green'	, element : 'span', styles : { 'background-color' : 'Lime' } },
+ 43
+ 44 	{ name : 'Big'				, element : 'big' },
+ 45 	{ name : 'Small'			, element : 'small' },
+ 46 	{ name : 'Typewriter'		, element : 'tt' },
+ 47
+ 48 	{ name : 'Computer Code'	, element : 'code' },
+ 49 	{ name : 'Keyboard Phrase'	, element : 'kbd' },
+ 50 	{ name : 'Sample Text'		, element : 'samp' },
+ 51 	{ name : 'Variable'			, element : 'var' },
+ 52
+ 53 	{ name : 'Deleted Text'		, element : 'del' },
+ 54 	{ name : 'Inserted Text'	, element : 'ins' },
+ 55
+ 56 	{ name : 'Cited Work'		, element : 'cite' },
+ 57 	{ name : 'Inline Quotation'	, element : 'q' },
+ 58
+ 59 	{ name : 'Language: RTL'	, element : 'span', attributes : { 'dir' : 'rtl' } },
+ 60 	{ name : 'Language: LTR'	, element : 'span', attributes : { 'dir' : 'ltr' } },
+ 61
+ 62 	/* Object Styles */
+ 63
+ 64 	{
+ 65 		name : 'Image on Left',
+ 66 		element : 'img',
+ 67 		attributes :
+ 68 		{
+ 69 			'style' : 'padding: 5px; margin-right: 5px',
+ 70 			'border' : '2',
+ 71 			'align' : 'left'
+ 72 		}
+ 73 	},
+ 74
+ 75 	{
+ 76 		name : 'Image on Right',
+ 77 		element : 'img',
+ 78 		attributes :
+ 79 		{
+ 80 			'style' : 'padding: 5px; margin-left: 5px',
+ 81 			'border' : '2',
+ 82 			'align' : 'right'
+ 83 		}
+ 84 	}
+ 85 ]);
+ 86 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tab_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tab_plugin.js.html new file mode 100644 index 000000000..d0f44d5fc --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tab_plugin.js.html @@ -0,0 +1,274 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	var blurCommand =
+  9 		{
+ 10 			exec : function( editor )
+ 11 			{
+ 12 				editor.container.focusNext( true );
+ 13 			}
+ 14 		};
+ 15
+ 16 	var blurBackCommand =
+ 17 		{
+ 18 			exec : function( editor )
+ 19 			{
+ 20 				editor.container.focusPrevious( true );
+ 21 			}
+ 22 		};
+ 23
+ 24 	CKEDITOR.plugins.add( 'tab',
+ 25 	{
+ 26 		requires : [ 'keystrokes' ],
+ 27
+ 28 		init : function( editor )
+ 29 		{
+ 30 			// Register the keystrokes.
+ 31 			var keystrokes = editor.keystrokeHandler.keystrokes;
+ 32 			keystrokes[ 9 /* TAB */ ] = 'tab';
+ 33 			keystrokes[ CKEDITOR.SHIFT + 9 /* TAB */ ] = 'shiftTab';
+ 34
+ 35 			var tabSpaces = editor.config.tabSpaces,
+ 36 				tabText = '';
+ 37
+ 38 			while ( tabSpaces-- )
+ 39 				tabText += '\xa0';
+ 40
+ 41 			// Register the "tab" and "shiftTab" commands.
+ 42 			editor.addCommand( 'tab',
+ 43 				{
+ 44 					exec : function( editor )
+ 45 					{
+ 46 						// Fire the "tab" event, making it possible to
+ 47 						// customize the TAB key behavior on specific cases.
+ 48 						if ( !editor.fire( 'tab' ) )
+ 49 						{
+ 50 							if ( tabText.length > 0 )
+ 51 								editor.insertHtml( tabText );
+ 52 							else
+ 53 							{
+ 54 								// All browsers jump to the next field on TAB,
+ 55 								// except Safari, so we have to do that manually
+ 56 								// here.
+ 57 								/// https://bugs.webkit.org/show_bug.cgi?id=20597
+ 58 								return editor.execCommand( 'blur' );
+ 59 							}
+ 60 						}
+ 61
+ 62 						return true;
+ 63 					}
+ 64 				});
+ 65
+ 66 			editor.addCommand( 'shiftTab',
+ 67 				{
+ 68 					exec : function( editor )
+ 69 					{
+ 70 						// Fire the "tab" event, making it possible to
+ 71 						// customize the TAB key behavior on specific cases.
+ 72 						if ( !editor.fire( 'shiftTab' ) )
+ 73 							return editor.execCommand( 'blurBack' );
+ 74
+ 75 						return true;
+ 76 					}
+ 77 				});
+ 78
+ 79 			editor.addCommand( 'blur', blurCommand );
+ 80 			editor.addCommand( 'blurBack', blurBackCommand );
+ 81 		}
+ 82 	});
+ 83 })();
+ 84
+ 85 /**
+ 86  * Moves the UI focus to the element following this element in the tabindex
+ 87  * order.
+ 88  * @example
+ 89  * var element = CKEDITOR.document.getById( 'example' );
+ 90  * element.focusNext();
+ 91  */
+ 92 CKEDITOR.dom.element.prototype.focusNext = function( ignoreChildren )
+ 93 {
+ 94 	var $ = this.$,
+ 95 		curTabIndex = this.getTabIndex(),
+ 96 		passedCurrent, enteredCurrent,
+ 97 		elected, electedTabIndex,
+ 98 		element, elementTabIndex;
+ 99
+100 	if ( curTabIndex <= 0 )
+101 	{
+102 		// If this element has tabindex <= 0 then we must simply look for any
+103 		// element following it containing tabindex=0.
+104
+105 		element = this.getNextSourceNode( ignoreChildren, CKEDITOR.NODE_ELEMENT );
+106
+107 		while( element )
+108 		{
+109 			if ( element.isVisible() && element.getTabIndex() === 0 )
+110 			{
+111 				elected = element;
+112 				break;
+113 			}
+114
+115 			element = element.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT );
+116 		}
+117 	}
+118 	else
+119 	{
+120 		// If this element has tabindex > 0 then we must look for:
+121 		//		1. An element following this element with the same tabindex.
+122 		//		2. The first element in source other with the lowest tabindex
+123 		//		   that is higher than this element tabindex.
+124 		//		3. The first element with tabindex=0.
+125
+126 		element = this.getDocument().getBody().getFirst();
+127
+128 		while( ( element = element.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT ) ) )
+129 		{
+130 			if ( !passedCurrent )
+131 			{
+132 				if ( !enteredCurrent && element.equals( this ) )
+133 				{
+134 					enteredCurrent = true;
+135
+136 					// Ignore this element, if required.
+137 					if ( ignoreChildren )
+138 					{
+139 						if ( !( element = element.getNextSourceNode( true, CKEDITOR.NODE_ELEMENT ) ) )
+140 							break;
+141 						passedCurrent = 1;
+142 					}
+143 				}
+144 				else if ( enteredCurrent && !this.contains( element ) )
+145 					passedCurrent = 1;
+146 			}
+147
+148 			if ( !element.isVisible() || ( elementTabIndex = element.getTabIndex() ) < 0 )
+149 				continue;
+150
+151 			if ( passedCurrent && elementTabIndex == curTabIndex )
+152 			{
+153 				elected = element;
+154 				break;
+155 			}
+156
+157 			if ( elementTabIndex > curTabIndex && ( !elected || !electedTabIndex || elementTabIndex < electedTabIndex ) )
+158 			{
+159 				elected = element;
+160 				electedTabIndex = elementTabIndex;
+161 			}
+162 			else if ( !elected && elementTabIndex === 0 )
+163 			{
+164 				elected = element;
+165 				electedTabIndex = elementTabIndex;
+166 			}
+167 		}
+168 	}
+169
+170 	if ( elected )
+171 		elected.focus();
+172 };
+173
+174 /**
+175  * Moves the UI focus to the element before this element in the tabindex order.
+176  * @example
+177  * var element = CKEDITOR.document.getById( 'example' );
+178  * element.focusPrevious();
+179  */
+180 CKEDITOR.dom.element.prototype.focusPrevious = function( ignoreChildren )
+181 {
+182 	var $ = this.$,
+183 		curTabIndex = this.getTabIndex(),
+184 		passedCurrent, enteredCurrent,
+185 		elected,
+186 		electedTabIndex = 0,
+187 		elementTabIndex;
+188
+189 	var element = this.getDocument().getBody().getLast();
+190
+191 	while( ( element = element.getPreviousSourceNode( false, CKEDITOR.NODE_ELEMENT ) ) )
+192 	{
+193 		if ( !passedCurrent )
+194 		{
+195 			if ( !enteredCurrent && element.equals( this ) )
+196 			{
+197 				enteredCurrent = true;
+198
+199 				// Ignore this element, if required.
+200 				if ( ignoreChildren )
+201 				{
+202 					if ( !( element = element.getPreviousSourceNode( true, CKEDITOR.NODE_ELEMENT ) ) )
+203 						break;
+204 					passedCurrent = 1;
+205 				}
+206 			}
+207 			else if ( enteredCurrent && !this.contains( element ) )
+208 				passedCurrent = 1;
+209 		}
+210
+211 		if ( !element.isVisible() || ( elementTabIndex = element.getTabIndex() ) < 0 )
+212 			continue;
+213
+214 		if ( curTabIndex <= 0 )
+215 		{
+216 			// If this element has tabindex <= 0 then we must look for:
+217 			//		1. An element before this one containing tabindex=0.
+218 			//		2. The last element with the highest tabindex.
+219
+220 			if ( passedCurrent && elementTabIndex === 0 )
+221 			{
+222 				elected = element;
+223 				break;
+224 			}
+225
+226 			if ( elementTabIndex > electedTabIndex )
+227 			{
+228 				elected = element;
+229 				electedTabIndex = elementTabIndex;
+230 			}
+231 		}
+232 		else
+233 		{
+234 			// If this element has tabindex > 0 we must look for:
+235 			//		1. An element preceeding this one, with the same tabindex.
+236 			//		2. The last element in source other with the highest tabindex
+237 			//		   that is lower than this element tabindex.
+238
+239 			if ( passedCurrent && elementTabIndex == curTabIndex )
+240 			{
+241 				elected = element;
+242 				break;
+243 			}
+244
+245 			if ( elementTabIndex < curTabIndex && ( !elected || elementTabIndex > electedTabIndex ) )
+246 			{
+247 				elected = element;
+248 				electedTabIndex = elementTabIndex;
+249 			}
+250 		}
+251 	}
+252
+253 	if ( elected )
+254 		elected.focus();
+255 };
+256
+257 /**
+258  * Intructs the editor to add a number of spaces (&nbsp;) to the text when
+259  * hitting the TAB key. If set to zero, the TAB key will have its default
+260  * behavior instead (like moving out of the editor).
+261  * @type {Number}
+262  * @default 0
+263  * @example
+264  * config.tabSpaces = 4;
+265  */
+266 CKEDITOR.config.tabSpaces = 0 ;
+267 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_table_dialogs_table.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_table_dialogs_table.js.html new file mode 100644 index 000000000..9c53ec596 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_table_dialogs_table.js.html @@ -0,0 +1,558 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	var widthPattern = /^(\d+(?:\.\d+)?)(px|%)$/,
+  9 		heightPattern = /^(\d+(?:\.\d+)?)px$/;
+ 10
+ 11 	var commitValue = function( data )
+ 12 	{
+ 13 		var id = this.id;
+ 14 		if ( !data.info )
+ 15 			data.info = {};
+ 16 		data.info[id] = this.getValue();
+ 17 	};
+ 18
+ 19 	function tableDialog( editor, command )
+ 20 	{
+ 21 		var makeElement = function( name ){ return new CKEDITOR.dom.element( name, editor.document ); };
+ 22
+ 23 		return {
+ 24 			title : editor.lang.table.title,
+ 25 			minWidth : 310,
+ 26 			minHeight : CKEDITOR.env.ie ? 310 : 280,
+ 27 			onShow : function()
+ 28 			{
+ 29 				// Detect if there's a selected table.
+ 30 				var selection = editor.getSelection(),
+ 31 					ranges = selection.getRanges(),
+ 32 					selectedTable = null;
+ 33
+ 34 				var rowsInput = this.getContentElement( 'info', 'txtRows' ),
+ 35 					colsInput = this.getContentElement( 'info', 'txtCols' ),
+ 36 					widthInput = this.getContentElement( 'info', 'txtWidth' );
+ 37 				if ( command == 'tableProperties' )
+ 38 				{
+ 39 					if ( ( selectedTable = editor.getSelection().getSelectedElement() ) )
+ 40 					{
+ 41 						if ( selectedTable.getName() != 'table' )
+ 42 							selectedTable = null;
+ 43 					}
+ 44 					else if ( ranges.length > 0 )
+ 45 					{
+ 46 						var rangeRoot = ranges[0].getCommonAncestor( true );
+ 47 						selectedTable = rangeRoot.getAscendant( 'table', true );
+ 48 					}
+ 49
+ 50 					// Save a reference to the selected table, and push a new set of default values.
+ 51 					this._.selectedElement = selectedTable;
+ 52 				}
+ 53
+ 54 				// Enable, disable and select the row, cols, width fields.
+ 55 				if ( selectedTable )
+ 56 				{
+ 57 					this.setupContent( selectedTable );
+ 58 					rowsInput && rowsInput.disable();
+ 59 					colsInput && colsInput.disable();
+ 60 					widthInput && widthInput.select();
+ 61 				}
+ 62 				else
+ 63 				{
+ 64 					rowsInput && rowsInput.enable();
+ 65 					colsInput && colsInput.enable();
+ 66 					rowsInput && rowsInput.select();
+ 67 				}
+ 68 			},
+ 69 			onOk : function()
+ 70 			{
+ 71 				var table = this._.selectedElement || makeElement( 'table' ),
+ 72 					me = this,
+ 73 					data = {};
+ 74
+ 75 				this.commitContent( data, table );
+ 76
+ 77 				if ( data.info )
+ 78 				{
+ 79 					var info = data.info;
+ 80
+ 81 					// Generate the rows and cols.
+ 82 					if ( !this._.selectedElement )
+ 83 					{
+ 84 						var tbody = table.append( makeElement( 'tbody' ) ),
+ 85 							rows = parseInt( info.txtRows, 10 ) || 0,
+ 86 							cols = parseInt( info.txtCols, 10 ) || 0;
+ 87
+ 88 						for ( var i = 0 ; i < rows ; i++ )
+ 89 						{
+ 90 							var row = tbody.append( makeElement( 'tr' ) );
+ 91 							for ( var j = 0 ; j < cols ; j++ )
+ 92 							{
+ 93 								var cell = row.append( makeElement( 'td' ) );
+ 94 								if ( !CKEDITOR.env.ie )
+ 95 									cell.append( makeElement( 'br' ) );
+ 96 							}
+ 97 						}
+ 98 					}
+ 99
+100 					// Modify the table headers. Depends on havint rows and cols generated
+101 					// correctly so it can't be done in commit functions.
+102
+103 					// Should we make a <thead>?
+104 					var headers = info.selHeaders;
+105 					if ( !table.$.tHead && ( headers == 'row' || headers == 'both' ) )
+106 					{
+107 						var thead = new CKEDITOR.dom.element( table.$.createTHead() );
+108 						tbody = table.getElementsByTag( 'tbody' ).getItem( 0 );
+109 						var theRow = tbody.getElementsByTag( 'tr' ).getItem( 0 );
+110
+111 						// Change TD to TH:
+112 						for ( i = 0 ; i < theRow.getChildCount() ; i++ )
+113 						{
+114 							var th = theRow.getChild( i );
+115 							if ( th.type == CKEDITOR.NODE_ELEMENT )
+116 							{
+117 								th.renameNode( 'th' );
+118 								if ( !i )
+119 									th.setAttribute( 'scope', 'col' );
+120 							}
+121 						}
+122 						thead.append( theRow.remove() );
+123 					}
+124
+125 					if ( table.$.tHead !== null && !( headers == 'row' || headers == 'both' ) )
+126 					{
+127 						// Move the row out of the THead and put it in the TBody:
+128 						thead = new CKEDITOR.dom.element( table.$.tHead );
+129 						tbody = table.getElementsByTag( 'tbody' ).getItem( 0 );
+130
+131 						var previousFirstRow = tbody.getFirst();
+132 						while ( thead.getChildCount() > 0 )
+133 						{
+134 							theRow = thead.getFirst();
+135 							for ( i = 0; i < theRow.getChildCount() ; i++ )
+136 							{
+137 								var newCell = theRow.getChild( i );
+138 								if ( newCell.type == CKEDITOR.NODE_ELEMENT )
+139 								{
+140 									newCell.renameNode( 'td' );
+141 									newCell.removeAttribute( 'scope' );
+142 								}
+143 							}
+144 							theRow.insertBefore( previousFirstRow );
+145 						}
+146 						thead.remove();
+147 					}
+148
+149 					// Should we make all first cells in a row TH?
+150 					if ( !this.hasColumnHeaders && ( headers == 'col' || headers == 'both' ) )
+151 					{
+152 						for( row = 0 ; row < table.$.rows.length ; row++ )
+153 						{
+154 							newCell = new CKEDITOR.dom.element( table.$.rows[ row ].cells[ 0 ] );
+155 							newCell.renameNode( 'th' );
+156 							newCell.setAttribute( 'scope', 'col' );
+157 						}
+158 					}
+159
+160 					// Should we make all first TH-cells in a row make TD? If 'yes' we do it the other way round :-)
+161 					if ( ( this.hasColumnHeaders ) && !( headers == 'col' || headers == 'both' ) )
+162 					{
+163 						for( i = 0 ; i < table.$.rows.length ; i++ )
+164 						{
+165 							row = new CKEDITOR.dom.element( table.$.rows[i] );
+166 							if ( row.getParent().getName() == 'tbody' )
+167 							{
+168 								newCell = new CKEDITOR.dom.element( row.$.cells[0] );
+169 								newCell.renameNode( 'td');
+170 								newCell.removeAttribute( 'scope' );
+171 							}
+172 						}
+173 					}
+174
+175 					// Set the width and height.
+176 					var styles = [];
+177 					if ( info.txtHeight )
+178 						styles.push( 'height:' + info.txtHeight + 'px' );
+179 					if ( info.txtWidth )
+180 					{
+181 						var type = info.cmbWidthType || 'pixels';
+182 						styles.push( 'width:' + info.txtWidth + ( type == 'pixels' ? 'px' : '%' ) );
+183 					}
+184 					styles = styles.join( ';' );
+185 					if ( styles )
+186 						table.$.style.cssText = styles;
+187 					else
+188 						table.removeAttribute( 'style' );
+189 				}
+190
+191 				// Insert the table element if we're creating one.
+192 				if ( !this._.selectedElement )
+193 					editor.insertElement( table );
+194
+195 				return true;
+196 			},
+197 			contents : [
+198 				{
+199 					id : 'info',
+200 					label : editor.lang.table.title,
+201 					elements :
+202 					[
+203 						{
+204 							type : 'hbox',
+205 							widths : [ null, null ],
+206 							styles : [ 'vertical-align:top' ],
+207 							children :
+208 							[
+209 								{
+210 									type : 'vbox',
+211 									padding : 0,
+212 									children :
+213 									[
+214 										{
+215 											type : 'text',
+216 											id : 'txtRows',
+217 											'default' : 3,
+218 											label : editor.lang.table.rows,
+219 											style : 'width:5em',
+220 											validate : function()
+221 											{
+222 												var pass = true,
+223 													value = this.getValue();
+224 												pass = pass && CKEDITOR.dialog.validate.integer()( value )
+225 													&& value > 0;
+226 												if ( !pass )
+227 												{
+228 													alert( editor.lang.table.invalidRows );
+229 													this.select();
+230 												}
+231 												return pass;
+232 											},
+233 											setup : function( selectedElement )
+234 											{
+235 												this.setValue( selectedElement.$.rows.length );
+236 											},
+237 											commit : commitValue
+238 										},
+239 										{
+240 											type : 'text',
+241 											id : 'txtCols',
+242 											'default' : 2,
+243 											label : editor.lang.table.columns,
+244 											style : 'width:5em',
+245 											validate : function()
+246 											{
+247 												var pass = true,
+248 													value = this.getValue();
+249 												pass = pass && CKEDITOR.dialog.validate.integer()( value )
+250 													&& value > 0;
+251 												if ( !pass )
+252 												{
+253 													alert( editor.lang.table.invalidCols );
+254 													this.select();
+255 												}
+256 												return pass;
+257 											},
+258 											setup : function( selectedTable )
+259 											{
+260 												this.setValue( selectedTable.$.rows[0].cells.length);
+261 											},
+262 											commit : commitValue
+263 										},
+264 										{
+265 											type : 'html',
+266 											html : ' '
+267 										},
+268 										{
+269 											type : 'select',
+270 											id : 'selHeaders',
+271 											'default' : '',
+272 											label : editor.lang.table.headers,
+273 											items :
+274 											[
+275 												[ editor.lang.table.headersNone, '' ],
+276 												[ editor.lang.table.headersRow, 'row' ],
+277 												[ editor.lang.table.headersColumn, 'col' ],
+278 												[ editor.lang.table.headersBoth, 'both' ]
+279 											],
+280 											setup : function( selectedTable )
+281 											{
+282 												// Fill in the headers field.
+283 												var dialog = this.getDialog();
+284 												dialog.hasColumnHeaders = true;
+285
+286 												// Check if all the first cells in every row are TH
+287 												for ( var row = 0 ; row < selectedTable.$.rows.length ; row++ )
+288 												{
+289 													// If just one cell isn't a TH then it isn't a header column
+290 													if ( selectedTable.$.rows[row].cells[0].nodeName.toLowerCase() != 'th' )
+291 													{
+292 														dialog.hasColumnHeaders = false;
+293 														break;
+294 													}
+295 												}
+296
+297 												// Check if the table contains <thead>.
+298 												if ( ( selectedTable.$.tHead !== null) )
+299 													this.setValue( dialog.hasColumnHeaders ? 'both' : 'row' );
+300 												else
+301 													this.setValue( dialog.hasColumnHeaders ? 'col' : '' );
+302 											},
+303 											commit : commitValue
+304 										},
+305 										{
+306 											type : 'text',
+307 											id : 'txtBorder',
+308 											'default' : 1,
+309 											label : editor.lang.table.border,
+310 											style : 'width:3em',
+311 											validate : CKEDITOR.dialog.validate['number']( editor.lang.table.invalidBorder ),
+312 											setup : function( selectedTable )
+313 											{
+314 												this.setValue( selectedTable.getAttribute( 'border' ) || '' );
+315 											},
+316 											commit : function( data, selectedTable )
+317 											{
+318 												if ( this.getValue() )
+319 													selectedTable.setAttribute( 'border', this.getValue() );
+320 												else
+321 													selectedTable.removeAttribute( 'border' );
+322 											}
+323 										},
+324 										{
+325 											id : 'cmbAlign',
+326 											type : 'select',
+327 											'default' : '',
+328 											label : editor.lang.table.align,
+329 											items :
+330 											[
+331 												[ editor.lang.table.alignNotSet , ''],
+332 												[ editor.lang.table.alignLeft , 'left'],
+333 												[ editor.lang.table.alignCenter , 'center'],
+334 												[ editor.lang.table.alignRight , 'right']
+335 											],
+336 											setup : function( selectedTable )
+337 											{
+338 												this.setValue( selectedTable.getAttribute( 'align' ) || '' );
+339 											},
+340 											commit : function( data, selectedTable )
+341 											{
+342 												if ( this.getValue() )
+343 													selectedTable.setAttribute( 'align', this.getValue() );
+344 												else
+345 													selectedTable.removeAttribute( 'align' );
+346 											}
+347 										}
+348 									]
+349 								},
+350 								{
+351 									type : 'vbox',
+352 									padding : 0,
+353 									children :
+354 									[
+355 										{
+356 											type : 'hbox',
+357 											widths : [ '5em' ],
+358 											children :
+359 											[
+360 												{
+361 													type : 'text',
+362 													id : 'txtWidth',
+363 													style : 'width:5em',
+364 													label : editor.lang.table.width,
+365 													'default' : 200,
+366 													validate : CKEDITOR.dialog.validate['number']( editor.lang.table.invalidWidth ),
+367 													setup : function( selectedTable )
+368 													{
+369 														var widthMatch = widthPattern.exec( selectedTable.$.style.width );
+370 														if ( widthMatch )
+371 															this.setValue( widthMatch[1] );
+372 													},
+373 													commit : commitValue
+374 												},
+375 												{
+376 													id : 'cmbWidthType',
+377 													type : 'select',
+378 													label : ' ',
+379 													'default' : 'pixels',
+380 													items :
+381 													[
+382 														[ editor.lang.table.widthPx , 'pixels'],
+383 														[ editor.lang.table.widthPc , 'percents']
+384 													],
+385 													setup : function( selectedTable )
+386 													{
+387 														var widthMatch = widthPattern.exec( selectedTable.$.style.width );
+388 														if ( widthMatch )
+389 															this.setValue( widthMatch[2] == 'px' ? 'pixels' : 'percents' );
+390 													},
+391 													commit : commitValue
+392 												}
+393 											]
+394 										},
+395 										{
+396 											type : 'hbox',
+397 											widths : [ '5em' ],
+398 											children :
+399 											[
+400 												{
+401 													type : 'text',
+402 													id : 'txtHeight',
+403 													style : 'width:5em',
+404 													label : editor.lang.table.height,
+405 													'default' : '',
+406 													validate : CKEDITOR.dialog.validate['number']( editor.lang.table.invalidHeight ),
+407 													setup : function( selectedTable )
+408 													{
+409 														var heightMatch = heightPattern.exec( selectedTable.$.style.height );
+410 														if ( heightMatch )
+411 															this.setValue( heightMatch[1] );
+412 													},
+413 													commit : commitValue
+414 												},
+415 												{
+416 													type : 'html',
+417 													html : '<br />' + editor.lang.table.widthPx
+418 												}
+419 											]
+420 										},
+421 										{
+422 											type : 'html',
+423 											html : ' '
+424 										},
+425 										{
+426 											type : 'text',
+427 											id : 'txtCellSpace',
+428 											style : 'width:3em',
+429 											label : editor.lang.table.cellSpace,
+430 											'default' : 1,
+431 											validate : CKEDITOR.dialog.validate['number']( editor.lang.table.invalidCellSpacing ),
+432 											setup : function( selectedTable )
+433 											{
+434 												this.setValue( selectedTable.getAttribute( 'cellSpacing' ) || '' );
+435 											},
+436 											commit : function( data, selectedTable )
+437 											{
+438 												if ( this.getValue() )
+439 													selectedTable.setAttribute( 'cellSpacing', this.getValue() );
+440 												else
+441 													selectedTable.removeAttribute( 'cellSpacing' );
+442 											}
+443 										},
+444 										{
+445 											type : 'text',
+446 											id : 'txtCellPad',
+447 											style : 'width:3em',
+448 											label : editor.lang.table.cellPad,
+449 											'default' : 1,
+450 											validate : CKEDITOR.dialog.validate['number']( editor.lang.table.invalidCellPadding ),
+451 											setup : function( selectedTable )
+452 											{
+453 												this.setValue( selectedTable.getAttribute( 'cellPadding' ) || '' );
+454 											},
+455 											commit : function( data, selectedTable )
+456 											{
+457 												if ( this.getValue() )
+458 													selectedTable.setAttribute( 'cellPadding', this.getValue() );
+459 												else
+460 													selectedTable.removeAttribute( 'cellPadding' );
+461 											}
+462 										}
+463 									]
+464 								}
+465 							]
+466 						},
+467 						{
+468 							type : 'html',
+469 							align : 'right',
+470 							html : ''
+471 						},
+472 						{
+473 							type : 'vbox',
+474 							padding : 0,
+475 							children :
+476 							[
+477 								{
+478 									type : 'text',
+479 									id : 'txtCaption',
+480 									label : editor.lang.table.caption,
+481 									setup : function( selectedTable )
+482 									{
+483 										var nodeList = selectedTable.getElementsByTag( 'caption' );
+484 										if ( nodeList.count() > 0 )
+485 										{
+486 											var caption = nodeList.getItem( 0 );
+487 											caption = ( caption.getChild( 0 ) && caption.getChild( 0 ).getText() ) || '';
+488 											caption = CKEDITOR.tools.trim( caption );
+489 											this.setValue( caption );
+490 										}
+491 									},
+492 									commit : function( data, table )
+493 									{
+494 										var caption = this.getValue(),
+495 											captionElement = table.getElementsByTag( 'caption' );
+496 										if ( caption )
+497 										{
+498 											if ( captionElement.count() > 0 )
+499 											{
+500 												captionElement = captionElement.getItem( 0 );
+501 												captionElement.setHtml( '' );
+502 											}
+503 											else
+504 											{
+505 												captionElement = new CKEDITOR.dom.element( 'caption', editor.document );
+506 												if ( table.getChildCount() )
+507 													captionElement.insertBefore( table.getFirst() );
+508 												else
+509 													captionElement.appendTo( table );
+510 											}
+511 											captionElement.append( new CKEDITOR.dom.text( caption, editor.document ) );
+512 										}
+513 										else if ( captionElement.count() > 0 )
+514 										{
+515 											for ( var i = captionElement.count() - 1 ; i >= 0 ; i-- )
+516 												captionElement.getItem( i ).remove();
+517 										}
+518 									}
+519 								},
+520 								{
+521 									type : 'text',
+522 									id : 'txtSummary',
+523 									label : editor.lang.table.summary,
+524 									setup : function( selectedTable )
+525 									{
+526 										this.setValue( selectedTable.getAttribute( 'summary' ) || '' );
+527 									},
+528 									commit : function( data, selectedTable )
+529 									{
+530 										if ( this.getValue() )
+531 											selectedTable.setAttribute( 'summary', this.getValue() );
+532 									}
+533 								}
+534 							]
+535 						}
+536 					]
+537 				}
+538 			]
+539 		};
+540 	}
+541
+542 	CKEDITOR.dialog.add( 'table', function( editor )
+543 		{
+544 			return tableDialog( editor, 'table' );
+545 		} );
+546 	CKEDITOR.dialog.add( 'tableProperties', function( editor )
+547 		{
+548 			return tableDialog( editor, 'tableProperties' );
+549 		} );
+550 })();
+551 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_table_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_table_plugin.js.html new file mode 100644 index 000000000..8ade9977b --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_table_plugin.js.html @@ -0,0 +1,78 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'table',
+  7 {
+  8 	init : function( editor )
+  9 	{
+ 10 		var table = CKEDITOR.plugins.table,
+ 11 			lang = editor.lang.table;
+ 12
+ 13 		editor.addCommand( 'table', new CKEDITOR.dialogCommand( 'table' ) );
+ 14 		editor.addCommand( 'tableProperties', new CKEDITOR.dialogCommand( 'tableProperties' ) );
+ 15
+ 16 		editor.ui.addButton( 'Table',
+ 17 			{
+ 18 				label : lang.toolbar,
+ 19 				command : 'table'
+ 20 			});
+ 21
+ 22 		CKEDITOR.dialog.add( 'table', this.path + 'dialogs/table.js' );
+ 23 		CKEDITOR.dialog.add( 'tableProperties', this.path + 'dialogs/table.js' );
+ 24
+ 25 		// If the "menu" plugin is loaded, register the menu items.
+ 26 		if ( editor.addMenuItems )
+ 27 		{
+ 28 			editor.addMenuItems(
+ 29 				{
+ 30 					table :
+ 31 					{
+ 32 						label : lang.menu,
+ 33 						command : 'tableProperties',
+ 34 						group : 'table',
+ 35 						order : 5
+ 36 					},
+ 37
+ 38 					tabledelete :
+ 39 					{
+ 40 						label : lang.deleteTable,
+ 41 						command : 'tableDelete',
+ 42 						group : 'table',
+ 43 						order : 1
+ 44 					}
+ 45 				} );
+ 46 		}
+ 47
+ 48 		// If the "contextmenu" plugin is loaded, register the listeners.
+ 49 		if ( editor.contextMenu )
+ 50 		{
+ 51 			editor.contextMenu.addListener( function( element, selection )
+ 52 				{
+ 53 					if ( !element )
+ 54 						return null;
+ 55
+ 56 					var isTable	= element.is( 'table' ) || element.hasAscendant( 'table' );
+ 57
+ 58 					if ( isTable )
+ 59 					{
+ 60 						return {
+ 61 							tabledelete : CKEDITOR.TRISTATE_OFF,
+ 62 							table : CKEDITOR.TRISTATE_OFF
+ 63 						};
+ 64 					}
+ 65
+ 66 					return null;
+ 67 				} );
+ 68 		}
+ 69 	}
+ 70 } );
+ 71 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tabletools_dialogs_tableCell.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tabletools_dialogs_tableCell.js.html new file mode 100644 index 000000000..ff2e12411 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tabletools_dialogs_tableCell.js.html @@ -0,0 +1,338 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dialog.add( 'cellProperties', function( editor )
+  7 	{
+  8 		var langTable = editor.lang.table;
+  9 		var langCell = langTable.cell;
+ 10 		var langCommon = editor.lang.common;
+ 11 		var validate = CKEDITOR.dialog.validate;
+ 12 		var widthPattern = /^(\d+(?:\.\d+)?)(px|%)$/,
+ 13 			heightPattern = /^(\d+(?:\.\d+)?)px$/;
+ 14 		var bind = CKEDITOR.tools.bind;
+ 15
+ 16 		function spacer()
+ 17 		{
+ 18 			return { type : 'html', html : ' ' };
+ 19 		}
+ 20
+ 21 		return {
+ 22 			title : langCell.title,
+ 23 			minWidth : 480,
+ 24 			minHeight : 140,
+ 25 			contents : [
+ 26 				{
+ 27 					id : 'info',
+ 28 					label : langCell.title,
+ 29 					accessKey : 'I',
+ 30 					elements :
+ 31 					[
+ 32 						{
+ 33 							type : 'hbox',
+ 34 							widths : [ '45%', '10%', '45%' ],
+ 35 							children :
+ 36 							[
+ 37 								{
+ 38 									type : 'vbox',
+ 39 									padding : 0,
+ 40 									children :
+ 41 									[
+ 42 										{
+ 43 											type : 'hbox',
+ 44 											widths : [ '70%', '30%' ],
+ 45 											children :
+ 46 											[
+ 47 												{
+ 48 													type : 'text',
+ 49 													id : 'width',
+ 50 													label : langTable.width,
+ 51 													widths : [ '71%', '29%' ],
+ 52 													labelLayout : 'horizontal',
+ 53 													validate : validate[ 'number' ]( langCell.invalidWidth ),
+ 54 													setup : function( selectedCell )
+ 55 													{
+ 56 														var widthMatch = widthPattern.exec( selectedCell.$.style.width );
+ 57 														if ( widthMatch )
+ 58 															this.setValue( widthMatch[1] );
+ 59 													},
+ 60 													commit : function( selectedCell )
+ 61 													{
+ 62 														var unit = this.getDialog().getValueOf( 'info', 'widthType' );
+ 63 														if ( this.getValue() !== '' )
+ 64 															selectedCell.$.style.width = this.getValue() + unit;
+ 65 														else
+ 66 															selectedCell.$.style.width = '';
+ 67 													},
+ 68 													'default' : ''
+ 69 												},
+ 70 												{
+ 71 													type : 'select',
+ 72 													id : 'widthType',
+ 73 													labelLayout : 'horizontal',
+ 74 													widths : [ '0%', '100%' ],
+ 75 													label : '',
+ 76 													'default' : 'px',
+ 77 													items :
+ 78 													[
+ 79 														[ langTable.widthPx, 'px' ],
+ 80 														[ langTable.widthPc, '%' ]
+ 81 													],
+ 82 													setup : function( selectedCell )
+ 83 													{
+ 84 														var widthMatch = widthPattern.exec( selectedCell.$.style.width );
+ 85 														if ( widthMatch )
+ 86 															this.setValue( widthMatch[2] );
+ 87 													}
+ 88 												}
+ 89 											]
+ 90 										},
+ 91 										{
+ 92 											type : 'hbox',
+ 93 											widths : [ '70%', '30%' ],
+ 94 											children :
+ 95 											[
+ 96 												{
+ 97 													type : 'text',
+ 98 													id : 'height',
+ 99 													label : langTable.height,
+100 													'default' : '',
+101 													widths : [ '71%', '29%' ],
+102 													labelLayout : 'horizontal',
+103 													validate : validate[ 'number' ]( langCell.invalidHeight ),
+104 													setup : function( selectedCell )
+105 													{
+106 														var heightMatch = heightPattern.exec( selectedCell.$.style.height );
+107 														if ( heightMatch )
+108 															this.setValue( heightMatch[1] );
+109 													},
+110 													commit : function( selectedCell )
+111 													{
+112 														if ( this.getValue() !== '' )
+113 															selectedCell.$.style.height = this.getValue() + 'px';
+114 														else
+115 															selectedCell.$.style.height = '';
+116 													}
+117 												},
+118 												{
+119 													type : 'html',
+120 													html : langTable.widthPx
+121 												}
+122 											]
+123 										},
+124 										spacer(),
+125 										{
+126 											type : 'select',
+127 											id : 'wordWrap',
+128 											labelLayout : 'horizontal',
+129 											label : langCell.wordWrap,
+130 											widths : [ '50%', '50%' ],
+131 											'default' : 'yes',
+132 											items :
+133 											[
+134 												[ langCell.yes, 'yes' ],
+135 												[ langCell.no, 'no' ]
+136 											],
+137 											commit : function( selectedCell )
+138 											{
+139 												if ( this.getValue() == 'no' )
+140 													selectedCell.setAttribute( 'noWrap', 'nowrap' );
+141 												else
+142 													selectedCell.removeAttribute( 'noWrap' );
+143 											}
+144 										},
+145 										spacer(),
+146 										{
+147 											type : 'select',
+148 											id : 'hAlign',
+149 											labelLayout : 'horizontal',
+150 											label : langCell.hAlign,
+151 											widths : [ '50%', '50%' ],
+152 											'default' : '',
+153 											items :
+154 											[
+155 												[ langCommon.notSet, '' ],
+156 												[ langTable.alignLeft, 'left' ],
+157 												[ langTable.alignCenter, 'center' ],
+158 												[ langTable.alignRight, 'right' ]
+159 											],
+160 											setup : function( selectedCell )
+161 											{
+162 												this.setValue( selectedCell.getAttribute( 'align' ) || '' );
+163 											},
+164 											commit : function( selectedCell )
+165 											{
+166 												if ( this.getValue() )
+167 													selectedCell.setAttribute( 'align', this.getValue() );
+168 												else
+169 													selectedCell.removeAttribute( 'align' );
+170 											}
+171 										},
+172 										{
+173 											type : 'select',
+174 											id : 'vAlign',
+175 											labelLayout : 'horizontal',
+176 											label : langCell.vAlign,
+177 											widths : [ '50%', '50%' ],
+178 											'default' : '',
+179 											items :
+180 											[
+181 												[ langCommon.notSet, '' ],
+182 												[ langCell.alignTop, 'top' ],
+183 												[ langCell.alignMiddle, 'middle' ],
+184 												[ langCell.alignBottom, 'bottom' ],
+185 												[ langCell.alignBaseline, 'baseline' ]
+186 											],
+187 											setup : function( selectedCell )
+188 											{
+189 												this.setValue( selectedCell.getAttribute( 'vAlign' ) || '' );
+190 											},
+191 											commit : function( selectedCell )
+192 											{
+193 												if ( this.getValue() )
+194 													selectedCell.setAttribute( 'vAlign', this.getValue() );
+195 												else
+196 													selectedCell.removeAttribute( 'vAlign' );
+197 											}
+198 										}
+199 									]
+200 								},
+201 								spacer(),
+202 								{
+203 									type : 'vbox',
+204 									padding : 0,
+205 									children :
+206 									[
+207 										{
+208 											type : 'select',
+209 											id : 'cellType',
+210 											label : langCell.cellType,
+211 											labelLayout : 'horizontal',
+212 											widths : [ '50%', '50%' ],
+213 											'default' : 'td',
+214 											items :
+215 											[
+216 												[ langCell.data, 'td' ],
+217 												[ langCell.header, 'th' ]
+218 											],
+219 											setup : function( selectedCell )
+220 											{
+221 												this.setValue( selectedCell.getName() );
+222 											},
+223 											commit : function( selectedCell )
+224 											{
+225 												selectedCell.renameNode( this.getValue() );
+226 											}
+227 										},
+228 										spacer(),
+229 										{
+230 											type : 'text',
+231 											id : 'rowSpan',
+232 											label : langCell.rowSpan,
+233 											labelLayout : 'horizontal',
+234 											widths : [ '50%', '50%' ],
+235 											'default' : '',
+236 											validate : validate.integer( langCell.invalidRowSpan ),
+237 											setup : function( selectedCell )
+238 											{
+239 												this.setValue( selectedCell.getAttribute( 'rowSpan' ) || '' );
+240 											},
+241 											commit : function( selectedCell )
+242 											{
+243 												if ( this.getValue() )
+244 													selectedCell.setAttribute( 'rowSpan', this.getValue() );
+245 												else
+246 													selectedCell.removeAttribute( 'rowSpan' );
+247 											}
+248 										},
+249 										{
+250 											type : 'text',
+251 											id : 'colSpan',
+252 											label : langCell.colSpan,
+253 											labelLayout : 'horizontal',
+254 											widths : [ '50%', '50%' ],
+255 											'default' : '',
+256 											validate : validate.integer( langCell.invalidColSpan ),
+257 											setup : function( selectedCell )
+258 											{
+259 												this.setValue( selectedCell.getAttribute( 'colSpan' ) || '' );
+260 											},
+261 											commit : function( selectedCell )
+262 											{
+263 												if ( this.getValue() )
+264 													selectedCell.setAttribute( 'colSpan', this.getValue() );
+265 												else
+266 													selectedCell.removeAttribute( 'colSpan' );
+267 											}
+268 										},
+269 										spacer(),
+270 										{
+271 											type : 'text',
+272 											id : 'bgColor',
+273 											label : langCell.bgColor,
+274 											labelLayout : 'horizontal',
+275 											widths : [ '50%', '50%' ],
+276 											'default' : '',
+277 											setup : function( selectedCell )
+278 											{
+279 												this.setValue( selectedCell.getAttribute( 'bgColor' ) || '' );
+280 											},
+281 											commit : function( selectedCell )
+282 											{
+283 												if ( this.getValue() )
+284 													selectedCell.setAttribute( 'bgColor', this.getValue() );
+285 												else
+286 													selectedCell.removeAttribute( 'bgColor' );
+287 											}
+288 										},
+289 										{
+290 											type : 'text',
+291 											id : 'borderColor',
+292 											label : langCell.borderColor,
+293 											labelLayout : 'horizontal',
+294 											widths : [ '50%', '50%' ],
+295 											'default' : '',
+296 											setup : function( selectedCell )
+297 											{
+298 												this.setValue( selectedCell.getAttribute( 'borderColor' ) || '' );
+299 											},
+300 											commit : function( selectedCell )
+301 											{
+302 												if ( this.getValue() )
+303 													selectedCell.setAttribute( 'borderColor', this.getValue() );
+304 												else
+305 													selectedCell.removeAttribute( 'borderColor' );
+306 											}
+307 										}
+308 									]
+309 								}
+310 							]
+311 						}
+312 					]
+313 				}
+314 			],
+315 			onShow : function()
+316 			{
+317 				// Get the selected table cell.
+318 				var startElement = editor.getSelection().getStartElement();
+319 				this.cell = startElement.getAscendant( 'td', true ) || startElement.getAscendant( 'th', true );
+320
+321 				// Call setupContent().
+322 				this.setupContent( this.cell );
+323 			},
+324 			onOk : function()
+325 			{
+326 				// Call commitContent().
+327 				this.commitContent( this.cell );
+328 			}
+329 		};
+330 	} );
+331 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tabletools_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tabletools_plugin.js.html new file mode 100644 index 000000000..de6d21c6c --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_tabletools_plugin.js.html @@ -0,0 +1,701 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	function removeRawAttribute( $node, attr )
+  9 	{
+ 10 		if ( CKEDITOR.env.ie )
+ 11 			$node.removeAttribute( attr );
+ 12 		else
+ 13 			delete $node[ attr ];
+ 14 	}
+ 15
+ 16 	var cellNodeRegex = /^(?:td|th)$/;
+ 17
+ 18 	function getSelectedCells( selection )
+ 19 	{
+ 20 		// Walker will try to split text nodes, which will make the current selection
+ 21 		// invalid. So save bookmarks before doing anything.
+ 22 		var bookmarks = selection.createBookmarks();
+ 23
+ 24 		var ranges = selection.getRanges();
+ 25 		var retval = [];
+ 26 		var database = {};
+ 27
+ 28 		function moveOutOfCellGuard( node )
+ 29 		{
+ 30 			// Apply to the first cell only.
+ 31 			if ( retval.length > 0 )
+ 32 				return;
+ 33
+ 34 			// If we are exiting from the first </td>, then the td should definitely be
+ 35 			// included.
+ 36 			if ( node.type == CKEDITOR.NODE_ELEMENT && cellNodeRegex.test( node.getName() )
+ 37 					&& !node.getCustomData( 'selected_cell' ) )
+ 38 			{
+ 39 				CKEDITOR.dom.element.setMarker( database, node, 'selected_cell', true );
+ 40 				retval.push( node );
+ 41 			}
+ 42 		}
+ 43
+ 44 		for ( var i = 0 ; i < ranges.length ; i++ )
+ 45 		{
+ 46 			var range = ranges[ i ];
+ 47
+ 48 			if ( range.collapsed )
+ 49 			{
+ 50 				// Walker does not handle collapsed ranges yet - fall back to old API.
+ 51 				var startNode = range.getCommonAncestor();
+ 52 				var nearestCell = startNode.getAscendant( 'td', true ) || startNode.getAscendant( 'th', true );
+ 53 				if ( nearestCell )
+ 54 					retval.push( nearestCell );
+ 55 			}
+ 56 			else
+ 57 			{
+ 58 				var walker = new CKEDITOR.dom.walker( range );
+ 59 				var node;
+ 60 				walker.guard = moveOutOfCellGuard;
+ 61
+ 62 				while ( ( node = walker.next() ) )
+ 63 				{
+ 64 					// If may be possible for us to have a range like this:
+ 65 					// <td>^1</td><td>^2</td>
+ 66 					// The 2nd td shouldn't be included.
+ 67 					//
+ 68 					// So we have to take care to include a td we've entered only when we've
+ 69 					// walked into its children.
+ 70
+ 71 					var parent = node.getParent();
+ 72 					if ( parent && cellNodeRegex.test( parent.getName() ) && !parent.getCustomData( 'selected_cell' ) )
+ 73 					{
+ 74 						CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
+ 75 						retval.push( parent );
+ 76 					}
+ 77 				}
+ 78 			}
+ 79 		}
+ 80
+ 81 		CKEDITOR.dom.element.clearAllMarkers( database );
+ 82
+ 83 		// Restore selection position.
+ 84 		selection.selectBookmarks( bookmarks );
+ 85
+ 86 		return retval;
+ 87 	}
+ 88
+ 89 	function createTableMap( $refCell )
+ 90 	{
+ 91 		var refCell = new CKEDITOR.dom.element( $refCell );
+ 92 		var $table = ( refCell.getName() == 'table' ? $refCell : refCell.getAscendant( 'table' ) ).$;
+ 93 		var $rows = $table.rows;
+ 94
+ 95 		// Row and column counters.
+ 96 		var r = -1;
+ 97 		var map = [];
+ 98 		for ( var i = 0 ; i < $rows.length ; i++ )
+ 99 		{
+100 			r++;
+101 			if ( !map[ r ] )
+102 				map[ r ] = [];
+103
+104 			var c = -1;
+105
+106 			for ( var j = 0 ; j < $rows[ i ].cells.length ; j++ )
+107 			{
+108 				var $cell = $rows[ i ].cells[ j ];
+109
+110 				c++;
+111 				while ( map[ r ][ c ] )
+112 					c++;
+113
+114 				var colSpan = isNaN( $cell.colSpan ) ? 1 : $cell.colSpan;
+115 				var rowSpan = isNaN( $cell.rowSpan ) ? 1 : $cell.rowSpan;
+116
+117 				for ( var rs = 0 ; rs < rowSpan ; rs++ )
+118 				{
+119 					if ( !map[ r + rs ] )
+120 						map[ r + rs ] = [];
+121
+122 					for ( var cs = 0 ; cs < colSpan ; cs++ )
+123 						map [ r + rs ][ c + cs ] = $rows[ i ].cells[ j ];
+124 				}
+125
+126 				c += colSpan - 1;
+127 			}
+128 		}
+129
+130 		return map;
+131 	}
+132
+133 	function installTableMap( tableMap, $table )
+134 	{
+135 		/*
+136 		 * IE BUG: rowSpan is always 1 in IE if the cell isn't attached to a row. So
+137 		 * store is separately in another attribute. (#1917)
+138 		 */
+139 		var rowSpanAttr = CKEDITOR.env.ie ? '_cke_rowspan' : 'rowSpan';
+140
+141 		/*
+142 		 * Disconnect all the cells in tableMap from their parents, set all colSpan
+143 		 * and rowSpan attributes to 1.
+144 		 */
+145 		for ( var i = 0 ; i < tableMap.length ; i++ )
+146 		{
+147 			for ( var j = 0 ; j < tableMap[ i ].length ; j++ )
+148 			{
+149 				var $cell = tableMap[ i ][ j ];
+150 				if ( $cell.parentNode )
+151 					$cell.parentNode.removeChild( $cell );
+152 				$cell.colSpan = $cell[ rowSpanAttr ] = 1;
+153 			}
+154 		}
+155
+156 		// Scan by rows and set colSpan.
+157 		var maxCol = 0;
+158 		for ( i = 0 ; i < tableMap.length ; i++ )
+159 		{
+160 			for ( j = 0 ; j < tableMap[ i ].length ; j++ )
+161 			{
+162 				$cell = tableMap[ i ][ j ];
+163 				if ( !$cell )
+164 					continue;
+165 				if ( j > maxCol )
+166 					maxCol = j;
+167 				if ( $cell[ '_cke_colScanned' ] )
+168 					continue;
+169 				if ( tableMap[ i ][ j - 1 ] == $cell )
+170 					$cell.colSpan++;
+171 				if ( tableMap[ i ][ j + 1 ] != $cell )
+172 					$cell[ '_cke_colScanned' ] = 1;
+173 			}
+174 		}
+175
+176 		// Scan by columns and set rowSpan.
+177 		for ( i = 0 ; i <= maxCol ; i++ )
+178 		{
+179 			for ( j = 0 ; j < tableMap.length ; j++ )
+180 			{
+181 				if ( !tableMap[ j ] )
+182 					continue;
+183 				$cell = tableMap[ j ][ i ];
+184 				if ( !$cell || $cell[ '_cke_rowScanned' ] )
+185 					continue;
+186 				if ( tableMap[ j - 1 ] && tableMap[ j - 1 ][ i ] == $cell )
+187 					$cell[ rowSpanAttr ]++;
+188 				if ( !tableMap[ j + 1 ] || tableMap[ j + 1 ][ i ] != $cell  )
+189 					$cell[ '_cke_rowScanned' ] = 1;
+190 			}
+191 		}
+192
+193 		// Clear all temporary flags.
+194 		for ( i = 0 ; i < tableMap.length ; i++ )
+195 		{
+196 			for ( j = 0 ; j < tableMap[ i ].length ; j++ )
+197 			{
+198 				$cell = tableMap[ i ][ j ];
+199 				removeRawAttribute( $cell, '_cke_colScanned' );
+200 				removeRawAttribute( $cell, '_cke_rowScanned' );
+201 			}
+202 		}
+203
+204 		// Insert physical rows and columns to table.
+205 		for ( i = 0 ; i < tableMap.length ; i++ )
+206 		{
+207 			var $row = $table.ownerDocument.createElement( 'tr' );
+208 			for ( j = 0 ; j < tableMap[ i ].length ; )
+209 			{
+210 				$cell = tableMap[ i ][ j ];
+211 				if ( tableMap[ i - 1 ] && tableMap[ i - 1 ][ j ] == $cell )
+212 				{
+213 					j += $cell.colSpan;
+214 					continue;
+215 				}
+216 				$row.appendChild( $cell );
+217 				if ( rowSpanAttr != 'rowSpan' )
+218 				{
+219 					$cell.rowSpan = $cell[ rowSpanAttr ];
+220 					$cell.removeAttribute( rowSpanAttr );
+221 				}
+222 				j += $cell.colSpan;
+223 				if ( $cell.colSpan == 1 )
+224 					$cell.removeAttribute( 'colSpan' );
+225 				if ( $cell.rowSpan == 1 )
+226 					$cell.removeAttribute( 'rowSpan' );
+227 			}
+228
+229 			if ( CKEDITOR.env.ie )
+230 				$table.rows[ i ].replaceNode( $row );
+231 			else
+232 			{
+233 				var dest = new CKEDITOR.dom.element( $table.rows[ i ] );
+234 				var src = new CKEDITOR.dom.element( $row );
+235 				dest.setHtml( '' );
+236 				src.moveChildren( dest );
+237 			}
+238 		}
+239 	}
+240
+241 	function clearRow( $tr )
+242 	{
+243 		// Get the array of row's cells.
+244 		var $cells = $tr.cells;
+245
+246 		// Empty all cells.
+247 		for ( var i = 0 ; i < $cells.length ; i++ )
+248 		{
+249 			$cells[ i ].innerHTML = '';
+250
+251 			if ( !CKEDITOR.env.ie )
+252 				( new CKEDITOR.dom.element( $cells[ i ] ) ).appendBogus();
+253 		}
+254 	}
+255
+256 	function insertRow( selection, insertBefore )
+257 	{
+258 		// Get the row where the selection is placed in.
+259 		var row = selection.getStartElement().getAscendant( 'tr' );
+260 		if ( !row )
+261 			return;
+262
+263 		// Create a clone of the row.
+264 		var newRow = row.clone( true );
+265
+266 		// Insert the new row before of it.
+267 		newRow.insertBefore( row );
+268
+269 		// Clean one of the rows to produce the illusion of inserting an empty row
+270 		// before or after.
+271 		clearRow( insertBefore ? newRow.$ : row.$ );
+272 	}
+273
+274 	function deleteRows( selectionOrRow )
+275 	{
+276 		if ( selectionOrRow instanceof CKEDITOR.dom.selection )
+277 		{
+278 			var cells = getSelectedCells( selectionOrRow );
+279 			var rowsToDelete = [];
+280
+281 			// Queue up the rows - it's possible and likely that we have duplicates.
+282 			for ( var i = 0 ; i < cells.length ; i++ )
+283 			{
+284 				var row = cells[ i ].getParent();
+285 				rowsToDelete[ row.$.rowIndex ] = row;
+286 			}
+287
+288 			for ( i = rowsToDelete.length ; i >= 0 ; i-- )
+289 			{
+290 				if ( rowsToDelete[ i ] )
+291 					deleteRows( rowsToDelete[ i ] );
+292 			}
+293 		}
+294 		else if ( selectionOrRow instanceof CKEDITOR.dom.element )
+295 		{
+296 			var table = selectionOrRow.getAscendant( 'table' );
+297
+298 			if ( table.$.rows.length == 1 )
+299 				table.remove();
+300 			else
+301 				selectionOrRow.remove();
+302 		}
+303 	}
+304
+305 	function insertColumn( selection, insertBefore )
+306 	{
+307 		// Get the cell where the selection is placed in.
+308 		var startElement = selection.getStartElement();
+309 		var cell = startElement.getAscendant( 'td', true ) || startElement.getAscendant( 'th', true );
+310
+311 		if ( !cell )
+312 			return;
+313
+314 		// Get the cell's table.
+315 		var table = cell.getAscendant( 'table' );
+316 		var cellIndex = cell.$.cellIndex;
+317
+318 		// Loop through all rows available in the table.
+319 		for ( var i = 0 ; i < table.$.rows.length ; i++ )
+320 		{
+321 			var $row = table.$.rows[ i ];
+322
+323 			// If the row doesn't have enough cells, ignore it.
+324 			if ( $row.cells.length < ( cellIndex + 1 ) )
+325 				continue;
+326
+327 			cell = new CKEDITOR.dom.element( $row.cells[ cellIndex ].cloneNode( false ) );
+328
+329 			if ( !CKEDITOR.env.ie )
+330 				cell.appendBogus();
+331
+332 			// Get back the currently selected cell.
+333 			var baseCell = new CKEDITOR.dom.element( $row.cells[ cellIndex ] );
+334 			if ( insertBefore )
+335 				cell.insertBefore( baseCell );
+336 			else
+337 				cell.insertAfter( baseCell );
+338 		}
+339 	}
+340
+341 	function deleteColumns( selectionOrCell )
+342 	{
+343 		if ( selectionOrCell instanceof CKEDITOR.dom.selection )
+344 		{
+345 			var colsToDelete = getSelectedCells( selectionOrCell );
+346 			for ( var i = colsToDelete.length ; i >= 0 ; i-- )
+347 			{
+348 				if ( colsToDelete[ i ] )
+349 					deleteColumns( colsToDelete[ i ] );
+350 			}
+351 		}
+352 		else if ( selectionOrCell instanceof CKEDITOR.dom.element )
+353 		{
+354 			// Get the cell's table.
+355 			var table = selectionOrCell.getAscendant( 'table' );
+356
+357 			// Get the cell index.
+358 			var cellIndex = selectionOrCell.$.cellIndex;
+359
+360 			/*
+361 			 * Loop through all rows from down to up, coz it's possible that some rows
+362 			 * will be deleted.
+363 			 */
+364 			for ( i = table.$.rows.length - 1 ; i >= 0 ; i-- )
+365 			{
+366 				// Get the row.
+367 				var row = new CKEDITOR.dom.element( table.$.rows[ i ] );
+368
+369 				// If the cell to be removed is the first one and the row has just one cell.
+370 				if ( !cellIndex && row.$.cells.length == 1 )
+371 				{
+372 					deleteRows( row );
+373 					continue;
+374 				}
+375
+376 				// Else, just delete the cell.
+377 				if ( row.$.cells[ cellIndex ] )
+378 					row.$.removeChild( row.$.cells[ cellIndex ] );
+379 			}
+380 		}
+381 	}
+382
+383 	function insertCell( selection, insertBefore )
+384 	{
+385 		var startElement = selection.getStartElement();
+386 		var cell = startElement.getAscendant( 'td', true ) || startElement.getAscendant( 'th', true );
+387
+388 		if ( !cell )
+389 			return;
+390
+391 		// Create the new cell element to be added.
+392 		var newCell = cell.clone();
+393 		if ( !CKEDITOR.env.ie )
+394 			newCell.appendBogus();
+395
+396 		if ( insertBefore )
+397 			newCell.insertBefore( cell );
+398 		else
+399 			newCell.insertAfter( cell );
+400 	}
+401
+402 	function deleteCells( selectionOrCell )
+403 	{
+404 		if ( selectionOrCell instanceof CKEDITOR.dom.selection )
+405 		{
+406 			var cellsToDelete = getSelectedCells( selectionOrCell );
+407 			for ( var i = cellsToDelete.length - 1 ; i >= 0 ; i-- )
+408 				deleteCells( cellsToDelete[ i ] );
+409 		}
+410 		else if ( selectionOrCell instanceof CKEDITOR.dom.element )
+411 		{
+412 			if ( selectionOrCell.getParent().getChildCount() == 1 )
+413 				selectionOrCell.getParent().remove();
+414 			else
+415 				selectionOrCell.remove();
+416 		}
+417 	}
+418
+419 	CKEDITOR.plugins.add( 'tabletools',
+420 	{
+421 		init : function( editor )
+422 		{
+423 			var lang = editor.lang.table;
+424
+425 			editor.addCommand( 'cellProperties', new CKEDITOR.dialogCommand( 'cellProperties' ) );
+426 			CKEDITOR.dialog.add( 'cellProperties', this.path + 'dialogs/tableCell.js' );
+427
+428 			editor.addCommand( 'tableDelete',
+429 				{
+430 					exec : function( editor )
+431 					{
+432 						var selection = editor.getSelection();
+433 						var startElement = selection && selection.getStartElement();
+434 						var table = startElement && startElement.getAscendant( 'table', true );
+435
+436 						if ( !table )
+437 							return;
+438
+439 						// Maintain the selection point at where the table was deleted.
+440 						selection.selectElement( table );
+441 						var range = selection.getRanges()[0];
+442 						range.collapse();
+443 						selection.selectRanges( [ range ] );
+444
+445 						// If the table's parent has only one child, remove it as well.
+446 						if ( table.getParent().getChildCount() == 1 )
+447 							table.getParent().remove();
+448 						else
+449 							table.remove();
+450 					}
+451 				} );
+452
+453 			editor.addCommand( 'rowDelete',
+454 				{
+455 					exec : function( editor )
+456 					{
+457 						var selection = editor.getSelection();
+458 						deleteRows( selection );
+459 					}
+460 				} );
+461
+462 			editor.addCommand( 'rowInsertBefore',
+463 				{
+464 					exec : function( editor )
+465 					{
+466 						var selection = editor.getSelection();
+467 						insertRow( selection, true );
+468 					}
+469 				} );
+470
+471 			editor.addCommand( 'rowInsertAfter',
+472 				{
+473 					exec : function( editor )
+474 					{
+475 						var selection = editor.getSelection();
+476 						insertRow( selection );
+477 					}
+478 				} );
+479
+480 			editor.addCommand( 'columnDelete',
+481 				{
+482 					exec : function( editor )
+483 					{
+484 						var selection = editor.getSelection();
+485 						deleteColumns( selection );
+486 					}
+487 				} );
+488
+489 			editor.addCommand( 'columnInsertBefore',
+490 				{
+491 					exec : function( editor )
+492 					{
+493 						var selection = editor.getSelection();
+494 						insertColumn( selection, true );
+495 					}
+496 				} );
+497
+498 			editor.addCommand( 'columnInsertAfter',
+499 				{
+500 					exec : function( editor )
+501 					{
+502 						var selection = editor.getSelection();
+503 						insertColumn( selection );
+504 					}
+505 				} );
+506
+507 			editor.addCommand( 'cellDelete',
+508 				{
+509 					exec : function( editor )
+510 					{
+511 						var selection = editor.getSelection();
+512 						deleteCells( selection );
+513 					}
+514 				} );
+515
+516 			editor.addCommand( 'cellInsertBefore',
+517 				{
+518 					exec : function( editor )
+519 					{
+520 						var selection = editor.getSelection();
+521 						insertCell( selection, true );
+522 					}
+523 				} );
+524
+525 			editor.addCommand( 'cellInsertAfter',
+526 				{
+527 					exec : function( editor )
+528 					{
+529 						var selection = editor.getSelection();
+530 						insertCell( selection );
+531 					}
+532 				} );
+533
+534 			// If the "menu" plugin is loaded, register the menu items.
+535 			if ( editor.addMenuItems )
+536 			{
+537 				editor.addMenuItems(
+538 					{
+539 						tablecell :
+540 						{
+541 							label : lang.cell.menu,
+542 							group : 'tablecell',
+543 							order : 1,
+544 							getItems : function()
+545 							{
+546 								var cells = getSelectedCells( editor.getSelection() );
+547
+548 								return {
+549 									tablecell_insertBefore : CKEDITOR.TRISTATE_OFF,
+550 									tablecell_insertAfter : CKEDITOR.TRISTATE_OFF,
+551 									tablecell_delete : CKEDITOR.TRISTATE_OFF,
+552 									tablecell_properties : cells.length == 1 ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
+553 								};
+554 							}
+555 						},
+556
+557 						tablecell_insertBefore :
+558 						{
+559 							label : lang.cell.insertBefore,
+560 							group : 'tablecell',
+561 							command : 'cellInsertBefore',
+562 							order : 5
+563 						},
+564
+565 						tablecell_insertAfter :
+566 						{
+567 							label : lang.cell.insertAfter,
+568 							group : 'tablecell',
+569 							command : 'cellInsertAfter',
+570 							order : 10
+571 						},
+572
+573 						tablecell_delete :
+574 						{
+575 							label : lang.cell.deleteCell,
+576 							group : 'tablecell',
+577 							command : 'cellDelete',
+578 							order : 15
+579 						},
+580
+581 						tablecell_properties :
+582 						{
+583 							label : lang.cell.title,
+584 							group : 'tablecellproperties',
+585 							command : 'cellProperties',
+586 							order : 20
+587 						},
+588
+589 						tablerow :
+590 						{
+591 							label : lang.row.menu,
+592 							group : 'tablerow',
+593 							order : 1,
+594 							getItems : function()
+595 							{
+596 								return {
+597 									tablerow_insertBefore : CKEDITOR.TRISTATE_OFF,
+598 									tablerow_insertAfter : CKEDITOR.TRISTATE_OFF,
+599 									tablerow_delete : CKEDITOR.TRISTATE_OFF
+600 								};
+601 							}
+602 						},
+603
+604 						tablerow_insertBefore :
+605 						{
+606 							label : lang.row.insertBefore,
+607 							group : 'tablerow',
+608 							command : 'rowInsertBefore',
+609 							order : 5
+610 						},
+611
+612 						tablerow_insertAfter :
+613 						{
+614 							label : lang.row.insertAfter,
+615 							group : 'tablerow',
+616 							command : 'rowInsertAfter',
+617 							order : 10
+618 						},
+619
+620 						tablerow_delete :
+621 						{
+622 							label : lang.row.deleteRow,
+623 							group : 'tablerow',
+624 							command : 'rowDelete',
+625 							order : 15
+626 						},
+627
+628 						tablecolumn :
+629 						{
+630 							label : lang.column.menu,
+631 							group : 'tablecolumn',
+632 							order : 1,
+633 							getItems : function()
+634 							{
+635 								return {
+636 									tablecolumn_insertBefore : CKEDITOR.TRISTATE_OFF,
+637 									tablecolumn_insertAfter : CKEDITOR.TRISTATE_OFF,
+638 									tablecolumn_delete : CKEDITOR.TRISTATE_OFF
+639 								};
+640 							}
+641 						},
+642
+643 						tablecolumn_insertBefore :
+644 						{
+645 							label : lang.column.insertBefore,
+646 							group : 'tablecolumn',
+647 							command : 'columnInsertBefore',
+648 							order : 5
+649 						},
+650
+651 						tablecolumn_insertAfter :
+652 						{
+653 							label : lang.column.insertAfter,
+654 							group : 'tablecolumn',
+655 							command : 'columnInsertAfter',
+656 							order : 10
+657 						},
+658
+659 						tablecolumn_delete :
+660 						{
+661 							label : lang.column.deleteColumn,
+662 							group : 'tablecolumn',
+663 							command : 'columnDelete',
+664 							order : 15
+665 						}
+666 					});
+667 			}
+668
+669 			// If the "contextmenu" plugin is laoded, register the listeners.
+670 			if ( editor.contextMenu )
+671 			{
+672 				editor.contextMenu.addListener( function( element, selection )
+673 					{
+674 						if ( !element )
+675 							return null;
+676
+677 							var isCell	= !element.is( 'table' ) && element.hasAscendant( 'table' ) ;
+678
+679 							if ( isCell )
+680 							{
+681 								return {
+682 									tablecell : CKEDITOR.TRISTATE_OFF,
+683 									tablerow : CKEDITOR.TRISTATE_OFF,
+684 									tablecolumn : CKEDITOR.TRISTATE_OFF
+685 								};
+686 							}
+687
+688 							return null;
+689 					} );
+690 			}
+691 		}
+692 	} );
+693 })();
+694 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_dialogs_templates.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_dialogs_templates.js.html new file mode 100644 index 000000000..c49c60d90 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_dialogs_templates.js.html @@ -0,0 +1,178 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	var doc = CKEDITOR.document;
+  9
+ 10 	var listId = 'cke' + CKEDITOR.tools.getNextNumber();
+ 11
+ 12 	// Constructs the HTML view of the specified templates data.
+ 13 	function renderTemplatesList( editor, templatesDefinitions )
+ 14 	{
+ 15 		var listDiv = doc.getById( listId );
+ 16
+ 17 		// clear loading wait text.
+ 18 		listDiv.setHtml( '' );
+ 19
+ 20 		for ( var i = 0 ; i < templatesDefinitions.length ; i++ )
+ 21 		{
+ 22 			var definition = CKEDITOR.getTemplates( templatesDefinitions[ i ] ),
+ 23 				imagesPath = definition.imagesPath,
+ 24 				templates = definition.templates;
+ 25
+ 26 			for ( var j = 0 ; j < templates.length ; j++ )
+ 27 			{
+ 28 				var template = templates[ j ];
+ 29 				listDiv.append( createTemplateItem( editor, template, imagesPath ) );
+ 30 			}
+ 31 		}
+ 32 	}
+ 33
+ 34 	function createTemplateItem( editor, template, imagesPath )
+ 35 	{
+ 36 		var div = doc.createElement( 'div' );
+ 37 		div.setAttribute( 'class', 'cke_tpl_item' );
+ 38
+ 39 		// Build the inner HTML of our new item DIV.
+ 40 		var html = '<table style="width:350px;" class="cke_tpl_preview"><tr>';
+ 41
+ 42 		if( template.image && imagesPath )
+ 43 			html += '<td class="cke_tpl_preview_img"><img src="' + CKEDITOR.getUrl( imagesPath + template.image ) + '"></td>';
+ 44
+ 45 		html += '<td style="white-space:normal;"><span class="cke_tpl_title">' + template.title + '</span><br/>';
+ 46
+ 47 		if( template.description )
+ 48 			html += '<span>' + template.description + '</span>';
+ 49
+ 50 		html += '</td></tr></table>';
+ 51
+ 52 		div.setHtml( html );
+ 53
+ 54 		div.on( 'mouseover', function()
+ 55 			{
+ 56 				div.addClass( 'cke_tpl_hover' );
+ 57 			});
+ 58
+ 59 		div.on( 'mouseout', function()
+ 60 			{
+ 61 				div.removeClass( 'cke_tpl_hover' );
+ 62 			});
+ 63
+ 64 		div.on( 'click', function()
+ 65 			{
+ 66 				insertTemplate( editor, template.html );
+ 67 			});
+ 68
+ 69 		return div;
+ 70 	}
+ 71
+ 72 	/**
+ 73 	 * Insert the specified template content
+ 74 	 * to document.
+ 75 	 * @param {Number} index
+ 76 	 */
+ 77 	function insertTemplate( editor, html )
+ 78 	{
+ 79 		var dialog = CKEDITOR.dialog.getCurrent(),
+ 80 			isInsert = dialog.getValueOf( 'selectTpl', 'chkInsertOpt' );
+ 81
+ 82 		if( isInsert )
+ 83 		{
+ 84 			editor.setData( html );
+ 85 		}
+ 86 		else
+ 87 		{
+ 88 			editor.insertHtml( html );
+ 89 		}
+ 90
+ 91 		dialog.hide();
+ 92 	}
+ 93
+ 94 	CKEDITOR.dialog.add( 'templates', function( editor )
+ 95 		{
+ 96 			// Load skin at first.
+ 97 			CKEDITOR.skins.load( editor, 'templates' );
+ 98
+ 99 			/**
+100 			 * Load templates once.
+101 			 */
+102 			var isLoaded = false;
+103
+104 			return {
+105 				title :editor.lang.templates.title,
+106
+107 				minWidth : CKEDITOR.env.ie ? 440 : 400,
+108 				minHeight : 340,
+109
+110 				contents :
+111 				[
+112 					{
+113 						id :'selectTpl',
+114 						label : editor.lang.templates.title,
+115 						elements :
+116 						[
+117 							{
+118 								type : 'vbox',
+119 								padding : 5,
+120 								children :
+121 								[
+122 									{
+123 										type : 'html',
+124 										html :
+125 											'<span>'  +
+126 												editor.lang.templates.selectPromptMsg +
+127 											'</span>'
+128 									},
+129 									{
+130 										type : 'html',
+131 										html :
+132 											'<div id="' + listId + '" class="cke_tpl_list">' +
+133 												'<div class="cke_tpl_loading"><span></span></div>' +
+134 											'</div>'
+135 									},
+136 									{
+137 										id : 'chkInsertOpt',
+138 										type : 'checkbox',
+139 										label : editor.lang.templates.insertOption,
+140 										'default' : editor.config.templates_replaceContent
+141 									}
+142 								]
+143 							}
+144 						]
+145 					}
+146 				],
+147
+148 				buttons : [ CKEDITOR.dialog.cancelButton ],
+149
+150 				onShow : function()
+151 				{
+152 					CKEDITOR.loadTemplates( editor.config.templates_files, function()
+153 						{
+154 							var templates = editor.config.templates.split( ',' );
+155
+156 							if ( templates.length )
+157 								renderTemplatesList( editor, templates );
+158 							else
+159 							{
+160 								var listCtEl = doc.getById( listId );
+161 								listCtEl.setHtml(
+162 									'<div class="cke_tpl_empty">' +
+163 										'<span>' + editor.lang.templates.emptyListMsg + '</span>' +
+164 									'</div>' );
+165 							}
+166 						});
+167 				}
+168 			};
+169 		});
+170 })();
+171 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_plugin.js.html new file mode 100644 index 000000000..939f140b4 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_plugin.js.html @@ -0,0 +1,96 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 (function()
+  7 {
+  8 	CKEDITOR.plugins.add( 'templates',
+  9 		{
+ 10 			requires : [ 'dialog' ],
+ 11
+ 12 			init : function( editor )
+ 13 			{
+ 14 				CKEDITOR.dialog.add( 'templates', CKEDITOR.getUrl( this.path + 'dialogs/templates.js' ) );
+ 15
+ 16 				editor.addCommand( 'templates', new CKEDITOR.dialogCommand( 'templates' ) );
+ 17
+ 18 				editor.ui.addButton( 'Templates',
+ 19 					{
+ 20 						label : editor.lang.templates.button,
+ 21 						command : 'templates'
+ 22 					});
+ 23 			}
+ 24 		});
+ 25
+ 26 	var templates = {},
+ 27 		loadedTemplatesFiles = {};
+ 28
+ 29 	CKEDITOR.addTemplates = function( name, definition )
+ 30 	{
+ 31 		templates[ name ] = definition;
+ 32 	};
+ 33
+ 34 	CKEDITOR.getTemplates = function( name )
+ 35 	{
+ 36 		return templates[ name ];
+ 37 	};
+ 38
+ 39 	CKEDITOR.loadTemplates = function( templateFiles, callback )
+ 40 	{
+ 41 		// Holds the templates files to be loaded.
+ 42 		var toLoad = [];
+ 43
+ 44 		// Look for pending template files to get loaded.
+ 45 		for ( var i = 0 ; i < templateFiles.length ; i++ )
+ 46 		{
+ 47 			if ( !loadedTemplatesFiles[ templateFiles[ i ] ] )
+ 48 			{
+ 49 				toLoad.push( templateFiles[ i ] );
+ 50 				loadedTemplatesFiles[ templateFiles[ i ] ] = 1;
+ 51 			}
+ 52 		}
+ 53
+ 54 		if ( toLoad.length > 0 )
+ 55 			CKEDITOR.scriptLoader.load( toLoad, callback );
+ 56 		else
+ 57 			setTimeout( callback, 0 );
+ 58 	};
+ 59 })();
+ 60
+ 61
+ 62
+ 63 /**
+ 64  * The templates definition set to use. It accepts a list of names separated by
+ 65  * comma. It must match definitions loaded with the templates_files setting.
+ 66  * @type String
+ 67  * @default 'default'
+ 68  */
+ 69 CKEDITOR.config.templates = 'default';
+ 70
+ 71 /**
+ 72  * The list of templates definition files to load.
+ 73  * @type (String) Array
+ 74  * @default [ 'plugins/templates/templates/default.js' ]
+ 75  */
+ 76 CKEDITOR.config.templates_files =
+ 77 	[
+ 78 		CKEDITOR.getUrl(
+ 80 			'plugins/templates/templates/default.js' )
+ 81 	];
+ 82
+ 83 /**
+ 84  * Whether replace the current document content OR insert current
+ 85  * editing position.
+ 86  * @type Boolean
+ 87  * @default true
+ 88  */
+ 89 CKEDITOR.config.templates_replaceContent = true;
+ 90 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_templates_default.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_templates_default.js.html new file mode 100644 index 000000000..b7fe0d096 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_templates_templates_default.js.html @@ -0,0 +1,102 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 // Register a templates definition set named "default".
+  7 CKEDITOR.addTemplates( 'default',
+  8 {
+  9 	// The name of sub folder which hold the shortcut preview images of the
+ 10 	// templates.
+ 11 	imagesPath : CKEDITOR.getUrl( CKEDITOR.plugins.getPath( 'templates' ) + 'templates/images/' ),
+ 12
+ 13 	// The templates definitions.
+ 14 	templates :
+ 15 		[
+ 16 			{
+ 17 				title: 'Image and Title',
+ 18 				image: 'template1.gif',
+ 19 				description: 'One main image with a title and text that surround the image.',
+ 20 				html:
+ 21 					'<h3>' +
+ 22 						'<img style="margin-right: 10px" height="100" alt="" width="100" align="left"/>' +
+ 23 						'Type the title here'+
+ 24 					'</h3>' +
+ 25 					'<p>' +
+ 26 						'Type the text here' +
+ 27 					'</p>'
+ 28 			},
+ 29 			{
+ 30 				title: 'Strange Template',
+ 31 				image: 'template2.gif',
+ 32 				description: 'A template that defines two colums, each one with a title, and some text.',
+ 33 				html:
+ 34 					'<table cellspacing="0" cellpadding="0" width="100%" border="0">' +
+ 35 						'<tr>' +
+ 36 							'<td width="50%">' +
+ 37 								'<h3>Title 1</h3>' +
+ 38 							'</td>' +
+ 39 							'<td></td>' +
+ 40 							'<td width="50%">' +
+ 41 								'<h3>Title 2</h3>' +
+ 42 							'</td>' +
+ 43 						'</tr>' +
+ 44 						'<tr>' +
+ 45 							'<td>' +
+ 46 								'Text 1' +
+ 47 							'</td>' +
+ 48 							'<td></td>' +
+ 49 							'<td>' +
+ 50 								'Text 2' +
+ 51 							'</td>' +
+ 52 						'</tr>' +
+ 53 					'</table>' +
+ 54 					'<p>' +
+ 55 						'More text goes here.' +
+ 56 					'</p>'
+ 57 			},
+ 58 			{
+ 59 				title: 'Text and Table',
+ 60 				image: 'template3.gif',
+ 61 				description: 'A title with some text and a table.',
+ 62 				html:
+ 63 					'<div style="width: 80%">' +
+ 64 						'<h3>' +
+ 65 							'Title goes here' +
+ 66 						'</h3>' +
+ 67 						'<table style="float: right" cellspacing="0" cellpadding="0" width="150" border="1">' +
+ 68 							'<caption style="border:solid 1px black">' +
+ 69 								'<strong>Table title</strong>' +
+ 70 							'</caption>' +
+ 71 							'</tr>' +
+ 72 							'<tr>' +
+ 73 								'<td> </td>' +
+ 74 								'<td> </td>' +
+ 75 								'<td> </td>' +
+ 76 							'</tr>' +
+ 77 							'<tr>' +
+ 78 								'<td> </td>' +
+ 79 								'<td> </td>' +
+ 80 								'<td> </td>' +
+ 81 							'</tr>' +
+ 82 							'<tr>' +
+ 83 								'<td> </td>' +
+ 84 								'<td> </td>' +
+ 85 								'<td> </td>' +
+ 86 							'</tr>' +
+ 87 						'</table>' +
+ 88 						'<p>' +
+ 89 							'Type the text here' +
+ 90 						'</p>' +
+ 91 					'</div>'
+ 92 			}
+ 93 		]
+ 94 });
+ 95 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_toolbar_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_toolbar_plugin.js.html new file mode 100644 index 000000000..fec462c6a --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_toolbar_plugin.js.html @@ -0,0 +1,361 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview The "toolbar" plugin. Renders the default toolbar interface in
+  8  * the editor.
+  9  */
+ 10
+ 11 (function()
+ 12 {
+ 13 	var toolbox = function()
+ 14 	{
+ 15 		this.toolbars = [];
+ 16 		this.focusCommandExecuted = false;
+ 17 	};
+ 18
+ 19 	toolbox.prototype.focus = function()
+ 20 	{
+ 21 		for ( var t = 0, toolbar ; toolbar = this.toolbars[ t++ ] ; )
+ 22 		{
+ 23 			for ( var i = 0, item ; item = toolbar.items[ i++ ] ; )
+ 24 			{
+ 25 				if ( item.focus )
+ 26 				{
+ 27 					item.focus();
+ 28 					return;
+ 29 				}
+ 30 			}
+ 31 		}
+ 32 	};
+ 33
+ 34 	var commands =
+ 35 	{
+ 36 		toolbarFocus :
+ 37 		{
+ 38 			modes : { wysiwyg : 1, source : 1 },
+ 39
+ 40 			exec : function( editor )
+ 41 			{
+ 42 				if ( editor.toolbox )
+ 43 				{
+ 44 					editor.toolbox.focusCommandExecuted = true;
+ 45
+ 46 					// Make the first button focus accessible. (#3417)
+ 47 					if ( CKEDITOR.env.ie )
+ 48 						setTimeout( function(){ editor.toolbox.focus(); }, 100 );
+ 49 					else
+ 50 						editor.toolbox.focus();
+ 51 				}
+ 52 			}
+ 53 		}
+ 54 	};
+ 55
+ 56 	CKEDITOR.plugins.add( 'toolbar',
+ 57 	{
+ 58 		init : function( editor )
+ 59 		{
+ 60 			var itemKeystroke = function( item, keystroke )
+ 61 			{
+ 62 				switch ( keystroke )
+ 63 				{
+ 64 					case 39 :					// RIGHT-ARROW
+ 65 					case 9 :					// TAB
+ 66 						// Look for the next item in the toolbar.
+ 67 						while ( ( item = item.next || ( item.toolbar.next && item.toolbar.next.items[ 0 ] ) ) && !item.focus )
+ 68 						{ /*jsl:pass*/ }
+ 69
+ 70 						// If available, just focus it, otherwise focus the
+ 71 						// first one.
+ 72 						if ( item )
+ 73 							item.focus();
+ 74 						else
+ 75 							editor.toolbox.focus();
+ 76
+ 77 						return false;
+ 78
+ 79 					case 37 :					// LEFT-ARROW
+ 80 					case CKEDITOR.SHIFT + 9 :	// SHIFT + TAB
+ 81 						// Look for the previous item in the toolbar.
+ 82 						while ( ( item = item.previous || ( item.toolbar.previous && item.toolbar.previous.items[ item.toolbar.previous.items.length - 1 ] ) ) && !item.focus )
+ 83 						{ /*jsl:pass*/ }
+ 84
+ 85 						// If available, just focus it, otherwise focus the
+ 86 						// last one.
+ 87 						if ( item )
+ 88 							item.focus();
+ 89 						else
+ 90 						{
+ 91 							var lastToolbarItems = editor.toolbox.toolbars[ editor.toolbox.toolbars.length - 1 ].items;
+ 92 							lastToolbarItems[ lastToolbarItems.length - 1 ].focus();
+ 93 						}
+ 94
+ 95 						return false;
+ 96
+ 97 					case 27 :					// ESC
+ 98 						editor.focus();
+ 99 						return false;
+100
+101 					case 13 :					// ENTER
+102 					case 32 :					// SPACE
+103 						item.execute();
+104 						return false;
+105 				}
+106 				return true;
+107 			};
+108
+109 			editor.on( 'themeSpace', function( event )
+110 				{
+111 					if ( event.data.space == editor.config.toolbarLocation )
+112 					{
+113 						editor.toolbox = new toolbox();
+114
+115 						var output = [ '<div class="cke_toolbox"' ],
+116 							expanded =  editor.config.toolbarStartupExpanded,
+117 							groupStarted;
+118
+119 						output.push( expanded ? '>' : ' style="display:none">' );
+120
+121 						var toolbars = editor.toolbox.toolbars,
+122 							toolbar =
+123 									( editor.config.toolbar instanceof Array ) ?
+124 										editor.config.toolbar
+125 									:
+126 										editor.config[ 'toolbar_' + editor.config.toolbar ];
+127
+128 						for ( var r = 0 ; r < toolbar.length ; r++ )
+129 						{
+130 							var row = toolbar[ r ],
+131 								toolbarId = 'cke_' + CKEDITOR.tools.getNextNumber(),
+132 								toolbarObj = { id : toolbarId, items : [] };
+133
+134 							if ( groupStarted )
+135 							{
+136 								output.push( '</div>' );
+137 								groupStarted = 0;
+138 							}
+139
+140 							if ( row === '/' )
+141 							{
+142 								output.push( '<div class="cke_break"></div>' );
+143 								continue;
+144 							}
+145
+146 							output.push( '<span id="', toolbarId, '" class="cke_toolbar"><span class="cke_toolbar_start"></span>' );
+147
+148 							// Add the toolbar to the "editor.toolbox.toolbars"
+149 							// array.
+150 							var index = toolbars.push( toolbarObj ) - 1;
+151
+152 							// Create the next/previous reference.
+153 							if ( index > 0 )
+154 							{
+155 								toolbarObj.previous = toolbars[ index - 1 ];
+156 								toolbarObj.previous.next = toolbarObj;
+157 							}
+158
+159 							// Create all items defined for this toolbar.
+160 							for ( var i = 0 ; i < row.length ; i++ )
+161 							{
+162 								var item,
+163 									itemName = row[ i ];
+164
+165 								if ( itemName == '-' )
+166 									item = CKEDITOR.ui.separator;
+167 								else
+168 									item = editor.ui.create( itemName );
+169
+170 								if ( item )
+171 								{
+172 									if ( item.canGroup )
+173 									{
+174 										if ( !groupStarted )
+175 										{
+176 											output.push( '<span class="cke_toolgroup">' );
+177 											groupStarted = 1;
+178 										}
+179 									}
+180 									else if ( groupStarted )
+181 									{
+182 										output.push( '</span>' );
+183 										groupStarted = 0;
+184 									}
+185
+186 									var itemObj = item.render( editor, output );
+187 									index = toolbarObj.items.push( itemObj ) - 1;
+188
+189 									if ( index > 0 )
+190 									{
+191 										itemObj.previous = toolbarObj.items[ index - 1 ];
+192 										itemObj.previous.next = itemObj;
+193 									}
+194
+195 									itemObj.toolbar = toolbarObj;
+196 									itemObj.onkey = itemKeystroke;
+197
+198 									/*
+199 									 * Fix for #3052:
+200 									 * Prevent JAWS from focusing the toolbar after document load.
+201 									 */
+202 									itemObj.onfocus = function()
+203 									{
+204 										if ( !editor.toolbox.focusCommandExecuted )
+205 											editor.focus();
+206 									};
+207 								}
+208 							}
+209
+210 							if ( groupStarted )
+211 							{
+212 								output.push( '</span>' );
+213 								groupStarted = 0;
+214 							}
+215
+216 							output.push( '<span class="cke_toolbar_end"></span></span>' );
+217 						}
+218
+219 						output.push( '</div>' );
+220
+221 						if ( editor.config.toolbarCanCollapse )
+222 						{
+223 							var collapserFn = CKEDITOR.tools.addFunction(
+224 								function()
+225 								{
+226 									editor.execCommand( 'toolbarCollapse' );
+227 								} );
+228
+229 							var collapserId = 'cke_' + CKEDITOR.tools.getNextNumber();
+230
+231 							editor.addCommand( 'toolbarCollapse',
+232 								{
+233 									exec : function( editor )
+234 									{
+235 										var collapser = CKEDITOR.document.getById( collapserId );
+236 										var toolbox = collapser.getPrevious();
+237 										var contents = editor.getThemeSpace( 'contents' );
+238 										var toolboxContainer = toolbox.getParent();
+239 										var contentHeight = parseInt( contents.$.style.height, 10 );
+240 										var previousHeight = toolboxContainer.$.offsetHeight;
+241
+242 										if ( toolbox.isVisible() )
+243 										{
+244 											toolbox.hide();
+245 											collapser.addClass( 'cke_toolbox_collapser_min' );
+246 										}
+247 										else
+248 										{
+249 											toolbox.show();
+250 											collapser.removeClass( 'cke_toolbox_collapser_min' );
+251 										}
+252
+253 										var dy = toolboxContainer.$.offsetHeight - previousHeight;
+254 										contents.setStyle( 'height', ( contentHeight - dy ) + 'px' );
+255 									},
+256
+257 									modes : { wysiwyg : 1, source : 1 }
+258 								} );
+259
+260 							output.push( '<a id="' + collapserId + '" class="cke_toolbox_collapser' );
+261
+262 							if ( !expanded )
+263 								output.push( ' cke_toolbox_collapser_min' );
+264
+265 							output.push( '" onclick="CKEDITOR.tools.callFunction(' + collapserFn + ')"></a>' );
+266 						}
+267
+268 						event.data.html += output.join( '' );
+269 					}
+270 				});
+271
+272 			editor.addCommand( 'toolbarFocus', commands.toolbarFocus );
+273 		}
+274 	});
+275 })();
+276
+277 /**
+278  * The UI element that renders a toolbar separator.
+279  * @type Object
+280  * @example
+281  */
+282 CKEDITOR.ui.separator =
+283 {
+284 	render : function( editor, output )
+285 	{
+286 		output.push( '<span class="cke_separator"></span>' );
+287 		return {};
+288 	}
+289 };
+290
+291 /**
+292  * The "theme space" to which rendering the toolbar. For the default theme,
+293  * the recommended options are "top" and "bottom".
+294  * @type String
+295  * @default 'top'
+296  * @see CKEDITOR.config.theme
+297  * @example
+298  * config.toolbarLocation = 'bottom';
+299  */
+300 CKEDITOR.config.toolbarLocation = 'top';
+301
+302 /**
+303  * The toolbar definition. It is an array of toolbars (strips),
+304  * each one being also an array, containing a list of UI items.
+305  * @type Array
+306  * @example
+307  * // Defines a toolbar with only one strip containing the "Source" button, a
+308  * // separator and the "Bold" and "Italic" buttons.
+309  * <b>CKEDITOR.config.toolbar_Basic =
+310  * [
+311  *     [ 'Source', '-', 'Bold', 'Italic' ]
+312  * ]</b>;
+313  */
+314 CKEDITOR.config.toolbar_Basic =
+315 [
+316 	['Bold', 'Italic', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink','-','About']
+317 ];
+318
+319 CKEDITOR.config.toolbar_Full =
+320 [
+321 	['Source','-','Save','NewPage','Preview','-','Templates'],
+322 	['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print', 'SpellChecker', 'Scayt'],
+323 	['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
+324 	['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField'],
+325 	'/',
+326 	['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
+327 	['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
+328 	['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
+329 	['Link','Unlink','Anchor'],	['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],
+330 	'/',
+331 	['Styles','Format','Font','FontSize'],
+332 	['TextColor','BGColor'],
+333 	['Maximize', 'ShowBlocks','-','About']
+334 ];
+335
+336 /**
+337  * The toolbox (alias toolbar) definition. It is a toolbar name or an array of toolbars (strips),
+338  * each one being also an array, containing a list of UI items.
+339  * @type Array or String
+340  * @example
+341  * // Defines a toolbar with only one strip containing the "Source" button, a
+342  * // separator and the "Bold" and "Italic" buttons.
+343  * <b>CKEDITOR.config.toolbar =
+344  * [
+345  *     [ 'Source', '-', 'Bold', 'Italic' ]
+346  * ]</b>;
+347  * // Load toolbar_Name where Name = Basic.
+348  * <b>CKEDITOR.config.toolbar = 'Basic';
+349  */
+350 CKEDITOR.config.toolbar = 'Full';
+351
+352 CKEDITOR.config.toolbarCanCollapse = true;
+353 CKEDITOR.config.toolbarStartupExpanded = true;
+354 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_dialogs_uicolor.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_dialogs_uicolor.js.html new file mode 100644 index 000000000..5c39484b0 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_dialogs_uicolor.js.html @@ -0,0 +1,207 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dialog.add( 'uicolor', function( editor )
+  7 {
+  8 	var dialog, picker, pickerContents,
+  9 		// Actual UI color value.
+ 10 		uiColor = editor.getUiColor();
+ 11
+ 12 	function setNewPickerColor( color )
+ 13 	{
+ 14 		// Convert HEX representation to RGB, stripping # char.
+ 15 		if ( /^#/.test( color ) )
+ 16 			color = YAHOO.util.Color.hex2rgb( color.substr( 1 ) );
+ 17 		picker.setValue( color, true );
+ 18 		// Refresh picker UI.
+ 19 		picker.refresh( 'cke_uicolor_picker' );
+ 20 	}
+ 21
+ 22 	function setNewUiColor( color, force )
+ 23 	{
+ 24 		if ( force || dialog._.contents.tab1.livePeview.getValue() )
+ 25 			editor.setUiColor( color );
+ 26 		// Write new config string into textbox.
+ 27 		dialog._.contents.tab1.configBox.setValue(
+ 28 			'config.uiColor = "#' + picker.get( "hex" ) + '"'
+ 29 		);
+ 30 	}
+ 31
+ 32 	pickerContents =
+ 33 	{
+ 34 		id : 'yuiColorPicker',
+ 35 		type : 'html',
+ 36 		html : "<div id='cke_uicolor_picker' style='width: 360px; height: 200px; position: relative;'></div>",
+ 37 		onLoad : function( event )
+ 38 		{
+ 39 			var url = CKEDITOR.getUrl(
+ 41 					'plugins/uicolor/yui/'
+ 42 				);
+ 43
+ 44 			// Create new color picker widget.
+ 45 			picker = new YAHOO.widget.ColorPicker( "cke_uicolor_picker",
+ 46 				{
+ 47 					showhsvcontrols : true,
+ 48 					showhexcontrols : true,
+ 49 					images :
+ 50 					{
+ 51 						PICKER_THUMB : url + "assets/picker_thumb.png",
+ 52 						HUE_THUMB : url + "assets/hue_thumb.png"
+ 53 					}
+ 54 				});
+ 55
+ 56 			// Set actual UI color to the picker.
+ 57 			if ( uiColor )
+ 58 				setNewPickerColor( uiColor );
+ 59
+ 60 			// Subscribe to the rgbChange event.
+ 61 			picker.on( "rgbChange", function()
+ 62 				{
+ 63 					// Reset predefined box.
+ 64 					dialog._.contents.tab1.predefined.setValue( '' );
+ 65 					setNewUiColor( '#' + picker.get( 'hex' ) );
+ 66 				});
+ 67
+ 68 			// Fix input class names.
+ 69 			var inputs = new CKEDITOR.dom.nodeList( picker.getElementsByTagName( 'input' ) );
+ 70 			for ( var i = 0; i < inputs.count() ; i++ )
+ 71 				inputs.getItem( i ).addClass( 'cke_dialog_ui_input_text' );
+ 72 		}
+ 73 	};
+ 74
+ 75 	var skipPreviewChange = true;
+ 76
+ 77 	return {
+ 78 		title : editor.lang.uicolor.title,
+ 79 		minWidth : 360,
+ 80 		minHeight : 320,
+ 81 		onLoad : function()
+ 82 		{
+ 83 			dialog = this;
+ 84 			this.setupContent();
+ 85 		},
+ 86 		contents : [
+ 87 			{
+ 88 				id : 'tab1',
+ 89 				label : '',
+ 90 				title : '',
+ 91 				expand : true,
+ 92 				padding : 0,
+ 93 				elements : [
+ 94 						pickerContents,
+ 95 						{
+ 96 							id : 'tab1',
+ 97 							type : 'vbox',
+ 98 							children :
+ 99 							[
+100 								{
+101 									id : 'livePeview',
+102 									type : 'checkbox',
+103 									label : editor.lang.uicolor.preview,
+104 									'default' : 1,
+105 									onLoad : function()
+106 									{
+107 										skipPreviewChange = true;
+108 									},
+109 									onChange : function()
+110 									{
+111 										if ( skipPreviewChange )
+112 											return;
+113 										var on = this.getValue(),
+114 											color = on ? '#' + picker.get( 'hex' ) : uiColor;
+115 										setNewUiColor( color, true );
+116 									}
+117 								},
+118 								{
+119 									type : 'hbox',
+120 									children :
+121 									[
+122 										{
+123 											id : 'predefined',
+124 											type : 'select',
+125 											'default' : '',
+126 											label : editor.lang.uicolor.predefined,
+127 											items :
+128 											[
+129 												[ '' ],
+130 												[ 'Light blue', '#9AB8F3' ],
+131 												[ 'Sand', '#D2B48C' ],
+132 												[ 'Metallic', '#949AAA' ],
+133 												[ 'Purple', '#C2A3C7' ],
+134 												[ 'Olive', '#A2C980' ],
+135 												[ 'Happy green', '#9BD446' ],
+136 												[ 'Jezebel Blue', '#14B8C4' ],
+137 												[ 'Burn', '#FF893A' ],
+138 												[ 'Easy red', '#FF6969' ],
+139 												[ 'Pisces 3', '#48B4F2' ],
+140 												[ 'Aquarius 5', '#487ED4' ],
+141 												[ 'Absinthe', '#A8CF76' ],
+142 												[ 'Scrambled Egg', '#C7A622' ],
+143 												[ 'Hello monday', '#8E8D80' ],
+144 												[ 'Lovely sunshine', '#F1E8B1' ],
+145 												[ 'Recycled air', '#B3C593' ],
+146 												[ 'Down', '#BCBCA4' ],
+147 												[ 'Mark Twain', '#CFE91D' ],
+148 												[ 'Specks of dust', '#D1B596' ],
+149 												[ 'Lollipop', '#F6CE23' ]
+150 											],
+151 											onChange : function()
+152 											{
+153 												var color = this.getValue();
+154 												if ( color )
+155 												{
+156 													setNewPickerColor( color );
+157 													setNewUiColor( color );
+158 													// Refresh predefined preview box.
+159 													CKEDITOR.document.getById( 'predefinedPreview' ).setStyle( 'background', color );
+160 												}
+161 												else
+162 													CKEDITOR.document.getById( 'predefinedPreview' ).setStyle( 'background', '' );
+163 											},
+164 											onShow : function()
+165 											{
+166 												var color = editor.getUiColor();
+167 												if ( color )
+168 													this.setValue( color );
+169 											}
+170 										},
+171 										{
+172 											id : 'predefinedPreview',
+173 											type : 'html',
+174 											html : '<div id="cke_uicolor_preview" style="border: 1px solid black; padding: 3px; width: 30px;">' +
+175 													'<div id="predefinedPreview" style="width: 30px; height: 30px;"> </div>' +
+176 												'</div>'
+177 										}
+178 									]
+179 								},
+180 								{
+181 									id : 'configBox',
+182 									type : 'text',
+183 									label : editor.lang.uicolor.config,
+184 									onShow : function()
+185 									{
+186 										var color = editor.getUiColor();
+187 										if ( color )
+188 											this.setValue(
+189 												'config.uiColor = "' + color + '"'
+190 											);
+191 									}
+192 								}
+193 							]
+194 						}
+195 					]
+196 			}
+197 		],
+198 		buttons : [ CKEDITOR.dialog.okButton ]
+199 	};
+200 } );
+201 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_lang_en.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_lang_en.js.html new file mode 100644 index 000000000..987f0f384 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_lang_en.js.html @@ -0,0 +1,23 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.setLang( 'uicolor', 'en',
+  7 {
+  8 	uicolor :
+  9 	{
+ 10 		title : 'UI Color Picker',
+ 11 		preview : 'Live preview',
+ 12 		config : 'Paste this string into your config.js file',
+ 13 		predefined : 'Predefined color sets'
+ 14 	}
+ 15 });
+ 16 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_plugin.js.html new file mode 100644 index 000000000..c9272dc6e --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_plugin.js.html @@ -0,0 +1,43 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.plugins.add( 'uicolor',
+  7 {
+  8 	requires : [ 'dialog' ],
+  9 	lang : [ 'en' ],
+ 10
+ 11 	init : function( editor )
+ 12 	{
+ 13 		if ( CKEDITOR.env.ie6Compat )
+ 14 			return;
+ 15
+ 16 		editor.addCommand( 'uicolor', new CKEDITOR.dialogCommand( 'uicolor' ) );
+ 17 		editor.ui.addButton( 'UIColor',
+ 18 			{
+ 19 				label : editor.lang.uicolor.title,
+ 20 				command : 'uicolor',
+ 21 				icon : this.path + 'uicolor.gif'
+ 22 			});
+ 23 		CKEDITOR.dialog.add( 'uicolor', this.path + 'dialogs/uicolor.js' );
+ 24
+ 25 		// Load YUI js files.
+ 26 		CKEDITOR.scriptLoader.load( CKEDITOR.getUrl(
+ 28 			'plugins/uicolor/yui/yui.js'
+ 29 		));
+ 30
+ 31 		// Load YUI css files.
+ 32 		editor.element.getDocument().appendStyleSheet( CKEDITOR.getUrl(
+ 34 				'plugins/uicolor/yui/assets/yui.css'
+ 35 		));
+ 36 	}
+ 37 } );
+ 38 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_yui_yui.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_yui_yui.js.html new file mode 100644 index 000000000..f2c868681 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_uicolor_yui_yui.js.html @@ -0,0 +1,79 @@ +
  1 /*jsl:ignoreall*/
+  2 /*
+  3 Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+  4 Code licensed under the BSD License:
+  5 http://developer.yahoo.net/yui/license.txt
+  6 version: 2.7.0
+  7 */
+  8 if(typeof YAHOO=="undefined"||!YAHOO){var YAHOO={};}YAHOO.namespace=function(){var A=arguments,E=null,C,B,D;for(C=0;C<A.length;C=C+1){D=(""+A[C]).split(".");E=YAHOO;for(B=(D[0]=="YAHOO")?1:0;B<D.length;B=B+1){E[D[B]]=E[D[B]]||{};E=E[D[B]];}}return E;};YAHOO.log=function(D,A,C){var B=YAHOO.widget.Logger;if(B&&B.log){return B.log(D,A,C);}else{return false;}};YAHOO.register=function(A,E,D){var I=YAHOO.env.modules,B,H,G,F,C;if(!I[A]){I[A]={versions:[],builds:[]};}B=I[A];H=D.version;G=D.build;F=YAHOO.env.listeners;B.name=A;B.version=H;B.build=G;B.versions.push(H);B.builds.push(G);B.mainClass=E;for(C=0;C<F.length;C=C+1){F[C](B);}if(E){E.VERSION=H;E.BUILD=G;}else{YAHOO.log("mainClass is undefined for module "+A,"warn");}};YAHOO.env=YAHOO.env||{modules:[],listeners:[]};YAHOO.env.getVersion=function(A){return YAHOO.env.modules[A]||null;};YAHOO.env.ua=function(){var C={ie:0,opera:0,gecko:0,webkit:0,mobile:null,air:0,caja:0},B=navigator.userAgent,A;if((/KHTML/).test(B)){C.webkit=1;}A=B.match(/AppleWebKit\/([^\s]*)/);if(A&&A[1]){C.webkit=parseFloat(A[1]);if(/ Mobile\//.test(B)){C.mobile="Apple";}else{A=B.match(/NokiaN[^\/]*/);if(A){C.mobile=A[0];}}A=B.match(/AdobeAIR\/([^\s]*)/);if(A){C.air=A[0];}}if(!C.webkit){A=B.match(/Opera[\s\/]([^\s]*)/);if(A&&A[1]){C.opera=parseFloat(A[1]);A=B.match(/Opera Mini[^;]*/);if(A){C.mobile=A[0];}}else{A=B.match(/MSIE\s([^;]*)/);if(A&&A[1]){C.ie=parseFloat(A[1]);}else{A=B.match(/Gecko\/([^\s]*)/);if(A){C.gecko=1;A=B.match(/rv:([^\s\)]*)/);if(A&&A[1]){C.gecko=parseFloat(A[1]);}}}}}A=B.match(/Caja\/([^\s]*)/);if(A&&A[1]){C.caja=parseFloat(A[1]);}return C;}();(function(){YAHOO.namespace("util","widget","example");if("undefined"!==typeof YAHOO_config){var B=YAHOO_config.listener,A=YAHOO.env.listeners,D=true,C;if(B){for(C=0;C<A.length;C=C+1){if(A[C]==B){D=false;break;}}if(D){A.push(B);}}}})();YAHOO.lang=YAHOO.lang||{};(function(){var B=YAHOO.lang,F="[object Array]",C="[object Function]",A=Object.prototype,E=["toString","valueOf"],D={isArray:function(G){return A.toString.apply(G)===F;},isBoolean:function(G){return typeof G==="boolean";},isFunction:function(G){return A.toString.apply(G)===C;},isNull:function(G){return G===null;},isNumber:function(G){return typeof G==="number"&&isFinite(G);},isObject:function(G){return(G&&(typeof G==="object"||B.isFunction(G)))||false;},isString:function(G){return typeof G==="string";},isUndefined:function(G){return typeof G==="undefined";},_IEEnumFix:(YAHOO.env.ua.ie)?function(I,H){var G,K,J;for(G=0;G<E.length;G=G+1){K=E[G];J=H[K];if(B.isFunction(J)&&J!=A[K]){I[K]=J;}}}:function(){},extend:function(J,K,I){if(!K||!J){throw new Error("extend failed, please check that "+"all dependencies are included.");}var H=function(){},G;H.prototype=K.prototype;J.prototype=new H();J.prototype.constructor=J;J.superclass=K.prototype;if(K.prototype.constructor==A.constructor){K.prototype.constructor=K;}if(I){for(G in I){if(B.hasOwnProperty(I,G)){J.prototype[G]=I[G];}}B._IEEnumFix(J.prototype,I);}},augmentObject:function(K,J){if(!J||!K){throw new Error("Absorb failed, verify dependencies.");}var G=arguments,I,L,H=G[2];if(H&&H!==true){for(I=2;I<G.length;I=I+1){K[G[I]]=J[G[I]];}}else{for(L in J){if(H||!(L in K)){K[L]=J[L];}}B._IEEnumFix(K,J);}},augmentProto:function(J,I){if(!I||!J){throw new Error("Augment failed, verify dependencies.");}var G=[J.prototype,I.prototype],H;for(H=2;H<arguments.length;H=H+1){G.push(arguments[H]);}B.augmentObject.apply(this,G);},dump:function(G,L){var I,K,N=[],O="{...}",H="f(){...}",M=", ",J=" => ";if(!B.isObject(G)){return G+"";}else{if(G instanceof Date||("nodeType" in G&&"tagName" in G)){return G;}else{if(B.isFunction(G)){return H;}}}L=(B.isNumber(L))?L:3;if(B.isArray(G)){N.push("[");for(I=0,K=G.length;I<K;I=I+1){if(B.isObject(G[I])){N.push((L>0)?B.dump(G[I],L-1):O);}else{N.push(G[I]);}N.push(M);}if(N.length>1){N.pop();}N.push("]");}else{N.push("{");for(I in G){if(B.hasOwnProperty(G,I)){N.push(I+J);if(B.isObject(G[I])){N.push((L>0)?B.dump(G[I],L-1):O);}else{N.push(G[I]);}N.push(M);}}if(N.length>1){N.pop();}N.push("}");}return N.join("");},substitute:function(V,H,O){var L,K,J,R,S,U,Q=[],I,M="dump",P=" ",G="{",T="}",N;for(;;){L=V.lastIndexOf(G);if(L<0){break;}K=V.indexOf(T,L);if(L+1>=K){break;}I=V.substring(L+1,K);R=I;U=null;J=R.indexOf(P);if(J>-1){U=R.substring(J+1);R=R.substring(0,J);}S=H[R];if(O){S=O(R,S,U);}if(B.isObject(S)){if(B.isArray(S)){S=B.dump(S,parseInt(U,10));}else{U=U||"";N=U.indexOf(M);if(N>-1){U=U.substring(4);}if(S.toString===A.toString||N>-1){S=B.dump(S,parseInt(U,10));}else{S=S.toString();}}}else{if(!B.isString(S)&&!B.isNumber(S)){S="~-"+Q.length+"-~";Q[Q.length]=I;}}V=V.substring(0,L)+S+V.substring(K+1);}for(L=Q.length-1;L>=0;L=L-1){V=V.replace(new RegExp("~-"+L+"-~"),"{"+Q[L]+"}","g");}return V;},trim:function(G){try{return G.replace(/^\s+|\s+$/g,"");}catch(H){return G;}},merge:function(){var J={},H=arguments,G=H.length,I;for(I=0;I<G;I=I+1){B.augmentObject(J,H[I],true);}return J;},later:function(N,H,O,J,K){N=N||0;H=H||{};var I=O,M=J,L,G;if(B.isString(O)){I=H[O];}if(!I){throw new TypeError("method undefined");}if(!B.isArray(M)){M=[J];}L=function(){I.apply(H,M);};G=(K)?setInterval(L,N):setTimeout(L,N);return{interval:K,cancel:function(){if(this.interval){clearInterval(G);}else{clearTimeout(G);}}};},isValue:function(G){return(B.isObject(G)||B.isString(G)||B.isNumber(G)||B.isBoolean(G));}};B.hasOwnProperty=(A.hasOwnProperty)?function(G,H){return G&&G.hasOwnProperty(H);}:function(G,H){return !B.isUndefined(G[H])&&G.constructor.prototype[H]!==G[H];};D.augmentObject(B,D,true);YAHOO.util.Lang=B;B.augment=B.augmentProto;YAHOO.augment=B.augmentProto;YAHOO.extend=B.extend;})();YAHOO.register("yahoo",YAHOO,{version:"2.7.0",build:"1796"});(function(){YAHOO.env._id_counter=YAHOO.env._id_counter||0;var E=YAHOO.util,L=YAHOO.lang,m=YAHOO.env.ua,A=YAHOO.lang.trim,d={},h={},N=/^t(?:able|d|h)$/i,X=/color$/i,K=window.document,W=K.documentElement,e="ownerDocument",n="defaultView",v="documentElement",t="compatMode",b="offsetLeft",P="offsetTop",u="offsetParent",Z="parentNode",l="nodeType",C="tagName",O="scrollLeft",i="scrollTop",Q="getBoundingClientRect",w="getComputedStyle",a="currentStyle",M="CSS1Compat",c="BackCompat",g="class",F="className",J="",B=" ",s="(?:^|\\s)",k="(?= |$)",U="g",p="position",f="fixed",V="relative",j="left",o="top",r="medium",q="borderLeftWidth",R="borderTopWidth",D=m.opera,I=m.webkit,H=m.gecko,T=m.ie;E.Dom={CUSTOM_ATTRIBUTES:(!W.hasAttribute)?{"for":"htmlFor","class":F}:{"htmlFor":"for","className":g},get:function(y){var AA,Y,z,x,G;if(y){if(y[l]||y.item){return y;}if(typeof y==="string"){AA=y;y=K.getElementById(y);if(y&&y.id===AA){return y;}else{if(y&&K.all){y=null;Y=K.all[AA];for(x=0,G=Y.length;x<G;++x){if(Y[x].id===AA){return Y[x];}}}}return y;}if(y.DOM_EVENTS){y=y.get("element");}if("length" in y){z=[];for(x=0,G=y.length;x<G;++x){z[z.length]=E.Dom.get(y[x]);}return z;}return y;}return null;},getComputedStyle:function(G,Y){if(window[w]){return G[e][n][w](G,null)[Y];}else{if(G[a]){return E.Dom.IE_ComputedStyle.get(G,Y);}}},getStyle:function(G,Y){return E.Dom.batch(G,E.Dom._getStyle,Y);},_getStyle:function(){if(window[w]){return function(G,y){y=(y==="float")?y="cssFloat":E.Dom._toCamel(y);var x=G.style[y],Y;if(!x){Y=G[e][n][w](G,null);if(Y){x=Y[y];}}return x;};}else{if(W[a]){return function(G,y){var x;switch(y){case"opacity":x=100;try{x=G.filters["DXImageTransform.Microsoft.Alpha"].opacity;}catch(z){try{x=G.filters("alpha").opacity;}catch(Y){}}return x/100;case"float":y="styleFloat";default:y=E.Dom._toCamel(y);x=G[a]?G[a][y]:null;return(G.style[y]||x);}};}}}(),setStyle:function(G,Y,x){E.Dom.batch(G,E.Dom._setStyle,{prop:Y,val:x});},_setStyle:function(){if(T){return function(Y,G){var x=E.Dom._toCamel(G.prop),y=G.val;if(Y){switch(x){case"opacity":if(L.isString(Y.style.filter)){Y.style.filter="alpha(opacity="+y*100+")";if(!Y[a]||!Y[a].hasLayout){Y.style.zoom=1;}}break;case"float":x="styleFloat";default:Y.style[x]=y;}}else{}};}else{return function(Y,G){var x=E.Dom._toCamel(G.prop),y=G.val;if(Y){if(x=="float"){x="cssFloat";}Y.style[x]=y;}else{}};}}(),getXY:function(G){return E.Dom.batch(G,E.Dom._getXY);},_canPosition:function(G){return(E.Dom._getStyle(G,"display")!=="none"&&E.Dom._inDoc(G));},_getXY:function(){if(K[v][Q]){return function(y){var z,Y,AA,AF,AE,AD,AC,G,x,AB=Math.floor,AG=false;if(E.Dom._canPosition(y)){AA=y[Q]();AF=y[e];z=E.Dom.getDocumentScrollLeft(AF);Y=E.Dom.getDocumentScrollTop(AF);AG=[AB(AA[j]),AB(AA[o])];if(T&&m.ie<8){AE=2;AD=2;AC=AF[t];G=S(AF[v],q);x=S(AF[v],R);if(m.ie===6){if(AC!==c){AE=0;AD=0;}}if((AC==c)){if(G!==r){AE=parseInt(G,10);}if(x!==r){AD=parseInt(x,10);}}AG[0]-=AE;AG[1]-=AD;}if((Y||z)){AG[0]+=z;AG[1]+=Y;}AG[0]=AB(AG[0]);AG[1]=AB(AG[1]);}else{}return AG;};}else{return function(y){var x,Y,AA,AB,AC,z=false,G=y;if(E.Dom._canPosition(y)){z=[y[b],y[P]];x=E.Dom.getDocumentScrollLeft(y[e]);Y=E.Dom.getDocumentScrollTop(y[e]);AC=((H||m.webkit>519)?true:false);while((G=G[u])){z[0]+=G[b];z[1]+=G[P];if(AC){z=E.Dom._calcBorders(G,z);}}if(E.Dom._getStyle(y,p)!==f){G=y;while((G=G[Z])&&G[C]){AA=G[i];AB=G[O];if(H&&(E.Dom._getStyle(G,"overflow")!=="visible")){z=E.Dom._calcBorders(G,z);}if(AA||AB){z[0]-=AB;z[1]-=AA;}}z[0]+=x;z[1]+=Y;}else{if(D){z[0]-=x;z[1]-=Y;}else{if(I||H){z[0]+=x;z[1]+=Y;}}}z[0]=Math.floor(z[0]);z[1]=Math.floor(z[1]);}else{}return z;};}}(),getX:function(G){var Y=function(x){return E.Dom.getXY(x)[0];};return E.Dom.batch(G,Y,E.Dom,true);},getY:function(G){var Y=function(x){return E.Dom.getXY(x)[1];};return E.Dom.batch(G,Y,E.Dom,true);},setXY:function(G,x,Y){E.Dom.batch(G,E.Dom._setXY,{pos:x,noRetry:Y});},_setXY:function(G,z){var AA=E.Dom._getStyle(G,p),y=E.Dom.setStyle,AD=z.pos,Y=z.noRetry,AB=[parseInt(E.Dom.getComputedStyle(G,j),10),parseInt(E.Dom.getComputedStyle(G,o),10)],AC,x;if(AA=="static"){AA=V;y(G,p,AA);}AC=E.Dom._getXY(G);if(!AD||AC===false){return false;}if(isNaN(AB[0])){AB[0]=(AA==V)?0:G[b];}if(isNaN(AB[1])){AB[1]=(AA==V)?0:G[P];}if(AD[0]!==null){y(G,j,AD[0]-AC[0]+AB[0]+"px");}if(AD[1]!==null){y(G,o,AD[1]-AC[1]+AB[1]+"px");}if(!Y){x=E.Dom._getXY(G);if((AD[0]!==null&&x[0]!=AD[0])||(AD[1]!==null&&x[1]!=AD[1])){E.Dom._setXY(G,{pos:AD,noRetry:true});}}},setX:function(Y,G){E.Dom.setXY(Y,[G,null]);},setY:function(G,Y){E.Dom.setXY(G,[null,Y]);},getRegion:function(G){var Y=function(x){var y=false;if(E.Dom._canPosition(x)){y=E.Region.getRegion(x);}else{}return y;};return E.Dom.batch(G,Y,E.Dom,true);},getClientWidth:function(){return E.Dom.getViewportWidth();},getClientHeight:function(){return E.Dom.getViewportHeight();},getElementsByClassName:function(AB,AF,AC,AE,x,AD){AB=L.trim(AB);AF=AF||"*";AC=(AC)?E.Dom.get(AC):null||K;if(!AC){return[];}var Y=[],G=AC.getElementsByTagName(AF),z=E.Dom.hasClass;for(var y=0,AA=G.length;y<AA;++y){if(z(G[y],AB)){Y[Y.length]=G[y];}}if(AE){E.Dom.batch(Y,AE,x,AD);}return Y;},hasClass:function(Y,G){return E.Dom.batch(Y,E.Dom._hasClass,G);},_hasClass:function(x,Y){var G=false,y;if(x&&Y){y=E.Dom.getAttribute(x,F)||J;if(Y.exec){G=Y.test(y);}else{G=Y&&(B+y+B).indexOf(B+Y+B)>-1;}}else{}return G;},addClass:function(Y,G){return E.Dom.batch(Y,E.Dom._addClass,G);},_addClass:function(x,Y){var G=false,y;if(x&&Y){y=E.Dom.getAttribute(x,F)||J;if(!E.Dom._hasClass(x,Y)){E.Dom.setAttribute(x,F,A(y+B+Y));G=true;}}else{}return G;},removeClass:function(Y,G){return E.Dom.batch(Y,E.Dom._removeClass,G);},_removeClass:function(y,x){var Y=false,AA,z,G;if(y&&x){AA=E.Dom.getAttribute(y,F)||J;E.Dom.setAttribute(y,F,AA.replace(E.Dom._getClassRegex(x),J));z=E.Dom.getAttribute(y,F);if(AA!==z){E.Dom.setAttribute(y,F,A(z));Y=true;if(E.Dom.getAttribute(y,F)===""){G=(y.hasAttribute&&y.hasAttribute(g))?g:F;y.removeAttribute(G);}}}else{}return Y;},replaceClass:function(x,Y,G){return E.Dom.batch(x,E.Dom._replaceClass,{from:Y,to:G});
+  9 },_replaceClass:function(y,x){var Y,AB,AA,G=false,z;if(y&&x){AB=x.from;AA=x.to;if(!AA){G=false;}else{if(!AB){G=E.Dom._addClass(y,x.to);}else{if(AB!==AA){z=E.Dom.getAttribute(y,F)||J;Y=(B+z.replace(E.Dom._getClassRegex(AB),B+AA)).split(E.Dom._getClassRegex(AA));Y.splice(1,0,B+AA);E.Dom.setAttribute(y,F,A(Y.join(J)));G=true;}}}}else{}return G;},generateId:function(G,x){x=x||"yui-gen";var Y=function(y){if(y&&y.id){return y.id;}var z=x+YAHOO.env._id_counter++;if(y){if(y[e].getElementById(z)){return E.Dom.generateId(y,z+x);}y.id=z;}return z;};return E.Dom.batch(G,Y,E.Dom,true)||Y.apply(E.Dom,arguments);},isAncestor:function(Y,x){Y=E.Dom.get(Y);x=E.Dom.get(x);var G=false;if((Y&&x)&&(Y[l]&&x[l])){if(Y.contains&&Y!==x){G=Y.contains(x);}else{if(Y.compareDocumentPosition){G=!!(Y.compareDocumentPosition(x)&16);}}}else{}return G;},inDocument:function(G,Y){return E.Dom._inDoc(E.Dom.get(G),Y);},_inDoc:function(Y,x){var G=false;if(Y&&Y[C]){x=x||Y[e];G=E.Dom.isAncestor(x[v],Y);}else{}return G;},getElementsBy:function(Y,AF,AB,AD,y,AC,AE){AF=AF||"*";AB=(AB)?E.Dom.get(AB):null||K;if(!AB){return[];}var x=[],G=AB.getElementsByTagName(AF);for(var z=0,AA=G.length;z<AA;++z){if(Y(G[z])){if(AE){x=G[z];break;}else{x[x.length]=G[z];}}}if(AD){E.Dom.batch(x,AD,y,AC);}return x;},getElementBy:function(x,G,Y){return E.Dom.getElementsBy(x,G,Y,null,null,null,true);},batch:function(x,AB,AA,z){var y=[],Y=(z)?AA:window;x=(x&&(x[C]||x.item))?x:E.Dom.get(x);if(x&&AB){if(x[C]||x.length===undefined){return AB.call(Y,x,AA);}for(var G=0;G<x.length;++G){y[y.length]=AB.call(Y,x[G],AA);}}else{return false;}return y;},getDocumentHeight:function(){var Y=(K[t]!=M||I)?K.body.scrollHeight:W.scrollHeight,G=Math.max(Y,E.Dom.getViewportHeight());return G;},getDocumentWidth:function(){var Y=(K[t]!=M||I)?K.body.scrollWidth:W.scrollWidth,G=Math.max(Y,E.Dom.getViewportWidth());return G;},getViewportHeight:function(){var G=self.innerHeight,Y=K[t];if((Y||T)&&!D){G=(Y==M)?W.clientHeight:K.body.clientHeight;}return G;},getViewportWidth:function(){var G=self.innerWidth,Y=K[t];if(Y||T){G=(Y==M)?W.clientWidth:K.body.clientWidth;}return G;},getAncestorBy:function(G,Y){while((G=G[Z])){if(E.Dom._testElement(G,Y)){return G;}}return null;},getAncestorByClassName:function(Y,G){Y=E.Dom.get(Y);if(!Y){return null;}var x=function(y){return E.Dom.hasClass(y,G);};return E.Dom.getAncestorBy(Y,x);},getAncestorByTagName:function(Y,G){Y=E.Dom.get(Y);if(!Y){return null;}var x=function(y){return y[C]&&y[C].toUpperCase()==G.toUpperCase();};return E.Dom.getAncestorBy(Y,x);},getPreviousSiblingBy:function(G,Y){while(G){G=G.previousSibling;if(E.Dom._testElement(G,Y)){return G;}}return null;},getPreviousSibling:function(G){G=E.Dom.get(G);if(!G){return null;}return E.Dom.getPreviousSiblingBy(G);},getNextSiblingBy:function(G,Y){while(G){G=G.nextSibling;if(E.Dom._testElement(G,Y)){return G;}}return null;},getNextSibling:function(G){G=E.Dom.get(G);if(!G){return null;}return E.Dom.getNextSiblingBy(G);},getFirstChildBy:function(G,x){var Y=(E.Dom._testElement(G.firstChild,x))?G.firstChild:null;return Y||E.Dom.getNextSiblingBy(G.firstChild,x);},getFirstChild:function(G,Y){G=E.Dom.get(G);if(!G){return null;}return E.Dom.getFirstChildBy(G);},getLastChildBy:function(G,x){if(!G){return null;}var Y=(E.Dom._testElement(G.lastChild,x))?G.lastChild:null;return Y||E.Dom.getPreviousSiblingBy(G.lastChild,x);},getLastChild:function(G){G=E.Dom.get(G);return E.Dom.getLastChildBy(G);},getChildrenBy:function(Y,y){var x=E.Dom.getFirstChildBy(Y,y),G=x?[x]:[];E.Dom.getNextSiblingBy(x,function(z){if(!y||y(z)){G[G.length]=z;}return false;});return G;},getChildren:function(G){G=E.Dom.get(G);if(!G){}return E.Dom.getChildrenBy(G);},getDocumentScrollLeft:function(G){G=G||K;return Math.max(G[v].scrollLeft,G.body.scrollLeft);},getDocumentScrollTop:function(G){G=G||K;return Math.max(G[v].scrollTop,G.body.scrollTop);},insertBefore:function(Y,G){Y=E.Dom.get(Y);G=E.Dom.get(G);if(!Y||!G||!G[Z]){return null;}return G[Z].insertBefore(Y,G);},insertAfter:function(Y,G){Y=E.Dom.get(Y);G=E.Dom.get(G);if(!Y||!G||!G[Z]){return null;}if(G.nextSibling){return G[Z].insertBefore(Y,G.nextSibling);}else{return G[Z].appendChild(Y);}},getClientRegion:function(){var x=E.Dom.getDocumentScrollTop(),Y=E.Dom.getDocumentScrollLeft(),y=E.Dom.getViewportWidth()+Y,G=E.Dom.getViewportHeight()+x;return new E.Region(x,y,G,Y);},setAttribute:function(Y,G,x){G=E.Dom.CUSTOM_ATTRIBUTES[G]||G;Y.setAttribute(G,x);},getAttribute:function(Y,G){G=E.Dom.CUSTOM_ATTRIBUTES[G]||G;return Y.getAttribute(G);},_toCamel:function(Y){var x=d;function G(y,z){return z.toUpperCase();}return x[Y]||(x[Y]=Y.indexOf("-")===-1?Y:Y.replace(/-([a-z])/gi,G));},_getClassRegex:function(Y){var G;if(Y!==undefined){if(Y.exec){G=Y;}else{G=h[Y];if(!G){Y=Y.replace(E.Dom._patterns.CLASS_RE_TOKENS,"\\$1");G=h[Y]=new RegExp(s+Y+k,U);}}}return G;},_patterns:{ROOT_TAG:/^body|html$/i,CLASS_RE_TOKENS:/([\.\(\)\^\$\*\+\?\|\[\]\{\}])/g},_testElement:function(G,Y){return G&&G[l]==1&&(!Y||Y(G));},_calcBorders:function(x,y){var Y=parseInt(E.Dom[w](x,R),10)||0,G=parseInt(E.Dom[w](x,q),10)||0;if(H){if(N.test(x[C])){Y=0;G=0;}}y[0]+=G;y[1]+=Y;return y;}};var S=E.Dom[w];if(m.opera){E.Dom[w]=function(Y,G){var x=S(Y,G);if(X.test(G)){x=E.Dom.Color.toRGB(x);}return x;};}if(m.webkit){E.Dom[w]=function(Y,G){var x=S(Y,G);if(x==="rgba(0, 0, 0, 0)"){x="transparent";}return x;};}})();YAHOO.util.Region=function(C,D,A,B){this.top=C;this.y=C;this[1]=C;this.right=D;this.bottom=A;this.left=B;this.x=B;this[0]=B;this.width=this.right-this.left;this.height=this.bottom-this.top;};YAHOO.util.Region.prototype.contains=function(A){return(A.left>=this.left&&A.right<=this.right&&A.top>=this.top&&A.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(E){var C=Math.max(this.top,E.top),D=Math.min(this.right,E.right),A=Math.min(this.bottom,E.bottom),B=Math.max(this.left,E.left);if(A>=C&&D>=B){return new YAHOO.util.Region(C,D,A,B);
+ 10 }else{return null;}};YAHOO.util.Region.prototype.union=function(E){var C=Math.min(this.top,E.top),D=Math.max(this.right,E.right),A=Math.max(this.bottom,E.bottom),B=Math.min(this.left,E.left);return new YAHOO.util.Region(C,D,A,B);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+", height: "+this.height+", width: "+this.width+"}");};YAHOO.util.Region.getRegion=function(D){var F=YAHOO.util.Dom.getXY(D),C=F[1],E=F[0]+D.offsetWidth,A=F[1]+D.offsetHeight,B=F[0];return new YAHOO.util.Region(C,E,A,B);};YAHOO.util.Point=function(A,B){if(YAHOO.lang.isArray(A)){B=A[1];A=A[0];}YAHOO.util.Point.superclass.constructor.call(this,B,A,B,A);};YAHOO.extend(YAHOO.util.Point,YAHOO.util.Region);(function(){var B=YAHOO.util,A="clientTop",F="clientLeft",J="parentNode",K="right",W="hasLayout",I="px",U="opacity",L="auto",D="borderLeftWidth",G="borderTopWidth",P="borderRightWidth",V="borderBottomWidth",S="visible",Q="transparent",N="height",E="width",H="style",T="currentStyle",R=/^width|height$/,O=/^(\d[.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz|%){1}?/i,M={get:function(X,Z){var Y="",a=X[T][Z];if(Z===U){Y=B.Dom.getStyle(X,U);}else{if(!a||(a.indexOf&&a.indexOf(I)>-1)){Y=a;}else{if(B.Dom.IE_COMPUTED[Z]){Y=B.Dom.IE_COMPUTED[Z](X,Z);}else{if(O.test(a)){Y=B.Dom.IE.ComputedStyle.getPixel(X,Z);}else{Y=a;}}}}return Y;},getOffset:function(Z,e){var b=Z[T][e],X=e.charAt(0).toUpperCase()+e.substr(1),c="offset"+X,Y="pixel"+X,a="",d;if(b==L){d=Z[c];if(d===undefined){a=0;}a=d;if(R.test(e)){Z[H][e]=d;if(Z[c]>d){a=d-(Z[c]-d);}Z[H][e]=L;}}else{if(!Z[H][Y]&&!Z[H][e]){Z[H][e]=b;}a=Z[H][Y];}return a+I;},getBorderWidth:function(X,Z){var Y=null;if(!X[T][W]){X[H].zoom=1;}switch(Z){case G:Y=X[A];break;case V:Y=X.offsetHeight-X.clientHeight-X[A];break;case D:Y=X[F];break;case P:Y=X.offsetWidth-X.clientWidth-X[F];break;}return Y+I;},getPixel:function(Y,X){var a=null,b=Y[T][K],Z=Y[T][X];Y[H][K]=Z;a=Y[H].pixelRight;Y[H][K]=b;return a+I;},getMargin:function(Y,X){var Z;if(Y[T][X]==L){Z=0+I;}else{Z=B.Dom.IE.ComputedStyle.getPixel(Y,X);}return Z;},getVisibility:function(Y,X){var Z;while((Z=Y[T])&&Z[X]=="inherit"){Y=Y[J];}return(Z)?Z[X]:S;},getColor:function(Y,X){return B.Dom.Color.toRGB(Y[T][X])||Q;},getBorderColor:function(Y,X){var Z=Y[T],a=Z[X]||Z.color;return B.Dom.Color.toRGB(B.Dom.Color.toHex(a));}},C={};C.top=C.right=C.bottom=C.left=C[E]=C[N]=M.getOffset;C.color=M.getColor;C[G]=C[P]=C[V]=C[D]=M.getBorderWidth;C.marginTop=C.marginRight=C.marginBottom=C.marginLeft=M.getMargin;C.visibility=M.getVisibility;C.borderColor=C.borderTopColor=C.borderRightColor=C.borderBottomColor=C.borderLeftColor=M.getBorderColor;B.Dom.IE_COMPUTED=C;B.Dom.IE_ComputedStyle=M;})();(function(){var C="toString",A=parseInt,B=RegExp,D=YAHOO.util;D.Dom.Color={KEYWORDS:{black:"000",silver:"c0c0c0",gray:"808080",white:"fff",maroon:"800000",red:"f00",purple:"800080",fuchsia:"f0f",green:"008000",lime:"0f0",olive:"808000",yellow:"ff0",navy:"000080",blue:"00f",teal:"008080",aqua:"0ff"},re_RGB:/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,re_hex:/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,re_hex3:/([0-9A-F])/gi,toRGB:function(E){if(!D.Dom.Color.re_RGB.test(E)){E=D.Dom.Color.toHex(E);}if(D.Dom.Color.re_hex.exec(E)){E="rgb("+[A(B.$1,16),A(B.$2,16),A(B.$3,16)].join(", ")+")";}return E;},toHex:function(H){H=D.Dom.Color.KEYWORDS[H]||H;if(D.Dom.Color.re_RGB.exec(H)){var G=(B.$1.length===1)?"0"+B.$1:Number(B.$1),F=(B.$2.length===1)?"0"+B.$2:Number(B.$2),E=(B.$3.length===1)?"0"+B.$3:Number(B.$3);H=[G[C](16),F[C](16),E[C](16)].join("");}if(H.length<6){H=H.replace(D.Dom.Color.re_hex3,"$1$1");}if(H!=="transparent"&&H.indexOf("#")<0){H="#"+H;}return H.toLowerCase();}};}());YAHOO.register("dom",YAHOO.util.Dom,{version:"2.7.0",build:"1796"});YAHOO.util.CustomEvent=function(D,C,B,A){this.type=D;this.scope=C||window;this.silent=B;this.signature=A||YAHOO.util.CustomEvent.LIST;this.subscribers=[];if(!this.silent){}var E="_YUICEOnSubscribe";if(D!==E){this.subscribeEvent=new YAHOO.util.CustomEvent(E,this,true);}this.lastError=null;};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1;YAHOO.util.CustomEvent.prototype={subscribe:function(A,B,C){if(!A){throw new Error("Invalid callback for subscriber to '"+this.type+"'");}if(this.subscribeEvent){this.subscribeEvent.fire(A,B,C);}this.subscribers.push(new YAHOO.util.Subscriber(A,B,C));},unsubscribe:function(D,F){if(!D){return this.unsubscribeAll();}var E=false;for(var B=0,A=this.subscribers.length;B<A;++B){var C=this.subscribers[B];if(C&&C.contains(D,F)){this._delete(B);E=true;}}return E;},fire:function(){this.lastError=null;var K=[],E=this.subscribers.length;if(!E&&this.silent){return true;}var I=[].slice.call(arguments,0),G=true,D,J=false;if(!this.silent){}var C=this.subscribers.slice(),A=YAHOO.util.Event.throwErrors;for(D=0;D<E;++D){var M=C[D];if(!M){J=true;}else{if(!this.silent){}var L=M.getScope(this.scope);if(this.signature==YAHOO.util.CustomEvent.FLAT){var B=null;if(I.length>0){B=I[0];}try{G=M.fn.call(L,B,M.obj);}catch(F){this.lastError=F;if(A){throw F;}}}else{try{G=M.fn.call(L,this.type,I,M.obj);}catch(H){this.lastError=H;if(A){throw H;}}}if(false===G){if(!this.silent){}break;}}}return(G!==false);},unsubscribeAll:function(){var A=this.subscribers.length,B;for(B=A-1;B>-1;B--){this._delete(B);}this.subscribers=[];return A;},_delete:function(A){var B=this.subscribers[A];if(B){delete B.fn;delete B.obj;}this.subscribers.splice(A,1);},toString:function(){return"CustomEvent: "+"'"+this.type+"', "+"context: "+this.scope;}};YAHOO.util.Subscriber=function(A,B,C){this.fn=A;this.obj=YAHOO.lang.isUndefined(B)?null:B;this.overrideContext=C;};YAHOO.util.Subscriber.prototype.getScope=function(A){if(this.overrideContext){if(this.overrideContext===true){return this.obj;}else{return this.overrideContext;}}return A;};YAHOO.util.Subscriber.prototype.contains=function(A,B){if(B){return(this.fn==A&&this.obj==B);}else{return(this.fn==A);}};YAHOO.util.Subscriber.prototype.toString=function(){return"Subscriber { obj: "+this.obj+", overrideContext: "+(this.overrideContext||"no")+" }";};if(!YAHOO.util.Event){YAHOO.util.Event=function(){var H=false;var I=[];var J=[];var G=[];var E=[];var C=0;var F=[];var B=[];var A=0;var D={63232:38,63233:40,63234:37,63235:39,63276:33,63277:34,25:9};var K=YAHOO.env.ua.ie?"focusin":"focus";var L=YAHOO.env.ua.ie?"focusout":"blur";return{POLL_RETRYS:2000,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,UNLOAD_OBJ:3,ADJ_SCOPE:4,OBJ:5,OVERRIDE:6,lastError:null,isSafari:YAHOO.env.ua.webkit,webkit:YAHOO.env.ua.webkit,isIE:YAHOO.env.ua.ie,_interval:null,_dri:null,DOMReady:false,throwErrors:false,startInterval:function(){if(!this._interval){var M=this;var N=function(){M._tryPreloadAttach();};this._interval=setInterval(N,this.POLL_INTERVAL);}},onAvailable:function(S,O,Q,R,P){var M=(YAHOO.lang.isString(S))?[S]:S;for(var N=0;N<M.length;N=N+1){F.push({id:M[N],fn:O,obj:Q,overrideContext:R,checkReady:P});}C=this.POLL_RETRYS;this.startInterval();},onContentReady:function(P,M,N,O){this.onAvailable(P,M,N,O,true);},onDOMReady:function(M,N,O){if(this.DOMReady){setTimeout(function(){var P=window;if(O){if(O===true){P=N;}else{P=O;}}M.call(P,"DOMReady",[],N);},0);}else{this.DOMReadyEvent.subscribe(M,N,O);}},_addListener:function(O,M,Y,S,W,b){if(!Y||!Y.call){return false;}if(this._isValidCollection(O)){var Z=true;for(var T=0,V=O.length;T<V;++T){Z=this.on(O[T],M,Y,S,W)&&Z;}return Z;}else{if(YAHOO.lang.isString(O)){var R=this.getEl(O);if(R){O=R;}else{this.onAvailable(O,function(){YAHOO.util.Event.on(O,M,Y,S,W);});return true;}}}if(!O){return false;}if("unload"==M&&S!==this){J[J.length]=[O,M,Y,S,W];return true;}var N=O;if(W){if(W===true){N=S;}else{N=W;}}var P=function(c){return Y.call(N,YAHOO.util.Event.getEvent(c,O),S);};var a=[O,M,Y,P,N,S,W];var U=I.length;I[U]=a;if(this.useLegacyEvent(O,M)){var Q=this.getLegacyIndex(O,M);if(Q==-1||O!=G[Q][0]){Q=G.length;B[O.id+M]=Q;G[Q]=[O,M,O["on"+M]];E[Q]=[];O["on"+M]=function(c){YAHOO.util.Event.fireLegacyEvent(YAHOO.util.Event.getEvent(c),Q);};}E[Q].push(a);}else{try{this._simpleAdd(O,M,P,b);}catch(X){this.lastError=X;this.removeListener(O,M,Y);return false;}}return true;},addListener:function(N,Q,M,O,P){return this._addListener(N,Q,M,O,P,false);},addFocusListener:function(N,M,O,P){return this._addListener(N,K,M,O,P,true);},removeFocusListener:function(N,M){return this.removeListener(N,K,M);},addBlurListener:function(N,M,O,P){return this._addListener(N,L,M,O,P,true);},removeBlurListener:function(N,M){return this.removeListener(N,L,M);},fireLegacyEvent:function(R,P){var T=true,M,V,U,N,S;V=E[P].slice();for(var O=0,Q=V.length;O<Q;++O){U=V[O];if(U&&U[this.WFN]){N=U[this.ADJ_SCOPE];S=U[this.WFN].call(N,R);T=(T&&S);}}M=G[P];if(M&&M[2]){M[2](R);}return T;},getLegacyIndex:function(N,O){var M=this.generateId(N)+O;if(typeof B[M]=="undefined"){return -1;}else{return B[M];}},useLegacyEvent:function(M,N){return(this.webkit&&this.webkit<419&&("click"==N||"dblclick"==N));},removeListener:function(N,M,V){var Q,T,X;if(typeof N=="string"){N=this.getEl(N);}else{if(this._isValidCollection(N)){var W=true;for(Q=N.length-1;Q>-1;Q--){W=(this.removeListener(N[Q],M,V)&&W);}return W;}}if(!V||!V.call){return this.purgeElement(N,false,M);}if("unload"==M){for(Q=J.length-1;Q>-1;Q--){X=J[Q];if(X&&X[0]==N&&X[1]==M&&X[2]==V){J.splice(Q,1);return true;}}return false;}var R=null;var S=arguments[3];if("undefined"===typeof S){S=this._getCacheIndex(N,M,V);}if(S>=0){R=I[S];}if(!N||!R){return false;}if(this.useLegacyEvent(N,M)){var P=this.getLegacyIndex(N,M);var O=E[P];if(O){for(Q=0,T=O.length;Q<T;++Q){X=O[Q];if(X&&X[this.EL]==N&&X[this.TYPE]==M&&X[this.FN]==V){O.splice(Q,1);break;}}}}else{try{this._simpleRemove(N,M,R[this.WFN],false);}catch(U){this.lastError=U;return false;}}delete I[S][this.WFN];delete I[S][this.FN];
+ 11 I.splice(S,1);return true;},getTarget:function(O,N){var M=O.target||O.srcElement;return this.resolveTextNode(M);},resolveTextNode:function(N){try{if(N&&3==N.nodeType){return N.parentNode;}}catch(M){}return N;},getPageX:function(N){var M=N.pageX;if(!M&&0!==M){M=N.clientX||0;if(this.isIE){M+=this._getScrollLeft();}}return M;},getPageY:function(M){var N=M.pageY;if(!N&&0!==N){N=M.clientY||0;if(this.isIE){N+=this._getScrollTop();}}return N;},getXY:function(M){return[this.getPageX(M),this.getPageY(M)];},getRelatedTarget:function(N){var M=N.relatedTarget;if(!M){if(N.type=="mouseout"){M=N.toElement;}else{if(N.type=="mouseover"){M=N.fromElement;}}}return this.resolveTextNode(M);},getTime:function(O){if(!O.time){var N=new Date().getTime();try{O.time=N;}catch(M){this.lastError=M;return N;}}return O.time;},stopEvent:function(M){this.stopPropagation(M);this.preventDefault(M);},stopPropagation:function(M){if(M.stopPropagation){M.stopPropagation();}else{M.cancelBubble=true;}},preventDefault:function(M){if(M.preventDefault){M.preventDefault();}else{M.returnValue=false;}},getEvent:function(O,M){var N=O||window.event;if(!N){var P=this.getEvent.caller;while(P){N=P.arguments[0];if(N&&Event==N.constructor){break;}P=P.caller;}}return N;},getCharCode:function(N){var M=N.keyCode||N.charCode||0;if(YAHOO.env.ua.webkit&&(M in D)){M=D[M];}return M;},_getCacheIndex:function(Q,R,P){for(var O=0,N=I.length;O<N;O=O+1){var M=I[O];if(M&&M[this.FN]==P&&M[this.EL]==Q&&M[this.TYPE]==R){return O;}}return -1;},generateId:function(M){var N=M.id;if(!N){N="yuievtautoid-"+A;++A;M.id=N;}return N;},_isValidCollection:function(N){try{return(N&&typeof N!=="string"&&N.length&&!N.tagName&&!N.alert&&typeof N[0]!=="undefined");}catch(M){return false;}},elCache:{},getEl:function(M){return(typeof M==="string")?document.getElementById(M):M;},clearCache:function(){},DOMReadyEvent:new YAHOO.util.CustomEvent("DOMReady",this),_load:function(N){if(!H){H=true;var M=YAHOO.util.Event;M._ready();M._tryPreloadAttach();}},_ready:function(N){var M=YAHOO.util.Event;if(!M.DOMReady){M.DOMReady=true;M.DOMReadyEvent.fire();M._simpleRemove(document,"DOMContentLoaded",M._ready);}},_tryPreloadAttach:function(){if(F.length===0){C=0;if(this._interval){clearInterval(this._interval);this._interval=null;}return;}if(this.locked){return;}if(this.isIE){if(!this.DOMReady){this.startInterval();return;}}this.locked=true;var S=!H;if(!S){S=(C>0&&F.length>0);}var R=[];var T=function(V,W){var U=V;if(W.overrideContext){if(W.overrideContext===true){U=W.obj;}else{U=W.overrideContext;}}W.fn.call(U,W.obj);};var N,M,Q,P,O=[];for(N=0,M=F.length;N<M;N=N+1){Q=F[N];if(Q){P=this.getEl(Q.id);if(P){if(Q.checkReady){if(H||P.nextSibling||!S){O.push(Q);F[N]=null;}}else{T(P,Q);F[N]=null;}}else{R.push(Q);}}}for(N=0,M=O.length;N<M;N=N+1){Q=O[N];T(this.getEl(Q.id),Q);}C--;if(S){for(N=F.length-1;N>-1;N--){Q=F[N];if(!Q||!Q.id){F.splice(N,1);}}this.startInterval();}else{if(this._interval){clearInterval(this._interval);this._interval=null;}}this.locked=false;},purgeElement:function(Q,R,T){var O=(YAHOO.lang.isString(Q))?this.getEl(Q):Q;var S=this.getListeners(O,T),P,M;if(S){for(P=S.length-1;P>-1;P--){var N=S[P];this.removeListener(O,N.type,N.fn);}}if(R&&O&&O.childNodes){for(P=0,M=O.childNodes.length;P<M;++P){this.purgeElement(O.childNodes[P],R,T);}}},getListeners:function(O,M){var R=[],N;if(!M){N=[I,J];}else{if(M==="unload"){N=[J];}else{N=[I];}}var T=(YAHOO.lang.isString(O))?this.getEl(O):O;for(var Q=0;Q<N.length;Q=Q+1){var V=N[Q];if(V){for(var S=0,U=V.length;S<U;++S){var P=V[S];if(P&&P[this.EL]===T&&(!M||M===P[this.TYPE])){R.push({type:P[this.TYPE],fn:P[this.FN],obj:P[this.OBJ],adjust:P[this.OVERRIDE],scope:P[this.ADJ_SCOPE],index:S});}}}}return(R.length)?R:null;},_unload:function(T){var N=YAHOO.util.Event,Q,P,O,S,R,U=J.slice(),M;for(Q=0,S=J.length;Q<S;++Q){O=U[Q];if(O){M=window;if(O[N.ADJ_SCOPE]){if(O[N.ADJ_SCOPE]===true){M=O[N.UNLOAD_OBJ];}else{M=O[N.ADJ_SCOPE];}}O[N.FN].call(M,N.getEvent(T,O[N.EL]),O[N.UNLOAD_OBJ]);U[Q]=null;}}O=null;M=null;J=null;if(I){for(P=I.length-1;P>-1;P--){O=I[P];if(O){N.removeListener(O[N.EL],O[N.TYPE],O[N.FN],P);}}O=null;}G=null;N._simpleRemove(window,"unload",N._unload);},_getScrollLeft:function(){return this._getScroll()[1];},_getScrollTop:function(){return this._getScroll()[0];},_getScroll:function(){var M=document.documentElement,N=document.body;if(M&&(M.scrollTop||M.scrollLeft)){return[M.scrollTop,M.scrollLeft];}else{if(N){return[N.scrollTop,N.scrollLeft];}else{return[0,0];}}},regCE:function(){},_simpleAdd:function(){if(window.addEventListener){return function(O,P,N,M){O.addEventListener(P,N,(M));};}else{if(window.attachEvent){return function(O,P,N,M){O.attachEvent("on"+P,N);};}else{return function(){};}}}(),_simpleRemove:function(){if(window.removeEventListener){return function(O,P,N,M){O.removeEventListener(P,N,(M));};}else{if(window.detachEvent){return function(N,O,M){N.detachEvent("on"+O,M);};}else{return function(){};}}}()};}();(function(){var EU=YAHOO.util.Event;EU.on=EU.addListener;EU.onFocus=EU.addFocusListener;EU.onBlur=EU.addBlurListener;
+ 12 /* DOMReady: based on work by: Dean Edwards/John Resig/Matthias Miller */
+ 13 if(EU.isIE){YAHOO.util.Event.onDOMReady(YAHOO.util.Event._tryPreloadAttach,YAHOO.util.Event,true);var n=document.createElement("p");EU._dri=setInterval(function(){try{n.doScroll("left");clearInterval(EU._dri);EU._dri=null;EU._ready();n=null;}catch(ex){}},EU.POLL_INTERVAL);}else{if(EU.webkit&&EU.webkit<525){EU._dri=setInterval(function(){var rs=document.readyState;if("loaded"==rs||"complete"==rs){clearInterval(EU._dri);EU._dri=null;EU._ready();}},EU.POLL_INTERVAL);}else{EU._simpleAdd(document,"DOMContentLoaded",EU._ready);}}EU._simpleAdd(window,"load",EU._load);EU._simpleAdd(window,"unload",EU._unload);EU._tryPreloadAttach();})();}YAHOO.util.EventProvider=function(){};YAHOO.util.EventProvider.prototype={__yui_events:null,__yui_subscribers:null,subscribe:function(A,C,F,E){this.__yui_events=this.__yui_events||{};var D=this.__yui_events[A];if(D){D.subscribe(C,F,E);
+ 14 }else{this.__yui_subscribers=this.__yui_subscribers||{};var B=this.__yui_subscribers;if(!B[A]){B[A]=[];}B[A].push({fn:C,obj:F,overrideContext:E});}},unsubscribe:function(C,E,G){this.__yui_events=this.__yui_events||{};var A=this.__yui_events;if(C){var F=A[C];if(F){return F.unsubscribe(E,G);}}else{var B=true;for(var D in A){if(YAHOO.lang.hasOwnProperty(A,D)){B=B&&A[D].unsubscribe(E,G);}}return B;}return false;},unsubscribeAll:function(A){return this.unsubscribe(A);},createEvent:function(G,D){this.__yui_events=this.__yui_events||{};var A=D||{};var I=this.__yui_events;if(I[G]){}else{var H=A.scope||this;var E=(A.silent);var B=new YAHOO.util.CustomEvent(G,H,E,YAHOO.util.CustomEvent.FLAT);I[G]=B;if(A.onSubscribeCallback){B.subscribeEvent.subscribe(A.onSubscribeCallback);}this.__yui_subscribers=this.__yui_subscribers||{};var F=this.__yui_subscribers[G];if(F){for(var C=0;C<F.length;++C){B.subscribe(F[C].fn,F[C].obj,F[C].overrideContext);}}}return I[G];},fireEvent:function(E,D,A,C){this.__yui_events=this.__yui_events||{};var G=this.__yui_events[E];if(!G){return null;}var B=[];for(var F=1;F<arguments.length;++F){B.push(arguments[F]);}return G.fire.apply(G,B);},hasEvent:function(A){if(this.__yui_events){if(this.__yui_events[A]){return true;}}return false;}};(function(){var A=YAHOO.util.Event,C=YAHOO.lang;YAHOO.util.KeyListener=function(D,I,E,F){if(!D){}else{if(!I){}else{if(!E){}}}if(!F){F=YAHOO.util.KeyListener.KEYDOWN;}var G=new YAHOO.util.CustomEvent("keyPressed");this.enabledEvent=new YAHOO.util.CustomEvent("enabled");this.disabledEvent=new YAHOO.util.CustomEvent("disabled");if(C.isString(D)){D=document.getElementById(D);}if(C.isFunction(E)){G.subscribe(E);}else{G.subscribe(E.fn,E.scope,E.correctScope);}function H(O,N){if(!I.shift){I.shift=false;}if(!I.alt){I.alt=false;}if(!I.ctrl){I.ctrl=false;}if(O.shiftKey==I.shift&&O.altKey==I.alt&&O.ctrlKey==I.ctrl){var J,M=I.keys,L;if(YAHOO.lang.isArray(M)){for(var K=0;K<M.length;K++){J=M[K];L=A.getCharCode(O);if(J==L){G.fire(L,O);break;}}}else{L=A.getCharCode(O);if(M==L){G.fire(L,O);}}}}this.enable=function(){if(!this.enabled){A.on(D,F,H);this.enabledEvent.fire(I);}this.enabled=true;};this.disable=function(){if(this.enabled){A.removeListener(D,F,H);this.disabledEvent.fire(I);}this.enabled=false;};this.toString=function(){return"KeyListener ["+I.keys+"] "+D.tagName+(D.id?"["+D.id+"]":"");};};var B=YAHOO.util.KeyListener;B.KEYDOWN="keydown";B.KEYUP="keyup";B.KEY={ALT:18,BACK_SPACE:8,CAPS_LOCK:20,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,META:224,NUM_LOCK:144,PAGE_DOWN:34,PAGE_UP:33,PAUSE:19,PRINTSCREEN:44,RIGHT:39,SCROLL_LOCK:145,SHIFT:16,SPACE:32,TAB:9,UP:38};})();YAHOO.register("event",YAHOO.util.Event,{version:"2.7.0",build:"1796"});YAHOO.register("yahoo-dom-event", YAHOO, {version: "2.7.0", build: "1796"});
+ 15 /*
+ 16 Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+ 17 Code licensed under the BSD License:
+ 18 http://developer.yahoo.net/yui/license.txt
+ 19 version: 2.7.0
+ 20 */
+ 21 if(!YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr=function(){var A=YAHOO.util.Event,B=YAHOO.util.Dom;return{useShim:false,_shimActive:false,_shimState:false,_debugShim:false,_createShim:function(){var C=document.createElement("div");C.id="yui-ddm-shim";if(document.body.firstChild){document.body.insertBefore(C,document.body.firstChild);}else{document.body.appendChild(C);}C.style.display="none";C.style.backgroundColor="red";C.style.position="absolute";C.style.zIndex="99999";B.setStyle(C,"opacity","0");this._shim=C;A.on(C,"mouseup",this.handleMouseUp,this,true);A.on(C,"mousemove",this.handleMouseMove,this,true);A.on(window,"scroll",this._sizeShim,this,true);},_sizeShim:function(){if(this._shimActive){var C=this._shim;C.style.height=B.getDocumentHeight()+"px";C.style.width=B.getDocumentWidth()+"px";C.style.top="0";C.style.left="0";}},_activateShim:function(){if(this.useShim){if(!this._shim){this._createShim();}this._shimActive=true;var C=this._shim,D="0";if(this._debugShim){D=".5";}B.setStyle(C,"opacity",D);this._sizeShim();C.style.display="block";}},_deactivateShim:function(){this._shim.style.display="none";this._shimActive=false;},_shim:null,ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initialized:false,locked:false,interactionInfo:null,init:function(){this.initialized=true;},POINT:0,INTERSECT:1,STRICT_INTERSECT:2,mode:0,_execOnAll:function(E,D){for(var F in this.ids){for(var C in this.ids[F]){var G=this.ids[F][C];if(!this.isTypeOfDD(G)){continue;}G[E].apply(G,D);}}},_onLoad:function(){this.init();A.on(document,"mouseup",this.handleMouseUp,this,true);A.on(document,"mousemove",this.handleMouseMove,this,true);A.on(window,"unload",this._onUnload,this,true);A.on(window,"resize",this._onResize,this,true);},_onResize:function(C){this._execOnAll("resetConstraints",[]);},lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isLocked:function(){return this.locked;},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:1000,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,fromTimeout:false,regDragDrop:function(D,C){if(!this.initialized){this.init();}if(!this.ids[C]){this.ids[C]={};}this.ids[C][D.id]=D;},removeDDFromGroup:function(E,C){if(!this.ids[C]){this.ids[C]={};}var D=this.ids[C];if(D&&D[E.id]){delete D[E.id];}},_remove:function(E){for(var D in E.groups){if(D){var C=this.ids[D];if(C&&C[E.id]){delete C[E.id];}}}delete this.handleIds[E.id];},regHandle:function(D,C){if(!this.handleIds[D]){this.handleIds[D]={};}this.handleIds[D][C]=C;},isDragDrop:function(C){return(this.getDDById(C))?true:false;},getRelated:function(H,D){var G=[];for(var F in H.groups){for(var E in this.ids[F]){var C=this.ids[F][E];if(!this.isTypeOfDD(C)){continue;}if(!D||C.isTarget){G[G.length]=C;}}}return G;},isLegalTarget:function(G,F){var D=this.getRelated(G,true);for(var E=0,C=D.length;E<C;++E){if(D[E].id==F.id){return true;}}return false;},isTypeOfDD:function(C){return(C&&C.__ygDragDrop);},isHandle:function(D,C){return(this.handleIds[D]&&this.handleIds[D][C]);},getDDById:function(D){for(var C in this.ids){if(this.ids[C][D]){return this.ids[C][D];}}return null;},handleMouseDown:function(E,D){this.currentTarget=YAHOO.util.Event.getTarget(E);this.dragCurrent=D;var C=D.getEl();this.startX=YAHOO.util.Event.getPageX(E);this.startY=YAHOO.util.Event.getPageY(E);this.deltaX=this.startX-C.offsetLeft;this.deltaY=this.startY-C.offsetTop;this.dragThreshMet=false;this.clickTimeout=setTimeout(function(){var F=YAHOO.util.DDM;F.startDrag(F.startX,F.startY);F.fromTimeout=true;},this.clickTimeThresh);},startDrag:function(C,E){if(this.dragCurrent&&this.dragCurrent.useShim){this._shimState=this.useShim;this.useShim=true;}this._activateShim();clearTimeout(this.clickTimeout);var D=this.dragCurrent;if(D&&D.events.b4StartDrag){D.b4StartDrag(C,E);D.fireEvent("b4StartDragEvent",{x:C,y:E});}if(D&&D.events.startDrag){D.startDrag(C,E);D.fireEvent("startDragEvent",{x:C,y:E});}this.dragThreshMet=true;},handleMouseUp:function(C){if(this.dragCurrent){clearTimeout(this.clickTimeout);if(this.dragThreshMet){if(this.fromTimeout){this.fromTimeout=false;this.handleMouseMove(C);}this.fromTimeout=false;this.fireEvents(C,true);}else{}this.stopDrag(C);this.stopEvent(C);}},stopEvent:function(C){if(this.stopPropagation){YAHOO.util.Event.stopPropagation(C);}if(this.preventDefault){YAHOO.util.Event.preventDefault(C);}},stopDrag:function(E,D){var C=this.dragCurrent;if(C&&!D){if(this.dragThreshMet){if(C.events.b4EndDrag){C.b4EndDrag(E);C.fireEvent("b4EndDragEvent",{e:E});}if(C.events.endDrag){C.endDrag(E);C.fireEvent("endDragEvent",{e:E});}}if(C.events.mouseUp){C.onMouseUp(E);C.fireEvent("mouseUpEvent",{e:E});}}if(this._shimActive){this._deactivateShim();if(this.dragCurrent&&this.dragCurrent.useShim){this.useShim=this._shimState;this._shimState=false;}}this.dragCurrent=null;this.dragOvers={};},handleMouseMove:function(F){var C=this.dragCurrent;if(C){if(YAHOO.util.Event.isIE&&!F.button){this.stopEvent(F);return this.handleMouseUp(F);}else{if(F.clientX<0||F.clientY<0){}}if(!this.dragThreshMet){var E=Math.abs(this.startX-YAHOO.util.Event.getPageX(F));var D=Math.abs(this.startY-YAHOO.util.Event.getPageY(F));if(E>this.clickPixelThresh||D>this.clickPixelThresh){this.startDrag(this.startX,this.startY);}}if(this.dragThreshMet){if(C&&C.events.b4Drag){C.b4Drag(F);C.fireEvent("b4DragEvent",{e:F});}if(C&&C.events.drag){C.onDrag(F);C.fireEvent("dragEvent",{e:F});}if(C){this.fireEvents(F,false);}}this.stopEvent(F);}},fireEvents:function(V,L){var a=this.dragCurrent;if(!a||a.isLocked()||a.dragOnly){return;}var N=YAHOO.util.Event.getPageX(V),M=YAHOO.util.Event.getPageY(V),P=new YAHOO.util.Point(N,M),K=a.getTargetCoord(P.x,P.y),F=a.getDragEl(),E=["out","over","drop","enter"],U=new YAHOO.util.Region(K.y,K.x+F.offsetWidth,K.y+F.offsetHeight,K.x),I=[],D={},Q=[],c={outEvts:[],overEvts:[],dropEvts:[],enterEvts:[]};for(var S in this.dragOvers){var d=this.dragOvers[S];if(!this.isTypeOfDD(d)){continue;
+ 22 }if(!this.isOverTarget(P,d,this.mode,U)){c.outEvts.push(d);}I[S]=true;delete this.dragOvers[S];}for(var R in a.groups){if("string"!=typeof R){continue;}for(S in this.ids[R]){var G=this.ids[R][S];if(!this.isTypeOfDD(G)){continue;}if(G.isTarget&&!G.isLocked()&&G!=a){if(this.isOverTarget(P,G,this.mode,U)){D[R]=true;if(L){c.dropEvts.push(G);}else{if(!I[G.id]){c.enterEvts.push(G);}else{c.overEvts.push(G);}this.dragOvers[G.id]=G;}}}}}this.interactionInfo={out:c.outEvts,enter:c.enterEvts,over:c.overEvts,drop:c.dropEvts,point:P,draggedRegion:U,sourceRegion:this.locationCache[a.id],validDrop:L};for(var C in D){Q.push(C);}if(L&&!c.dropEvts.length){this.interactionInfo.validDrop=false;if(a.events.invalidDrop){a.onInvalidDrop(V);a.fireEvent("invalidDropEvent",{e:V});}}for(S=0;S<E.length;S++){var Y=null;if(c[E[S]+"Evts"]){Y=c[E[S]+"Evts"];}if(Y&&Y.length){var H=E[S].charAt(0).toUpperCase()+E[S].substr(1),X="onDrag"+H,J="b4Drag"+H,O="drag"+H+"Event",W="drag"+H;if(this.mode){if(a.events[J]){a[J](V,Y,Q);a.fireEvent(J+"Event",{event:V,info:Y,group:Q});}if(a.events[W]){a[X](V,Y,Q);a.fireEvent(O,{event:V,info:Y,group:Q});}}else{for(var Z=0,T=Y.length;Z<T;++Z){if(a.events[J]){a[J](V,Y[Z].id,Q[0]);a.fireEvent(J+"Event",{event:V,info:Y[Z].id,group:Q[0]});}if(a.events[W]){a[X](V,Y[Z].id,Q[0]);a.fireEvent(O,{event:V,info:Y[Z].id,group:Q[0]});}}}}}},getBestMatch:function(E){var G=null;var D=E.length;if(D==1){G=E[0];}else{for(var F=0;F<D;++F){var C=E[F];if(this.mode==this.INTERSECT&&C.cursorIsOver){G=C;break;}else{if(!G||!G.overlap||(C.overlap&&G.overlap.getArea()<C.overlap.getArea())){G=C;}}}}return G;},refreshCache:function(D){var F=D||this.ids;for(var C in F){if("string"!=typeof C){continue;}for(var E in this.ids[C]){var G=this.ids[C][E];if(this.isTypeOfDD(G)){var H=this.getLocation(G);if(H){this.locationCache[G.id]=H;}else{delete this.locationCache[G.id];}}}}},verifyEl:function(D){try{if(D){var C=D.offsetParent;if(C){return true;}}}catch(E){}return false;},getLocation:function(H){if(!this.isTypeOfDD(H)){return null;}var F=H.getEl(),K,E,D,M,L,N,C,J,G;try{K=YAHOO.util.Dom.getXY(F);}catch(I){}if(!K){return null;}E=K[0];D=E+F.offsetWidth;M=K[1];L=M+F.offsetHeight;N=M-H.padding[0];C=D+H.padding[1];J=L+H.padding[2];G=E-H.padding[3];return new YAHOO.util.Region(N,C,J,G);},isOverTarget:function(K,C,E,F){var G=this.locationCache[C.id];if(!G||!this.useCache){G=this.getLocation(C);this.locationCache[C.id]=G;}if(!G){return false;}C.cursorIsOver=G.contains(K);var J=this.dragCurrent;if(!J||(!E&&!J.constrainX&&!J.constrainY)){return C.cursorIsOver;}C.overlap=null;if(!F){var H=J.getTargetCoord(K.x,K.y);var D=J.getDragEl();F=new YAHOO.util.Region(H.y,H.x+D.offsetWidth,H.y+D.offsetHeight,H.x);}var I=F.intersect(G);if(I){C.overlap=I;return(E)?true:C.cursorIsOver;}else{return false;}},_onUnload:function(D,C){this.unregAll();},unregAll:function(){if(this.dragCurrent){this.stopDrag();this.dragCurrent=null;}this._execOnAll("unreg",[]);this.ids={};},elementCache:{},getElWrapper:function(D){var C=this.elementCache[D];if(!C||!C.el){C=this.elementCache[D]=new this.ElementWrapper(YAHOO.util.Dom.get(D));}return C;},getElement:function(C){return YAHOO.util.Dom.get(C);},getCss:function(D){var C=YAHOO.util.Dom.get(D);return(C)?C.style:null;},ElementWrapper:function(C){this.el=C||null;this.id=this.el&&C.id;this.css=this.el&&C.style;},getPosX:function(C){return YAHOO.util.Dom.getX(C);},getPosY:function(C){return YAHOO.util.Dom.getY(C);},swapNode:function(E,C){if(E.swapNode){E.swapNode(C);}else{var F=C.parentNode;var D=C.nextSibling;if(D==E){F.insertBefore(E,C);}else{if(C==E.nextSibling){F.insertBefore(C,E);}else{E.parentNode.replaceChild(C,E);F.insertBefore(E,D);}}}},getScroll:function(){var E,C,F=document.documentElement,D=document.body;if(F&&(F.scrollTop||F.scrollLeft)){E=F.scrollTop;C=F.scrollLeft;}else{if(D){E=D.scrollTop;C=D.scrollLeft;}else{}}return{top:E,left:C};},getStyle:function(D,C){return YAHOO.util.Dom.getStyle(D,C);},getScrollTop:function(){return this.getScroll().top;},getScrollLeft:function(){return this.getScroll().left;},moveToEl:function(C,E){var D=YAHOO.util.Dom.getXY(E);YAHOO.util.Dom.setXY(C,D);},getClientHeight:function(){return YAHOO.util.Dom.getViewportHeight();},getClientWidth:function(){return YAHOO.util.Dom.getViewportWidth();},numericSort:function(D,C){return(D-C);},_timeoutCount:0,_addListeners:function(){var C=YAHOO.util.DDM;if(YAHOO.util.Event&&document){C._onLoad();}else{if(C._timeoutCount>2000){}else{setTimeout(C._addListeners,10);if(document&&document.body){C._timeoutCount+=1;}}}},handleWasClicked:function(C,E){if(this.isHandle(E,C.id)){return true;}else{var D=C.parentNode;while(D){if(this.isHandle(E,D.id)){return true;}else{D=D.parentNode;}}}return false;}};}();YAHOO.util.DDM=YAHOO.util.DragDropMgr;YAHOO.util.DDM._addListeners();}(function(){var A=YAHOO.util.Event;var B=YAHOO.util.Dom;YAHOO.util.DragDrop=function(E,C,D){if(E){this.init(E,C,D);}};YAHOO.util.DragDrop.prototype={events:null,on:function(){this.subscribe.apply(this,arguments);},id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isTarget:true,padding:null,dragOnly:false,useShim:false,_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,deltaX:0,deltaY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,cursorIsOver:false,overlap:null,b4StartDrag:function(C,D){},startDrag:function(C,D){},b4Drag:function(C){},onDrag:function(C){},onDragEnter:function(C,D){},b4DragOver:function(C){},onDragOver:function(C,D){},b4DragOut:function(C){},onDragOut:function(C,D){},b4DragDrop:function(C){},onDragDrop:function(C,D){},onInvalidDrop:function(C){},b4EndDrag:function(C){},endDrag:function(C){},b4MouseDown:function(C){},onMouseDown:function(C){},onMouseUp:function(C){},onAvailable:function(){},getEl:function(){if(!this._domRef){this._domRef=B.get(this.id);
+ 23 }return this._domRef;},getDragEl:function(){return B.get(this.dragElId);},init:function(F,C,D){this.initTarget(F,C,D);A.on(this._domRef||this.id,"mousedown",this.handleMouseDown,this,true);for(var E in this.events){this.createEvent(E+"Event");}},initTarget:function(E,C,D){this.config=D||{};this.events={};this.DDM=YAHOO.util.DDM;this.groups={};if(typeof E!=="string"){this._domRef=E;E=B.generateId(E);}this.id=E;this.addToGroup((C)?C:"default");this.handleElId=E;A.onAvailable(E,this.handleOnAvailable,this,true);this.setDragElId(E);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();},applyConfig:function(){this.events={mouseDown:true,b4MouseDown:true,mouseUp:true,b4StartDrag:true,startDrag:true,b4EndDrag:true,endDrag:true,drag:true,b4Drag:true,invalidDrop:true,b4DragOut:true,dragOut:true,dragEnter:true,b4DragOver:true,dragOver:true,b4DragDrop:true,dragDrop:true};if(this.config.events){for(var C in this.config.events){if(this.config.events[C]===false){this.events[C]=false;}}}this.padding=this.config.padding||[0,0,0,0];this.isTarget=(this.config.isTarget!==false);this.maintainOffset=(this.config.maintainOffset);this.primaryButtonOnly=(this.config.primaryButtonOnly!==false);this.dragOnly=((this.config.dragOnly===true)?true:false);this.useShim=((this.config.useShim===true)?true:false);},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable();},setPadding:function(E,C,F,D){if(!C&&0!==C){this.padding=[E,E,E,E];}else{if(!F&&0!==F){this.padding=[E,C,E,C];}else{this.padding=[E,C,F,D];}}},setInitPosition:function(F,E){var G=this.getEl();if(!this.DDM.verifyEl(G)){if(G&&G.style&&(G.style.display=="none")){}else{}return;}var D=F||0;var C=E||0;var H=B.getXY(G);this.initPageX=H[0]-D;this.initPageY=H[1]-C;this.lastPageX=H[0];this.lastPageY=H[1];this.setStartPosition(H);},setStartPosition:function(D){var C=D||B.getXY(this.getEl());this.deltaSetXY=null;this.startPageX=C[0];this.startPageY=C[1];},addToGroup:function(C){this.groups[C]=true;this.DDM.regDragDrop(this,C);},removeFromGroup:function(C){if(this.groups[C]){delete this.groups[C];}this.DDM.removeDDFromGroup(this,C);},setDragElId:function(C){this.dragElId=C;},setHandleElId:function(C){if(typeof C!=="string"){C=B.generateId(C);}this.handleElId=C;this.DDM.regHandle(this.id,C);},setOuterHandleElId:function(C){if(typeof C!=="string"){C=B.generateId(C);}A.on(C,"mousedown",this.handleMouseDown,this,true);this.setHandleElId(C);this.hasOuterHandles=true;},unreg:function(){A.removeListener(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this);},isLocked:function(){return(this.DDM.isLocked()||this.locked);},handleMouseDown:function(J,I){var D=J.which||J.button;if(this.primaryButtonOnly&&D>1){return;}if(this.isLocked()){return;}var C=this.b4MouseDown(J),F=true;if(this.events.b4MouseDown){F=this.fireEvent("b4MouseDownEvent",J);}var E=this.onMouseDown(J),H=true;if(this.events.mouseDown){H=this.fireEvent("mouseDownEvent",J);}if((C===false)||(E===false)||(F===false)||(H===false)){return;}this.DDM.refreshCache(this.groups);var G=new YAHOO.util.Point(A.getPageX(J),A.getPageY(J));if(!this.hasOuterHandles&&!this.DDM.isOverTarget(G,this)){}else{if(this.clickValidator(J)){this.setStartPosition();this.DDM.handleMouseDown(J,this);this.DDM.stopEvent(J);}else{}}},clickValidator:function(D){var C=YAHOO.util.Event.getTarget(D);return(this.isValidHandleChild(C)&&(this.id==this.handleElId||this.DDM.handleWasClicked(C,this.id)));},getTargetCoord:function(E,D){var C=E-this.deltaX;var F=D-this.deltaY;if(this.constrainX){if(C<this.minX){C=this.minX;}if(C>this.maxX){C=this.maxX;}}if(this.constrainY){if(F<this.minY){F=this.minY;}if(F>this.maxY){F=this.maxY;}}C=this.getTick(C,this.xTicks);F=this.getTick(F,this.yTicks);return{x:C,y:F};},addInvalidHandleType:function(C){var D=C.toUpperCase();this.invalidHandleTypes[D]=D;},addInvalidHandleId:function(C){if(typeof C!=="string"){C=B.generateId(C);}this.invalidHandleIds[C]=C;},addInvalidHandleClass:function(C){this.invalidHandleClasses.push(C);},removeInvalidHandleType:function(C){var D=C.toUpperCase();delete this.invalidHandleTypes[D];},removeInvalidHandleId:function(C){if(typeof C!=="string"){C=B.generateId(C);}delete this.invalidHandleIds[C];},removeInvalidHandleClass:function(D){for(var E=0,C=this.invalidHandleClasses.length;E<C;++E){if(this.invalidHandleClasses[E]==D){delete this.invalidHandleClasses[E];}}},isValidHandleChild:function(F){var E=true;var H;try{H=F.nodeName.toUpperCase();}catch(G){H=F.nodeName;}E=E&&!this.invalidHandleTypes[H];E=E&&!this.invalidHandleIds[F.id];for(var D=0,C=this.invalidHandleClasses.length;E&&D<C;++D){E=!B.hasClass(F,this.invalidHandleClasses[D]);}return E;},setXTicks:function(F,C){this.xTicks=[];this.xTickSize=C;var E={};for(var D=this.initPageX;D>=this.minX;D=D-C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true;}}for(D=this.initPageX;D<=this.maxX;D=D+C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true;}}this.xTicks.sort(this.DDM.numericSort);},setYTicks:function(F,C){this.yTicks=[];this.yTickSize=C;var E={};for(var D=this.initPageY;D>=this.minY;D=D-C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true;}}for(D=this.initPageY;D<=this.maxY;D=D+C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true;}}this.yTicks.sort(this.DDM.numericSort);},setXConstraint:function(E,D,C){this.leftConstraint=parseInt(E,10);this.rightConstraint=parseInt(D,10);this.minX=this.initPageX-this.leftConstraint;this.maxX=this.initPageX+this.rightConstraint;if(C){this.setXTicks(this.initPageX,C);}this.constrainX=true;},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks();},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0;},setYConstraint:function(C,E,D){this.topConstraint=parseInt(C,10);this.bottomConstraint=parseInt(E,10);this.minY=this.initPageY-this.topConstraint;this.maxY=this.initPageY+this.bottomConstraint;if(D){this.setYTicks(this.initPageY,D);
+ 24 }this.constrainY=true;},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var D=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var C=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(D,C);}else{this.setInitPosition();}if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize);}if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize);}},getTick:function(I,F){if(!F){return I;}else{if(F[0]>=I){return F[0];}else{for(var D=0,C=F.length;D<C;++D){var E=D+1;if(F[E]&&F[E]>=I){var H=I-F[D];var G=F[E]-I;return(G>H)?F[D]:F[E];}}return F[F.length-1];}}},toString:function(){return("DragDrop "+this.id);}};YAHOO.augment(YAHOO.util.DragDrop,YAHOO.util.EventProvider);})();YAHOO.util.DD=function(C,A,B){if(C){this.init(C,A,B);}};YAHOO.extend(YAHOO.util.DD,YAHOO.util.DragDrop,{scroll:true,autoOffset:function(C,B){var A=C-this.startPageX;var D=B-this.startPageY;this.setDelta(A,D);},setDelta:function(B,A){this.deltaX=B;this.deltaY=A;},setDragElPos:function(C,B){var A=this.getDragEl();this.alignElWithMouse(A,C,B);},alignElWithMouse:function(C,G,F){var E=this.getTargetCoord(G,F);if(!this.deltaSetXY){var H=[E.x,E.y];YAHOO.util.Dom.setXY(C,H);var D=parseInt(YAHOO.util.Dom.getStyle(C,"left"),10);var B=parseInt(YAHOO.util.Dom.getStyle(C,"top"),10);this.deltaSetXY=[D-E.x,B-E.y];}else{YAHOO.util.Dom.setStyle(C,"left",(E.x+this.deltaSetXY[0])+"px");YAHOO.util.Dom.setStyle(C,"top",(E.y+this.deltaSetXY[1])+"px");}this.cachePosition(E.x,E.y);var A=this;setTimeout(function(){A.autoScroll.call(A,E.x,E.y,C.offsetHeight,C.offsetWidth);},0);},cachePosition:function(B,A){if(B){this.lastPageX=B;this.lastPageY=A;}else{var C=YAHOO.util.Dom.getXY(this.getEl());this.lastPageX=C[0];this.lastPageY=C[1];}},autoScroll:function(J,I,E,K){if(this.scroll){var L=this.DDM.getClientHeight();var B=this.DDM.getClientWidth();var N=this.DDM.getScrollTop();var D=this.DDM.getScrollLeft();var H=E+I;var M=K+J;var G=(L+N-I-this.deltaY);var F=(B+D-J-this.deltaX);var C=40;var A=(document.all)?80:30;if(H>L&&G<C){window.scrollTo(D,N+A);}if(I<N&&N>0&&I-N<C){window.scrollTo(D,N-A);}if(M>B&&F<C){window.scrollTo(D+A,N);}if(J<D&&D>0&&J-D<C){window.scrollTo(D-A,N);}}},applyConfig:function(){YAHOO.util.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false);},b4MouseDown:function(A){this.setStartPosition();this.autoOffset(YAHOO.util.Event.getPageX(A),YAHOO.util.Event.getPageY(A));},b4Drag:function(A){this.setDragElPos(YAHOO.util.Event.getPageX(A),YAHOO.util.Event.getPageY(A));},toString:function(){return("DD "+this.id);}});YAHOO.util.DDProxy=function(C,A,B){if(C){this.init(C,A,B);this.initFrame();}};YAHOO.util.DDProxy.dragElId="ygddfdiv";YAHOO.extend(YAHOO.util.DDProxy,YAHOO.util.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var B=this,A=document.body;if(!A||!A.firstChild){setTimeout(function(){B.createFrame();},50);return;}var F=this.getDragEl(),E=YAHOO.util.Dom;if(!F){F=document.createElement("div");F.id=this.dragElId;var D=F.style;D.position="absolute";D.visibility="hidden";D.cursor="move";D.border="2px solid #aaa";D.zIndex=999;D.height="25px";D.width="25px";var C=document.createElement("div");E.setStyle(C,"height","100%");E.setStyle(C,"width","100%");E.setStyle(C,"background-color","#ccc");E.setStyle(C,"opacity","0");F.appendChild(C);A.insertBefore(F,A.firstChild);}},initFrame:function(){this.createFrame();},applyConfig:function(){YAHOO.util.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||YAHOO.util.DDProxy.dragElId);},showFrame:function(E,D){var C=this.getEl();var A=this.getDragEl();var B=A.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(B.width,10)/2),Math.round(parseInt(B.height,10)/2));}this.setDragElPos(E,D);YAHOO.util.Dom.setStyle(A,"visibility","visible");},_resizeProxy:function(){if(this.resizeFrame){var H=YAHOO.util.Dom;var B=this.getEl();var C=this.getDragEl();var G=parseInt(H.getStyle(C,"borderTopWidth"),10);var I=parseInt(H.getStyle(C,"borderRightWidth"),10);var F=parseInt(H.getStyle(C,"borderBottomWidth"),10);var D=parseInt(H.getStyle(C,"borderLeftWidth"),10);if(isNaN(G)){G=0;}if(isNaN(I)){I=0;}if(isNaN(F)){F=0;}if(isNaN(D)){D=0;}var E=Math.max(0,B.offsetWidth-I-D);var A=Math.max(0,B.offsetHeight-G-F);H.setStyle(C,"width",E+"px");H.setStyle(C,"height",A+"px");}},b4MouseDown:function(B){this.setStartPosition();var A=YAHOO.util.Event.getPageX(B);var C=YAHOO.util.Event.getPageY(B);this.autoOffset(A,C);},b4StartDrag:function(A,B){this.showFrame(A,B);},b4EndDrag:function(A){YAHOO.util.Dom.setStyle(this.getDragEl(),"visibility","hidden");},endDrag:function(D){var C=YAHOO.util.Dom;var B=this.getEl();var A=this.getDragEl();C.setStyle(A,"visibility","");C.setStyle(B,"visibility","hidden");YAHOO.util.DDM.moveToEl(B,A);C.setStyle(A,"visibility","hidden");C.setStyle(B,"visibility","");},toString:function(){return("DDProxy "+this.id);}});YAHOO.util.DDTarget=function(C,A,B){if(C){this.initTarget(C,A,B);}};YAHOO.extend(YAHOO.util.DDTarget,YAHOO.util.DragDrop,{toString:function(){return("DDTarget "+this.id);}});YAHOO.register("dragdrop",YAHOO.util.DragDropMgr,{version:"2.7.0",build:"1796"});/*
+ 25 Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+ 26 Code licensed under the BSD License:
+ 27 http://developer.yahoo.net/yui/license.txt
+ 28 version: 2.7.0
+ 29 */
+ 30 (function(){var B=YAHOO.util.Dom.getXY,A=YAHOO.util.Event,D=Array.prototype.slice;function C(G,E,F,H){C.ANIM_AVAIL=(!YAHOO.lang.isUndefined(YAHOO.util.Anim));if(G){this.init(G,E,true);this.initSlider(H);this.initThumb(F);}}YAHOO.lang.augmentObject(C,{getHorizSlider:function(F,G,I,H,E){return new C(F,F,new YAHOO.widget.SliderThumb(G,F,I,H,0,0,E),"horiz");},getVertSlider:function(G,H,E,I,F){return new C(G,G,new YAHOO.widget.SliderThumb(H,G,0,0,E,I,F),"vert");},getSliderRegion:function(G,H,J,I,E,K,F){return new C(G,G,new YAHOO.widget.SliderThumb(H,G,J,I,E,K,F),"region");},SOURCE_UI_EVENT:1,SOURCE_SET_VALUE:2,SOURCE_KEY_EVENT:3,ANIM_AVAIL:false},true);YAHOO.extend(C,YAHOO.util.DragDrop,{_mouseDown:false,dragOnly:true,initSlider:function(E){this.type=E;this.createEvent("change",this);this.createEvent("slideStart",this);this.createEvent("slideEnd",this);this.isTarget=false;this.animate=C.ANIM_AVAIL;this.backgroundEnabled=true;this.tickPause=40;this.enableKeys=true;this.keyIncrement=20;this.moveComplete=true;this.animationDuration=0.2;this.SOURCE_UI_EVENT=1;this.SOURCE_SET_VALUE=2;this.valueChangeSource=0;this._silent=false;this.lastOffset=[0,0];},initThumb:function(F){var E=this;this.thumb=F;F.cacheBetweenDrags=true;if(F._isHoriz&&F.xTicks&&F.xTicks.length){this.tickPause=Math.round(360/F.xTicks.length);}else{if(F.yTicks&&F.yTicks.length){this.tickPause=Math.round(360/F.yTicks.length);}}F.onAvailable=function(){return E.setStartSliderState();};F.onMouseDown=function(){E._mouseDown=true;return E.focus();};F.startDrag=function(){E._slideStart();};F.onDrag=function(){E.fireEvents(true);};F.onMouseUp=function(){E.thumbMouseUp();};},onAvailable:function(){this._bindKeyEvents();},_bindKeyEvents:function(){A.on(this.id,"keydown",this.handleKeyDown,this,true);A.on(this.id,"keypress",this.handleKeyPress,this,true);},handleKeyPress:function(F){if(this.enableKeys){var E=A.getCharCode(F);switch(E){case 37:case 38:case 39:case 40:case 36:case 35:A.preventDefault(F);break;default:}}},handleKeyDown:function(J){if(this.enableKeys){var G=A.getCharCode(J),F=this.thumb,H=this.getXValue(),E=this.getYValue(),I=true;switch(G){case 37:H-=this.keyIncrement;break;case 38:E-=this.keyIncrement;break;case 39:H+=this.keyIncrement;break;case 40:E+=this.keyIncrement;break;case 36:H=F.leftConstraint;E=F.topConstraint;break;case 35:H=F.rightConstraint;E=F.bottomConstraint;break;default:I=false;}if(I){if(F._isRegion){this._setRegionValue(C.SOURCE_KEY_EVENT,H,E,true);}else{this._setValue(C.SOURCE_KEY_EVENT,(F._isHoriz?H:E),true);}A.stopEvent(J);}}},setStartSliderState:function(){this.setThumbCenterPoint();this.baselinePos=B(this.getEl());this.thumb.startOffset=this.thumb.getOffsetFromParent(this.baselinePos);if(this.thumb._isRegion){if(this.deferredSetRegionValue){this._setRegionValue.apply(this,this.deferredSetRegionValue);this.deferredSetRegionValue=null;}else{this.setRegionValue(0,0,true,true,true);}}else{if(this.deferredSetValue){this._setValue.apply(this,this.deferredSetValue);this.deferredSetValue=null;}else{this.setValue(0,true,true,true);}}},setThumbCenterPoint:function(){var E=this.thumb.getEl();if(E){this.thumbCenterPoint={x:parseInt(E.offsetWidth/2,10),y:parseInt(E.offsetHeight/2,10)};}},lock:function(){this.thumb.lock();this.locked=true;},unlock:function(){this.thumb.unlock();this.locked=false;},thumbMouseUp:function(){this._mouseDown=false;if(!this.isLocked()&&!this.moveComplete){this.endMove();}},onMouseUp:function(){this._mouseDown=false;if(this.backgroundEnabled&&!this.isLocked()&&!this.moveComplete){this.endMove();}},getThumb:function(){return this.thumb;},focus:function(){this.valueChangeSource=C.SOURCE_UI_EVENT;var E=this.getEl();if(E.focus){try{E.focus();}catch(F){}}this.verifyOffset();return !this.isLocked();},onChange:function(E,F){},onSlideStart:function(){},onSlideEnd:function(){},getValue:function(){return this.thumb.getValue();},getXValue:function(){return this.thumb.getXValue();},getYValue:function(){return this.thumb.getYValue();},setValue:function(){var E=D.call(arguments);E.unshift(C.SOURCE_SET_VALUE);return this._setValue.apply(this,E);},_setValue:function(I,L,G,H,E){var F=this.thumb,K,J;if(!F.available){this.deferredSetValue=arguments;return false;}if(this.isLocked()&&!H){return false;}if(isNaN(L)){return false;}if(F._isRegion){return false;}this._silent=E;this.valueChangeSource=I||C.SOURCE_SET_VALUE;F.lastOffset=[L,L];this.verifyOffset(true);this._slideStart();if(F._isHoriz){K=F.initPageX+L+this.thumbCenterPoint.x;this.moveThumb(K,F.initPageY,G);}else{J=F.initPageY+L+this.thumbCenterPoint.y;this.moveThumb(F.initPageX,J,G);}return true;},setRegionValue:function(){var E=D.call(arguments);E.unshift(C.SOURCE_SET_VALUE);return this._setRegionValue.apply(this,E);},_setRegionValue:function(F,J,H,I,G,K){var L=this.thumb,E,M;if(!L.available){this.deferredSetRegionValue=arguments;return false;}if(this.isLocked()&&!G){return false;}if(isNaN(J)){return false;}if(!L._isRegion){return false;}this._silent=K;this.valueChangeSource=F||C.SOURCE_SET_VALUE;L.lastOffset=[J,H];this.verifyOffset(true);this._slideStart();E=L.initPageX+J+this.thumbCenterPoint.x;M=L.initPageY+H+this.thumbCenterPoint.y;this.moveThumb(E,M,I);return true;},verifyOffset:function(F){var G=B(this.getEl()),E=this.thumb;if(!this.thumbCenterPoint||!this.thumbCenterPoint.x){this.setThumbCenterPoint();}if(G){if(G[0]!=this.baselinePos[0]||G[1]!=this.baselinePos[1]){this.setInitPosition();this.baselinePos=G;E.initPageX=this.initPageX+E.startOffset[0];E.initPageY=this.initPageY+E.startOffset[1];E.deltaSetXY=null;this.resetThumbConstraints();return false;}}return true;},moveThumb:function(K,J,I,G){var L=this.thumb,M=this,F,E,H;if(!L.available){return;}L.setDelta(this.thumbCenterPoint.x,this.thumbCenterPoint.y);E=L.getTargetCoord(K,J);F=[Math.round(E.x),Math.round(E.y)];if(this.animate&&L._graduated&&!I){this.lock();this.curCoord=B(this.thumb.getEl());this.curCoord=[Math.round(this.curCoord[0]),Math.round(this.curCoord[1])];setTimeout(function(){M.moveOneTick(F);
+ 31 },this.tickPause);}else{if(this.animate&&C.ANIM_AVAIL&&!I){this.lock();H=new YAHOO.util.Motion(L.id,{points:{to:F}},this.animationDuration,YAHOO.util.Easing.easeOut);H.onComplete.subscribe(function(){M.unlock();if(!M._mouseDown){M.endMove();}});H.animate();}else{L.setDragElPos(K,J);if(!G&&!this._mouseDown){this.endMove();}}}},_slideStart:function(){if(!this._sliding){if(!this._silent){this.onSlideStart();this.fireEvent("slideStart");}this._sliding=true;}},_slideEnd:function(){if(this._sliding&&this.moveComplete){var E=this._silent;this._sliding=false;this._silent=false;this.moveComplete=false;if(!E){this.onSlideEnd();this.fireEvent("slideEnd");}}},moveOneTick:function(F){var H=this.thumb,G=this,I=null,E,J;if(H._isRegion){I=this._getNextX(this.curCoord,F);E=(I!==null)?I[0]:this.curCoord[0];I=this._getNextY(this.curCoord,F);J=(I!==null)?I[1]:this.curCoord[1];I=E!==this.curCoord[0]||J!==this.curCoord[1]?[E,J]:null;}else{if(H._isHoriz){I=this._getNextX(this.curCoord,F);}else{I=this._getNextY(this.curCoord,F);}}if(I){this.curCoord=I;this.thumb.alignElWithMouse(H.getEl(),I[0]+this.thumbCenterPoint.x,I[1]+this.thumbCenterPoint.y);if(!(I[0]==F[0]&&I[1]==F[1])){setTimeout(function(){G.moveOneTick(F);},this.tickPause);}else{this.unlock();if(!this._mouseDown){this.endMove();}}}else{this.unlock();if(!this._mouseDown){this.endMove();}}},_getNextX:function(E,F){var H=this.thumb,J,G=[],I=null;if(E[0]>F[0]){J=H.tickSize-this.thumbCenterPoint.x;G=H.getTargetCoord(E[0]-J,E[1]);I=[G.x,G.y];}else{if(E[0]<F[0]){J=H.tickSize+this.thumbCenterPoint.x;G=H.getTargetCoord(E[0]+J,E[1]);I=[G.x,G.y];}else{}}return I;},_getNextY:function(E,F){var H=this.thumb,J,G=[],I=null;if(E[1]>F[1]){J=H.tickSize-this.thumbCenterPoint.y;G=H.getTargetCoord(E[0],E[1]-J);I=[G.x,G.y];}else{if(E[1]<F[1]){J=H.tickSize+this.thumbCenterPoint.y;G=H.getTargetCoord(E[0],E[1]+J);I=[G.x,G.y];}else{}}return I;},b4MouseDown:function(E){if(!this.backgroundEnabled){return false;}this.thumb.autoOffset();this.resetThumbConstraints();},onMouseDown:function(F){if(!this.backgroundEnabled||this.isLocked()){return false;}this._mouseDown=true;var E=A.getPageX(F),G=A.getPageY(F);this.focus();this._slideStart();this.moveThumb(E,G);},onDrag:function(F){if(this.backgroundEnabled&&!this.isLocked()){var E=A.getPageX(F),G=A.getPageY(F);this.moveThumb(E,G,true,true);this.fireEvents();}},endMove:function(){this.unlock();this.fireEvents();this.moveComplete=true;this._slideEnd();},resetThumbConstraints:function(){var E=this.thumb;E.setXConstraint(E.leftConstraint,E.rightConstraint,E.xTickSize);E.setYConstraint(E.topConstraint,E.bottomConstraint,E.xTickSize);},fireEvents:function(G){var F=this.thumb,I,H,E;if(!G){F.cachePosition();}if(!this.isLocked()){if(F._isRegion){I=F.getXValue();H=F.getYValue();if(I!=this.previousX||H!=this.previousY){if(!this._silent){this.onChange(I,H);this.fireEvent("change",{x:I,y:H});}}this.previousX=I;this.previousY=H;}else{E=F.getValue();if(E!=this.previousVal){if(!this._silent){this.onChange(E);this.fireEvent("change",E);}}this.previousVal=E;}}},toString:function(){return("Slider ("+this.type+") "+this.id);}});YAHOO.lang.augmentProto(C,YAHOO.util.EventProvider);YAHOO.widget.Slider=C;})();YAHOO.widget.SliderThumb=function(G,B,E,D,A,F,C){if(G){YAHOO.widget.SliderThumb.superclass.constructor.call(this,G,B);this.parentElId=B;}this.isTarget=false;this.tickSize=C;this.maintainOffset=true;this.initSlider(E,D,A,F,C);this.scroll=false;};YAHOO.extend(YAHOO.widget.SliderThumb,YAHOO.util.DD,{startOffset:null,dragOnly:true,_isHoriz:false,_prevVal:0,_graduated:false,getOffsetFromParent0:function(C){var A=YAHOO.util.Dom.getXY(this.getEl()),B=C||YAHOO.util.Dom.getXY(this.parentElId);return[(A[0]-B[0]),(A[1]-B[1])];},getOffsetFromParent:function(H){var A=this.getEl(),E,I,F,B,K,D,C,J,G;if(!this.deltaOffset){I=YAHOO.util.Dom.getXY(A);F=H||YAHOO.util.Dom.getXY(this.parentElId);E=[(I[0]-F[0]),(I[1]-F[1])];B=parseInt(YAHOO.util.Dom.getStyle(A,"left"),10);K=parseInt(YAHOO.util.Dom.getStyle(A,"top"),10);D=B-E[0];C=K-E[1];if(isNaN(D)||isNaN(C)){}else{this.deltaOffset=[D,C];}}else{J=parseInt(YAHOO.util.Dom.getStyle(A,"left"),10);G=parseInt(YAHOO.util.Dom.getStyle(A,"top"),10);E=[J+this.deltaOffset[0],G+this.deltaOffset[1]];}return E;},initSlider:function(D,C,A,E,B){this.initLeft=D;this.initRight=C;this.initUp=A;this.initDown=E;this.setXConstraint(D,C,B);this.setYConstraint(A,E,B);if(B&&B>1){this._graduated=true;}this._isHoriz=(D||C);this._isVert=(A||E);this._isRegion=(this._isHoriz&&this._isVert);},clearTicks:function(){YAHOO.widget.SliderThumb.superclass.clearTicks.call(this);this.tickSize=0;this._graduated=false;},getValue:function(){return(this._isHoriz)?this.getXValue():this.getYValue();},getXValue:function(){if(!this.available){return 0;}var A=this.getOffsetFromParent();if(YAHOO.lang.isNumber(A[0])){this.lastOffset=A;return(A[0]-this.startOffset[0]);}else{return(this.lastOffset[0]-this.startOffset[0]);}},getYValue:function(){if(!this.available){return 0;}var A=this.getOffsetFromParent();if(YAHOO.lang.isNumber(A[1])){this.lastOffset=A;return(A[1]-this.startOffset[1]);}else{return(this.lastOffset[1]-this.startOffset[1]);}},toString:function(){return"SliderThumb "+this.id;},onChange:function(A,B){}});(function(){var A=YAHOO.util.Event,B=YAHOO.widget;function C(I,F,H,D){var G=this,J={min:false,max:false},E,K;this.minSlider=I;this.maxSlider=F;this.activeSlider=I;this.isHoriz=I.thumb._isHoriz;E=this.minSlider.thumb.onMouseDown;K=this.maxSlider.thumb.onMouseDown;this.minSlider.thumb.onMouseDown=function(){G.activeSlider=G.minSlider;E.apply(this,arguments);};this.maxSlider.thumb.onMouseDown=function(){G.activeSlider=G.maxSlider;K.apply(this,arguments);};this.minSlider.thumb.onAvailable=function(){I.setStartSliderState();J.min=true;if(J.max){G.fireEvent("ready",G);}};this.maxSlider.thumb.onAvailable=function(){F.setStartSliderState();J.max=true;if(J.min){G.fireEvent("ready",G);}};I.onMouseDown=F.onMouseDown=function(L){return this.backgroundEnabled&&G._handleMouseDown(L);
+ 32 };I.onDrag=F.onDrag=function(L){G._handleDrag(L);};I.onMouseUp=F.onMouseUp=function(L){G._handleMouseUp(L);};I._bindKeyEvents=function(){G._bindKeyEvents(this);};F._bindKeyEvents=function(){};I.subscribe("change",this._handleMinChange,I,this);I.subscribe("slideStart",this._handleSlideStart,I,this);I.subscribe("slideEnd",this._handleSlideEnd,I,this);F.subscribe("change",this._handleMaxChange,F,this);F.subscribe("slideStart",this._handleSlideStart,F,this);F.subscribe("slideEnd",this._handleSlideEnd,F,this);this.createEvent("ready",this);this.createEvent("change",this);this.createEvent("slideStart",this);this.createEvent("slideEnd",this);D=YAHOO.lang.isArray(D)?D:[0,H];D[0]=Math.min(Math.max(parseInt(D[0],10)|0,0),H);D[1]=Math.max(Math.min(parseInt(D[1],10)|0,H),0);if(D[0]>D[1]){D.splice(0,2,D[1],D[0]);}this.minVal=D[0];this.maxVal=D[1];this.minSlider.setValue(this.minVal,true,true,true);this.maxSlider.setValue(this.maxVal,true,true,true);}C.prototype={minVal:-1,maxVal:-1,minRange:0,_handleSlideStart:function(E,D){this.fireEvent("slideStart",D);},_handleSlideEnd:function(E,D){this.fireEvent("slideEnd",D);},_handleDrag:function(D){B.Slider.prototype.onDrag.call(this.activeSlider,D);},_handleMinChange:function(){this.activeSlider=this.minSlider;this.updateValue();},_handleMaxChange:function(){this.activeSlider=this.maxSlider;this.updateValue();},_bindKeyEvents:function(D){A.on(D.id,"keydown",this._handleKeyDown,this,true);A.on(D.id,"keypress",this._handleKeyPress,this,true);},_handleKeyDown:function(D){this.activeSlider.handleKeyDown.apply(this.activeSlider,arguments);},_handleKeyPress:function(D){this.activeSlider.handleKeyPress.apply(this.activeSlider,arguments);},setValues:function(H,K,I,E,J){var F=this.minSlider,M=this.maxSlider,D=F.thumb,L=M.thumb,N=this,G={min:false,max:false};if(D._isHoriz){D.setXConstraint(D.leftConstraint,L.rightConstraint,D.tickSize);L.setXConstraint(D.leftConstraint,L.rightConstraint,L.tickSize);}else{D.setYConstraint(D.topConstraint,L.bottomConstraint,D.tickSize);L.setYConstraint(D.topConstraint,L.bottomConstraint,L.tickSize);}this._oneTimeCallback(F,"slideEnd",function(){G.min=true;if(G.max){N.updateValue(J);setTimeout(function(){N._cleanEvent(F,"slideEnd");N._cleanEvent(M,"slideEnd");},0);}});this._oneTimeCallback(M,"slideEnd",function(){G.max=true;if(G.min){N.updateValue(J);setTimeout(function(){N._cleanEvent(F,"slideEnd");N._cleanEvent(M,"slideEnd");},0);}});F.setValue(H,I,E,false);M.setValue(K,I,E,false);},setMinValue:function(F,H,I,E){var G=this.minSlider,D=this;this.activeSlider=G;D=this;this._oneTimeCallback(G,"slideEnd",function(){D.updateValue(E);setTimeout(function(){D._cleanEvent(G,"slideEnd");},0);});G.setValue(F,H,I);},setMaxValue:function(D,H,I,F){var G=this.maxSlider,E=this;this.activeSlider=G;this._oneTimeCallback(G,"slideEnd",function(){E.updateValue(F);setTimeout(function(){E._cleanEvent(G,"slideEnd");},0);});G.setValue(D,H,I);},updateValue:function(J){var E=this.minSlider.getValue(),K=this.maxSlider.getValue(),F=false,D,M,H,I,L,G;if(E!=this.minVal||K!=this.maxVal){F=true;D=this.minSlider.thumb;M=this.maxSlider.thumb;H=this.isHoriz?"x":"y";G=this.minSlider.thumbCenterPoint[H]+this.maxSlider.thumbCenterPoint[H];I=Math.max(K-G-this.minRange,0);L=Math.min(-E-G-this.minRange,0);if(this.isHoriz){I=Math.min(I,M.rightConstraint);D.setXConstraint(D.leftConstraint,I,D.tickSize);M.setXConstraint(L,M.rightConstraint,M.tickSize);}else{I=Math.min(I,M.bottomConstraint);D.setYConstraint(D.leftConstraint,I,D.tickSize);M.setYConstraint(L,M.bottomConstraint,M.tickSize);}}this.minVal=E;this.maxVal=K;if(F&&!J){this.fireEvent("change",this);}},selectActiveSlider:function(H){var E=this.minSlider,D=this.maxSlider,J=E.isLocked()||!E.backgroundEnabled,G=D.isLocked()||!E.backgroundEnabled,F=YAHOO.util.Event,I;if(J||G){this.activeSlider=J?D:E;}else{if(this.isHoriz){I=F.getPageX(H)-E.thumb.initPageX-E.thumbCenterPoint.x;}else{I=F.getPageY(H)-E.thumb.initPageY-E.thumbCenterPoint.y;}this.activeSlider=I*2>D.getValue()+E.getValue()?D:E;}},_handleMouseDown:function(D){if(!D._handled){D._handled=true;this.selectActiveSlider(D);return B.Slider.prototype.onMouseDown.call(this.activeSlider,D);}else{return false;}},_handleMouseUp:function(D){B.Slider.prototype.onMouseUp.apply(this.activeSlider,arguments);},_oneTimeCallback:function(F,D,E){F.subscribe(D,function(){F.unsubscribe(D,arguments.callee);E.apply({},[].slice.apply(arguments));});},_cleanEvent:function(K,E){var J,I,D,G,H,F;if(K.__yui_events&&K.events[E]){for(I=K.__yui_events.length;I>=0;--I){if(K.__yui_events[I].type===E){J=K.__yui_events[I];break;}}if(J){H=J.subscribers;F=[];G=0;for(I=0,D=H.length;I<D;++I){if(H[I]){F[G++]=H[I];}}J.subscribers=F;}}}};YAHOO.lang.augmentProto(C,YAHOO.util.EventProvider);B.Slider.getHorizDualSlider=function(H,J,K,G,F,D){var I=new B.SliderThumb(J,H,0,G,0,0,F),E=new B.SliderThumb(K,H,0,G,0,0,F);return new C(new B.Slider(H,H,I,"horiz"),new B.Slider(H,H,E,"horiz"),G,D);};B.Slider.getVertDualSlider=function(H,J,K,G,F,D){var I=new B.SliderThumb(J,H,0,0,0,G,F),E=new B.SliderThumb(K,H,0,0,0,G,F);return new B.DualSlider(new B.Slider(H,H,I,"vert"),new B.Slider(H,H,E,"vert"),G,D);};YAHOO.widget.DualSlider=C;})();YAHOO.register("slider",YAHOO.widget.Slider,{version:"2.7.0",build:"1796"});/*
+ 33 Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+ 34 Code licensed under the BSD License:
+ 35 http://developer.yahoo.net/yui/license.txt
+ 36 version: 2.7.0
+ 37 */
+ 38 YAHOO.util.Attribute=function(B,A){if(A){this.owner=A;this.configure(B,true);}};YAHOO.util.Attribute.prototype={name:undefined,value:null,owner:null,readOnly:false,writeOnce:false,_initialConfig:null,_written:false,method:null,setter:null,getter:null,validator:null,getValue:function(){var A=this.value;if(this.getter){A=this.getter.call(this.owner,this.name);}return A;},setValue:function(F,B){var E,A=this.owner,C=this.name;var D={type:C,prevValue:this.getValue(),newValue:F};if(this.readOnly||(this.writeOnce&&this._written)){return false;}if(this.validator&&!this.validator.call(A,F)){return false;}if(!B){E=A.fireBeforeChangeEvent(D);if(E===false){return false;}}if(this.setter){F=this.setter.call(A,F,this.name);if(F===undefined){}}if(this.method){this.method.call(A,F,this.name);}this.value=F;this._written=true;D.type=C;if(!B){this.owner.fireChangeEvent(D);}return true;},configure:function(B,C){B=B||{};if(C){this._written=false;}this._initialConfig=this._initialConfig||{};for(var A in B){if(B.hasOwnProperty(A)){this[A]=B[A];if(C){this._initialConfig[A]=B[A];}}}},resetValue:function(){return this.setValue(this._initialConfig.value);},resetConfig:function(){this.configure(this._initialConfig,true);},refresh:function(A){this.setValue(this.value,A);}};(function(){var A=YAHOO.util.Lang;YAHOO.util.AttributeProvider=function(){};YAHOO.util.AttributeProvider.prototype={_configs:null,get:function(C){this._configs=this._configs||{};var B=this._configs[C];if(!B||!this._configs.hasOwnProperty(C)){return null;}return B.getValue();},set:function(D,E,B){this._configs=this._configs||{};var C=this._configs[D];if(!C){return false;}return C.setValue(E,B);},getAttributeKeys:function(){this._configs=this._configs;var C=[],B;for(B in this._configs){if(A.hasOwnProperty(this._configs,B)&&!A.isUndefined(this._configs[B])){C[C.length]=B;}}return C;},setAttributes:function(D,B){for(var C in D){if(A.hasOwnProperty(D,C)){this.set(C,D[C],B);}}},resetValue:function(C,B){this._configs=this._configs||{};if(this._configs[C]){this.set(C,this._configs[C]._initialConfig.value,B);return true;}return false;},refresh:function(E,C){this._configs=this._configs||{};var F=this._configs;E=((A.isString(E))?[E]:E)||this.getAttributeKeys();for(var D=0,B=E.length;D<B;++D){if(F.hasOwnProperty(E[D])){this._configs[E[D]].refresh(C);}}},register:function(B,C){this.setAttributeConfig(B,C);},getAttributeConfig:function(C){this._configs=this._configs||{};var B=this._configs[C]||{};var D={};for(C in B){if(A.hasOwnProperty(B,C)){D[C]=B[C];}}return D;},setAttributeConfig:function(B,C,D){this._configs=this._configs||{};C=C||{};if(!this._configs[B]){C.name=B;this._configs[B]=this.createAttribute(C);}else{this._configs[B].configure(C,D);}},configureAttribute:function(B,C,D){this.setAttributeConfig(B,C,D);},resetAttributeConfig:function(B){this._configs=this._configs||{};this._configs[B].resetConfig();},subscribe:function(B,C){this._events=this._events||{};if(!(B in this._events)){this._events[B]=this.createEvent(B);}YAHOO.util.EventProvider.prototype.subscribe.apply(this,arguments);},on:function(){this.subscribe.apply(this,arguments);},addListener:function(){this.subscribe.apply(this,arguments);},fireBeforeChangeEvent:function(C){var B="before";B+=C.type.charAt(0).toUpperCase()+C.type.substr(1)+"Change";C.type=B;return this.fireEvent(C.type,C);},fireChangeEvent:function(B){B.type+="Change";return this.fireEvent(B.type,B);},createAttribute:function(B){return new YAHOO.util.Attribute(B,this);}};YAHOO.augment(YAHOO.util.AttributeProvider,YAHOO.util.EventProvider);})();(function(){var B=YAHOO.util.Dom,C=YAHOO.util.AttributeProvider;var A=function(D,E){this.init.apply(this,arguments);};A.DOM_EVENTS={"click":true,"dblclick":true,"keydown":true,"keypress":true,"keyup":true,"mousedown":true,"mousemove":true,"mouseout":true,"mouseover":true,"mouseup":true,"focus":true,"blur":true,"submit":true,"change":true};A.prototype={DOM_EVENTS:null,DEFAULT_HTML_SETTER:function(F,D){var E=this.get("element");if(E){E[D]=F;}},DEFAULT_HTML_GETTER:function(D){var E=this.get("element"),F;if(E){F=E[D];}return F;},appendChild:function(D){D=D.get?D.get("element"):D;return this.get("element").appendChild(D);},getElementsByTagName:function(D){return this.get("element").getElementsByTagName(D);},hasChildNodes:function(){return this.get("element").hasChildNodes();},insertBefore:function(D,E){D=D.get?D.get("element"):D;E=(E&&E.get)?E.get("element"):E;return this.get("element").insertBefore(D,E);},removeChild:function(D){D=D.get?D.get("element"):D;return this.get("element").removeChild(D);},replaceChild:function(D,E){D=D.get?D.get("element"):D;E=E.get?E.get("element"):E;return this.get("element").replaceChild(D,E);},initAttributes:function(D){},addListener:function(H,G,I,F){var E=this.get("element")||this.get("id");F=F||this;var D=this;if(!this._events[H]){if(E&&this.DOM_EVENTS[H]){YAHOO.util.Event.addListener(E,H,function(J){if(J.srcElement&&!J.target){J.target=J.srcElement;}D.fireEvent(H,J);},I,F);}this.createEvent(H,this);}return YAHOO.util.EventProvider.prototype.subscribe.apply(this,arguments);},on:function(){return this.addListener.apply(this,arguments);},subscribe:function(){return this.addListener.apply(this,arguments);},removeListener:function(E,D){return this.unsubscribe.apply(this,arguments);},addClass:function(D){B.addClass(this.get("element"),D);},getElementsByClassName:function(E,D){return B.getElementsByClassName(E,D,this.get("element"));},hasClass:function(D){return B.hasClass(this.get("element"),D);},removeClass:function(D){return B.removeClass(this.get("element"),D);},replaceClass:function(E,D){return B.replaceClass(this.get("element"),E,D);},setStyle:function(E,D){return B.setStyle(this.get("element"),E,D);},getStyle:function(D){return B.getStyle(this.get("element"),D);},fireQueue:function(){var E=this._queue;for(var F=0,D=E.length;F<D;++F){this[E[F][0]].apply(this,E[F][1]);}},appendTo:function(E,F){E=(E.get)?E.get("element"):B.get(E);this.fireEvent("beforeAppendTo",{type:"beforeAppendTo",target:E});
+ 39 F=(F&&F.get)?F.get("element"):B.get(F);var D=this.get("element");if(!D){return false;}if(!E){return false;}if(D.parent!=E){if(F){E.insertBefore(D,F);}else{E.appendChild(D);}}this.fireEvent("appendTo",{type:"appendTo",target:E});return D;},get:function(D){var F=this._configs||{},E=F.element;if(E&&!F[D]&&!YAHOO.lang.isUndefined(E.value[D])){this._setHTMLAttrConfig(D);}return C.prototype.get.call(this,D);},setAttributes:function(J,G){var E={},H=this._configOrder;for(var I=0,D=H.length;I<D;++I){if(J[H[I]]!==undefined){E[H[I]]=true;this.set(H[I],J[H[I]],G);}}for(var F in J){if(J.hasOwnProperty(F)&&!E[F]){this.set(F,J[F],G);}}},set:function(E,G,D){var F=this.get("element");if(!F){this._queue[this._queue.length]=["set",arguments];if(this._configs[E]){this._configs[E].value=G;}return;}if(!this._configs[E]&&!YAHOO.lang.isUndefined(F[E])){this._setHTMLAttrConfig(E);}return C.prototype.set.apply(this,arguments);},setAttributeConfig:function(D,E,F){this._configOrder.push(D);C.prototype.setAttributeConfig.apply(this,arguments);},createEvent:function(E,D){this._events[E]=true;return C.prototype.createEvent.apply(this,arguments);},init:function(E,D){this._initElement(E,D);},destroy:function(){var D=this.get("element");YAHOO.util.Event.purgeElement(D,true);this.unsubscribeAll();if(D&&D.parentNode){D.parentNode.removeChild(D);}this._queue=[];this._events={};this._configs={};this._configOrder=[];},_initElement:function(F,E){this._queue=this._queue||[];this._events=this._events||{};this._configs=this._configs||{};this._configOrder=[];E=E||{};E.element=E.element||F||null;var H=false;var D=A.DOM_EVENTS;this.DOM_EVENTS=this.DOM_EVENTS||{};for(var G in D){if(D.hasOwnProperty(G)){this.DOM_EVENTS[G]=D[G];}}if(typeof E.element==="string"){this._setHTMLAttrConfig("id",{value:E.element});}if(B.get(E.element)){H=true;this._initHTMLElement(E);this._initContent(E);}YAHOO.util.Event.onAvailable(E.element,function(){if(!H){this._initHTMLElement(E);}this.fireEvent("available",{type:"available",target:B.get(E.element)});},this,true);YAHOO.util.Event.onContentReady(E.element,function(){if(!H){this._initContent(E);}this.fireEvent("contentReady",{type:"contentReady",target:B.get(E.element)});},this,true);},_initHTMLElement:function(D){this.setAttributeConfig("element",{value:B.get(D.element),readOnly:true});},_initContent:function(D){this.initAttributes(D);this.setAttributes(D,true);this.fireQueue();},_setHTMLAttrConfig:function(D,F){var E=this.get("element");F=F||{};F.name=D;F.setter=F.setter||this.DEFAULT_HTML_SETTER;F.getter=F.getter||this.DEFAULT_HTML_GETTER;F.value=F.value||E[D];this._configs[D]=new YAHOO.util.Attribute(F,this);}};YAHOO.augment(A,C);YAHOO.util.Element=A;})();YAHOO.register("element",YAHOO.util.Element,{version:"2.7.0",build:"1796"});/*
+ 40 Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+ 41 Code licensed under the BSD License:
+ 42 http://developer.yahoo.net/yui/license.txt
+ 43 version: 2.7.0
+ 44 */
+ 45 YAHOO.util.Color=function(){var A="0",B=YAHOO.lang.isArray,C=YAHOO.lang.isNumber;return{real2dec:function(D){return Math.min(255,Math.round(D*256));},hsv2rgb:function(H,O,M){if(B(H)){return this.hsv2rgb.call(this,H[0],H[1],H[2]);}var D,I,L,G=Math.floor((H/60)%6),J=(H/60)-G,F=M*(1-O),E=M*(1-J*O),N=M*(1-(1-J)*O),K;switch(G){case 0:D=M;I=N;L=F;break;case 1:D=E;I=M;L=F;break;case 2:D=F;I=M;L=N;break;case 3:D=F;I=E;L=M;break;case 4:D=N;I=F;L=M;break;case 5:D=M;I=F;L=E;break;}K=this.real2dec;return[K(D),K(I),K(L)];},rgb2hsv:function(D,H,I){if(B(D)){return this.rgb2hsv.apply(this,D);}D/=255;H/=255;I/=255;var G,L,E=Math.min(Math.min(D,H),I),J=Math.max(Math.max(D,H),I),K=J-E,F;switch(J){case E:G=0;break;case D:G=60*(H-I)/K;if(H<I){G+=360;}break;case H:G=(60*(I-D)/K)+120;break;case I:G=(60*(D-H)/K)+240;break;}L=(J===0)?0:1-(E/J);F=[Math.round(G),L,J];return F;},rgb2hex:function(F,E,D){if(B(F)){return this.rgb2hex.apply(this,F);}var G=this.dec2hex;return G(F)+G(E)+G(D);},dec2hex:function(D){D=parseInt(D,10)|0;D=(D>255||D<0)?0:D;return(A+D.toString(16)).slice(-2).toUpperCase();},hex2dec:function(D){return parseInt(D,16);},hex2rgb:function(D){var E=this.hex2dec;return[E(D.slice(0,2)),E(D.slice(2,4)),E(D.slice(4,6))];},websafe:function(F,E,D){if(B(F)){return this.websafe.apply(this,F);}var G=function(H){if(C(H)){H=Math.min(Math.max(0,H),255);var I,J;for(I=0;I<256;I=I+51){J=I+51;if(H>=I&&H<=J){return(H-I>25)?J:I;}}}return H;};return[G(F),G(E),G(D)];}};}();(function(){var J=0,F=YAHOO.util,C=YAHOO.lang,D=YAHOO.widget.Slider,B=F.Color,E=F.Dom,I=F.Event,A=C.substitute,H="yui-picker";function G(L,K){J=J+1;K=K||{};if(arguments.length===1&&!YAHOO.lang.isString(L)&&!L.nodeName){K=L;L=K.element||null;}if(!L&&!K.element){L=this._createHostElement(K);}G.superclass.constructor.call(this,L,K);this.initPicker();}YAHOO.extend(G,YAHOO.util.Element,{ID:{R:H+"-r",R_HEX:H+"-rhex",G:H+"-g",G_HEX:H+"-ghex",B:H+"-b",B_HEX:H+"-bhex",H:H+"-h",S:H+"-s",V:H+"-v",PICKER_BG:H+"-bg",PICKER_THUMB:H+"-thumb",HUE_BG:H+"-hue-bg",HUE_THUMB:H+"-hue-thumb",HEX:H+"-hex",SWATCH:H+"-swatch",WEBSAFE_SWATCH:H+"-websafe-swatch",CONTROLS:H+"-controls",RGB_CONTROLS:H+"-rgb-controls",HSV_CONTROLS:H+"-hsv-controls",HEX_CONTROLS:H+"-hex-controls",HEX_SUMMARY:H+"-hex-summary",CONTROLS_LABEL:H+"-controls-label"},TXT:{ILLEGAL_HEX:"Illegal hex value entered",SHOW_CONTROLS:"Show color details",HIDE_CONTROLS:"Hide color details",CURRENT_COLOR:"Currently selected color: {rgb}",CLOSEST_WEBSAFE:"Closest websafe color: {rgb}. Click to select.",R:"R",G:"G",B:"B",H:"H",S:"S",V:"V",HEX:"#",DEG:"\u00B0",PERCENT:"%"},IMAGE:{PICKER_THUMB:"../../build/colorpicker/assets/picker_thumb.png",HUE_THUMB:"../../build/colorpicker/assets/hue_thumb.png"},DEFAULT:{PICKER_SIZE:180},OPT:{HUE:"hue",SATURATION:"saturation",VALUE:"value",RED:"red",GREEN:"green",BLUE:"blue",HSV:"hsv",RGB:"rgb",WEBSAFE:"websafe",HEX:"hex",PICKER_SIZE:"pickersize",SHOW_CONTROLS:"showcontrols",SHOW_RGB_CONTROLS:"showrgbcontrols",SHOW_HSV_CONTROLS:"showhsvcontrols",SHOW_HEX_CONTROLS:"showhexcontrols",SHOW_HEX_SUMMARY:"showhexsummary",SHOW_WEBSAFE:"showwebsafe",CONTAINER:"container",IDS:"ids",ELEMENTS:"elements",TXT:"txt",IMAGES:"images",ANIMATE:"animate"},skipAnim:true,_createHostElement:function(){var K=document.createElement("div");if(this.CSS.BASE){K.className=this.CSS.BASE;}return K;},_updateHueSlider:function(){var K=this.get(this.OPT.PICKER_SIZE),L=this.get(this.OPT.HUE);L=K-Math.round(L/360*K);if(L===K){L=0;}this.hueSlider.setValue(L,this.skipAnim);},_updatePickerSlider:function(){var L=this.get(this.OPT.PICKER_SIZE),M=this.get(this.OPT.SATURATION),K=this.get(this.OPT.VALUE);M=Math.round(M*L/100);K=Math.round(L-(K*L/100));this.pickerSlider.setRegionValue(M,K,this.skipAnim);},_updateSliders:function(){this._updateHueSlider();this._updatePickerSlider();},setValue:function(L,K){K=(K)||false;this.set(this.OPT.RGB,L,K);this._updateSliders();},hueSlider:null,pickerSlider:null,_getH:function(){var K=this.get(this.OPT.PICKER_SIZE),L=(K-this.hueSlider.getValue())/K;L=Math.round(L*360);return(L===360)?0:L;},_getS:function(){return this.pickerSlider.getXValue()/this.get(this.OPT.PICKER_SIZE);},_getV:function(){var K=this.get(this.OPT.PICKER_SIZE);return(K-this.pickerSlider.getYValue())/K;},_updateSwatch:function(){var M=this.get(this.OPT.RGB),O=this.get(this.OPT.WEBSAFE),N=this.getElement(this.ID.SWATCH),L=M.join(","),K=this.get(this.OPT.TXT);E.setStyle(N,"background-color","rgb("+L+")");N.title=A(K.CURRENT_COLOR,{"rgb":"#"+this.get(this.OPT.HEX)});N=this.getElement(this.ID.WEBSAFE_SWATCH);L=O.join(",");E.setStyle(N,"background-color","rgb("+L+")");N.title=A(K.CLOSEST_WEBSAFE,{"rgb":"#"+B.rgb2hex(O)});},_getValuesFromSliders:function(){this.set(this.OPT.RGB,B.hsv2rgb(this._getH(),this._getS(),this._getV()));},_updateFormFields:function(){this.getElement(this.ID.H).value=this.get(this.OPT.HUE);this.getElement(this.ID.S).value=this.get(this.OPT.SATURATION);this.getElement(this.ID.V).value=this.get(this.OPT.VALUE);this.getElement(this.ID.R).value=this.get(this.OPT.RED);this.getElement(this.ID.R_HEX).innerHTML=B.dec2hex(this.get(this.OPT.RED));this.getElement(this.ID.G).value=this.get(this.OPT.GREEN);this.getElement(this.ID.G_HEX).innerHTML=B.dec2hex(this.get(this.OPT.GREEN));this.getElement(this.ID.B).value=this.get(this.OPT.BLUE);this.getElement(this.ID.B_HEX).innerHTML=B.dec2hex(this.get(this.OPT.BLUE));this.getElement(this.ID.HEX).value=this.get(this.OPT.HEX);},_onHueSliderChange:function(N){var L=this._getH(),K=B.hsv2rgb(L,1,1),M="rgb("+K.join(",")+")";this.set(this.OPT.HUE,L,true);E.setStyle(this.getElement(this.ID.PICKER_BG),"background-color",M);if(this.hueSlider.valueChangeSource!==D.SOURCE_SET_VALUE){this._getValuesFromSliders();}this._updateFormFields();this._updateSwatch();},_onPickerSliderChange:function(M){var L=this._getS(),K=this._getV();this.set(this.OPT.SATURATION,Math.round(L*100),true);this.set(this.OPT.VALUE,Math.round(K*100),true);if(this.pickerSlider.valueChangeSource!==D.SOURCE_SET_VALUE){this._getValuesFromSliders();
+ 46 }this._updateFormFields();this._updateSwatch();},_getCommand:function(K){var L=I.getCharCode(K);if(L===38){return 3;}else{if(L===13){return 6;}else{if(L===40){return 4;}else{if(L>=48&&L<=57){return 1;}else{if(L>=97&&L<=102){return 2;}else{if(L>=65&&L<=70){return 2;}else{if("8, 9, 13, 27, 37, 39".indexOf(L)>-1||K.ctrlKey||K.metaKey){return 5;}else{return 0;}}}}}}}},_useFieldValue:function(L,K,N){var M=K.value;if(N!==this.OPT.HEX){M=parseInt(M,10);}if(M!==this.get(N)){this.set(N,M);}},_rgbFieldKeypress:function(M,K,O){var N=this._getCommand(M),L=(M.shiftKey)?10:1;switch(N){case 6:this._useFieldValue.apply(this,arguments);break;case 3:this.set(O,Math.min(this.get(O)+L,255));this._updateFormFields();break;case 4:this.set(O,Math.max(this.get(O)-L,0));this._updateFormFields();break;default:}},_hexFieldKeypress:function(L,K,N){var M=this._getCommand(L);if(M===6){this._useFieldValue.apply(this,arguments);}},_hexOnly:function(L,K){var M=this._getCommand(L);switch(M){case 6:case 5:case 1:break;case 2:if(K!==true){break;}default:I.stopEvent(L);return false;}},_numbersOnly:function(K){return this._hexOnly(K,true);},getElement:function(K){return this.get(this.OPT.ELEMENTS)[this.get(this.OPT.IDS)[K]];},_createElements:function(){var N,M,P,O,L,K=this.get(this.OPT.IDS),Q=this.get(this.OPT.TXT),S=this.get(this.OPT.IMAGES),R=function(U,V){var W=document.createElement(U);if(V){C.augmentObject(W,V,true);}return W;},T=function(U,V){var W=C.merge({autocomplete:"off",value:"0",size:3,maxlength:3},V);W.name=W.id;return new R(U,W);};L=this.get("element");N=new R("div",{id:K[this.ID.PICKER_BG],className:"yui-picker-bg",tabIndex:-1,hideFocus:true});M=new R("div",{id:K[this.ID.PICKER_THUMB],className:"yui-picker-thumb"});P=new R("img",{src:S.PICKER_THUMB});M.appendChild(P);N.appendChild(M);L.appendChild(N);N=new R("div",{id:K[this.ID.HUE_BG],className:"yui-picker-hue-bg",tabIndex:-1,hideFocus:true});M=new R("div",{id:K[this.ID.HUE_THUMB],className:"yui-picker-hue-thumb"});P=new R("img",{src:S.HUE_THUMB});M.appendChild(P);N.appendChild(M);L.appendChild(N);N=new R("div",{id:K[this.ID.CONTROLS],className:"yui-picker-controls"});L.appendChild(N);L=N;N=new R("div",{className:"hd"});M=new R("a",{id:K[this.ID.CONTROLS_LABEL],href:"#"});N.appendChild(M);L.appendChild(N);N=new R("div",{className:"bd"});L.appendChild(N);L=N;N=new R("ul",{id:K[this.ID.RGB_CONTROLS],className:"yui-picker-rgb-controls"});M=new R("li");M.appendChild(document.createTextNode(Q.R+" "));O=new T("input",{id:K[this.ID.R],className:"yui-picker-r"});M.appendChild(O);N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.G+" "));O=new T("input",{id:K[this.ID.G],className:"yui-picker-g"});M.appendChild(O);N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.B+" "));O=new T("input",{id:K[this.ID.B],className:"yui-picker-b"});M.appendChild(O);N.appendChild(M);L.appendChild(N);N=new R("ul",{id:K[this.ID.HSV_CONTROLS],className:"yui-picker-hsv-controls"});M=new R("li");M.appendChild(document.createTextNode(Q.H+" "));O=new T("input",{id:K[this.ID.H],className:"yui-picker-h"});M.appendChild(O);M.appendChild(document.createTextNode(" "+Q.DEG));N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.S+" "));O=new T("input",{id:K[this.ID.S],className:"yui-picker-s"});M.appendChild(O);M.appendChild(document.createTextNode(" "+Q.PERCENT));N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.V+" "));O=new T("input",{id:K[this.ID.V],className:"yui-picker-v"});M.appendChild(O);M.appendChild(document.createTextNode(" "+Q.PERCENT));N.appendChild(M);L.appendChild(N);N=new R("ul",{id:K[this.ID.HEX_SUMMARY],className:"yui-picker-hex_summary"});M=new R("li",{id:K[this.ID.R_HEX]});N.appendChild(M);M=new R("li",{id:K[this.ID.G_HEX]});N.appendChild(M);M=new R("li",{id:K[this.ID.B_HEX]});N.appendChild(M);L.appendChild(N);N=new R("div",{id:K[this.ID.HEX_CONTROLS],className:"yui-picker-hex-controls"});N.appendChild(document.createTextNode(Q.HEX+" "));M=new T("input",{id:K[this.ID.HEX],className:"yui-picker-hex",size:6,maxlength:6});N.appendChild(M);L.appendChild(N);L=this.get("element");N=new R("div",{id:K[this.ID.SWATCH],className:"yui-picker-swatch"});L.appendChild(N);N=new R("div",{id:K[this.ID.WEBSAFE_SWATCH],className:"yui-picker-websafe-swatch"});L.appendChild(N);},_attachRGBHSV:function(L,K){I.on(this.getElement(L),"keydown",function(N,M){M._rgbFieldKeypress(N,this,K);},this);I.on(this.getElement(L),"keypress",this._numbersOnly,this,true);I.on(this.getElement(L),"blur",function(N,M){M._useFieldValue(N,this,K);},this);},_updateRGB:function(){var K=[this.get(this.OPT.RED),this.get(this.OPT.GREEN),this.get(this.OPT.BLUE)];this.set(this.OPT.RGB,K);this._updateSliders();},_initElements:function(){var O=this.OPT,N=this.get(O.IDS),L=this.get(O.ELEMENTS),K,M,P;for(K in this.ID){if(C.hasOwnProperty(this.ID,K)){N[this.ID[K]]=N[K];}}M=E.get(N[this.ID.PICKER_BG]);if(!M){this._createElements();}else{}for(K in N){if(C.hasOwnProperty(N,K)){M=E.get(N[K]);P=E.generateId(M);N[K]=P;N[N[K]]=P;L[P]=M;}}},initPicker:function(){this._initSliders();this._bindUI();this.syncUI(true);},_initSliders:function(){var K=this.ID,L=this.get(this.OPT.PICKER_SIZE);this.hueSlider=D.getVertSlider(this.getElement(K.HUE_BG),this.getElement(K.HUE_THUMB),0,L);this.pickerSlider=D.getSliderRegion(this.getElement(K.PICKER_BG),this.getElement(K.PICKER_THUMB),0,L,0,L);this.set(this.OPT.ANIMATE,this.get(this.OPT.ANIMATE));},_bindUI:function(){var K=this.ID,L=this.OPT;this.hueSlider.subscribe("change",this._onHueSliderChange,this,true);this.pickerSlider.subscribe("change",this._onPickerSliderChange,this,true);I.on(this.getElement(K.WEBSAFE_SWATCH),"click",function(M){this.setValue(this.get(L.WEBSAFE));},this,true);I.on(this.getElement(K.CONTROLS_LABEL),"click",function(M){this.set(L.SHOW_CONTROLS,!this.get(L.SHOW_CONTROLS));I.preventDefault(M);},this,true);this._attachRGBHSV(K.R,L.RED);this._attachRGBHSV(K.G,L.GREEN);this._attachRGBHSV(K.B,L.BLUE);this._attachRGBHSV(K.H,L.HUE);
+ 47 this._attachRGBHSV(K.S,L.SATURATION);this._attachRGBHSV(K.V,L.VALUE);I.on(this.getElement(K.HEX),"keydown",function(N,M){M._hexFieldKeypress(N,this,L.HEX);},this);I.on(this.getElement(this.ID.HEX),"keypress",this._hexOnly,this,true);I.on(this.getElement(this.ID.HEX),"blur",function(N,M){M._useFieldValue(N,this,L.HEX);},this);},syncUI:function(K){this.skipAnim=K;this._updateRGB();this.skipAnim=false;},_updateRGBFromHSV:function(){var L=[this.get(this.OPT.HUE),this.get(this.OPT.SATURATION)/100,this.get(this.OPT.VALUE)/100],K=B.hsv2rgb(L);this.set(this.OPT.RGB,K);this._updateSliders();},_updateHex:function(){var N=this.get(this.OPT.HEX),K=N.length,O,M,L;if(K===3){O=N.split("");for(M=0;M<K;M=M+1){O[M]=O[M]+O[M];}N=O.join("");}if(N.length!==6){return false;}L=B.hex2rgb(N);this.setValue(L);},_hideShowEl:function(M,K){var L=(C.isString(M)?this.getElement(M):M);E.setStyle(L,"display",(K)?"":"none");},initAttributes:function(K){K=K||{};G.superclass.initAttributes.call(this,K);this.setAttributeConfig(this.OPT.PICKER_SIZE,{value:K.size||this.DEFAULT.PICKER_SIZE});this.setAttributeConfig(this.OPT.HUE,{value:K.hue||0,validator:C.isNumber});this.setAttributeConfig(this.OPT.SATURATION,{value:K.saturation||0,validator:C.isNumber});this.setAttributeConfig(this.OPT.VALUE,{value:C.isNumber(K.value)?K.value:100,validator:C.isNumber});this.setAttributeConfig(this.OPT.RED,{value:C.isNumber(K.red)?K.red:255,validator:C.isNumber});this.setAttributeConfig(this.OPT.GREEN,{value:C.isNumber(K.green)?K.green:255,validator:C.isNumber});this.setAttributeConfig(this.OPT.BLUE,{value:C.isNumber(K.blue)?K.blue:255,validator:C.isNumber});this.setAttributeConfig(this.OPT.HEX,{value:K.hex||"FFFFFF",validator:C.isString});this.setAttributeConfig(this.OPT.RGB,{value:K.rgb||[255,255,255],method:function(O){this.set(this.OPT.RED,O[0],true);this.set(this.OPT.GREEN,O[1],true);this.set(this.OPT.BLUE,O[2],true);var Q=B.websafe(O),P=B.rgb2hex(O),N=B.rgb2hsv(O);this.set(this.OPT.WEBSAFE,Q,true);this.set(this.OPT.HEX,P,true);if(N[1]){this.set(this.OPT.HUE,N[0],true);}this.set(this.OPT.SATURATION,Math.round(N[1]*100),true);this.set(this.OPT.VALUE,Math.round(N[2]*100),true);},readonly:true});this.setAttributeConfig(this.OPT.CONTAINER,{value:null,method:function(N){if(N){N.showEvent.subscribe(function(){this.pickerSlider.focus();},this,true);}}});this.setAttributeConfig(this.OPT.WEBSAFE,{value:K.websafe||[255,255,255]});var M=K.ids||C.merge({},this.ID),L;if(!K.ids&&J>1){for(L in M){if(C.hasOwnProperty(M,L)){M[L]=M[L]+J;}}}this.setAttributeConfig(this.OPT.IDS,{value:M,writeonce:true});this.setAttributeConfig(this.OPT.TXT,{value:K.txt||this.TXT,writeonce:true});this.setAttributeConfig(this.OPT.IMAGES,{value:K.images||this.IMAGE,writeonce:true});this.setAttributeConfig(this.OPT.ELEMENTS,{value:{},readonly:true});this.setAttributeConfig(this.OPT.SHOW_CONTROLS,{value:C.isBoolean(K.showcontrols)?K.showcontrols:true,method:function(N){var O=E.getElementsByClassName("bd","div",this.getElement(this.ID.CONTROLS))[0];this._hideShowEl(O,N);this.getElement(this.ID.CONTROLS_LABEL).innerHTML=(N)?this.get(this.OPT.TXT).HIDE_CONTROLS:this.get(this.OPT.TXT).SHOW_CONTROLS;}});this.setAttributeConfig(this.OPT.SHOW_RGB_CONTROLS,{value:C.isBoolean(K.showrgbcontrols)?K.showrgbcontrols:true,method:function(N){this._hideShowEl(this.ID.RGB_CONTROLS,N);}});this.setAttributeConfig(this.OPT.SHOW_HSV_CONTROLS,{value:C.isBoolean(K.showhsvcontrols)?K.showhsvcontrols:false,method:function(N){this._hideShowEl(this.ID.HSV_CONTROLS,N);if(N&&this.get(this.OPT.SHOW_HEX_SUMMARY)){this.set(this.OPT.SHOW_HEX_SUMMARY,false);}}});this.setAttributeConfig(this.OPT.SHOW_HEX_CONTROLS,{value:C.isBoolean(K.showhexcontrols)?K.showhexcontrols:false,method:function(N){this._hideShowEl(this.ID.HEX_CONTROLS,N);}});this.setAttributeConfig(this.OPT.SHOW_WEBSAFE,{value:C.isBoolean(K.showwebsafe)?K.showwebsafe:true,method:function(N){this._hideShowEl(this.ID.WEBSAFE_SWATCH,N);}});this.setAttributeConfig(this.OPT.SHOW_HEX_SUMMARY,{value:C.isBoolean(K.showhexsummary)?K.showhexsummary:true,method:function(N){this._hideShowEl(this.ID.HEX_SUMMARY,N);if(N&&this.get(this.OPT.SHOW_HSV_CONTROLS)){this.set(this.OPT.SHOW_HSV_CONTROLS,false);}}});this.setAttributeConfig(this.OPT.ANIMATE,{value:C.isBoolean(K.animate)?K.animate:true,method:function(N){if(this.pickerSlider){this.pickerSlider.animate=N;this.hueSlider.animate=N;}}});this.on(this.OPT.HUE+"Change",this._updateRGBFromHSV,this,true);this.on(this.OPT.SATURATION+"Change",this._updateRGBFromHSV,this,true);this.on(this.OPT.VALUE+"Change",this._updateRGBFromHSV,this,true);this.on(this.OPT.RED+"Change",this._updateRGB,this,true);this.on(this.OPT.GREEN+"Change",this._updateRGB,this,true);this.on(this.OPT.BLUE+"Change",this._updateRGB,this,true);this.on(this.OPT.HEX+"Change",this._updateHex,this,true);this._initElements();}});YAHOO.widget.ColorPicker=G;})();YAHOO.register("colorpicker",YAHOO.widget.ColorPicker,{version:"2.7.0",build:"1796"});
+ 48
+ 49 /*
+ 50 Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+ 51 Code licensed under the BSD License:
+ 52 http://developer.yahoo.net/yui/license.txt
+ 53 version: 2.7.0
+ 54 */
+ 55 (function(){var B=YAHOO.util;var A=function(D,C,E,F){if(!D){}this.init(D,C,E,F);};A.NAME="Anim";A.prototype={toString:function(){var C=this.getEl()||{};var D=C.id||C.tagName;return(this.constructor.NAME+": "+D);},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(C,E,D){return this.method(this.currentFrame,E,D-E,this.totalFrames);},setAttribute:function(C,F,E){var D=this.getEl();if(this.patterns.noNegatives.test(C)){F=(F>0)?F:0;}if("style" in D){B.Dom.setStyle(D,C,F+E);}else{if(C in D){D[C]=F;}}},getAttribute:function(C){var E=this.getEl();var G=B.Dom.getStyle(E,C);if(G!=="auto"&&!this.patterns.offsetUnit.test(G)){return parseFloat(G);}var D=this.patterns.offsetAttribute.exec(C)||[];var H=!!(D[3]);var F=!!(D[2]);if("style" in E){if(F||(B.Dom.getStyle(E,"position")=="absolute"&&H)){G=E["offset"+D[0].charAt(0).toUpperCase()+D[0].substr(1)];}else{G=0;}}else{if(C in E){G=E[C];}}return G;},getDefaultUnit:function(C){if(this.patterns.defaultUnit.test(C)){return"px";}return"";},setRuntimeAttribute:function(D){var I;var E;var F=this.attributes;this.runtimeAttributes[D]={};var H=function(J){return(typeof J!=="undefined");};if(!H(F[D]["to"])&&!H(F[D]["by"])){return false;}I=(H(F[D]["from"]))?F[D]["from"]:this.getAttribute(D);if(H(F[D]["to"])){E=F[D]["to"];}else{if(H(F[D]["by"])){if(I.constructor==Array){E=[];for(var G=0,C=I.length;G<C;++G){E[G]=I[G]+F[D]["by"][G]*1;}}else{E=I+F[D]["by"]*1;}}}this.runtimeAttributes[D].start=I;this.runtimeAttributes[D].end=E;this.runtimeAttributes[D].unit=(H(F[D].unit))?F[D]["unit"]:this.getDefaultUnit(D);return true;},init:function(E,J,I,C){var D=false;var F=null;var H=0;E=B.Dom.get(E);this.attributes=J||{};this.duration=!YAHOO.lang.isUndefined(I)?I:1;this.method=C||B.Easing.easeNone;this.useSeconds=true;this.currentFrame=0;this.totalFrames=B.AnimMgr.fps;this.setEl=function(M){E=B.Dom.get(M);};this.getEl=function(){return E;};this.isAnimated=function(){return D;};this.getStartTime=function(){return F;};this.runtimeAttributes={};this.animate=function(){if(this.isAnimated()){return false;}this.currentFrame=0;this.totalFrames=(this.useSeconds)?Math.ceil(B.AnimMgr.fps*this.duration):this.duration;if(this.duration===0&&this.useSeconds){this.totalFrames=1;}B.AnimMgr.registerElement(this);return true;};this.stop=function(M){if(!this.isAnimated()){return false;}if(M){this.currentFrame=this.totalFrames;this._onTween.fire();}B.AnimMgr.stop(this);};var L=function(){this.onStart.fire();this.runtimeAttributes={};for(var M in this.attributes){this.setRuntimeAttribute(M);}D=true;H=0;F=new Date();};var K=function(){var O={duration:new Date()-this.getStartTime(),currentFrame:this.currentFrame};O.toString=function(){return("duration: "+O.duration+", currentFrame: "+O.currentFrame);};this.onTween.fire(O);var N=this.runtimeAttributes;for(var M in N){this.setAttribute(M,this.doMethod(M,N[M].start,N[M].end),N[M].unit);}H+=1;};var G=function(){var M=(new Date()-F)/1000;var N={duration:M,frames:H,fps:H/M};N.toString=function(){return("duration: "+N.duration+", frames: "+N.frames+", fps: "+N.fps);};D=false;H=0;this.onComplete.fire(N);};this._onStart=new B.CustomEvent("_start",this,true);this.onStart=new B.CustomEvent("start",this);this.onTween=new B.CustomEvent("tween",this);this._onTween=new B.CustomEvent("_tween",this,true);this.onComplete=new B.CustomEvent("complete",this);this._onComplete=new B.CustomEvent("_complete",this,true);this._onStart.subscribe(L);this._onTween.subscribe(K);this._onComplete.subscribe(G);}};B.Anim=A;})();YAHOO.util.AnimMgr=new function(){var C=null;var B=[];var A=0;this.fps=1000;this.delay=1;this.registerElement=function(F){B[B.length]=F;A+=1;F._onStart.fire();this.start();};this.unRegister=function(G,F){F=F||E(G);if(!G.isAnimated()||F==-1){return false;}G._onComplete.fire();B.splice(F,1);A-=1;if(A<=0){this.stop();}return true;};this.start=function(){if(C===null){C=setInterval(this.run,this.delay);}};this.stop=function(H){if(!H){clearInterval(C);for(var G=0,F=B.length;G<F;++G){this.unRegister(B[0],0);}B=[];C=null;A=0;}else{this.unRegister(H);}};this.run=function(){for(var H=0,F=B.length;H<F;++H){var G=B[H];if(!G||!G.isAnimated()){continue;}if(G.currentFrame<G.totalFrames||G.totalFrames===null){G.currentFrame+=1;if(G.useSeconds){D(G);}G._onTween.fire();}else{YAHOO.util.AnimMgr.stop(G,H);}}};var E=function(H){for(var G=0,F=B.length;G<F;++G){if(B[G]==H){return G;}}return -1;};var D=function(G){var J=G.totalFrames;var I=G.currentFrame;var H=(G.currentFrame*G.duration*1000/G.totalFrames);var F=(new Date()-G.getStartTime());var K=0;if(F<G.duration*1000){K=Math.round((F/H-1)*G.currentFrame);}else{K=J-(I+1);}if(K>0&&isFinite(K)){if(G.currentFrame+K>=J){K=J-(I+1);}G.currentFrame+=K;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(E,D){var F=E.length;var C=[];for(var B=0;B<F;++B){C[B]=[E[B][0],E[B][1]];}for(var A=1;A<F;++A){for(B=0;B<F-A;++B){C[B][0]=(1-D)*C[B][0]+D*C[parseInt(B+1,10)][0];C[B][1]=(1-D)*C[B][1]+D*C[parseInt(B+1,10)][1];}}return[C[0][0],C[0][1]];};};(function(){var A=function(F,E,G,H){A.superclass.constructor.call(this,F,E,G,H);};A.NAME="ColorAnim";A.DEFAULT_BGCOLOR="#fff";var C=YAHOO.util;YAHOO.extend(A,C.Anim);var D=A.superclass;var B=A.prototype;B.patterns.color=/color$/i;B.patterns.rgb=/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;B.patterns.hex=/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;B.patterns.hex3=/^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;B.patterns.transparent=/^transparent|rgba\(0, 0, 0, 0\)$/;B.parseColor=function(E){if(E.length==3){return E;}var F=this.patterns.hex.exec(E);if(F&&F.length==4){return[parseInt(F[1],16),parseInt(F[2],16),parseInt(F[3],16)];}F=this.patterns.rgb.exec(E);if(F&&F.length==4){return[parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10)];}F=this.patterns.hex3.exec(E);if(F&&F.length==4){return[parseInt(F[1]+F[1],16),parseInt(F[2]+F[2],16),parseInt(F[3]+F[3],16)];
+ 56 }return null;};B.getAttribute=function(E){var G=this.getEl();if(this.patterns.color.test(E)){var I=YAHOO.util.Dom.getStyle(G,E);var H=this;if(this.patterns.transparent.test(I)){var F=YAHOO.util.Dom.getAncestorBy(G,function(J){return !H.patterns.transparent.test(I);});if(F){I=C.Dom.getStyle(F,E);}else{I=A.DEFAULT_BGCOLOR;}}}else{I=D.getAttribute.call(this,E);}return I;};B.doMethod=function(F,J,G){var I;if(this.patterns.color.test(F)){I=[];for(var H=0,E=J.length;H<E;++H){I[H]=D.doMethod.call(this,F,J[H],G[H]);}I="rgb("+Math.floor(I[0])+","+Math.floor(I[1])+","+Math.floor(I[2])+")";}else{I=D.doMethod.call(this,F,J,G);}return I;};B.setRuntimeAttribute=function(F){D.setRuntimeAttribute.call(this,F);if(this.patterns.color.test(F)){var H=this.attributes;var J=this.parseColor(this.runtimeAttributes[F].start);var G=this.parseColor(this.runtimeAttributes[F].end);if(typeof H[F]["to"]==="undefined"&&typeof H[F]["by"]!=="undefined"){G=this.parseColor(H[F].by);for(var I=0,E=J.length;I<E;++I){G[I]=J[I]+G[I];}}this.runtimeAttributes[F].start=J;this.runtimeAttributes[F].end=G;}};C.ColorAnim=A;})();
+ 57 /*
+ 58 TERMS OF USE - EASING EQUATIONS
+ 59 Open source under the BSD License.
+ 60 Copyright 2001 Robert Penner All rights reserved.
+ 61
+ 62 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+ 63
+ 64  * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ 65  * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ 66  * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+ 67
+ 68 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ 69 */
+ 70 YAHOO.util.Easing={easeNone:function(B,A,D,C){return D*B/C+A;},easeIn:function(B,A,D,C){return D*(B/=C)*B+A;},easeOut:function(B,A,D,C){return -D*(B/=C)*(B-2)+A;},easeBoth:function(B,A,D,C){if((B/=C/2)<1){return D/2*B*B+A;}return -D/2*((--B)*(B-2)-1)+A;},easeInStrong:function(B,A,D,C){return D*(B/=C)*B*B*B+A;},easeOutStrong:function(B,A,D,C){return -D*((B=B/C-1)*B*B*B-1)+A;},easeBothStrong:function(B,A,D,C){if((B/=C/2)<1){return D/2*B*B*B*B+A;}return -D/2*((B-=2)*B*B*B-2)+A;},elasticIn:function(C,A,G,F,B,E){if(C==0){return A;}if((C/=F)==1){return A+G;}if(!E){E=F*0.3;}if(!B||B<Math.abs(G)){B=G;var D=E/4;}else{var D=E/(2*Math.PI)*Math.asin(G/B);}return -(B*Math.pow(2,10*(C-=1))*Math.sin((C*F-D)*(2*Math.PI)/E))+A;},elasticOut:function(C,A,G,F,B,E){if(C==0){return A;}if((C/=F)==1){return A+G;}if(!E){E=F*0.3;}if(!B||B<Math.abs(G)){B=G;var D=E/4;}else{var D=E/(2*Math.PI)*Math.asin(G/B);}return B*Math.pow(2,-10*C)*Math.sin((C*F-D)*(2*Math.PI)/E)+G+A;},elasticBoth:function(C,A,G,F,B,E){if(C==0){return A;}if((C/=F/2)==2){return A+G;}if(!E){E=F*(0.3*1.5);}if(!B||B<Math.abs(G)){B=G;var D=E/4;}else{var D=E/(2*Math.PI)*Math.asin(G/B);}if(C<1){return -0.5*(B*Math.pow(2,10*(C-=1))*Math.sin((C*F-D)*(2*Math.PI)/E))+A;}return B*Math.pow(2,-10*(C-=1))*Math.sin((C*F-D)*(2*Math.PI)/E)*0.5+G+A;},backIn:function(B,A,E,D,C){if(typeof C=="undefined"){C=1.70158;}return E*(B/=D)*B*((C+1)*B-C)+A;},backOut:function(B,A,E,D,C){if(typeof C=="undefined"){C=1.70158;}return E*((B=B/D-1)*B*((C+1)*B+C)+1)+A;},backBoth:function(B,A,E,D,C){if(typeof C=="undefined"){C=1.70158;}if((B/=D/2)<1){return E/2*(B*B*(((C*=(1.525))+1)*B-C))+A;}return E/2*((B-=2)*B*(((C*=(1.525))+1)*B+C)+2)+A;},bounceIn:function(B,A,D,C){return D-YAHOO.util.Easing.bounceOut(C-B,0,D,C)+A;},bounceOut:function(B,A,D,C){if((B/=C)<(1/2.75)){return D*(7.5625*B*B)+A;}else{if(B<(2/2.75)){return D*(7.5625*(B-=(1.5/2.75))*B+0.75)+A;}else{if(B<(2.5/2.75)){return D*(7.5625*(B-=(2.25/2.75))*B+0.9375)+A;}}}return D*(7.5625*(B-=(2.625/2.75))*B+0.984375)+A;},bounceBoth:function(B,A,D,C){if(B<C/2){return YAHOO.util.Easing.bounceIn(B*2,0,D,C)*0.5+A;}return YAHOO.util.Easing.bounceOut(B*2-C,0,D,C)*0.5+D*0.5+A;}};(function(){var A=function(H,G,I,J){if(H){A.superclass.constructor.call(this,H,G,I,J);}};A.NAME="Motion";var E=YAHOO.util;YAHOO.extend(A,E.ColorAnim);var F=A.superclass;var C=A.prototype;C.patterns.points=/^points$/i;C.setAttribute=function(G,I,H){if(this.patterns.points.test(G)){H=H||"px";F.setAttribute.call(this,"left",I[0],H);F.setAttribute.call(this,"top",I[1],H);}else{F.setAttribute.call(this,G,I,H);}};C.getAttribute=function(G){if(this.patterns.points.test(G)){var H=[F.getAttribute.call(this,"left"),F.getAttribute.call(this,"top")];}else{H=F.getAttribute.call(this,G);}return H;};C.doMethod=function(G,K,H){var J=null;if(this.patterns.points.test(G)){var I=this.method(this.currentFrame,0,100,this.totalFrames)/100;J=E.Bezier.getPosition(this.runtimeAttributes[G],I);}else{J=F.doMethod.call(this,G,K,H);}return J;};C.setRuntimeAttribute=function(P){if(this.patterns.points.test(P)){var H=this.getEl();var J=this.attributes;var G;var L=J["points"]["control"]||[];var I;var M,O;if(L.length>0&&!(L[0] instanceof Array)){L=[L];}else{var K=[];for(M=0,O=L.length;M<O;++M){K[M]=L[M];}L=K;}if(E.Dom.getStyle(H,"position")=="static"){E.Dom.setStyle(H,"position","relative");}if(D(J["points"]["from"])){E.Dom.setXY(H,J["points"]["from"]);
+ 71 }else{E.Dom.setXY(H,E.Dom.getXY(H));}G=this.getAttribute("points");if(D(J["points"]["to"])){I=B.call(this,J["points"]["to"],G);var N=E.Dom.getXY(this.getEl());for(M=0,O=L.length;M<O;++M){L[M]=B.call(this,L[M],G);}}else{if(D(J["points"]["by"])){I=[G[0]+J["points"]["by"][0],G[1]+J["points"]["by"][1]];for(M=0,O=L.length;M<O;++M){L[M]=[G[0]+L[M][0],G[1]+L[M][1]];}}}this.runtimeAttributes[P]=[G];if(L.length>0){this.runtimeAttributes[P]=this.runtimeAttributes[P].concat(L);}this.runtimeAttributes[P][this.runtimeAttributes[P].length]=I;}else{F.setRuntimeAttribute.call(this,P);}};var B=function(G,I){var H=E.Dom.getXY(this.getEl());G=[G[0]-H[0]+I[0],G[1]-H[1]+I[1]];return G;};var D=function(G){return(typeof G!=="undefined");};E.Motion=A;})();(function(){var D=function(F,E,G,H){if(F){D.superclass.constructor.call(this,F,E,G,H);}};D.NAME="Scroll";var B=YAHOO.util;YAHOO.extend(D,B.ColorAnim);var C=D.superclass;var A=D.prototype;A.doMethod=function(E,H,F){var G=null;if(E=="scroll"){G=[this.method(this.currentFrame,H[0],F[0]-H[0],this.totalFrames),this.method(this.currentFrame,H[1],F[1]-H[1],this.totalFrames)];}else{G=C.doMethod.call(this,E,H,F);}return G;};A.getAttribute=function(E){var G=null;var F=this.getEl();if(E=="scroll"){G=[F.scrollLeft,F.scrollTop];}else{G=C.getAttribute.call(this,E);}return G;};A.setAttribute=function(E,H,G){var F=this.getEl();if(E=="scroll"){F.scrollLeft=H[0];F.scrollTop=H[1];}else{C.setAttribute.call(this,E,H,G);}};B.Scroll=D;})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.7.0",build:"1799"});
+ 72 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_undo_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_undo_plugin.js.html new file mode 100644 index 000000000..dab0cb1ed --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_undo_plugin.js.html @@ -0,0 +1,492 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview Undo/Redo system for saving shapshot for document modification
+  8  *		and other recordable changes.
+  9  */
+ 10
+ 11 (function()
+ 12 {
+ 13 	CKEDITOR.plugins.add( 'undo',
+ 14 	{
+ 15 		requires : [ 'selection', 'wysiwygarea' ],
+ 16
+ 17 		init : function( editor )
+ 18 		{
+ 19 			var undoManager = new UndoManager( editor );
+ 20
+ 21 			var undoCommand = editor.addCommand( 'undo',
+ 22 				{
+ 23 					exec : function()
+ 24 					{
+ 25 						if ( undoManager.undo() )
+ 26 						{
+ 27 							editor.selectionChange();
+ 28 							this.fire( 'afterUndo' );
+ 29 						}
+ 30 					},
+ 31 					state : CKEDITOR.TRISTATE_DISABLED,
+ 32 					canUndo : false
+ 33 				});
+ 34
+ 35 			var redoCommand = editor.addCommand( 'redo',
+ 36 				{
+ 37 					exec : function()
+ 38 					{
+ 39 						if ( undoManager.redo() )
+ 40 						{
+ 41 							editor.selectionChange();
+ 42 							this.fire( 'afterRedo' );
+ 43 						}
+ 44 					},
+ 45 					state : CKEDITOR.TRISTATE_DISABLED,
+ 46 					canUndo : false
+ 47 				});
+ 48
+ 49 			undoManager.onChange = function()
+ 50 			{
+ 51 				undoCommand.setState( undoManager.undoable() ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
+ 52 				redoCommand.setState( undoManager.redoable() ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
+ 53 			};
+ 54
+ 55 			function recordCommand( event )
+ 56 			{
+ 57 				// If the command hasn't been marked to not support undo.
+ 58 				if ( undoManager.enabled && event.data.command.canUndo !== false )
+ 59 					undoManager.save();
+ 60 			}
+ 61
+ 62 			// We'll save snapshots before and after executing a command.
+ 63 			editor.on( 'beforeCommandExec', recordCommand );
+ 64 			editor.on( 'afterCommandExec', recordCommand );
+ 65
+ 66 			// Save snapshots before doing custom changes.
+ 67 			editor.on( 'saveSnapshot', function()
+ 68 				{
+ 69 					undoManager.save();
+ 70 				});
+ 71
+ 72 			// Make the undo manager available only in wysiwyg mode.
+ 73 			editor.on( 'mode', function()
+ 74 				{
+ 75 					if ( editor.mode == 'wysiwyg' )
+ 76 					{
+ 77 						if ( !undoManager.enabled )
+ 78 						{
+ 79 							undoManager.enabled = true;
+ 80
+ 81 							editor.document.on( 'keydown', function( event )
+ 82 								{
+ 83 									// Do not capture CTRL hotkeys.
+ 84 									if ( !event.data.$.ctrlKey && !event.data.$.metaKey )
+ 85 										undoManager.type( event );
+ 86 								});
+ 87
+ 88 							// Always save an undo snapshot - the previous mode might have changed
+ 89 							// editor contents.
+ 90 							undoManager.save( true );
+ 91 						}
+ 92 					}
+ 93 					else
+ 94 						undoManager.enabled = false;
+ 95
+ 96 					undoManager.onChange();
+ 97 				});
+ 98
+ 99 			editor.ui.addButton( 'Undo',
+100 				{
+101 					label : editor.lang.undo,
+102 					command : 'undo'
+103 				});
+104
+105 			editor.ui.addButton( 'Redo',
+106 				{
+107 					label : editor.lang.redo,
+108 					command : 'redo'
+109 				});
+110
+111 			editor.resetUndo = function()
+112 			{
+113 				// Reset the undo stack.
+114 				undoManager.reset();
+115
+116 				// Create the first image.
+117 				editor.fire( 'saveSnapshot' );
+118 			};
+119 		}
+120 	});
+121
+122 	// Gets a snapshot image which represent the current document status.
+123 	function Image( editor )
+124 	{
+125 		var selection = editor.getSelection();
+126
+127 		this.contents	= editor.getSnapshot();
+128 		this.bookmarks	= selection && selection.createBookmarks2( true );
+129
+130 		// In IE, we need to remove the expando attributes.
+131 		if ( CKEDITOR.env.ie )
+132 			this.contents = this.contents.replace( /\s+_cke_expando=".*?"/g, '' );
+133 	}
+134
+135 	Image.prototype =
+136 	{
+137 		equals : function( otherImage, contentOnly )
+138 		{
+139 			if ( this.contents != otherImage.contents )
+140 				return false;
+141
+142 			if ( contentOnly )
+143 				return true;
+144
+145 			var bookmarksA = this.bookmarks,
+146 				bookmarksB = otherImage.bookmarks;
+147
+148 			if ( bookmarksA || bookmarksB )
+149 			{
+150 				if ( !bookmarksA || !bookmarksB || bookmarksA.length != bookmarksB.length )
+151 					return false;
+152
+153 				for ( var i = 0 ; i < bookmarksA.length ; i++ )
+154 				{
+155 					var bookmarkA = bookmarksA[ i ],
+156 						bookmarkB = bookmarksB[ i ];
+157
+158 					if (
+159 						bookmarkA.startOffset != bookmarkB.startOffset ||
+160 						bookmarkA.endOffset != bookmarkB.endOffset ||
+161 						!CKEDITOR.tools.arrayCompare( bookmarkA.start, bookmarkB.start ) ||
+162 						!CKEDITOR.tools.arrayCompare( bookmarkA.end, bookmarkB.end ) )
+163 					{
+164 						return false;
+165 					}
+166 				}
+167 			}
+168
+169 			return true;
+170 		}
+171 	};
+172
+173 	/**
+174 	 * @constructor Main logic for Redo/Undo feature.
+175 	 */
+176 	function UndoManager( editor )
+177 	{
+178 		this.editor = editor;
+179
+180 		// Reset the undo stack.
+181 		this.reset();
+182 	}
+183
+184 	UndoManager.prototype =
+185 	{
+186 		/**
+187 		 * Process undo system regard keystrikes.
+188 		 * @param {CKEDITOR.dom.event} event
+189 		 */
+190 		type : function( event )
+191 		{
+192 			var keystroke = event && event.data.getKeystroke(),
+193
+194 				// Backspace, Delete
+195 				modifierCodes = { 8:1, 46:1 },
+196 				// Keystrokes which will modify the contents.
+197 				isModifier = keystroke in modifierCodes,
+198 				wasModifier = this.lastKeystroke in modifierCodes,
+199 				lastWasSameModifier = isModifier && keystroke == this.lastKeystroke,
+200
+201 				// Arrows: L, T, R, B
+202 				resetTypingCodes = { 37:1, 38:1, 39:1, 40:1 },
+203 				// Keystrokes which navigation through contents.
+204 				isReset = keystroke in resetTypingCodes,
+205 				wasReset = this.lastKeystroke in resetTypingCodes,
+206
+207 				// Keystrokes which just introduce new contents.
+208 				isContent = ( !isModifier && !isReset ),
+209
+210 				// Create undo snap for every different modifier key.
+211 				modifierSnapshot = ( isModifier && !lastWasSameModifier ),
+212 				// Create undo snap on the following cases:
+213 				// 1. Just start to type.
+214 				// 2. Typing some content after a modifier.
+215 				// 3. Typing some content after make a visible selection.
+216 				startedTyping = !this.typing
+217 					|| ( isContent && ( wasModifier || wasReset ) );
+218
+219 			if ( startedTyping || modifierSnapshot )
+220 			{
+221 				var beforeTypeImage = new Image( this.editor );
+222
+223 				// Use setTimeout, so we give the necessary time to the
+224 				// browser to insert the character into the DOM.
+225 				CKEDITOR.tools.setTimeout( function()
+226 					{
+227 						var currentSnapshot = this.editor.getSnapshot();
+228
+229 						// In IE, we need to remove the expando attributes.
+230 						if ( CKEDITOR.env.ie )
+231 							currentSnapshot = currentSnapshot.replace( /\s+_cke_expando=".*?"/g, '' );
+232
+233 						if ( beforeTypeImage.contents != currentSnapshot )
+234 						{
+235 							// This's a special save, with specified snapshot
+236 							// and without auto 'fireChange'.
+237 							if ( !this.save( false, beforeTypeImage, false ) )
+238 								// Drop future snapshots.
+239 								this.snapshots.splice( this.index + 1, this.snapshots.length - this.index - 1 );
+240
+241 							this.hasUndo = true;
+242 							this.hasRedo = false;
+243
+244 							this.typesCount = 1;
+245 							this.modifiersCount = 1;
+246
+247 							this.onChange();
+248 						}
+249 					},
+250 					0, this
+251 				);
+252 			}
+253
+254 			this.lastKeystroke = keystroke;
+255 			// Create undo snap after typed too much (over 25 times).
+256 			if ( isModifier )
+257 			{
+258 				this.typesCount = 0;
+259 				this.modifiersCount++;
+260
+261 				if ( this.modifiersCount > 25 )
+262 				{
+263 					this.save();
+264 					this.modifiersCount = 1;
+265 				}
+266 			}
+267 			else if ( !isReset )
+268 			{
+269 				this.modifiersCount = 0;
+270 				this.typesCount++;
+271
+272 				if ( this.typesCount > 25 )
+273 				{
+274 					this.save();
+275 					this.typesCount = 1;
+276 				}
+277 			}
+278
+279 			this.typing = true;
+280 		},
+281
+282 		reset : function()	// Reset the undo stack.
+283 		{
+284 			/**
+285 			 * Remember last pressed key.
+286 			 */
+287 			this.lastKeystroke = 0;
+288
+289 			/**
+290 			 * Stack for all the undo and redo snapshots, they're always created/removed
+291 			 * in consistency.
+292 			 */
+293 			this.snapshots = [];
+294
+295 			/**
+296 			 * Current snapshot history index.
+297 			 */
+298 			this.index = -1;
+299
+300 			this.limit = this.editor.config.undoStackSize;
+301
+302 			this.currentImage = null;
+303
+304 			this.hasUndo = false;
+305 			this.hasRedo = false;
+306
+307 			this.resetType();
+308 		},
+309
+310 		/**
+311 		 * Reset all states about typing.
+312 		 * @see  UndoManager.type
+313 		 */
+314 		resetType : function()
+315 		{
+316 			this.typing = false;
+317 			delete this.lastKeystroke;
+318 			this.typesCount = 0;
+319 			this.modifiersCount = 0;
+320 		},
+321 		fireChange : function()
+322 		{
+323 			this.hasUndo = !!this.getNextImage( true );
+324 			this.hasRedo = !!this.getNextImage( false );
+325 			// Reset typing
+326 			this.resetType();
+327 			this.onChange();
+328 		},
+329
+330 		/**
+331 		 * Save a snapshot of document image for later retrieve.
+332 		 */
+333 		save : function( onContentOnly, image, autoFireChange )
+334 		{
+335 			var snapshots = this.snapshots;
+336
+337 			// Get a content image.
+338 			if ( !image )
+339 				image = new Image( this.editor );
+340
+341 			// Check if this is a duplicate. In such case, do nothing.
+342 			if ( this.currentImage && image.equals( this.currentImage, onContentOnly ) )
+343 				return false;
+344
+345 			// Drop future snapshots.
+346 			snapshots.splice( this.index + 1, snapshots.length - this.index - 1 );
+347
+348 			// If we have reached the limit, remove the oldest one.
+349 			if ( snapshots.length == this.limit )
+350 				snapshots.shift();
+351
+352 			// Add the new image, updating the current index.
+353 			this.index = snapshots.push( image ) - 1;
+354
+355 			this.currentImage = image;
+356
+357 			if ( autoFireChange !== false )
+358 				this.fireChange();
+359 			return true;
+360 		},
+361
+362 		restoreImage : function( image )
+363 		{
+364 			this.editor.loadSnapshot( image.contents );
+365
+366 			if ( image.bookmarks )
+367 				this.editor.getSelection().selectBookmarks( image.bookmarks );
+368 			else if ( CKEDITOR.env.ie )
+369 			{
+370 				// IE BUG: If I don't set the selection to *somewhere* after setting
+371 				// document contents, then IE would create an empty paragraph at the bottom
+372 				// the next time the document is modified.
+373 				var $range = this.editor.document.getBody().$.createTextRange();
+374 				$range.collapse( true );
+375 				$range.select();
+376 			}
+377
+378 			this.index = image.index;
+379
+380 			this.currentImage = image;
+381
+382 			this.fireChange();
+383 		},
+384
+385 		// Get the closest available image.
+386 		getNextImage : function( isUndo )
+387 		{
+388 			var snapshots = this.snapshots,
+389 				currentImage = this.currentImage,
+390 				image, i;
+391
+392 			if ( currentImage )
+393 			{
+394 				if ( isUndo )
+395 				{
+396 					for ( i = this.index - 1 ; i >= 0 ; i-- )
+397 					{
+398 						image = snapshots[ i ];
+399 						if ( !currentImage.equals( image, true ) )
+400 						{
+401 							image.index = i;
+402 							return image;
+403 						}
+404 					}
+405 				}
+406 				else
+407 				{
+408 					for ( i = this.index + 1 ; i < snapshots.length ; i++ )
+409 					{
+410 						image = snapshots[ i ];
+411 						if ( !currentImage.equals( image, true ) )
+412 						{
+413 							image.index = i;
+414 							return image;
+415 						}
+416 					}
+417 				}
+418 			}
+419
+420 			return null;
+421 		},
+422
+423 		/**
+424 		 * Check the current redo state.
+425 		 * @return {Boolean} Whether the document has previous state to
+426 		 *		retrieve.
+427 		 */
+428 		redoable : function()
+429 		{
+430 			return this.enabled && this.hasRedo;
+431 		},
+432
+433 		/**
+434 		 * Check the current undo state.
+435 		 * @return {Boolean} Whether the document has future state to restore.
+436 		 */
+437 		undoable : function()
+438 		{
+439 			return this.enabled && this.hasUndo;
+440 		},
+441
+442 		/**
+443 		 * Perform undo on current index.
+444 		 */
+445 		undo : function()
+446 		{
+447 			if ( this.undoable() )
+448 			{
+449 				this.save( true );
+450
+451 				var image = this.getNextImage( true );
+452 				if ( image )
+453 					return this.restoreImage( image ), true;
+454 			}
+455
+456 			return false;
+457 		},
+458
+459 		/**
+460 		 * Perform redo on current index.
+461 		 */
+462 		redo : function()
+463 		{
+464 			if ( this.redoable() )
+465 			{
+466 				// Try to save. If no changes have been made, the redo stack
+467 				// will not change, so it will still be redoable.
+468 				this.save( true );
+469
+470 				// If instead we had changes, we can't redo anymore.
+471 				if ( this.redoable() )
+472 				{
+473 					var image = this.getNextImage( false );
+474 					if ( image )
+475 						return this.restoreImage( image ), true;
+476 				}
+477 			}
+478
+479 			return false;
+480 		}
+481 	};
+482 })();
+483
+484 CKEDITOR.config.undoStackSize = 20;
+485 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wsc_dialogs_wsc.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wsc_dialogs_wsc.js.html new file mode 100644 index 000000000..d41972dcd --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wsc_dialogs_wsc.js.html @@ -0,0 +1,177 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 CKEDITOR.dialog.add( 'checkspell', function( editor )
+  7 {
+  8 	var number = CKEDITOR.tools.getNextNumber(),
+  9 		iframeId = 'cke_frame_' + number,
+ 10 		textareaId = 'cke_data_' + number,
+ 11 		errorBoxId = 'cke_error_' + number,
+ 12 		interval,
+ 13 		protocol = document.location.protocol || 'http:',
+ 14 		errorMsg = editor.lang.spellCheck.notAvailable;
+ 15
+ 16 	var pasteArea = '<textarea'+
+ 17 			' style="display: none"' +
+ 18 			' id="' + textareaId + '"' +
+ 19 			' rows="10"' +
+ 20 			' cols="40">' +
+ 21 		' </textarea><div' +
+ 22 			' id="' + errorBoxId + '"' +
+ 23 			' style="display:none;color:red;font-size:16px;font-weight:bold;padding-top:160px;text-align:center;z-index:11;">' +
+ 24 		'</div><iframe' +
+ 25 			' src=""' +
+ 26 			' style="width:485px;background-color:#f1f1e3;height:380px"' +
+ 27 			' frameborder="0"' +
+ 28 			' name="' + iframeId + '"' +
+ 29 			' id="' + iframeId + '"' +
+ 30 			' allowtransparency="1">' +
+ 31 		'</iframe>';
+ 32
+ 33 	var wscCoreUrl = editor.config.wsc_customLoaderScript || ( protocol +
+ 34 			'//loader.spellchecker.net/sproxy_fck/sproxy.php'
+ 35 			+ '?plugin=fck2'
+ 36 			+ '&customerid=' + editor.config.wsc_customerId
+ 37 			+ '&cmd=script&doc=wsc&schema=22'
+ 38 		);
+ 39
+ 40 	if ( editor.config.wsc_customLoaderScript )
+ 41 		errorMsg += '<p style="color:#000;font-size:11px;font-weight: normal;text-align:center;padding-top:10px">' +
+ 42 			editor.lang.spellCheck.errorLoading.replace( /%s/g, editor.config.wsc_customLoaderScript ) + '</p>';
+ 43
+ 44 	function burnSpelling( dialog, errorMsg )
+ 45 	{
+ 46 		var i = 0;
+ 47 		return function ()
+ 48 		{
+ 49 			if ( typeof( window.doSpell ) == 'function' )
+ 50 			{
+ 51 				//Call from window.setInteval expected at once.
+ 52 				if ( typeof( interval ) != 'undefined' )
+ 53 					window.clearInterval( interval );
+ 54
+ 55 				initAndSpell( dialog );
+ 56 			}
+ 57 			else if ( i++ == 180 )								// Timeout: 180 * 250ms = 45s.
+ 58 				_cancelOnError( errorMsg );
+ 59 		};
+ 60 	}
+ 61
+ 62 	window._cancelOnError = function( m )
+ 63 	{
+ 64 		if ( typeof( window.WSC_Error ) == 'undefined' )
+ 65 		{
+ 66 			CKEDITOR.document.getById( iframeId ).setStyle( 'display', 'none' );
+ 67 			var errorBox = CKEDITOR.document.getById( errorBoxId );
+ 68 			errorBox.setStyle( 'display', 'block' );
+ 69 			errorBox.setHtml( m || editor.lang.spellCheck.notAvailable );
+ 70 		}
+ 71 	};
+ 72
+ 73 	function initAndSpell( dialog )
+ 74 	{
+ 75 		var LangComparer = new window._SP_FCK_LangCompare(),							// Language abbr standarts comparer.
+ 76 			pluginPath = CKEDITOR.getUrl( editor.plugins.wsc.path + 'dialogs/' ),			// Service paths corecting/preparing.
+ 77 			framesetPath = pluginPath + 'tmpFrameset.html';
+ 78
+ 79 		// global var is used in FCK specific core
+ 80 		// change on equal var used in fckplugin.js
+ 81 		gFCKPluginName = 'wsc';
+ 82
+ 83 		LangComparer.setDefaulLangCode( editor.config.defaultLanguage );
+ 84
+ 85 		window.doSpell({
+ 86 			ctrl : textareaId,
+ 87 			lang : LangComparer.getSPLangCode( editor.langCode ),
+ 88 			winType : iframeId,		// If not defined app will run on winpopup.
+ 89
+ 90 			// Callback binding section.
+ 91 			onCancel : function()
+ 92 			{
+ 93 				dialog.hide();
+ 94 			},
+ 95 			onFinish : function( dT )
+ 96 			{
+ 97 				editor.focus();
+ 98 				dialog.getParentEditor().setData( dT.value );
+ 99 				dialog.hide();
+100 			},
+101
+102 			// Some manipulations with client static pages.
+103 			staticFrame : framesetPath,
+104 			framesetPath : framesetPath,
+105 			iframePath : pluginPath + 'ciframe.html',
+106
+107 			// Styles defining.
+108 			schemaURI : pluginPath + 'wsc.css'
+109 		});
+110
+111 		// Hide user message console (if application was loaded more then after timeout).
+112 		CKEDITOR.document.getById( errorBoxId ).setStyle( 'display', 'none' );
+113 		CKEDITOR.document.getById( iframeId ).setStyle( 'display', 'block' );
+114 	}
+115
+116 	return {
+117 		title : editor.lang.spellCheck.title,
+118 		minWidth : 485,
+119 		minHeight : 380,
+120 		buttons : [ CKEDITOR.dialog.cancelButton ],
+121 		onShow : function()
+122 		{
+123 			var contentArea = this.getContentElement( 'general', 'content' ).getElement();
+124 			contentArea.setHtml( pasteArea );
+125
+126 			if ( typeof( window.doSpell ) != 'function' )
+127 			{
+128 				// Load script.
+129 				CKEDITOR.document.getHead().append(
+130 					CKEDITOR.document.createElement( 'script',
+131 						{
+132 							attributes :
+133 								{
+134 									type : 'text/javascript',
+135 									src : wscCoreUrl
+136 								}
+137 						})
+138 				);
+139 			}
+140
+141 			var sData = editor.getData();											// Get the data to be checked.
+142 			CKEDITOR.document.getById( textareaId ).setValue( sData );
+143
+144 			interval = window.setInterval( burnSpelling( this, errorMsg ), 250 );
+145 		},
+146 		onHide : function()
+147 		{
+148 			window.ooo = undefined;
+149 			window.int_framsetLoaded = undefined;
+150 			window.framesetLoaded = undefined;
+151 			window.is_window_opened = false;
+152 		},
+153 		contents : [
+154 			{
+155 				id : 'general',
+156 				label : editor.lang.spellCheck.title,
+157 				padding : 0,
+158 				elements : [
+159 					{
+160 						type : 'html',
+161 						id : 'content',
+162 						style : 'width:485;height:380px',
+163 						html : '<div></div>'
+164 					}
+165 				]
+166 			}
+167 		]
+168 	};
+169 });
+170 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wsc_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wsc_plugin.js.html new file mode 100644 index 000000000..a45d97e64 --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wsc_plugin.js.html @@ -0,0 +1,40 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @file Spell checker
+  8  */
+  9
+ 10 // Register a plugin named "wsc".
+ 11 CKEDITOR.plugins.add( 'wsc',
+ 12 {
+ 13 	init : function( editor )
+ 14 	{
+ 15 		var commandName = 'checkspell';
+ 16
+ 17 		var command = editor.addCommand( commandName, new CKEDITOR.dialogCommand( commandName ) );
+ 18
+ 19 		// SpellChecker doesn't work in Opera and with custom domain
+ 20 		command.modes = { wysiwyg : ( !CKEDITOR.env.opera && document.domain == window.location.hostname ) };
+ 21
+ 22 		editor.ui.addButton( 'SpellChecker',
+ 23 			{
+ 24 				label : editor.lang.spellCheck.toolbar,
+ 25 				command : commandName
+ 26 			});
+ 27 		CKEDITOR.dialog.add( commandName, this.path + 'dialogs/wsc.js' );
+ 28 	}
+ 29 });
+ 30
+ 31 CKEDITOR.config.wsc_customerId			= CKEDITOR.config.wsc_customerId || '1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk' ;
+ 32 CKEDITOR.config.wsc_customLoaderScript	= CKEDITOR.config.wsc_customLoaderScript || null;
+ 33 
diff --git a/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wysiwygarea_plugin.js.html b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wysiwygarea_plugin.js.html new file mode 100644 index 000000000..6714edc9e --- /dev/null +++ b/UI/WebServerResources/ckeditor/_docs/api/symbols/src/plugins_wysiwygarea_plugin.js.html @@ -0,0 +1,620 @@ +
  1 /*
+  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+  3 For licensing, see LICENSE.html or http://ckeditor.com/license
+  4 */
+  5
+  6 /**
+  7  * @fileOverview The "wysiwygarea" plugin. It registers the "wysiwyg" editing
+  8  *		mode, which handles the main editing area space.
+  9  */
+ 10
+ 11 (function()
+ 12 {
+ 13 	/**
+ 14 	 * List of elements in which has no way to move editing focus outside.
+ 15 	 */
+ 16 	var nonExitableElementNames = { table:1,pre:1 };
+ 17 	// Matching an empty paragraph at the end of document.
+ 18 	var emptyParagraphRegexp = /\s*<(p|div|address|h\d|center)[^>]*>\s*(?:<br[^>]*>| | )\s*(:?<\/\1>)?\s*$/gi;
+ 19
+ 20 	function onInsertHtml( evt )
+ 21 	{
+ 22 		if ( this.mode == 'wysiwyg' )
+ 23 		{
+ 24 			this.focus();
+ 25
+ 26 			var selection = this.getSelection(),
+ 27 				data = evt.data;
+ 28
+ 29 			if ( this.dataProcessor )
+ 30 				data = this.dataProcessor.toHtml( data );
+ 31
+ 32 			if ( CKEDITOR.env.ie )
+ 33 			{
+ 34 				var selIsLocked = selection.isLocked;
+ 35
+ 36 				if ( selIsLocked )
+ 37 					selection.unlock();
+ 38
+ 39 				var $sel = selection.getNative();
+ 40 				if ( $sel.type == 'Control' )
+ 41 					$sel.clear();
+ 42 				$sel.createRange().pasteHTML( data );
+ 43
+ 44 				if ( selIsLocked )
+ 45 					this.getSelection().lock();
+ 46 			}
+ 47 			else
+ 48 				this.document.$.execCommand( 'inserthtml', false, data );
+ 49 		}
+ 50 	}
+ 51
+ 52 	function onInsertElement( evt )
+ 53 	{
+ 54 		if ( this.mode == 'wysiwyg' )
+ 55 		{
+ 56 			this.focus();
+ 57 			this.fire( 'saveSnapshot' );
+ 58
+ 59 			var element = evt.data,
+ 60 				elementName = element.getName(),
+ 61 				isBlock = CKEDITOR.dtd.$block[ elementName ];
+ 62
+ 63 			var selection = this.getSelection(),
+ 64 				ranges = selection.getRanges();
+ 65
+ 66 			var selIsLocked = selection.isLocked;
+ 67
+ 68 			if ( selIsLocked )
+ 69 				selection.unlock();
+ 70
+ 71 			var range, clone, lastElement, bookmark;
+ 72
+ 73 			for ( var i = ranges.length - 1 ; i >= 0 ; i-- )
+ 74 			{
+ 75 				range = ranges[ i ];
+ 76
+ 77 				// Remove the original contents.
+ 78 				range.deleteContents();
+ 79
+ 80 				clone = !i && element || element.clone( true );
+ 81
+ 82 				// If we're inserting a block at dtd-violated position, split
+ 83 				// the parent blocks until we reach blockLimit.
+ 84 				var parent, dtd;
+ 85 				if ( this.config.enterMode != CKEDITOR.ENTER_BR && isBlock )
+ 86 				{
+ 87 					while( ( parent = range.getCommonAncestor( false, true ) )
+ 88 							&& ( dtd = CKEDITOR.dtd[ parent.getName() ] )
+ 89 							&& !( dtd && dtd [ elementName ] ) )
+ 90 					{
+ 91 						range.splitBlock();
+ 92 					}
+ 93 				}
+ 94
+ 95 				// Insert the new node.
+ 96 				range.insertNode( clone );
+ 97
+ 98 				// Save the last element reference so we can make the
+ 99 				// selection later.
+100 				if ( !lastElement )
+101 					lastElement = clone;
+102 			}
+103
+104 			range.moveToPosition( lastElement, CKEDITOR.POSITION_AFTER_END );
+105
+106 			var next = lastElement.getNextSourceNode( true );
+107 			if ( next && next.type == CKEDITOR.NODE_ELEMENT )
+108 				range.moveToElementEditStart( next );
+109
+110 			selection.selectRanges( [ range ] );
+111
+112 			if ( selIsLocked )
+113 				this.getSelection().lock();
+114
+115 			// Save snaps after the whole execution completed.
+116 			// This's a workaround for make DOM modification's happened after
+117 			// 'insertElement' to be included either, e.g. Form-based dialogs' 'commitContents'
+118 			// call.
+119 			CKEDITOR.tools.setTimeout( function(){
+120 				this.fire( 'saveSnapshot' );
+121 			}, 0, this );
+122 		}
+123 	}
+124
+125 	/**
+126 	 *  Auto-fixing block-less content by wrapping paragraph (#3190), prevent
+127 	 *  non-exitable-block by padding extra br.(#3189)
+128 	 */
+129 	function onSelectionChangeFixBody( evt )
+130 	{
+131 		var editor = evt.editor,
+132 			path = evt.data.path,
+133 			blockLimit = path.blockLimit,
+134 			selection = evt.data.selection,
+135 			range = selection.getRanges()[0],
+136 			body = editor.document.getBody(),
+137 			enterMode = editor.config.enterMode;
+138
+139 		// When enterMode set to block, we'll establing new paragraph only if we're
+140 		// selecting inline contents right under body. (#3657)
+141 		if ( enterMode != CKEDITOR.ENTER_BR
+142 		     && range.collapsed
+143 			 && blockLimit.getName() == 'body'
+144 			 && !path.block )
+145 		{
+146 			var bms = selection.createBookmarks(),
+147 				fixedBlock = range.fixBlock( true,
+148 					editor.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'p'  );
+149
+150 			// For IE, we'll be removing any bogus br ( introduce by fixing body )
+151 			// right now to prevent it introducing visual line break.
+152 			if ( CKEDITOR.env.ie )
+153 			{
+154 				var brNodeList = fixedBlock.getElementsByTag( 'br' ), brNode;
+155 				for ( var i = 0 ; i < brNodeList.count() ; i++ )
+156 				{
+157 					if( ( brNode = brNodeList.getItem( i ) ) && brNode.hasAttribute( '_cke_bogus' ) )
+158 						brNode.remove();
+159 				}
+160 			}
+161
+162 			selection.selectBookmarks( bms );
+163
+164 			// If the fixed block is blank and is already followed by a exitable
+165 			// block, we should drop it and move to the exist block(#3684).
+166 			var children = fixedBlock.getChildren(),
+167 				count = children.count(),
+168 				firstChild,
+169 				previousElement = fixedBlock.getPrevious( true ),
+170 				nextElement = fixedBlock.getNext( true ),
+171 				enterBlock;
+172 			if ( previousElement && previousElement.getName
+173 				 && !( previousElement.getName() in nonExitableElementNames ) )
+174 				enterBlock = previousElement;
+175 			else if ( nextElement && nextElement.getName
+176 					  && !( nextElement.getName() in nonExitableElementNames ) )
+177 				enterBlock = nextElement;
+178
+179 			if( ( !count
+180 				  || ( firstChild = children.getItem( 0 ) ) && firstChild.is && firstChild.is( 'br' ) )
+181 				&& enterBlock )
+182 			{
+183 				fixedBlock.remove();
+184 				range.moveToElementEditStart( enterBlock );
+185 				range.select();
+186 			}
+187 		}
+188
+189 		// Inserting the padding-br before body if it's preceded by an
+190 		// unexitable block.
+191 		var lastNode = body.getLast( true );
+192 		if ( lastNode.getName && ( lastNode.getName() in nonExitableElementNames ) )
+193 		{
+194 			var paddingBlock = editor.document.createElement(
+195 					( CKEDITOR.env.ie && enterMode != CKEDITOR.ENTER_BR ) ?
+196 						'<br _cke_bogus="true" />' : 'br' );
+197 			body.append( paddingBlock );
+198 		}
+199 	}
+200
+201 	CKEDITOR.plugins.add( 'wysiwygarea',
+202 	{
+203 		requires : [ 'editingblock' ],
+204
+205 		init : function( editor )
+206 		{
+207 			var fixForBody = ( editor.config.enterMode != CKEDITOR.ENTER_BR )
+208 				? editor.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'p' : false;
+209
+210 			editor.on( 'editingBlockReady', function()
+211 				{
+212 					var mainElement,
+213 						iframe,
+214 						isLoadingData,
+215 						isPendingFocus,
+216 						fireMode;
+217
+218 					// Support for custom document.domain in IE.
+219 					var isCustomDomain = CKEDITOR.env.isCustomDomain();
+220
+221 					// Creates the iframe that holds the editable document.
+222 					var createIFrame = function()
+223 					{
+224 						if ( iframe )
+225 							iframe.remove();
+226
+227 						iframe = new CKEDITOR.dom.element( 'iframe' )
+228 							.setAttributes({
+229 								frameBorder : 0,
+230 								tabIndex : -1,
+231 								allowTransparency : true })
+232 							.setStyles({
+233 								width : '100%',
+234 								height : '100%' });
+235
+236 						if ( CKEDITOR.env.ie )
+237 						{
+238 							if ( isCustomDomain )
+239 							{
+240 								// The document domain must be set within the src
+241 								// attribute.
+242 								iframe.setAttribute( 'src',
+243 									'javascript:void( (function(){' +
+244 										'document.open();' +
+245 										'document.domain="' + document.domain + '";' +
+246 										'document.write( window.parent._cke_htmlToLoad_' + editor.name + ' );' +
+247 										'document.close();' +
+248 										'window.parent._cke_htmlToLoad_' + editor.name + ' = null;' +
+249 									'})() )' );
+250 							}
+251 							else
+252 								// To avoid HTTPS warnings.
+253 								iframe.setAttribute( 'src', 'javascript:void(0)' );
+254 						}
+255
+256 						var accTitle = editor.lang.editorTitle.replace( '%1', editor.name );
+257
+258 						if ( CKEDITOR.env.gecko )
+259 						{
+260 							// Accessibility attributes for Firefox.
+261 							mainElement.setAttributes(
+262 								{
+263 									role : 'region',
+264 									title : accTitle
+265 								} );
+266 							iframe.setAttributes(
+267 								{
+268 									role : 'region',
+269 									title : ' '
+270 								} );
+271 						}
+272 						else if ( CKEDITOR.env.webkit )
+273 						{
+274 							iframe.setAttribute( 'title', accTitle );	// Safari 4
+275 							iframe.setAttribute( 'name', accTitle );	// Safari 3
+276 						}
+277 						else if ( CKEDITOR.env.ie )
+278 						{
+279 							// Accessibility label for IE.
+280 							var fieldset = CKEDITOR.dom.element.createFromHtml(
+281 								'<fieldset style="height:100%' +
+282 									( CKEDITOR.env.quirks ? ';position:relative' : '' ) +
+283 								'">' +
+284 									'<legend style="position:absolute;left:-10000px">' +
+285 										CKEDITOR.tools.htmlEncode( accTitle ) +
+286 									'</legend>' +
+287 								'</fieldset>'
+288 								, CKEDITOR.document );
+289 							iframe.appendTo( fieldset );
+290 							fieldset.appendTo( mainElement );
+291 						}
+292
+293 						if ( !CKEDITOR.env.ie )
+294 							mainElement.append( iframe );
+295 					};
+296
+297 					// The script that is appended to the data being loaded. It
+298 					// enables editing, and makes some
+299 					var activationScript =
+300 						'<script id="cke_actscrpt" type="text/javascript">' +
+301 							'window.onload = function()' +
+302 							'{' +
+303 								// Remove this script from the DOM.
+304 								'var s = document.getElementById( "cke_actscrpt" );' +
+305 								's.parentNode.removeChild( s );' +
+306
+307 								// Call the temporary function for the editing
+308 								// boostrap.
+309 								'window.parent.CKEDITOR._["contentDomReady' + editor.name + '"]( window );' +
+310 							'}' +
+311 						'</script>';
+312
+313 					// Editing area bootstrap code.
+314 					var contentDomReady = function( domWindow )
+315 					{
+316 						delete CKEDITOR._[ 'contentDomReady' + editor.name ];
+317
+318 						var domDocument = domWindow.document,
+319 							body = domDocument.body;
+320
+321 						body.spellcheck = !editor.config.disableNativeSpellChecker;
+322
+323 						if ( CKEDITOR.env.ie )
+324 						{
+325 							// Don't display the focus border.
+326 							body.hideFocus = true;
+327
+328 							// Disable and re-enable the body to avoid IE from
+329 							// taking the editing focus at startup. (#141 / #523)
+330 							body.disabled = true;
+331 							body.contentEditable = true;
+332 							body.removeAttribute( 'disabled' );
+333 						}
+334 						else
+335 							domDocument.designMode = 'on';
+336
+337 						// IE, Opera and Safari may not support it and throw
+338 						// errors.
+339 						try { domDocument.execCommand( 'enableObjectResizing', false, !editor.config.disableObjectResizing ) ; } catch(e) {}
+340 						try { domDocument.execCommand( 'enableInlineTableEditing', false, !editor.config.disableNativeTableHandles ) ; } catch(e) {}
+341
+342 						domWindow	= editor.window		= new CKEDITOR.dom.window( domWindow );
+343 						domDocument	= editor.document	= new CKEDITOR.dom.document( domDocument );
+344
+345 						// Gecko/Webkit need some help when selecting control type elements. (#3448)
+346 						if ( !( CKEDITOR.env.ie || CKEDITOR.env.opera) )
+347 						{
+348 							domDocument.on( 'mousedown', function( ev )
+349 							{
+350 								var control = ev.data.getTarget();
+351 								if ( control.is( 'img', 'hr', 'input', 'textarea', 'select' ) )
+352 									editor.getSelection().selectElement( control );
+353 							} );
+354 						}
+355
+356 						// Webkit: avoid from editing form control elements content.
+357 						if ( CKEDITOR.env.webkit )
+358 						{
+359 							// Prevent from tick checkbox/radiobox/select
+360 							domDocument.on( 'click', function( ev )
+361 							{
+362 								if ( ev.data.getTarget().is( 'input', 'select' ) )
+363 									ev.data.preventDefault();
+364 							} );
+365
+366 							// Prevent from editig textfield/textarea value.
+367 							domDocument.on( 'mouseup', function( ev )
+368 							{
+369 								if ( ev.data.getTarget().is( 'input', 'textarea' ) )
+370 									ev.data.preventDefault();
+371 							} );
+372 						}
+373
+374 						var focusTarget = ( CKEDITOR.env.ie || CKEDITOR.env.safari ) ?
+375 								domWindow : domDocument;
+376
+377 						focusTarget.on( 'blur', function()
+378 							{
+379 								editor.focusManager.blur();
+380 							});
+381
+382 						focusTarget.on( 'focus', function()
+383 							{
+384 								editor.focusManager.focus();
+385 							});
+386
+387 						var keystrokeHandler = editor.keystrokeHandler;
+388 						if ( keystrokeHandler )
+389 							keystrokeHandler.attach( domDocument );
+390
+391 						// Adds the document body as a context menu target.
+392 						if ( editor.contextMenu )
+393 							editor.contextMenu.addTarget( domDocument );
+394
+395 						setTimeout( function()
+396 							{
+397 								editor.fire( 'contentDom' );
+398
+399 								if ( fireMode )
+400 								{
+401 									editor.mode = 'wysiwyg';
+402 									editor.fire( 'mode' );
+403 									fireMode = false;
+404 								}
+405
+406 								isLoadingData = false;
+407
+408 								if ( isPendingFocus )
+409 								{
+410 									editor.focus();
+411 									isPendingFocus = false;
+412 								}
+413
+414 								/*
+415 								 * IE BUG: IE might have rendered the iframe with invisible contents.
+416 								 * (#3623). Push some inconsequential CSS style changes to force IE to
+417 								 * refresh it.
+418 								 *
+419 								 * Also, for some unknown reasons, short timeouts (e.g. 100ms) do not
+420 								 * fix the problem. :(
+421 								 */
+422 								if ( CKEDITOR.env.ie )
+423 								{
+424 									setTimeout( function()
+425 										{
+426 											if ( editor.document )
+427 											{
+428 												var $body = editor.document.$.body;
+429 												$body.runtimeStyle.marginBottom = '0px';
+430 												$body.runtimeStyle.marginBottom = '';
+431 											}
+432 										}, 1000 );
+433 								}
+434 							},
+435 							0 );
+436 					};
+437
+438 					editor.addMode( 'wysiwyg',
+439 						{
+440 							load : function( holderElement, data, isSnapshot )
+441 							{
+442 								mainElement = holderElement;
+443
+444 								if ( CKEDITOR.env.ie && ( CKEDITOR.env.quirks || CKEDITOR.env.version < 8 ) )
+445 									holderElement.setStyle( 'position', 'relative' );
+446
+447 								// Create the iframe at load for all browsers
+448 								// except FF and IE with custom domain.
+449 								if ( !isCustomDomain || !CKEDITOR.env.gecko )
+450 									createIFrame();
+451
+452 								// The editor data "may be dirty" after this
+453 								// point.
+454 								editor.mayBeDirty = true;
+455
+456 								fireMode = true;
+457
+458 								if ( isSnapshot )
+459 									this.loadSnapshotData( data );
+460 								else
+461 									this.loadData( data );
+462 							},
+463
+464 							loadData : function( data )
+465 							{
+466 								isLoadingData = true;
+467
+468 								// Get the HTML version of the data.
+469 								if ( editor.dataProcessor )
+470 								{
+471 									data = editor.dataProcessor.toHtml( data, fixForBody );
+472 								}
+473
+474 								data =
+475 									editor.config.docType +
+476 									'<html dir="' + editor.config.contentsLangDirection + '">' +
+477 									'<head>' +
+478 										'<link href="' + editor.config.contentsCss + '" type="text/css" rel="stylesheet" _fcktemp="true"/>' +
+479 										'<style type="text/css" _fcktemp="true">' +
+480 											editor._.styles.join( '\n' ) +
+481 										'</style>'+
+482 									'</head>' +
+483 									'<body>' +
+484 										data +
+485 									'</body>' +
+486 									'</html>' +
+487 									activationScript;
+488
+489 								// For custom domain in IE, set the global variable
+490 								// that will temporarily hold the editor data. This
+491 								// reference will be used in the ifram src.
+492 								if ( isCustomDomain )
+493 									window[ '_cke_htmlToLoad_' + editor.name ] = data;
+494
+495 								CKEDITOR._[ 'contentDomReady' + editor.name ] = contentDomReady;
+496
+497 								// We need to recreate the iframe in FF for every
+498 								// data load, otherwise the following spellcheck
+499 								// and execCommand features will be active only for
+500 								// the first time.
+501 								// The same is valid for IE with custom domain,
+502 								// because the iframe src must be reset every time.
+503 								if ( isCustomDomain || CKEDITOR.env.gecko )
+504 									createIFrame();
+505
+506 								// For custom domain in IE, the data loading is
+507 								// done through the src attribute of the iframe.
+508 								if ( !isCustomDomain )
+509 								{
+510 									var doc = iframe.$.contentWindow.document;
+511 									doc.open();
+512 									doc.write( data );
+513 									doc.close();
+514 								}
+515 							},
+516
+517 							getData : function()
+518 							{
+519 								var data = iframe.getFrameDocument().getBody().getHtml();
+520
+521 								if ( editor.dataProcessor )
+522 									data = editor.dataProcessor.toDataFormat( data, fixForBody );
+523
+524 								// Strip the last blank paragraph within document.
+525 								if ( editor.config.ignoreEmptyParagraph )
+526 									data = data.replace( emptyParagraphRegexp, '' );
+527
+528 								return data;
+529 							},
+530
+531 							getSnapshotData : function()
+532 							{
+533 								return iframe.getFrameDocument().getBody().getHtml();
+534 							},
+535
+536 							loadSnapshotData : function( data )
+537 							{
+538 								iframe.getFrameDocument().getBody().setHtml( data );
+539 							},
+540
+541 							unload : function( holderElement )
+542 							{
+543 								editor.window = editor.document = iframe = mainElement = isPendingFocus = null;
+544
+545 								editor.fire( 'contentDomUnload' );
+546 							},
+547
+548 							focus : function()
+549 							{
+550 								if ( isLoadingData )
+551 									isPendingFocus = true;
+552 								else if ( editor.window )
+553 								{
+554 									editor.window.focus();
+555 									editor.selectionChange();
+556 								}
+557 							}
+558 						});
+559
+560 					editor.on( 'insertHtml', onInsertHtml, null, null, 20 );
+561 					editor.on( 'insertElement', onInsertElement, null, null, 20 );
+562 					// Auto fixing on some document structure weakness to enhance usabilities. (#3190 and #3189)
+563 					editor.on( 'selectionChange', onSelectionChangeFixBody, null, null, 1 );
+564 				});
+565 		}
+566 	});
+567 })();
+568
+569 /**
+570  * Disables the ability of resize objects (image and tables) in the editing
+571  * area
+572  * @type Boolean
+573  * @default false
+574  * @example
+575  * config.disableObjectResizing = true;
+576  */
+577 CKEDITOR.config.disableObjectResizing = false;
+578
+579 /**
+580  * Disables the "table tools" offered natively by the browser (currently
+581  * Firefox only) to make quick table editing operations, like adding or
+582  * deleting rows and columns.
+583  * @type Boolean
+584  * @default true
+585  * @example
+586  * config.disableNativeTableHandles = false;
+587  */
+588 CKEDITOR.config.disableNativeTableHandles = true;
+589
+590 /**
+591  * Disables the built-in spell checker while typing natively available in the
+592  * browser (currently Firefox and Safari only).<br /><br />
+593  *
+594  * Even if word suggestions will not appear in the CKEditor context menu, this
+595  * feature is useful to help quickly identifying misspelled words.<br /><br />
+596  *
+597  * This setting is currently compatible with Firefox only due to limitations in
+598  * other browsers.
+599  * @type Boolean
+600  * @default true
+601  * @example
+602  * config.disableNativeSpellChecker = false;
+603  */
+604 CKEDITOR.config.disableNativeSpellChecker = true;
+605 /**
+606  * The editor will post an empty value ("") if you have just an empty paragraph on it, like this:
+607  * @example
+608  * <p></p>
+609  * <p><br /></p>
+610  * <p><b></b></p>
+611  */
+612 CKEDITOR.config.ignoreEmptyParagraph = true;
+613 
diff --git a/UI/WebServerResources/ckeditor/_samples/ajax.html b/UI/WebServerResources/ckeditor/_samples/ajax.html new file mode 100644 index 000000000..d2ce3bd5c --- /dev/null +++ b/UI/WebServerResources/ckeditor/_samples/ajax.html @@ -0,0 +1,95 @@ + + + + + Sample - CKEditor + + + + + + + +

+ CKEditor Sample +

+ +
+ +
+ +

+ + +

+
+
+