From bedd53523b38f3d3f6d8291139d6031f7aafdb1d Mon Sep 17 00:00:00 2001 From: PaulHarvey Date: Sat, 20 Aug 2011 09:03:08 +0000 Subject: [PATCH] Item10724: Update TinyMCEPlugin 3.3.9.3 -> 3.3.4 git-svn-id: http://svn.foswiki.org/trunk@12342 0b4bb1d4-4e5a-0410-9cc4-b2b747904278 --- .../Foswiki/Plugins/TinyMCEPlugin/MANIFEST | 161 +- .../System/TinyMCEPlugin/tinymce/LICENSE.TXT | 504 + .../System/TinyMCEPlugin/tinymce/build.xml | 763 +- .../TinyMCEPlugin/tinymce/changelog.txt | 2500 +-- .../tinymce/docs/api/class_tinyMCEPopup.html | 41 + .../docs/api/class_tinymce.AddOnManager.html | 4 + .../docs/api/class_tinymce.Editor.html | 140 +- .../docs/api/class_tinymce.Plugin.html | 109 +- .../tinymce/docs/api/class_tinymce.Theme.html | 91 +- .../docs/api/class_tinymce.UndoManager.html | 25 +- .../docs/api/class_tinymce.WindowManager.html | 11 +- .../docs/api/class_tinymce.dom.DOMUtils.html | 172 +- .../docs/api/class_tinymce.dom.Element.html | 2 + .../api/class_tinymce.dom.EventUtils.html | 6 + .../docs/api/class_tinymce.dom.Schema.html | 86 - .../api/class_tinymce.dom.ScriptLoader.html | 225 + .../docs/api/class_tinymce.dom.Selection.html | 175 +- .../api/class_tinymce.dom.Serializer.html | 243 +- .../api/class_tinymce.dom.StringWriter.html | 308 - .../docs/api/class_tinymce.dom.XMLWriter.html | 261 - .../tinymce/docs/api/class_tinymce.html | 92 + .../docs/api/class_tinymce.html.Node.html | 32 +- .../docs/api/class_tinymce.html.Schema.html | 73 +- .../docs/api/class_tinymce.ui.Button.html | 8 +- .../class_tinymce.ui.ColorSplitButton.html | 57 +- .../docs/api/class_tinymce.ui.Container.html | 2 +- .../class_tinymce.ui.KeyboardNavigation.html | 97 + .../docs/api/class_tinymce.ui.ListBox.html | 10 +- .../docs/api/class_tinymce.ui.MenuButton.html | 10 +- .../api/class_tinymce.ui.SplitButton.html | 10 +- .../api/class_tinymce.ui.ToolbarGroup.html | 226 + .../docs/api/class_tinymce.util.Cookie.html | 2 + .../api/class_tinymce.util.Dispatcher.html | 2 + .../docs/api/class_tinymce.util.JSON.html | 2 + .../api/class_tinymce.util.JSONRequest.html | 2 + .../docs/api/class_tinymce.util.URI.html | 4 + .../docs/api/class_tinymce.util.XHR.html | 2 + .../TinyMCEPlugin/tinymce/docs/api/index.html | 25 + .../tinymce/docs/api/member_tinyMCE.html | 2 + .../tinymce/docs/api/member_tinymce.DOM.html | 2 + .../api/member_tinymce.EditorManager.html | 33 + .../TinyMCEPlugin/tinymce/docs/api/model.xml | 1609 +- .../tinymce/docs/api/tinymce.vsdoc.js | 375 +- .../tinymce/examples/accessibility.html | 101 + .../tinymce/examples/custom_formats.html | 2 +- .../TinyMCEPlugin/tinymce/examples/full.html | 22 +- .../tinymce/examples/full_jquery.html | 20 +- .../tinymce/examples/lists/media_list.js | 6 +- .../tinymce/examples/media/sample.flv | Bin 0 -> 88722 bytes .../TinyMCEPlugin/tinymce/examples/menu.html | 3 +- .../TinyMCEPlugin/tinymce/examples/skins.html | 8 +- .../tinymce/examples/translate.html | 84 - .../TinyMCEPlugin/tinymce/examples/word.html | 5 +- .../jscripts/tiny_mce/classes/AddOnManager.js | 473 +- .../tiny_mce/classes/CommandManager.js | 57 - .../tiny_mce/classes/ControlManager.js | 24 +- .../jscripts/tiny_mce/classes/Developer.js | 94 - .../jscripts/tiny_mce/classes/Editor.js | 6026 +++---- .../tiny_mce/classes/EditorCommands.js | 166 +- .../tiny_mce/classes/EditorManager.js | 50 + .../jscripts/tiny_mce/classes/ForceBlocks.js | 328 +- .../jscripts/tiny_mce/classes/Formatter.js | 3380 ++-- .../jscripts/tiny_mce/classes/LegacyInput.js | 1 + .../jscripts/tiny_mce/classes/Popup.js | 24 +- .../jscripts/tiny_mce/classes/UndoManager.js | 73 +- .../tiny_mce/classes/WindowManager.js | 48 + .../classes/adapter/jquery/adapter.js | 25 +- .../classes/adapter/jquery/jquery.tinymce.js | 20 +- .../jscripts/tiny_mce/classes/dom/DOMUtils.js | 748 +- .../jscripts/tiny_mce/classes/dom/Element.js | 6 + .../tiny_mce/classes/dom/EventUtils.js | 22 +- .../jscripts/tiny_mce/classes/dom/Range.js | 23 +- .../tiny_mce/classes/dom/RangeUtils.js | 2 +- .../jscripts/tiny_mce/classes/dom/Schema.js | 185 - .../tiny_mce/classes/dom/ScriptLoader.js | 63 +- .../tiny_mce/classes/dom/Selection.js | 1953 ++- .../tiny_mce/classes/dom/Serializer.js | 1196 +- .../tiny_mce/classes/dom/StringWriter.js | 204 - .../tiny_mce/classes/dom/TreeWalker.js | 2 +- .../tiny_mce/classes/dom/TridentSelection.js | 420 +- .../tiny_mce/classes/dom/XMLWriter.js | 165 - .../tiny_mce/classes/firebug/FIREBUG.LICENSE | 30 + .../tiny_mce/classes/html/DomParser.js | 575 + .../tiny_mce/classes/html/Entities.js | 253 + .../jscripts/tiny_mce/classes/html/Node.js | 474 + .../tiny_mce/classes/html/SaxParser.js | 342 + .../jscripts/tiny_mce/classes/html/Schema.js | 661 + .../tiny_mce/classes/html/Serializer.js | 152 + .../jscripts/tiny_mce/classes/html/Styles.js | 279 + .../jscripts/tiny_mce/classes/html/Writer.js | 186 + .../jscripts/tiny_mce/classes/tinymce.js | 194 +- .../jscripts/tiny_mce/classes/ui/Button.js | 16 +- .../tiny_mce/classes/ui/ColorSplitButton.js | 83 +- .../jscripts/tiny_mce/classes/ui/Container.js | 4 +- .../jscripts/tiny_mce/classes/ui/Control.js | 28 +- .../jscripts/tiny_mce/classes/ui/DropMenu.js | 93 +- .../tiny_mce/classes/ui/KeyboardNavigation.js | 183 + .../jscripts/tiny_mce/classes/ui/ListBox.js | 107 +- .../tiny_mce/classes/ui/MenuButton.js | 40 +- .../jscripts/tiny_mce/classes/ui/MenuItem.js | 1 + .../tiny_mce/classes/ui/NativeListBox.js | 10 +- .../jscripts/tiny_mce/classes/ui/Separator.js | 3 +- .../tiny_mce/classes/ui/SplitButton.js | 80 +- .../jscripts/tiny_mce/classes/ui/Toolbar.js | 8 +- .../tiny_mce/classes/ui/ToolbarGroup.js | 76 + .../jscripts/tiny_mce/classes/util/Cookie.js | 9 + .../tiny_mce/classes/util/Dispatcher.js | 6 + .../jscripts/tiny_mce/classes/util/JSON.js | 83 +- .../tiny_mce/classes/util/JSONRequest.js | 25 +- .../jscripts/tiny_mce/classes/util/Quirks.js | 25 + .../jscripts/tiny_mce/classes/util/URI.js | 14 +- .../jscripts/tiny_mce/classes/util/VK.js | 12 + .../jscripts/tiny_mce/classes/util/XHR.js | 8 + .../jscripts/tiny_mce/classes/xml/Parser.js | 129 - .../jscripts/tiny_mce/jquery.tinymce.js | 2 +- .../tinymce/jscripts/tiny_mce/langs/en.js | 59 +- .../tiny_mce/plugins/advhr/langs/en_dlg.js | 2 + .../jscripts/tiny_mce/plugins/advhr/rule.htm | 59 +- .../plugins/advimage/editor_plugin_src.js | 2 +- .../tiny_mce/plugins/advimage/image.htm | 65 +- .../tiny_mce/plugins/advimage/js/image.js | 35 +- .../tiny_mce/plugins/advimage/langs/en_dlg.js | 2 + .../tiny_mce/plugins/advlink/js/advlink.js | 38 +- .../tiny_mce/plugins/advlink/langs/en_dlg.js | 6 +- .../tiny_mce/plugins/advlink/link.htm | 65 +- .../plugins/advlist/editor_plugin_src.js | 40 +- .../plugins/autolink/editor_plugin_src.js | 172 + .../plugins/autoresize/editor_plugin_src.js | 28 +- .../plugins/autosave/editor_plugin_src.js | 19 +- .../plugins/bbcode/editor_plugin_src.js | 2 +- .../plugins/contextmenu/editor_plugin_src.js | 55 +- .../tiny_mce/plugins/emotions/emotions.htm | 29 +- .../emotions/img/smiley-foot-in-mouth.gif | Bin 344 -> 342 bytes .../plugins/emotions/img/smiley-laughing.gif | Bin 344 -> 343 bytes .../plugins/emotions/img/smiley-sealed.gif | Bin 325 -> 323 bytes .../plugins/emotions/img/smiley-smile.gif | Bin 345 -> 344 bytes .../plugins/emotions/img/smiley-surprised.gif | Bin 342 -> 338 bytes .../plugins/emotions/img/smiley-wink.gif | Bin 351 -> 350 bytes .../example_dependency/editor_plugin_src.js | 50 + .../plugins/fullpage/css/fullpage.css | 45 +- .../plugins/fullpage/editor_plugin_src.js | 372 +- .../tiny_mce/plugins/fullpage/fullpage.htm | 348 +- .../tiny_mce/plugins/fullpage/js/fullpage.js | 637 +- .../plugins/fullscreen/editor_plugin_src.js | 12 +- .../plugins/inlinepopups/editor_plugin_src.js | 96 +- .../skins/clearlooks2/img/alert.gif | Bin 818 -> 810 bytes .../skins/clearlooks2/img/button.gif | Bin 280 -> 272 bytes .../skins/clearlooks2/img/confirm.gif | Bin 915 -> 907 bytes .../skins/clearlooks2/img/corners.gif | Bin 911 -> 909 bytes .../skins/clearlooks2/img/vertical.gif | Bin 92 -> 84 bytes .../inlinepopups/skins/clearlooks2/window.css | 10 - .../plugins/layer/editor_plugin_src.js | 2 + .../plugins/legacyoutput/editor_plugin_src.js | 47 +- .../plugins/lists/editor_plugin_src.js | 769 + .../tiny_mce/plugins/media/css/content.css | 6 - .../tiny_mce/plugins/media/css/media.css | 9 +- .../plugins/media/editor_plugin_src.js | 998 +- .../tiny_mce/plugins/media/img/flash.gif | Bin 241 -> 0 bytes .../tiny_mce/plugins/media/img/flv_player.swf | Bin 11668 -> 0 bytes .../tiny_mce/plugins/media/img/quicktime.gif | Bin 303 -> 0 bytes .../tiny_mce/plugins/media/img/shockwave.gif | Bin 387 -> 0 bytes .../tiny_mce/plugins/media/js/media.js | 963 +- .../tiny_mce/plugins/media/langs/en_dlg.js | 13 +- .../jscripts/tiny_mce/plugins/media/media.htm | 650 +- .../tiny_mce/plugins/media/moxieplayer.swf | Bin 0 -> 33931 bytes .../plugins/nonbreaking/editor_plugin_src.js | 2 +- .../plugins/noneditable/editor_plugin_src.js | 9 +- .../plugins/pagebreak/css/content.css | 1 - .../plugins/pagebreak/editor_plugin_src.js | 5 +- .../tiny_mce/plugins/pagebreak/img/trans.gif | Bin 43 -> 0 bytes .../plugins/paste/editor_plugin_src.js | 270 +- .../searchreplace/editor_plugin_src.js | 4 + .../plugins/searchreplace/js/searchreplace.js | 24 +- .../plugins/searchreplace/searchreplace.htm | 33 +- .../plugins/spellchecker/editor_plugin_src.js | 93 +- .../tiny_mce/plugins/style/js/props.js | 12 +- .../tiny_mce/plugins/style/langs/en_dlg.js | 9 +- .../jscripts/tiny_mce/plugins/style/props.htm | 913 +- .../plugins/tabfocus/editor_plugin_src.js | 234 +- .../jscripts/tiny_mce/plugins/table/cell.htm | 30 +- .../plugins/table/editor_plugin_src.js | 2500 +-- .../tiny_mce/plugins/table/js/cell.js | 55 +- .../jscripts/tiny_mce/plugins/table/js/row.js | 36 +- .../tiny_mce/plugins/table/js/table.js | 20 +- .../tiny_mce/plugins/table/langs/en_dlg.js | 3 +- .../tiny_mce/plugins/table/merge_cells.htm | 22 +- .../jscripts/tiny_mce/plugins/table/row.htm | 21 +- .../jscripts/tiny_mce/plugins/table/table.htm | 107 +- .../tiny_mce/plugins/template/js/template.js | 2 +- .../plugins/visualchars/editor_plugin_src.js | 2 +- .../plugins/wordcount/editor_plugin_src.js | 56 +- .../tiny_mce/plugins/xhtmlxtras/abbr.htm | 11 +- .../tiny_mce/plugins/xhtmlxtras/acronym.htm | 11 +- .../plugins/xhtmlxtras/attributes.htm | 11 +- .../tiny_mce/plugins/xhtmlxtras/cite.htm | 9 +- .../tiny_mce/plugins/xhtmlxtras/del.htm | 17 +- .../plugins/xhtmlxtras/editor_plugin_src.js | 12 +- .../tiny_mce/plugins/xhtmlxtras/ins.htm | 21 +- .../plugins/xhtmlxtras/js/attributes.js | 17 +- .../tiny_mce/plugins/xhtmlxtras/js/del.js | 4 +- .../plugins/xhtmlxtras/js/element_common.js | 8 +- .../tiny_mce/plugins/xhtmlxtras/js/ins.js | 7 +- .../tiny_mce/themes/advanced/about.htm | 8 +- .../tiny_mce/themes/advanced/anchor.htm | 10 +- .../tiny_mce/themes/advanced/charmap.htm | 79 +- .../tiny_mce/themes/advanced/color_picker.htm | 19 +- .../themes/advanced/editor_template_src.js | 219 +- .../tiny_mce/themes/advanced/image.htm | 102 +- .../themes/advanced/img/colorpicker.jpg | Bin 3189 -> 2584 bytes .../tiny_mce/themes/advanced/img/flash.gif | Bin 0 -> 239 bytes .../tiny_mce/themes/advanced/img/icons.gif | Bin 11794 -> 11790 bytes .../tiny_mce/themes/advanced/img/iframe.gif | Bin 0 -> 600 bytes .../advanced}/img/pagebreak.gif | Bin .../themes/advanced/img/quicktime.gif | Bin 0 -> 301 bytes .../advanced}/img/realmedia.gif | Bin .../themes/advanced/img/shockwave.gif | Bin 0 -> 384 bytes .../media => themes/advanced}/img/trans.gif | Bin .../tiny_mce/themes/advanced/img/video.gif | Bin 0 -> 597 bytes .../advanced}/img/windowsmedia.gif | Bin .../tiny_mce/themes/advanced/js/about.js | 1 + .../tiny_mce/themes/advanced/js/anchor.js | 5 + .../tiny_mce/themes/advanced/js/charmap.js | 32 +- .../themes/advanced/js/color_picker.js | 140 +- .../tiny_mce/themes/advanced/js/image.js | 8 +- .../tiny_mce/themes/advanced/js/link.js | 11 +- .../themes/advanced/js/source_editor.js | 2 +- .../tiny_mce/themes/advanced/langs/en.js | 10 +- .../tiny_mce/themes/advanced/langs/en_dlg.js | 9 +- .../tiny_mce/themes/advanced/link.htm | 55 +- .../tiny_mce/themes/advanced/shortcuts.htm | 47 + .../themes/advanced/skins/default/content.css | 14 +- .../advanced/skins/default/img/buttons.png | Bin 3274 -> 3133 bytes .../advanced/skins/default/img/items.gif | Bin 70 -> 64 bytes .../advanced/skins/default/img/tabs.gif | Bin 1326 -> 1322 bytes .../themes/advanced/skins/default/ui.css | 9 +- .../advanced/skins/highcontrast/content.css | 23 + .../advanced/skins/highcontrast/dialog.css | 105 + .../themes/advanced/skins/highcontrast/ui.css | 102 + .../themes/advanced/skins/o2k7/content.css | 11 + .../themes/advanced/skins/o2k7/dialog.css | 1 + .../advanced/skins/o2k7/img/button_bg.png | Bin 5859 -> 2766 bytes .../skins/o2k7/img/button_bg_black.png | Bin 3736 -> 651 bytes .../skins/o2k7/img/button_bg_silver.png | Bin 5358 -> 2084 bytes .../themes/advanced/skins/o2k7/ui.css | 14 +- .../themes/advanced/skins/o2k7/ui_black.css | 2 +- .../themes/advanced/skins/o2k7/ui_silver.css | 2 +- .../themes/advanced/source_editor.htm | 6 +- .../themes/simple/editor_template_src.js | 3 +- .../tiny_mce/themes/simple/img/icons.gif | Bin 1440 -> 806 bytes .../tinymce/jscripts/tiny_mce/tiny_mce_dev.js | 252 +- .../jscripts/tiny_mce/tiny_mce_jquery_src.js | 11337 +++++++------ .../jscripts/tiny_mce/tiny_mce_popup.js | 2 +- .../tiny_mce/tiny_mce_prototype_src.js | 13196 +++++++++------- .../tinymce/jscripts/tiny_mce/tiny_mce_src.js | 13192 ++++++++------- .../jscripts/tiny_mce/utils/form_utils.js | 18 +- .../tinymce/jscripts/tiny_mce/utils/mctabs.js | 105 +- .../jscripts/tiny_mce/utils/validate.js | 38 +- .../System/TinyMCEPlugin/tinymce/readme.md | 58 +- .../tinymce/tests/accessibility0.html | 43 + .../tinymce/tests/accessibility1.html | 45 + .../tinymce/tests/accessibility10.html | 47 + .../tinymce/tests/accessibility2.html | 44 + .../tinymce/tests/accessibility3.html | 44 + .../tinymce/tests/accessibility4.html | 46 + .../tinymce/tests/accessibility5.html | 46 + .../tinymce/tests/accessibility6.html | 47 + .../tinymce/tests/accessibility7.html | 46 + .../tinymce/tests/accessibility8.html | 46 + .../tinymce/tests/accessibility9.html | 46 + .../TinyMCEPlugin/tinymce/tests/api.html | 3 +- .../TinyMCEPlugin/tinymce/tests/autolink.html | 165 + .../TinyMCEPlugin/tinymce/tests/basic.html | 74 +- .../tinymce/tests/crossdomain.html | 6 +- .../tinymce/tests/format.robot.html | 94 + .../TinyMCEPlugin/tinymce/tests/fullpage.html | 98 + .../TinyMCEPlugin/tinymce/tests/ie_range.html | 527 - .../TinyMCEPlugin/tinymce/tests/index.html | 135 +- .../tinymce/tests/jquery_plugin.html | 13 +- .../TinyMCEPlugin/tinymce/tests/js/api.js | 1227 +- .../tinymce/tests/js/autolink/actions.js | 48 + .../TinyMCEPlugin/tinymce/tests/js/dsl/dsl.js | 138 + .../tinymce/tests/js/dsl/states.js | 175 + .../tinymce/tests/js/lists/actions.js | 7 + .../tinymce/tests/js/tiny_mce_loader.js | 7 + .../tinymce/tests/js/tinymce.dom.DOMUtils.js | 634 + .../TinyMCEPlugin/tinymce/tests/js/utils.js | 135 +- .../tinymce/tests/json_rpc_error.js | 1 + .../tinymce/tests/json_rpc_ok.js | 1 + .../tinymce/tests/jsrobot/JSRobot.LICENSE | 202 + .../tinymce/tests/jsrobot/JSRobot.jar | Bin 0 -> 10804 bytes .../tinymce/tests/jsrobot/robot.js | 258 + .../tinymce/tests/lists_applying.html | 338 + .../tinymce/tests/lists_forced_brs.html | 112 + .../tinymce/tests/lists_general.html | 135 + .../tinymce/tests/lists_indenting.html | 224 + .../TinyMCEPlugin/tinymce/tests/main.html | 8 - .../TinyMCEPlugin/tinymce/tests/media.html | 264 +- .../TinyMCEPlugin/tinymce/tests/menu.html | 1 + .../TinyMCEPlugin/tinymce/tests/parts.html | 6 +- .../TinyMCEPlugin/tinymce/tests/paste.html | 90 +- .../tinymce/tests/performance.html | 364 +- .../tests/plugin_dependency_chain.html | 61 + .../tests/plugin_dependency_chain_legacy.html | 61 + .../plugin_dependency_init_call_order.html | 71 + .../tests/plugin_dependency_simple.html | 53 + .../plugin_dependency_specific_location.html | 60 + .../tinymce/tests/qunit/QUnit.LICENSE | 20 + .../tinymce/tests/qunit/runner.js | 119 +- .../TinyMCEPlugin/tinymce/tests/remove.html | 174 + .../tinymce/tests/removeformat.html | 5 +- .../tinymce/tests/selection.html | 291 - .../tinymce/tests/slickspeed/config.ini | 27 - .../tinymce/tests/slickspeed/footer.html | 3 - .../tinymce/tests/slickspeed/header.html | 6 - .../tinymce/tests/slickspeed/index.php | 1 - .../tinymce/tests/slickspeed/instructions.txt | 4 - .../tinymce/tests/slickspeed/logo.png | Bin 5829 -> 0 bytes .../tinymce/tests/slickspeed/selectors.list | 40 - .../tinymce/tests/slickspeed/style.css | 181 - .../tinymce/tests/slickspeed/system/index.php | 112 - .../tests/slickspeed/system/slickspeed.js | 147 - .../tests/slickspeed/system/template.php | 47 - .../tinymce/tests/slickspeed/template.html | 2865 ---- .../TinyMCEPlugin/tinymce/tests/table.html | 122 + .../tinymce/tests/tinymce.EditorCommands.html | 334 + ...pply.html => tinymce.Formatter_apply.html} | 1700 +- ...heck.html => tinymce.Formatter_check.html} | 4 +- ...ove.html => tinymce.Formatter_remove.html} | 4 +- .../tinymce/tests/tinymce.UndoManager.html | 180 + ...ototype.html => tinymce.dom.DOMUtils.html} | 20 +- ....html => tinymce.dom.DOMUtils_jquery.html} | 20 +- .../tinymce/tests/tinymce.dom.EventUtils.html | 153 + .../tinymce/tests/tinymce.dom.Range.html | 579 + .../tinymce/tests/tinymce.dom.Selection.html | 650 + .../tinymce/tests/tinymce.dom.Serializer.html | 390 + ...html => tinymce.dom.TridentSelection.html} | 259 +- .../tinymce/tests/tinymce.html.DomParser.html | 354 + .../tinymce/tests/tinymce.html.Entities.html | 96 + .../tinymce/tests/tinymce.html.Node.html | 461 + .../tinymce/tests/tinymce.html.SaxParser.html | 532 + .../tinymce/tests/tinymce.html.Schema.html | 270 + .../tests/tinymce.html.Serializer.html | 44 + .../tinymce/tests/tinymce.html.Styles.html | 110 + .../tinymce/tests/tinymce.html.Writer.html | 172 + .../tinymce/tests/tinymce.util.Cookie.html | 43 + .../tests/tinymce.util.Dispatcher.html | 74 + .../tinymce/tests/tinymce.util.JSON.html | 37 + .../tests/tinymce.util.JSONRequest.html | 99 + .../tinymce/tests/tinymce.util.URI.html | 88 + .../tinymce/tests/tinymce.util.XHR.html | 67 + .../TinyMCEPlugin/tinymce/tests/undo.html | 112 + .../tinymce/tests/wordcount.html | 113 + .../tinymce/tools/ant/js_build_tools.jar | Bin 33868 -> 40199 bytes .../tinymce/tools/ant/svnClientAdapter.jar | Bin 205053 -> 0 bytes .../tinymce/tools/ant/svnant.jar | Bin 62289 -> 0 bytes .../tinymce/tools/ant/svnjavahl.jar | Bin 86682 -> 0 bytes .../tinymce/tools/ant/svnkit.jar | Bin 1658458 -> 0 bytes 357 files changed, 58066 insertions(+), 37626 deletions(-) create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/LICENSE.TXT delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Schema.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.ScriptLoader.html delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.StringWriter.html delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.XMLWriter.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.KeyboardNavigation.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ToolbarGroup.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinymce.EditorManager.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/accessibility.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/media/sample.flv delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/translate.html delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/CommandManager.js delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/Developer.js delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Schema.js delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/StringWriter.js delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/XMLWriter.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/firebug/FIREBUG.LICENSE create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/DomParser.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Entities.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Node.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/SaxParser.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Schema.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Serializer.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Styles.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Writer.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/KeyboardNavigation.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ToolbarGroup.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Quirks.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/VK.js delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/xml/Parser.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin_src.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/css/content.css delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/flash.gif delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/flv_player.swf delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/quicktime.gif delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/shockwave.gif create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/moxieplayer.swf delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/css/content.css delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/img/trans.gif create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/flash.gif create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/iframe.gif rename TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/{plugins/pagebreak => themes/advanced}/img/pagebreak.gif (100%) create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/quicktime.gif rename TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/{plugins/media => themes/advanced}/img/realmedia.gif (100%) create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/shockwave.gif rename TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/{plugins/media => themes/advanced}/img/trans.gif (100%) create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/video.gif rename TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/{plugins/media => themes/advanced}/img/windowsmedia.gif (100%) create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/accessibility0.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/accessibility1.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/accessibility10.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/accessibility2.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/accessibility3.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/accessibility4.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/accessibility5.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/accessibility6.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/accessibility7.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/accessibility8.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/accessibility9.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/autolink.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/format.robot.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/fullpage.html delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/ie_range.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/autolink/actions.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/dsl/dsl.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/dsl/states.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/lists/actions.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/tiny_mce_loader.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/tinymce.dom.DOMUtils.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/json_rpc_error.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/json_rpc_ok.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/JSRobot.LICENSE create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/JSRobot.jar create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/robot.js create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_applying.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_forced_brs.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_general.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_indenting.html delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/main.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_chain.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_chain_legacy.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_init_call_order.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_simple.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_specific_location.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/qunit/QUnit.LICENSE create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/remove.html delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/selection.html delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/config.ini delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/footer.html delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/header.html delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/index.php delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/instructions.txt delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/logo.png delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/selectors.list delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/style.css delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/index.php delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/slickspeed.js delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/template.php delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/template.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/table.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.EditorCommands.html rename TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/{formatting_apply.html => tinymce.Formatter_apply.html} (69%) rename TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/{formatting_check.html => tinymce.Formatter_check.html} (96%) rename TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/{formatting_remove.html => tinymce.Formatter_remove.html} (97%) create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.UndoManager.html rename TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/{api_prototype.html => tinymce.dom.DOMUtils.html} (58%) rename TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/{api_jquery.html => tinymce.dom.DOMUtils_jquery.html} (58%) create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.EventUtils.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Range.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Selection.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Serializer.html rename TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/{ie_selection.html => tinymce.dom.TridentSelection.html} (50%) create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.DomParser.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Entities.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Node.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.SaxParser.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Schema.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Serializer.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Styles.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Writer.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.Cookie.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.Dispatcher.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.JSON.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.JSONRequest.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.URI.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.XHR.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/undo.html create mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/wordcount.html delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/svnClientAdapter.jar delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/svnant.jar delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/svnjavahl.jar delete mode 100644 TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/svnkit.jar diff --git a/TinyMCEPlugin/lib/Foswiki/Plugins/TinyMCEPlugin/MANIFEST b/TinyMCEPlugin/lib/Foswiki/Plugins/TinyMCEPlugin/MANIFEST index 15c11d1072..13fc250572 100644 --- a/TinyMCEPlugin/lib/Foswiki/Plugins/TinyMCEPlugin/MANIFEST +++ b/TinyMCEPlugin/lib/Foswiki/Plugins/TinyMCEPlugin/MANIFEST @@ -1,7 +1,7 @@ -!noci data/System/TinyMCEFrequentlyAskedQuestions.txt 0644 data/System/TinyMCEPlugin.txt 0644 data/System/TinyMCEQuickHelp.txt 0644 +!noci lib/Foswiki/Configure/Checkers/Plugins/TinyMCEPlugin/Enabled.pm 0644 lib/Foswiki/Plugins/TinyMCEPlugin.pm 0644 pub/System/TinyMCEPlugin/foswiki_src.js 0644 @@ -12,6 +12,7 @@ pub/System/TinyMCEPlugin/foswiki_tiny.js 0644 pub/System/TinyMCEPlugin/foswiki_tiny.js.gz 0644 pub/System/TinyMCEPlugin/screenshot.png 0644 pub/System/TinyMCEPlugin/tinymce.gif 0644 +pub/System/TinyMCEPlugin/tinymce/LICENSE.TXT 0644 #pub/System/TinyMCEPlugin/tinymce/build.bat 0644 #pub/System/TinyMCEPlugin/tinymce/build.xml 0644 pub/System/TinyMCEPlugin/tinymce/changelog.txt 0644 @@ -28,11 +29,9 @@ pub/System/TinyMCEPlugin/tinymce/changelog.txt 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.DOMUtils.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Element.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.EventUtils.html 0644 -#pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Schema.html 0644 +#pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.ScriptLoader.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Selection.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Serializer.html 0644 -#pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.StringWriter.html 0644 -#pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.XMLWriter.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html.DomParser.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html.Node.html 0644 @@ -48,6 +47,7 @@ pub/System/TinyMCEPlugin/tinymce/changelog.txt 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Container.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Control.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.DropMenu.html 0644 +#pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.KeyboardNavigation.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ListBox.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Menu.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.MenuButton.html 0644 @@ -56,6 +56,7 @@ pub/System/TinyMCEPlugin/tinymce/changelog.txt 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Separator.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.SplitButton.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Toolbar.html 0644 +#pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ToolbarGroup.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.Cookie.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.Dispatcher.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.JSON.html 0644 @@ -93,9 +94,11 @@ pub/System/TinyMCEPlugin/tinymce/changelog.txt 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/js/shCore.js 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinyMCE.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinymce.DOM.html 0644 +#pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinymce.EditorManager.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinymce.dom.Event.html 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/model.xml 0644 #pub/System/TinyMCEPlugin/tinymce/docs/api/tinymce.vsdoc.js 0644 +pub/System/TinyMCEPlugin/tinymce/examples/accessibility.html 0644 pub/System/TinyMCEPlugin/tinymce/examples/css/content.css 0644 pub/System/TinyMCEPlugin/tinymce/examples/css/content.css.gz 0644 pub/System/TinyMCEPlugin/tinymce/examples/css/word.css 0644 @@ -116,6 +119,7 @@ pub/System/TinyMCEPlugin/tinymce/examples/media/logo.jpg 0644 pub/System/TinyMCEPlugin/tinymce/examples/media/logo_over.jpg 0644 pub/System/TinyMCEPlugin/tinymce/examples/media/sample.avi 0644 pub/System/TinyMCEPlugin/tinymce/examples/media/sample.dcr 0644 +pub/System/TinyMCEPlugin/tinymce/examples/media/sample.flv 0644 pub/System/TinyMCEPlugin/tinymce/examples/media/sample.mov 0644 pub/System/TinyMCEPlugin/tinymce/examples/media/sample.ram 0644 pub/System/TinyMCEPlugin/tinymce/examples/media/sample.rm 0644 @@ -125,12 +129,9 @@ pub/System/TinyMCEPlugin/tinymce/examples/simple.html 0644 pub/System/TinyMCEPlugin/tinymce/examples/skins.html 0644 pub/System/TinyMCEPlugin/tinymce/examples/templates/layout1.htm 0644 pub/System/TinyMCEPlugin/tinymce/examples/templates/snippet1.htm 0644 -pub/System/TinyMCEPlugin/tinymce/examples/translate.html 0644 pub/System/TinyMCEPlugin/tinymce/examples/word.html 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/AddOnManager.js 0644 -#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/CommandManager.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ControlManager.js 0644 -#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/Developer.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/Editor.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/EditorCommands.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/EditorManager.js 0644 @@ -148,22 +149,29 @@ pub/System/TinyMCEPlugin/tinymce/examples/word.html 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/EventUtils.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Range.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/RangeUtils.js 0644 -#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Schema.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/ScriptLoader.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Selection.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Serializer.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Sizzle.js 0644 -#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/StringWriter.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/TreeWalker.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/TridentSelection.js 0644 -#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/XMLWriter.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/firebug/FIREBUG.LICENSE 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/firebug/firebug-lite.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/DomParser.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Entities.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Node.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/SaxParser.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Schema.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Serializer.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Styles.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Writer.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/tinymce.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Button.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ColorSplitButton.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Container.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Control.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/DropMenu.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/KeyboardNavigation.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ListBox.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Menu.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/MenuButton.js 0644 @@ -172,14 +180,16 @@ pub/System/TinyMCEPlugin/tinymce/examples/word.html 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Separator.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/SplitButton.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Toolbar.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ToolbarGroup.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Cookie.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Dispatcher.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/JSON.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/JSONP.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/JSONRequest.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Quirks.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/URI.js 0644 +#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/VK.js 0644 #pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/XHR.js 0644 -#pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/xml/Parser.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/jquery.tinymce.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/jquery.tinymce.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/langs/en.js 0644 @@ -219,6 +229,9 @@ pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advlink/link.htm 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin.js.gz 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin.js 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js.gz 0644 @@ -271,6 +284,9 @@ pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/example/langs/en.js 0 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/example/langs/en.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/example/langs/en_dlg.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/example/langs/en_dlg.js.gz 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin_src.js 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin.js 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/foswiki/editor_plugin_src.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/foswiki/editor_plugin.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/foswiki/editor_plugin.js.gz 0644 @@ -351,20 +367,14 @@ pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin.j pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js.gz 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/css/content.css 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/css/content.css.gz 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin.js 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/css/media.css 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/css/media.css.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin_src.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin.js.gz 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/flash.gif 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/flv_player.swf 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/quicktime.gif 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/realmedia.gif 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/shockwave.gif 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/trans.gif 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/windowsmedia.gif 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/js/embed.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/js/embed.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/js/media.js 0644 @@ -372,19 +382,16 @@ pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/js/media.js.gz pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/langs/en_dlg.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/langs/en_dlg.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/media.htm 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/moxieplayer.swf 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js.gz 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/css/content.css 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/css/content.css.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js.gz 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/img/pagebreak.gif 0644 -pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/img/trans.gif 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin.js.gz 0644 @@ -516,7 +523,16 @@ pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/editor_templa pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/editor_template.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/image.htm 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/flash.gif 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/icons.gif 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/iframe.gif 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/pagebreak.gif 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/quicktime.gif 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/realmedia.gif 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/shockwave.gif 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/trans.gif 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/video.gif 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/windowsmedia.gif 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/about.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/about.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js 0644 @@ -536,6 +552,7 @@ pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js.g pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/link.htm 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css 0644 @@ -548,6 +565,12 @@ pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/ui.css 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/ui.css.gz 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css.gz 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css.gz 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css 0644 +pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css 0644 @@ -599,51 +622,91 @@ pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/utils/mctabs.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/utils/validate.js 0644 pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/utils/validate.js.gz 0644 pub/System/TinyMCEPlugin/tinymce/readme.md 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/accessibility0.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/accessibility1.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/accessibility10.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/accessibility2.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/accessibility3.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/accessibility4.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/accessibility5.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/accessibility6.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/accessibility7.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/accessibility8.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/accessibility9.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/api.html 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/api_jquery.html 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/api_prototype.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/autolink.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/basic.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/crossdomain.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/css/unit.css 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/formatting_apply.html 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/formatting_check.html 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/formatting_remove.html 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/ie_range.html 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/ie_selection.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/format.robot.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/fullpage.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/index.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/jquery_plugin.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/js/api.js 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/js/autolink/actions.js 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/js/dsl/dsl.js 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/js/dsl/states.js 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/js/lists/actions.js 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/js/tiny_mce_loader.js 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/js/tinymce.dom.DOMUtils.js 0644 #pub/System/TinyMCEPlugin/tinymce/tests/js/utils.js 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/main.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/json_rpc_error.js 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/json_rpc_ok.js 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/JSRobot.LICENSE 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/JSRobot.jar 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/robot.js 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/lists_applying.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/lists_forced_brs.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/lists_general.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/lists_indenting.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/media.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/menu.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/parts.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/paste.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/performance.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_chain.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_chain_legacy.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_init_call_order.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_simple.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_specific_location.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/qunit/QUnit.LICENSE 0644 #pub/System/TinyMCEPlugin/tinymce/tests/qunit/qunit.css 0644 #pub/System/TinyMCEPlugin/tinymce/tests/qunit/qunit.js 0644 #pub/System/TinyMCEPlugin/tinymce/tests/qunit/runner.js 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/remove.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/removeformat.html 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/selection.html 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/config.ini 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/footer.html 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/header.html 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/index.php 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/instructions.txt 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/logo.png 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/selectors.list 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/style.css 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/index.php 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/slickspeed.js 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/template.php 0644 -#pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/template.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/table.html 0644 #pub/System/TinyMCEPlugin/tinymce/tests/test.xml 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.EditorCommands.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.Formatter_apply.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.Formatter_check.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.Formatter_remove.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.UndoManager.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.DOMUtils.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.DOMUtils_jquery.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.EventUtils.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Range.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Selection.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Serializer.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.TridentSelection.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.DomParser.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Entities.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Node.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.SaxParser.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Schema.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Serializer.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Styles.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Writer.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.Cookie.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.Dispatcher.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.JSON.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.JSONRequest.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.URI.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.XHR.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/undo.html 0644 +#pub/System/TinyMCEPlugin/tinymce/tests/wordcount.html 0644 #pub/System/TinyMCEPlugin/tinymce/tools/ant/ant-contrib.jar 0644 #pub/System/TinyMCEPlugin/tinymce/tools/ant/js_build_tools.jar 0644 -#pub/System/TinyMCEPlugin/tinymce/tools/ant/svnClientAdapter.jar 0644 -#pub/System/TinyMCEPlugin/tinymce/tools/ant/svnant.jar 0644 -#pub/System/TinyMCEPlugin/tinymce/tools/ant/svnjavahl.jar 0644 -#pub/System/TinyMCEPlugin/tinymce/tools/ant/svnkit.jar 0644 #pub/System/TinyMCEPlugin/tinymce/tools/ant/yuicompressor.jar 0644 #pub/System/TinyMCEPlugin/tinymce/tools/templates/class.xsl 0644 #pub/System/TinyMCEPlugin/tinymce/tools/templates/css/general.css 0644 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/LICENSE.TXT b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/LICENSE.TXT new file mode 100644 index 0000000000..60d6d4c8f5 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/LICENSE.TXT @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/build.xml b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/build.xml index 5d6bd485cb..159c314155 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/build.xml +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/build.xml @@ -1,368 +1,395 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- // Uncomment and change this document.domain value if you are loading the script cross subdomains - // document.domain = 'moxiecode.com'; - -
- -
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -TinyMCE Commercial Application License --------------------------------------- -This copy of TinyMCE is under a commercial license, the LGPL headers are removed. - -A signed agreement from Moxiecode Systems AB is required in order to use this specific copy of TinyMCE. - -If you have any questions regarding your license, contact Moxiecode Systems AB (www.moxiecode.com). - - - - - - - - - - - - - - - - -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ // Uncomment and change this document.domain value if you are loading the script cross subdomains + // document.domain = 'moxiecode.com'; + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TinyMCE Commercial Application License +-------------------------------------- +This copy of TinyMCE is under a commercial license, the LGPL headers are removed. + +A signed agreement from Moxiecode Systems AB is required in order to use this specific copy of TinyMCE. + +If you have any questions regarding your license, contact Moxiecode Systems AB (www.moxiecode.com). + + + + + + + + + + + + + + + + + + +
diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/changelog.txt b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/changelog.txt index cc3df7030e..ffccf4f8b9 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/changelog.txt +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/changelog.txt @@ -1,1116 +1,1384 @@ -Version 3.3.9.3 (2010-12-20) - Fixed issue where WebKit wouldn't correctly apply ins/del in xhtmlxtras plugin. - Fixed bug where paste as plaintext on WebKit wouldn't produce br and p elements correctly. - Fixed bug where the confirm dialog texts would be incorrectly placed due to recent IE 9 workarounds in the window.css. - Fixed bug where applying text color would not add spans inside link elements. This is needed due to CSS style inheritance. -Version 3.3.9.2 (2010-09-29) - Fixed bug where placing the caret in IE 9 beta 1 would not work correctly if you clicked out side the document body element. - Fixed bug where IE 9 beta 1 wouldn't resize the editor correctly since the events didn't fire as previous versions did. - Fixed bug where FF would produce an error message when being rendered inside a hidden div element. - Fixed bug where resize logic could produce a cookie with a width/height less than the size of the container. - Fixed bug where content_css wouldn't populate the styles dropdown correctly. -Version 3.3.9.1 (2010-09-23) - Fixed bug where WebKit browsers wouldn't activate the image button when images where selected. - Fixed bug where Opera Presto 10.60 deletes elements when restoring bookmarks. - Fixed bug where IE9 beta1 doesn't handle regexp replacement values correctly. - Fixed bug where IE9 beta1 didn't render the inline dialogs correctly due to a bug with CSS clip. - Fixed bug where IE9 beta1 would produce error messages on load since they removed the document.recalc method. - Fixed bug where IE9 beta1 would produce since they haven't implemented document.implementation.createDocument correctly. - Fixed bug where IE9 beta1 would searchreplace doesn't work since their native DOM Range doesn't have a find method. - Fixed bug where IE9 beta1 would render the source view incorrectly due to incorrect viewport size measurements. - Fixed bug where IE9 beta1 would crash when running the basic functionality unit tests. - Fixed bug where IE9 beta1 would wrap elements in blocks correctly due to changes to the selection object. - Fixed bug where IE9 beta1 would fail to insert contents since they havn't implemented the createContextualFragment method in their DOM Range. - Fixed bug where IE9 beta1 would fail to handle image selection since they currently doesn't support control selections in their DOM Range. - Fixed bug where IE9 beta1 would fail to load scripts since they fire the onload event before the scripts are parsed and executed. -Version 3.3.9 (2010-09-08) - Fixed bug where inserting table rows into a table with subtable would produce an incorrect column count. - Fixed bug where the selection of cells in a table with subtables could produce invalid selections. - Fixed bug where the table plugin would produce a script error if you tried to move the caret before a first child table. - Fixed bug where the keep_styles feature on IE would move the caret to an incorrect location at the end of list blocks. - Fixed so attributes from legacy elements such as font gets retained when they get converted to spans. - Fixed minor issue where the select boxes wouldn't be set the not set by default in the table dialog. -Version 3.3.8 (2010-06-30) - Fixed bug where WebKit would not move the caret to a correct position after a paste operation. - Fixed bug where WebKit would produce a div wrapper element when pasting some contents. - Fixed bug where the visual chars and nonbreaking plugin wouldn't show nbsp elements correctly. - Fixed bug where the format states would be enabled even after the format was removed. - Fixed bug where the delete key would move the caret to an incorrect position. - Fixed bug where it wasn't possible to toggle of the current font size/family/style by clicking the title item. - Fixed bug where the abbr element wouldn't get serialized correctly on IE6. - Fixed so that the examples checks if they are executed from the local file system since that might not work properly. -Version 3.3.7 (2010-06-10) - Fixed bug where context menu would produce an error on IE if you right clicked twice and left clicked once. - Fixed bug where resizing of the window on WebKit browsers in fullscreen mode wouldn't position the statusbar correctly. - Fixed bug where IE would produce an error if the editor was empty and you where undoing to that initial level. - Fixed bug where setting the table background on gecko would produce \" entities inside the url style property. - Fixed bug where the button states wouldn't be updated correctly on IE if you placed the caret inside the new element. - Fixed bug where undo levels wasn't properly added after applying styles or font sizes. - Fixed bug where IE would throw an error if you used "select all" on empty elements and applied formatting to that. - Fixed bug where IE could select one extra character when you did a bookmark call on a caret location. - Fixed bug where IE could produce a script error on delete since it would sometimes produce an invalid DOM. - Fixed bug where IE would return the wrong start element if the whole element was selected. - Fixed bug where formatting states wasn't updated on IE if you pressed enter at the end of a block with formatting. - Fixed bug where submenus for the context menu wasn't removed correctly when the editor was destroyed. - Fixed bug where Gecko could select the wrong element after applying format to multiple elements. - Fixed bug where Gecko would delete parts of the previous element if the selection range was a element selection. - Fixed bug where Gecko would not merge paragraph elements correctly if they contained br elements. - Fixed bug where the cleanup button could produce span artifacts if you pressed it twice in a row. - Fixed bug where the fullpage plugin header/footer would be have it's header reseted to it's initial state on undo. - Fixed bug where an empty paragraph would be collapsed if you performed a cleanup while having the caret inside it. - Fixed a few memory leaks on IE especially with drop menus in listboxes and the spellchecker. - Fixed so formats applied to the current caret gets merged to reduce the number of output elements. - Added the latest version of Sizzle for the CSS selector logic to fix a compatibility issue with prototype. -Version 3.3.6 (2010-05-20) - Fixed bug where a editor.focus call could produce errors on IE in very specific scenarios. - Fixed bug where Gecko would produce an error if you unformatted text inside an empty element. - Fixed bug where IE would produce an error if the caret was placed before a table and you used the align buttons. - Fixed bug where the font size drop down didn't display the a preview correctly. - Fixed bug where the paste plugin wouldn't include all contents some times on WebKit browsers. - Fixed bug where the plain text mode toggle wouldn't work properly on WebKit. - Fixed bug where the editors statusbar would become invisible when you resized the window in fullscreen mode. -Version 3.3.5.1 (2010-05-07) - Fixed a critical bug with the fullscreen plugin. Produced error messages when the state was toggled on/off. -Version 3.3.5 (2010-05-06) - Added new merge_with_parents option to formats, enables the control of removal of elements with similar parents. - Fixed so the default behavior for applying classes isn't a toggle state but the old behavior from before the 3.3 release. - Fixed bug where selecting contents using double click on Gecko would produce errors when using removing format. - Fixed bug where the IE DOM could get messed up when non valid contents was pasted into the editor. - Fixed bug where merging selected table cells using the context menu didn't work as expected. - Fixed bug where some nestled formatting would be applied incorrectly. - Fixed bug with enter in list items when using the force_br_newlines mode on WebKit patch contributed by Ryan Koopmans. - Fixed bug where undo/redo could produce js errors on some specific operations. - Fixed bug where the theme_advanced_font_sizes didn't work as before 3.3 when complex settings where used. - Fixed bug where the table plugin would copy cell/row id attributes when making new rows/cells. -Version 3.3.4 (2010-04-27) - Fixed bug where fullscreen plugin would add two editor instances to EditorManager collection. - Fixed bug where it was difficult to enter text on non western languages such as Japanese on IE. - Fixed bug where removing contents from nodes could result in an exception when using undo/redo. - Fixed bug with selection of images inside layers or other resizable containers on IE. - Fixed so editors isn't initialized on iPhone/iPad devices since they don't have caret support. -Version 3.3.3 (2010-04-19) - Added new script_loaded callback function setting for the jQuery plugin. - Added various fixes and new rpc methods for the spellchecker plugin. Patch contributed by Michael Peters. - Removed some unnecessary inline style information from some of the dialogs. - Fixed some issues with the chaining for the TinyMCE jQuery plugin. - Fixed so any extra arguments passed to patched jQuery functions gets passed through. Patch contributed by Lee Henson. - Fixed so spellchecking/contextmenu can be toggled on/off if the browser has native spellchecker support. - Fixed bug where some texts in the new paste plugin wasn't placed in language pack. - Fixed bug where IE would produce an incorrect information message when cutting. - Fixed bug where removing items using the xhtmlxtras plugin wouldn't work correctly. - Fixed bug where setting table background images would add extra quotes on Gecko. - Fixed bug where shortcut for bold/italic/underline wouldn't work properly on WebKit. - Fixed bug where IE would produce an error message if only contents was an image tag and bold was used. - Fixed bug where the caret would move if alignment was applied to empty block elements. - Fixed bug where some shortcut key commands wouldn't apply formatting correctly. -Version 3.3.2 (2010-03-25) - Fixed bug where it was possible to scale the editor iframe smaller than the editor UI. - Fixed bug where some of the resizing option didn't work with the new live resize. - Fixed bug where the format listbox didn't show nestled formats correctly. - Fixed bug where the native listboxes didn't work correctly. - Fixed bug where font size selection in using the legacyoutput plugin would produce errors. - Fixed so block and blockquote formats remove their matching element regardless of it's attributes. -Version 3.3.1 (2010-03-18) - Added new live resize feature, the editor contents is now visible while resizing. - Fixed bug where some valid_element patterns would produce an unknown property error. - Fixed bug where it wasn't possible to toggle off blockquotes. - Fixed bug where an undo level wasn't produced when applying formatting using the styles dropdown. - Fixed bug where IE 6/7 wouldn't perform caret formatting due to a focus/event bug in IE. - Fixed bug where undo/redo wasn't restoring the previous selection correctly. - Fixed bug where the caret would become invisible if you resized the editor in latest Gecko. - Fixed bug where the class attribute wasn't completely removed in IE 6/7 when the removeClass function was used. - Fixed so the matchNode method of the Formatter class returns the matched format rule. - Fixed so it's possible to apply formatting to both blocks and as inline elements. -Version 3.3 (2010-03-10) - Fixed bug where backspace on a table on IE would produce an empty tbody and some JS exceptions. - Fixed bug where some redundant children wasn't removed properly when applying inline styles to them. - Fixed bug where Chrome would produce incorect dialog sizes if the inlinepopups plugin wasn't used. - Fixed bug where spans with different classes would get merged if they where siblings to each other. - Fixed bug where IE 8 would crash if you used the spellchecker. - Fixed bug where Input Method for non western languages didn't work correctly. - Fixed bug where the UI would render incorrectly in FF 3.6 on Mac due to a bug n their rendering engine. - Fixed bug where WebKit wouldn't scroll down correctly if Shift+Enter was used. Patch contributed by Thomas Andersen. -Version 3.3rc1 (2010-02-23) - Fixed bug with new legacyoutput plugin not working correctly on it's own. - Fixed bug some performance issues with removing text formats. - Fixed bug where TinyMCE specific attributes wasn't removed properly by remove format. - Fixed bug where it wasn't possible to align images within inline elements. - Fixed bug where Ctrl+Delete/Backspace would produce an invalid argument exception on IE. - Fixed bug where the search/replace logic could produce an infinite loop on IE for reverse searches. - Fixed bug where cloning formats in cells didn't work properly on IE. - Fixed bug where IE6 would produce a horizontal scroll bar. - Fixed so remove jQuery method removes the TinyMCE instance as well as the specified textarea. - Fixed so selected rows and cells gets updated using the row/cell properties dialogs. -Version 3.3b2 (2010-02-04) - Fixed bug where sometimes img elements would be removed by split method in DOMUtils. - Fixed bug where merging of span elements could occur on bookmark nodes. - Fixed bug where classes wasn't properly removed when removeformat was used on IE 6. - Fixed bug where multiple calls to an tinyMCE.init with mode set to exact could produce the same unique ID. - Fixed bug with the IE selection implementation when it was feeded an document range. - Fixed bug where block elements formatting wasn't properly removed by removeformat on all browsers. - Fixed bug where selection location was lost if you performed a manual cleanup. - Fixed bug where removeformat wouldn't remove span elements within styled block elements. - Fixed bug where an error would be thrown if you clicked on the separator lines in menus. - Fixed bug with the jQuery plugin adding always adding a querystring value to other resources. - Fixed bug where IE would produce an error message if you had an empty editor instance. - Fixed bug where Shift+Enter didn't produce br elements on WebKit browsers. - Fixed bug where a temporary marker element wasn't removed by the paste plugin. - Fixed bug where inserting a table would produce two undo levels instead of one. -Version 3.3b1 (2010-01-25) - Added new text formatting engine. Fixes a lot of browser quirks and adds new possibilities. - Added new advlist plugin that enables you to set the formats of list elements. - Added new paste plugin logic that enables you to retain style information from Office. - Added new autosave plugin logic that automatically saves contents in local storage. - Added new valid_styles option. Adds the possibility to restrict styles and their order. - Added new theme_advanced_runtime_fontsize option to display the runtime font size in font size select box. - Added new jquery plugin version that handles the gzip compressor amongst other things. Contributed by Speednet. - Added new $ function to tinymce namespace and editor instances for the jQuery build. - Added the possibility to get editors by index as well as name in the tinyMCE.editors collection. - Fixed so the contents inside the editor renders in standards mode by default. - Fixed bug where it wasn't possible to move the caret on short documents running in standards mode on IE. - Fixed bug where the decode method of the DOMUtils class could end up in an endless loop. - Fixed bug where it was possible to bypass the paste cleanup on non IE browsers if you clicked while pasting. - Fixed bug where some attributes wasn't serialized correctly on IE if wildcard attribute patters where used. - Fixed bug where entity decoding was performed on strings that didn't have any valid entities in them. - Fixed bugs with the insertNode method of the IE DOMRange implementation. Patch contributed by Scott McNaught. - Rewrote the getBookmark/moveToBookmark selection logic to boost performance on larger documents. - Rewrote the table plugin to include new cell selection logic and fixed various bugs and issues. - Merged the tinyMCE, tinymce and tinymce.EditorManager into the same instance makes more sense. - Removed browser setting since the browser support for TinyMCE is not far better than it was when that setting was introduced. - Changed the mce_ attribute prefix to the more standard _mce_ prefix. This is similar to browser vendors prefixes. - Optimized performance with named entities on Gecko. Regexp replace was executing very slowly probably due to a Gecko bug. - Optimized performance of the IE specific selection/range implementation. - Removed the safari plugin since we now replaced all text formatting logic to custom code. -Version 3.2.7 (2009-09-22) - Fixed bug where uppercase paragraphs could still produce an invalid DOM tree on IE. - Fixed bug where split command didn't work on WebKit since the node serializer needs a real document to work with. - Fixed bug where it was impossible in Gecko to place the caret before a table if it was the first one. - Fixed bug where linking to urls like ../../ would produce an extra traling slash ../..//. - Fixed bug where the template cdate functionality was using an old 2.x API call. Patch contributed by vectorjohn. - Fixed bug where urls to the same site but different protocol would be converted when relative_urls where set to false. Patch contributed by Ted Rust. - Fixed bug where the paste plugin would remove mceItem prefixed classes. - Fixed bug where the paste plugin would sometimes add items in a reverse order on WebKit. - Fixed bug where the paste buttons would present an error message on Gecko even if you changed user.js. Patch contributed by Todd (teeaykay). - Fixed bug where Opera would crash if you had tables incorrectly placed inside paragraphs. - Fixed bug where styles elements wasn't properly processed if you had bad input HTML. - Fixed bug where style attributes wasn't properly forced into a specific format. - Fixed bug and issues with boolean attributes like checked, nowrap etc. - Fixed bug where input elements could override attributes on form elements. - Fixed bug where script or style elements could get modified by the DOMUtils processHTML method. - Fixed bug where the selected attribute could get lost when force root blocks logic got executed on IE. Patch contributed by Attila Mezei-Horvati. - Fixed bug where getAttribs method didn't handle boolean attributes correctly on IE. - Fixed so the paste from word dialog is presented if you paste content on an IE with to restrictive security settings. - Fixed so the paste_strip_class_attributes option is set to none by default in the paste plugin. - Removed default border=0 on tables for the default value of valid_elements. -Version 3.2.6 (2009-08-19) - Added new wordcount plugin, this will display the number of typed words as you write. Contributed by Andrew Ozz. - Added new getNext and getPrev methods to DOM utils. These will return the first matching sibling. - Fixed bug where it was impossible to place the caret after a table on Gecko. It will now add a paragraph after tables. - Fixed bug where inline dialogs would fail if used in a window opened using a showModalDialog. Patch contributed by Derek Britt. - Fixed bug where IE could sometimes render a unknown runtime error on invalid input HTML. - Fixed bug where some incorrectly placed tables wouldn't be moved outside the paragraphs on IE. - Fixed bug where uppercase script/style element wouldn't be handled correctly and converted to valid lowercase. - Fixed bug where some WebKit versions on Mac OS X would produce issues with hidden select fields. - Fixed bug where the media plugin would fail on WebKit since the node wasn't properly imported to the right document. - Fixed bug where absolute URLs for the TinyMCE script using a base href element would cause loading problems in IE 6/7. - Fixed bug where pasting using the paste plugin wasn't possible on IE with to restrictive security settings. - Fixed bug where pasting of whitespace was impossible using the new custom paste method. - Fixed bug where pasting on some WebKit browsers would not work if you pasted specific contents due to a WebKit bug. - Fixed bug where doctypes with multiple lines would not be parsed correctly by the fullpage plugin. Patch contributed by Colin. - Fixed bug where the autoresize plugin would break the fullscreen functionality. - Fixed bug where tables would be chopped up running on IE using invalid contents and pasting paragraphs into a cell. - Fixed bug where the each method of jQuery build didn't iterate styleSheets. We now use the TinyMCE API one instead. - Fixed bug where auto switching to paragraphs after headers some times failed in Gecko. - Fixed so all editor options gets passed to the Serializer class. Patch contributed by Jasper Mattsson. - Fixed so script/style blocks isn't wrapped in paragraphs as other inline elements. - Fixed so the XHR requests sends the X-Requested-With HTTP header. - Fixed so the data url scheme is handled in the tinymce.util.URI class. - Changed inline documentation to use moxiedoc style comments. - Removed the compat2x plugin people should have upgraded to the 3.x API by now. 3.0 was released more then a year ago. - Re-added Gecko specific message for users who doesn't understand the security concept regarding paste. -Version 3.2.5 (2009-06-29) - Added new jQuery plugin for the jQuery specific package. This enables you to more easily load and use TinyMCE. - Added new autoresize plugin contributed by Peter Dekkers. This plugin will auto resize the editor to the size of the contents. - Fixed so all packages have the same directory structure. Previous releases had a different structure for the production package. - Fixed so the paste from word dialog forces the contents to be processed as word contents even if it's not. - Fixed so the jQuery build adapter build works. It's currently only excluding Sizzle. - Fixed so noscript element contents is retained during the editing process. - Fixed bug where the getBookmark method would need a "simple" string input when the documented way is a boolean. - Fixed bug where invalid contents could break the fix_table_elements logic. - Fixed bug where Sizzle specific attributes would be serialized if the valid_elements was set to *[*]. - Fixed bug where IE would produce an error if you specified a relative content_css and opened the paste dialog. - Fixed bug where pasting images on IE would produce broken images if they came from an external site. - Fixed bug where memory was leaked if you add/remove controls dynamically. Some event handlers wasn't removed properly. - Fixed bug where domain relaxing wasn't treated correctly if you added it after the TinyMCE script element. - Fixed bug where the activeEditor wasn't set to null if the last editor instance was removed. - Fixed bug where IE was leaking memory on the onbeforeunload event due to some recently introduced logic. Patch contributed by Options. - Fixed bug where inserting tables in Safari 4 didn't work due to a new WebKit bug where some element names are reserved. - Fixed bug where URLs having a :// value in the query string would make it absolute regardless of URL settings. - Fixed the WebKit specific bug where DOM Ranges would fail if the node wasn't attached to something in a different way. - Removed the auto_resize option and the resizeToContent method from the tinymce.Editor class. Use the new autoresize plugin instead. -Version 3.2.4.1 (2009-05-25) - Fixed bug where Gecko browsers would produce an extra space after for example strong when loaded from sub domains. - Fixed bug where script elements would be removed if they where placed inside a paragraph element. - Fixed bug where IE 8 would produce 1 item remaining when loading CSS files dynamically with an empty cache. - Fixed bug where bound events would be removed from other editor instances if a specific one was removed. - Fixed various bugs and issues with script and style elements inside the editor. - Fixed so all script contents gets wrapped in CDATA sections so that they can be parsed using a XML parser. - Fixed so it's impossible for elements marked as closed to have child nodes rendered in output. -Version 3.2.4 (2009-05-21) - Added new paste_remove_styles/paste_remove_styles_if_webkit option to paste plugin concept contributed by Hadrien Gardeur. - Added new functionality to paste plugin contributed by Scott Eade aka monkeybrain. - Added new paste_block_drop option to the paste plugin this is disabled by default and will block any drag/drop event. - Added new bind/unbind methods to DOMUtils these works like Event.add/Event.remove but is easier to access. - Added new paste_dialog_width/paste_dialog_height options to paste pluign. Enables you to change the dialog sizes. - Fixed bug on IE 8 where it would sometimes produce a "1 item remaining" status message that would never finish. - Fixed bug on Safari 4 beta that would produce DOM Range exceptions on the DOMUtils split method since the browser has a bug. - Fixed bug where the paste plugin could accidentally think that some word sentences was supposed to be list elements. - Fixed bug where paste plugin would produce one extra empty undo level on some browsers. - Fixed bug where spans wasn't produced correctly on new line when the keep_styles option was enabled. - Fixed bug where the caret would be placed at the beginning of contents in IE 8 if you selected colors from the color pickers. - Fixed so the Event class is a normal class instead of a static one. The tinymce.dom.Event is now a global instance of that class. - Fixed so internal events for instances gets removed when the DOMUtils instance is removed. - Fixed so preventDefault and stopPropagation methods can be used on the event object in all browsers. -Version 3.2.3.1 (2009-05-05) - Fixed bug where paragraphs containing form elements such as input or textarea would be removed. - Fixed bug where some IE versions would produce a wrapper function for events attributes. - Fixed bug where table cell contents could be removed if you pressed return/enter at the end of the cell contents. - Fixed bug where the paste plugin would remove a extra character if the selection range was collapsed. - Fixed bug where creating tables with % width wouldn't be handled correctly on WebKit browsers. -Version 3.2.3 (2009-04-23) - Added new paste plugin logic. This new version will autodetect Word contents and clean it up. - Added a optional root element argument to getPos so you can tell it where to stop the calculation. - Added new DOM ready logic to remove the usage of document.write. We now use basically the same method as jQuery. - Fixed bug where WebKit browsers would fail when selecting all contents in the area using Ctrl+A. - Fixed bug where IE would produce paragraphs with empty inline style elements. - Fixed bug where WebKit browsers would fail when inserting tables with a non pixel width. - Fixed bug where block elements could get a redundant br element at the end of the element. - Fixed bug where the tabfocus plugin only worked with a single editor instance on page. - Fixed bug where IE 8 was loosing caret position if the selection was collapsed and a menu was clicked. - Fixed bug with application/xhtml+xml mode where menus wasn't working properly. - Fixed bug where the onstop workaround fix for IE would produce errors in an ASP update panel. - Fixed bug where the submit function override could produce errors if executed in the wrong scope. - Fixed bug where the area element wasn't closed by a short ending. - Fixed various number issues in the style plugins properties dialog. Contributed by datpaulchen. - Fixed issues with size suffix values in the style plugin dialog. - Fixed issue where hasDuplicate variable would leak out to the global space due to a bug in the Sizzle engine. - Fixed issue where the paste event would fire a dialog warning on IE since we extracted the text contents. - Updated Sizzle engine to the latest version, this version fixes a few bugs that was reported. -Version 3.2.2.3 (2009-03-26) - Fixed regression bug with the getPos method, it would return invalid if the view port was to small. -Version 3.2.2.2 (2009-03-25) - Fixed so the DOMUtils getPos method can be used cross documents if needed. - Fixed bug where undo/redo wasn't working correctly in Gecko browsers. -Version 3.2.2.1 (2009-03-19) - Added support for tel: URL prefixes. Even though this doesn't match any official RFC. - Fixed so the select method of the Selection class selects the first best suitable contents. - Fixed bug where the regexps for www. prefixes for link and advlink dialogs would match wwwX. - Fixed bug where the preview dialog would fail to open if the content_css wasn't defined. Patch contributed by David Bildström (ChronoZ). - Fixed bug where editors wasn't converted in application/xhtml+xml mode due to an issue with Sizzle. - Fixed bug where alignment would fail if multiple lines where selected. - Updated Sizzle engine to the latest version, this version fixes a few bugs that was reported. -Version 3.2.2 (2009-03-05) - Added new CSS selector engine. Sizzle the same one that jQuery and other libraries are using. - Added new is and getParents methods to the DOMUtils class. These use the new Sizzle engine to select elements. - Added new removeformat_selector option, enables you to specify a CSS selector pattern of elements to remove when using removeformat. - Fixed so the getParent method can take CSS expressions when selecting it's parents. - Added new ant based build process, includes a new javabased preprocessor and a yuicompressor ant task. - Moved the tab_focus logic into a plugin called tabfocus, so the old tab_focus option has been removed from the core. - Replaced the TinyMCE custom unit testing framework with Qunit and rewrote all tests to match the new logic. - Moved the examples/testcases to a root directory called tests since it now includes slickspeed. - Fixed bug where nbsp wasn't replaced correctly in ForceBlocks.js. Patch contributed by thorn. - Fixed bug where an dom exception would be thrown in Gecko when the theme_advanced_path path was set to false under xml application mode. - Fixed bug where it was impossible to get out of a link at the end of a block element in Gecko. - Fixed bug where the latest WebKit nightly would fail when changing font size and font family. - Fixed bug where the latest WebKit nightly would fail when opening dialogs due to changes to the arguments object. - Fixed bug where paragraphs wasn't added to elements positioned absolute using classes. - Fixed bug where font size values with dot's like 1.4em would produce a class instead of the style value. - Fixed bug where IE 8 would return an incorrect position for elements. - Fixed bug where IE 8 would render colorpicker/filepicker icons incorrectly. - Fixed bug where trailing slashes for directories in URLs would be removed. - Fixed bug where autostart and other boolean values in the media dialog wouldn't be stored/parsed correctly. - Fixed bug where the repaint call for the media plugin wouldn't be executed due to a typo in the source. - Fixed bug where id attribute of object elements wasn't kept intact by the media plugin. - Fixed bug where preview of embeded elements when the media_use_script option was used would fail. - Fixed bug where inlinepopups could be rendered at an incorrect location on IE 6 while dragging. - Fixed bug where the blocker shim could be placed at an incorrect location on IE 6. - Fixed bug where the multiple and size attributes of select elements would produce incorrect values while running in IE. - Fixed bug where IE would loose the caret position is you selected a color from the color drop down. - Fixed bug where remove format wouldn't work on IE since it couldn't remove span elements that had style information. - Fixed bug where Opera was removing links when removing formatting from selected contents. - Fixed bug where paragraphs could be produced inside non positional elements styled with the CSS position value of static. - Fixed bug where removeformat wouldn't work if you selected part of a span in IE. - Fixed bug where media plugin didn't retain the style attribute on embed/object elements. - Fixed bug where auto focus on empty editor instances could produce strange results if you inserted an image into it. - Fixed bug where   characters would be removed in FF when inserted with the mceInsertContent or selection.setContent methods. - Fixed bug where warning message of missing paste support wasn't displayed on WebKit browsers. - Fixed bug where anchor links could include other links. The selected range is now unlinked before adding news links to it. - Fixed memory leak when TinyMCE was used with prototype. Patch contributed by James Ots. - Fixed so the non documented fullpage_hide_in_source_view option for the fullpage plugin works again in the 3.x branch. - Fixed so tables doesn't get inserted into paragraphs by default since it's not W3C valid. Can be disabled by using the fix_table_elements option. - Fixed so the source view dialog sets a source_view state to the event object. Enables plugins to intercept the source view mode. - Fixed various validation issues with the html dialogs and pages. - Removed ask mode option since there is way better ways of doing this now. Use the add/remove control methods instead. - Removed logic for compatibility with Safari 2.x, this browser is no longer supported since no one is using it. - Removed the auto domain relaxing feature. If loading scripts cross sub domains it's better to specify the document.domain by hand. -Version 3.2.1.1 (2008-11-27) - Added new theme_advanced_default_background_color/theme_advanced_default_foreground_color options. Patch contributed by David Bildström (ChronoZ). - Fixed font style formatting compatibility issue with Adobe Air. - Fixed so legacy font elements get converted into spans even if cleanup_on_startup isn't enabled. - Fixed bug where pre elements could be incorrectly modified by an IE bug workaround. Patch contributed by hu vime. - Fixed bug where input elements inside inlinepopups wasn't editable in Firefox 2. - Fixed bug where the xhtmlxtras plugin wasn't replacing attribute values correctly. - Fixed bug where menu buttons in skin variants would look strange due to IE 8 fixes. - Fixed bug where WebKit browsers would on backspace take you back to the previous page if the editor was empty. - Fixed bug where DOMUtils decode method wouldn't handle strings larger than 4096kb due to node chunking. - Fixed bug where meta key wasn't handled as ctrl key on Mac OS X for custom keyboard short cuts. - Fixed bug where init event would get fired twice on WebKit on Mac OS X. -Version 3.2.1 (2008-11-04) - Added support for custom icon image for drop menus. Use icon_src to set a custom image directly. - Added new media_strict option to media plugin. Enables you to control if the flash embed is strict or not. Enabled by default. - Fixed so the editors script files gets dynamically loaded without using XHR or eval. - Fixed so the media plugin outputs valid XHTML object elements for Flash movies. Can be disabled with the media_strict option. - Fixed so dynamic loading doesn't require eval calls on non IE browsers for better Air support. - Fixed bug where the editor wasn't treated as empty if the remaining paragraph had attributes. - Fixed bug where id's of elements was removed ones they got wrapped in paragraphs. Patch contributed by ChronoZ. - Fixed bug where WebKit browsers where placing list elements inside paragraph elements. - Fixed bug where inserting images or links would produce absolute urls on WebKit browsers. - Fixed bug where values for checked, readonly, disabled and selected attributes was incorrect on IE. - Fixed bug where positive values for checked, readonly, disabled and selected attributes wasn't forced to valid values. - Fixed bug where selecting the first option in a native select box would produce an undefined error. - Fixed bug where tabindex 32768 could be outputted on IE if element attributes where cloned. - Fixed bug where the media dialogs preview window would display incorrect contents due to duplicate clsid prefixes. - Fixed bug where non pixel or percent heights for textarea elements would produce errors on IE. - Fixed bug where cdata sections in script elements wasn't handled correctly. - Fixed bug where nowrap of table cells would produce a 65535 value output. - Fixed bug where media plugin would produce an error if you selected the first item in the items list. - Fixed bug where media plugin would modify links with the item _value in them. - Fixed so table width/height is better forced if inline_styles is enabled. Patch contributed by daKmoR. - Fixed css for IE 8 such as opacity and other rendering quirks. -Version 3.2.0.2 (2008-10-02) - Fixed bug where the SelectBox and NativeSelectBox wasn't updated correctly if undefined was passed to them. - Fixed bug where the style dropdown wasn't correctly changed back to it's original state when element had no class. - Fixed bug where multiple pending font styles wasn't handled correctly. - Fixed so you can disable all auto css loading for dialogs by setting the popups_css option to false. -Version 3.2.0.1 (2008-09-17) - Fixed bug where font sizes and faces wouldn't be changed correctly when there was a parent with a different style. - Fixed bug where adding fonts to the same selection would produce redundant spans. -Version 3.2 (2008-09-11) - Added new text style support, it will now use span elements internally instead of font elements. - Added new improved support for the theme_advanced_font_sizes option, check the Wiki for details. - Added new keep_style setting that maintains the text style on return/enter on non IE browsers, enabled by default. - Added new onBeforeSetContent/onBeforeGetContent/onSetContent/onGetContent events to the Selection class. - Added new selectByIndex method to ListBox class. This enables you to select list items by an index instead of a value. - Added new possibility to the select method of the ListBox class. This can now have a selector function as it's value argument. - Added new possibility to skip the loading of popups css by setting the feature popup_css to the value false. - Added new possibility to skip translation of popups by setting the translate_i18n feature to false. - Added new element_format option enables you to produce HTML element endings instead of XHTML. But we are still in the XHTML is better camp. - Added missing allowfullscreen and quality options for flash elements, this will now get correctly stored. - Fixed bug where table cell dialog didn't close properly unless the accessibility_warnings option was set to false. - Fixed bug where the modal dialog blocker element for inlinepopups wasn't placed at a correct location if the page had scroll. - Fixed bug where non inline dialogs didn't close correctly if the inlinepopups plugin was used. - Fixed bug where non inline dialogs could make the modal dialog blocker to work incorrectly. - Fixed bug where style select wasn't populated correctly if you pressed the arrow. Patch by Hari Karam Singh. - Fixed bug where toggling the fullscreen mode didn't restore scrollbars on IE when the editor was inside a frame. Patch by Jacob Barrett. - Fixed bug where inserting flash contents using the template plugin didn't work correctly. - Fixed bug where inserting flash contents using the selection.setContent or mceInsertContent command didn't work correctly. - Fixed bug where IE would produce an exception if a comment started with -. - Fixed bug where the blockquote button would wrap lists incorrectly on non IE browsers. - Fixed bug where Opera would display BR elements in the element path. - Fixed bug where xhtmlxtras didn't insert elements correctly on IE. - Fixed bug where the buttons wasn't activated correctly in the xhtmlxtras plugin. - Fixed bug where adding an object as the style attribute for the dom setAttribs method wouldn't work. - Fixed bug where the background color would bleed out to parent container element in Gecko. - Fixed bug where the insert column actions for tables would fail if you did it in a thead or tfoot. Patch contributed by T Andersen (tan73). - Fixed bug where event blocker element wasn't positioned correctly for the inlinepopups plugin. - Fixed bug where pasting from Office 2007 would produce an odd comment in the contents. - Fixed bug where the paste as plain text could remove an extra character. Patch contributed by Speednet. - Fixed bug where some characters where missing for the paste_replace_list option. Patch contributed by Speednet. - Fixed bug where removing non existing editor instances by the mceRemoveControl command would produce an error. - Fixed bug where meta elements with the name description would produce errors in IE. - Fixed bug where color and background colors wouldn't be updated properly. - Fixed bug where the createMenuButton of tinymce.ControlManager didn't implement the last class argument. - Fixed bug where the editor_css option was relative from the TinyMCE installation directory not the current page. - Fixed bug where elements wouldn't be padded if the element contained bogus br elements. For example TD elements. - Fixed bug where parsing of in fullpage plugin would produce an error. - Fixed bug where relative urls with just ./ would become an empty string. - Fixed bug where outdent button would be disabled if inline_styles where set to false. - Fixed bug where replace with an empty search string would produce an error on IE. - Fixed bug where restoring the overflow state of the body in fullscreen plugin running on IE would produce vertical scrollbars. - Fixed bug where pressing return/enter in list items would sometimes move the caret the to top of the content area in FF. - Fixed bug where the style listbox wouldn't be updated correctly if you used the use_native_selects option. - Fixed bug where WebKit browsers would produce a div element when ending list elements using return. - Fixed so translation of popup contents only occurs if it's needed. - Optimized the URI object in regards or converting absolute URIs to relative URIs. -Version 3.1.1 (2008-08-18) - Added new getSize method to DOMUtils it will return the dimensions only of an element. - Added new alert/confirm methods to the tinyMCEPopup class to prevent focus problems and also to shorten method calls. - Added new plugin_preview_inline option to preview plugin to enable/disable native/inline dialogs. - Added new readonly option. If this is set the editor will only display the contents for the user. - Added missing tabindex and accesskey to input elements in the default valid_elements setup. - Updated firebug lite to 1.2, to enable it use the tiny_mce_dev.js?debug=1 on the development package. - Fixed so the preview dialog in the preview plugin uses inline dialogs/popups. - Fixed so CDATA sections remains intact through the serialization process of the DOM tree. - Fixed various issues with the getAttrib command. It will now return more correct values. - Fixed bug where the embed element wasn't properly parsed in the media plugin it now supports 3 formats. - Fixed bug where the noshade attribute was serialized incorrectly on IE. - Fixed bug where editing an existing link element didn't force it relative. - Fixed bug where image link creation fails on Safari if the image is aligned. - Fixed bug where it was possible to scroll the fullscreen mode in Opera 9.50. - Fixed bug where removal of center image alignment would fail. Patch contributed by Andrew Ozz. - Fixed bug where inlinedialogs didn't work properly if the doctype was incorrect in IE. - Fixed bug where cross domain loading didn't work correctly in Opera 9.50. - Fixed bug where breaking huge text blocks with return/enter key would scroll to end of block. - Fixed bug where replace button kept inserting the replacement text even if there is no more matches. - Fixed bug with fullpage plugin where value wasn't set correctly. Patch contributed by Pascal Chantelois. - Fixed bug where the dom utils setAttrib method call could produce an exception if the input was null/false. - Fixed bug where pressing backspace would sometimes remove one extra character in Gecko browsers. - Fixed bug where the native confirm/alert boxes would move focus to parent document if fired in dialogs. - Fixed bug where Opera 9.50 was telling you that the selection is collapsed even when it isn't. - Fixed bug where mceInsertContent would break up existing elements in Opera and Gecko. - Fixed bug where TinyMCE fails to detect some keyboard combos on Mac, contributed by MattyRob. - Fixed bug where replace all didn't move the caret to beginning of text before searching. - Fixed bug where the oninit callback wasn't executed correctly when the strict_loading_mode option was used, thanks goes to Nicholas Oxhoej. - Fixed bug where a access denied exception was thrown if some other script specified document.domain before loading TinyMCE. - Fixed so setting language to empty string will skip language loading if translations are made by some backend. - Fixed so dialog_type is automatically modal if you use the inlinepopups plugin use dialog_type : "window" to re-enable the old behavior. -Version 3.1.0.1 (2008-06-18) - Fixed bug where the Opera line break fix didn't work correctly on Mac OS X and Unix. - Fixed bug where IE was producing the default value the maxlength attribute of input elements. -Version 3.1.0 (2008-06-17) - Fixed bug where the paste as text didn't work correctly it encoded produced paragraphs and br elements. - Fixed bug where embed element in XHTML style didn't work correctly in the media plugin. - Fixed bug where style elements was forced empty in IE. The will now be wrapped in a comment just like script elements. - Fixed bug where some script elements wrapped in CDATA could fail to be serialized correctly. - Fixed bug where FF 3 produced -moz- internal styles in some style attributes. - Fixed bug where query strings and external URLs didn't work correctly in style attributes. - Fixed bug where shape attribute of area elements got serialized as rect regardless of it's initial value in IE 6. - Fixed bug where selection of elements inside layers would fail in IE since focus was moved to the document body. - Fixed bug where pressing enter/return in an editable select box would produce an __mce_add_custom__ class value. - Fixed bug where changing font size of text placed inside a colored text chunk would remove the parent node. - Fixed bug where Opera 9.5 final produced a strange line break behavior due to a workaround for previous Opera versions. - Fixed bug where text/background color would produce a strange focus problem when you tried to click on the body in IE. - Fixed issue where selecting the title of an listbox equals the old 2.x behavior of changing the value to an empty string. - Fixed issue where it was common for the media plugin to break if the _value attribute wasn't added for the param element. - Fixed issue where the wrong parent editor instance might be updated if you use fullscreen mode in an incorrect way. - Fixed issue where Safari was producing a warning about the base element not being closed correctly. - Removed redundant form element name matching from regexp in the DOMUtils class. -Version 3.0.9 (2008-06-02) - Added new contextmenu_offset_x/contextmenu_offset_y options for the contextmenu plugin. - Added cite attribute to the default rule for the blockquote element. - Added support for using arrow keys for selection of items in listboxes. - Added support for using arrow keys for selection of items in dropmenus. - Fixed bug where blockformat change on elements with BR inside them didn't change correctly on Firefox. - Fixed bug where removing table rows inside thead or tfoot would remove the whole table if it was the last one. - Fixed bug where XHR synchronous mode didn't execute the callback handlers synchronously. - Fixed bug where setting border to 0 didn't add border: 0 to the style attribute when using the advimage dialog. - Fixed bug where the selection of images and table cells didn't work correctly when the editor is placed in a frame and running on IE. - Fixed bug where the store/restore of a selection didn't work correctly in non IE browsers. - Fixed bug where only the first element would be invalid for the invalid_elements option. - Fixed bug where paste as plain text didn't encode the characters correctly when they where inserted. - Fixed bug where HTML source window couldn't be maximized on Gecko when the maximizable feature was enabled. - Fixed bug where color selection using the color picker could produce exception in IE. - Fixed bug where font size changes could produce produce extra redundant elements. - Fixed bug where IE could produce unknown runtime error if you replaced a image with another image from a separate frame. - Fixed bug where the domLoaded state for the Event class wasn't set correctly if the editor was loaded dynamically using the gzip compressor. - Fixed bug where handling of the base element for a page would produce incorrect urls. Based on a patch contributed by John LeSueur. - Fixed bug where table constraint alert boxes was presented with an empty value and wasn't the skinned inline ones. - Fixed bug where the onChange event wasn't fired when the form was submitted. It's now also triggered when the save method is called. - Fixed bug where encoding set to xml didn't work as expected. It now encodes the contents into XML entities. - Fixed bug where numrows didn't work correctly for the merge cells dialog of the table plugin. - Fixed bug where the onGetContent event was fired even when the no_events flag was set. - Fixed bug where the preview panels for the advimage and the media plugin could overflow on Safari and FF 3. - Fixed bug where the editing and removal of abbr elements using the xhtmlxtras plugin working correctly on IE. - Fixed bug where save button in the save plugin didn't work correctly on IE. - Fixed bug where dragging layers didn't work as expected since it would snap back to it's original location if you saved. - Fixed bug where the description of the template plugin dialog wasn't updated correctly. - Fixed bug where the values for frame and rules in the table dialogs where swapped. - Fixed bug where the elements like ins, del, cite, acronym and abbr didn't have the default editing style as the old 2.x branch. - Fixed bug where ask mode would lock the focused textarea if you pressed cancel in the confirm dialog on FF 3. - Fixed bug where ask mode would produce contents for empty textareas if you reloaded the page. - Fixed so the onGetContent event gets the full pass through object just like the other events. - Fixed so attributes for block elements remains the same when you change format of a element. -Version 3.0.8 (2008-04-30) - Fixed bug where IE would produce an error if textareas without names where converted. - Fixed bug where editor wasn't forced empty when there was only a single br or empty paragraph left. - Fixed bug where IE would produce an warning message if object elements where produced in the media plugins preview running on https. - Fixed bug where new addVer function didn't handle hash items correctly. Patch contributed by Mirek Burkon. - Fixed bug where font_size_style_values option wasn't applied correctly to fonts inside the editor. - Fixed bug where image selection could be lost if a image was edited using context menu on IE. - Fixed bug where style values wasn't updated properly due to an invalid regexp. - Fixed bug where IE 6 where displaying warning message about insecure items when inserting an image while using https. Patch contributed by Norifumi Sunaoka. - Fixed bug where IE was producing an auto save message if you selected a color from the color split button. - Fixed bug where backspace sometimes would move the caret to the end of the previous block in Gecko. - Fixed bug where the rowlayout manager didn't work as described in the documentation. - Fixed bug where the default options for the fullpage plugin wasn't applied correctly. - Fixed bug where selection would jump one character if you applied a styles to a words in non IE browsers. - Fixed bug where undo levels wasn't added correctly if you went back in undo history and added a new event. - Fixed bug where font size dropdown didn't mark the selected size in IE. - Fixed bug where the size of the editor was determined using clientWidth instead of offsetWidth. - Fixed so the onchange event doesn't fire on the initial undo level, it will also fire when the editor is blurred. - Fixed so the advhr plugin produces XHTML valid output instead of non standard attributes. - Fixed so blockquote gets converted into [quote] in when the bbcode plugin is enabled. - Fixed so theme_advanced_font_sizes can be named for example Font 1=1, Font 2=2 etc. - Fixed so editor_selector/editor_deselector can be regexps. By default only strings are allowed not part regexps like before. - Fixed so that the version suffix is optional. It still requires the build process so you need to export it manually. - Fixed so it's possible to tab to table cells in non Gecko browsers and also produce new rows if you tab at the end of a table. Contributed by Josh Peek. -Version 3.0.7 (2008-04-14) - Added new version suffix to all internal GET requests to make sure that the users cache gets cleared correctly. - Fixed issue with isDirty returning true event if it wasn't dirty on IE due to changes in tables during initialization. - Fixed memory leak in IE where if a page was unloaded before all images on the page was loaded it would leak. - Fixed bug in IE where underline and strikethrough could produce an exception error message. - Fixed bug where inserting paragraphs in totally empty table cells would produce odd effects. - Fixed bug where layer style data wasn't updated correctly due to some performance enhancements with the DOM serializer. - Fixed bug where it would convert the wrong element if there was two elements with the same name and id on the page. - Fixed bug where it was possible to add style information to the body element using the style plugin. - Fixed bug where Gecko would add an extra undo level some times due to the blur event. - Fixed bug where the underline icon would get active if the caret was inside a link element. - Fixed bug where merging th cells not working correctly. Patch contributed by André R. - Fixed bug where forecolorpicker and backcolorpicker buttons where rendered incorrectly when the o2k7 skin was used. - Fixed bug where comment couldn't contain -- since it's invalid markup. It will now at least not break on those invalid comments. - Fixed bug where apos wasn't handled correctly in IE. It will now convert apos to ' on IE since that browser doesn't support that entity. - Fixed bug where entities wasn't encoded correctly inside pre elements since they where protected from whitespace removal. - Fixed bug where color split buttons where rendered incorrectly on IE6 when using the non default theme. - Fixed so caret is placed after links ones they are created, to improve usability of the editor. - Fixed so you can select tables by clicking on it's borders in non IE browsers to normalize the behavior. - Fixed so the menus can be toggled by clicking once more on the icon in listboxes, menubuttons and splitbuttons based on code contributed by Josh Peek. - Fixed so buttons can be labeled, currently only works with the default skin, so it's kind of experimental. Patch contributed by Daniel Insley. - Fixed so forecolorpicker and backcolorpicker remembers the last selected color. Patch contributed by Shane Tomlinson. - Fixed so that you can only execute the mceAddEditor command once for the same instance name. - Fixed so command functions added with addCommand can pass though the call to default handles if it returns true. -Version 3.0.6.2 (2008-04-07) - Fixed bug where empty tables couldn't be edited correctly on non IE browsers if they where loaded into the editor. - Fixed bug where it was impossible to resize layers correctly in IE since it thought it was an image. - Fixed bug where an editor instance was stealing focus in IE resulting in a scroll to the editor on page reloads. - Fixed bug where Safari was crashing on Mac OS X if you closed dialogs using the Esc key. -Version 3.0.6.1 (2008-04-04) - Added support for the missing mceAddFrameControl command. The input for this command has changed so consult the Wiki. - Fixed bug where sub menus for the drop menus would leave an empty element behind. - Fixed memory leak in IE if the editor was placed in a frame or iframe. -Version 3.0.6 (2008-04-03) - Added elements to the default value of valid_elements option. It now contains all XHTML strict elements and a few transitional. - Added more accessibility fixes, it's now possible to navigate and close list boxes and split button menus with the keyboard. - Added missing getInfo method to the contextmenu and safari plugin, this caused problems for the Drupal module. - Added new inlinepopups_zindex option to the inlinepopups plugin so that you can configure the default start z-index. - Added new setControlType method to the tinymce.ControlManager class. This method enables you to override the default classes. - Added ability to specific an optional control class to use instead of the default one for the ControlManager methods. Based on concept by Josh Peek. - Fixed bug where attribute rules for the DOM Serializer couldn't contain - or _ characters in their names. - Fixed bug where inlinepopups event blocker and modal dialog blocker elements produced vertical scrollbars. - Fixed bug where there was a rendering issue with quirks mode in Safari moving the resize handle to an incorrect position. - Fixed bug with forecolor/backcolor controls on IE. Sometimes elements positioned relative will generate display errors. - Fixed bug where a p2 was leaking out in the global name space when you selected a color from the forecolor/backcolor controls. - Fixed bug where empty paragraphs didn't work as expected in browsers other than IE. - Fixed bug where the load method of the tinymce.dom.ScriptLoader didn't check if the file was already loaded. - Fixed bug where the load method for the PluginManager and ThemeManager didn't check if a plugin/theme by a specific name was all ready loaded. - Fixed bug where the theme_advanced_link_targets option didn't work correctly with the advanced themes link dialog. Patch contributed by Arnold B. - Fixed bug where the style command would merge classes into empty span elements. - Fixed bug where the style command would remove empty span elements outside the current selection. - Fixed bug where the fix for the Safari backspace bug removed all editor contents if it was filled with empty paragraphs. - Fixed bug where alert and confirm boxes opened by the inlinepopups plugin would produce an exception if domain relaxing was used. - Fixed bug where Safari was adding style attributes to all elements when you paste them into the editor. - Fixed bug where the spellchecker menus was visually incorrect since the space for the non existing icon was still there. - Fixed bug where remove_linebreaks option didn't remove line breaks inside the text contents of a element. - Fixed bug where Safari 3.1 was introducing _mc_tmp into paragraphs due to the new querySelectorAll and a TinyMCE specific workaround. - Fixed bug where getParam method in the Editor class was returning incorrect objects and would mess up the font drop down. Patch contributed by speednet. - Fixed bug where the table dialog would produce an exception in IE when you edited tables since it tried to place focus in a disabled field. - Fixed bug where class attribute on some span elements was removed on cleanup. - Fixed bug where resizing the editor in IE could produce an exception if the editor width/height got to be a negative value. - Fixed bug where wmv files wouldn't play since the src param was used instead of the url param. - Fixed bug where br elements would be added here and there in Gecko. Geckos internal _moz_dirty br elements where serialized as well. - Fixed bug where editing named anchors would produce two anchors instead of one updated one. - Fixed bug where arrow and function keys didn't work when an noneditable element was focused within the editor. - Fixed bug where the dispatcher could produce an exception if the listener list was altered inside an event callback. - Fixed bug where it was impossible to totally empty the editor contents on Safari due to an mistreatment of nbsp as whitespace. Patch contributed by Andrew Ozz. - Fixed bug where TinyMCE would not convert textareas with the same name attribute value. It will now generate an unique id for those textareas. - Fixed bug where backspace/delete key was deleting td elements inside tables while running on Gecko. - Fixed bug where Firefox 3.0b4 and Opera 9.26 where scrolling to the top of document when pressing return/enter. - Fixed bug where the template plugin wasn't just inserting the mceTmpl tagged element. - Fixed bug where the alert method of the default WindowManager implementation didn't translate input language strings like the inlinepopups dialog does. - Fixed bugs with the backspace behavior in Gecko. The caret was placed on incorrect locations in the DOM sometimes. - Fixed so advimage dialog and table dialogs has support for editable select boxes for the class value. - Fixed so the media, pagebreak and spellchecker doesn't load it's default content.css file if the content_css option is set to false. - Fixed so the paste_use_dialog option works again it's enabled by default but can be disabled on IE. Patch contributed by Speednet. - Fixed so that the fullscreen editor is focused when switching fullscreen editing on. - Fixed so it's possible to edit images and links inside tables using the context menu. - Fixed so table dialogs and the advanced image dialog doesn't loose selection in IE if the dialogs where navigated/submitted with the keyboard. - Fixed so the theme_advanced_blockformats options can have named items for example title 1=h1;title 2=h2. - Fixed so it's possible to add a custom editor_css for the simple theme. - Fixed quirks with directionality rtl, patch contributed by Andrew Ozz. - Fixed so the inlinepopups default start zIndex is 300000. - Fixed typo in media plugin Shockware is now replaced with Shockwave. - Fixed psuedo memory leak in IE with the replaceChild method inside the DOMUtils.replace method. - Fixed so memory is released when an editor instance is removed from page. - Optimized the color split button menus so that they use less event handlers. - Removed the util/mclayer.js file since it's no longer used by any of the TinyMCE dialogs and is considered deprecated. -Version 3.0.5 (2008-03-12) - Added new black skin variant to the o2k7 skin contributed by Stefan Moonen. - Added new explode method to the tinymce core class. This does a split but removed whitespace it also defaults to a , delimiter. - Added new detection logic for IE 8 standards mode into the DOMUtils class strMode can now be checked to see if that mode is on/off. - Added new noscale option value for the scale select box for Flash in the media plugin. - Fixed bug where the menu for the ColorSplitButton wasn't removed when the editor was removed. - Fixed bug where font colors couldn't be edited correctly since the style of the element didn't get updated correctly. - Fixed bug where class of elements would get lost when TinyMCE was fixing incorrect HTML markup. - Fixed bug where table editing would produce double height values. - Fixed bug where width style value wouldn't be removed if you switched width unit from cm/em to pixels or percent. - Fixed bug where the search/replace input box wasn't auto focused like the other dialogs. - Fixed bug where the old mceAddControl command would use the fullscreen settings next time it created an instance. - Fixed bug where multiple lines where added to the target cell if you merged multiple empty cells. - Fixed bug where drop down menus would be incorrectly positioned inside scrollable divs. - Fixed bug where the separators of the silver skin variant didn't display correctly in IE 6. - Fixed bug where createStyleSheet seems to load scripts at opposite order in some IE versions. - Fixed bug where directionality could produce odd results for the UI and the dialogs. - Fixed bug where the DOM serializer wouldn't serialize custom namespaced attributes in IE 6 using the *[*] valid elements rule. - Fixed bug where table caption would be inserted after the thead element if you swapped a tr to be inside the thead. - Fixed bug where the youtube detection logic for the media plugin was to generic. - Fixed so the deprecated and undocumented theme_advanced_path_location set to none won't hide the whole statusbar. - Fixed so most input lists can have whitespace in them they are now split using the new tinymce.explode method. - Fixed so the popup_css and popup_css_add URLs are relative to where the current document is located. - Fixed various bugs and quirks with the store/restore selection logic. - Fixed so the editor starts in IE 8 standards mode but still that browser is very very buggy. - Fixed so dialog_type set to modal will block the background and other inline windows and only give access to the front most window. -Version 3.0.4.1 (2008-03-08) - Fixed critical bug where it was impossible to edit images when inlinepopups where used due to lost selection in IE. -Version 3.0.4 (2008-03-07) - Added new option constrain_menus, this enables you to force view port constraints on all menus. Contributed by Shane Tomlinson. - Fixed bug where table background wasn't visible inside the editor due to a default CSS rule overriding the style attribute. - Fixed bug where links would get a null class added if no styles was used in IE. - Fixed bug where spellchecker was auto focusing the editor in IE. - Fixed bug where document.domain would produce invalid argument if the editor was loaded in IE6 over a network UNC path. - Fixed bug where table height attribute was used, this is deprecated in XHTML so it now adds it as an style. - Fixed bug where textareas with style values would produce error in IE. - Fixed so the first element in each dialog is focused by default to enhance keyboard usage. - Fixed so you can add a mceFocus class to elements to make it auto focused. - Fixed so you can close dialogs using the esc key. - Fixed so you can press return/enter to submit the action of each dialog. - Fixed so tabbing inside an inline popups wont focus the resize anchor elements. - Fixed so you can press ok in inline alert messages using the return/enter key. - Fixed so textareas can be set to non px or % sizes for example em, cm, pt etc. - Fixed so non pixel values can be used in width/height properties for tables. - Fixed so the custom context menu can be disabled by holding down ctrl key while clicking. - Fixed so the layout for the o2k7 skin looks better if you don't have separators before and after list boxes. - Fixed so the sub classes get a copy of the super class constructor function to ease up type checking. - Fixed so font sizes for the format block previews are normalized according to http://www.w3.org/TR/CSS21/sample.html (it can be overridden). - Fixed so font sizes for h1-h6 in the default content.css is normalized according to http://www.w3.org/TR/CSS21/sample.html (it can be overridden). -Version 3.0.3 (2008-03-03) - Fixed bug where an error about document.domain would be thrown if TinyMCE was loaded using a different port. - Fixed bug where mode exact would convert textareas without id or name if the elements option was omitted. - Fixed bug where the caret could be placed at an incorrect location when backspace was used in Gecko. - Fixed bug where local file:// URLs where converted into absolute domain URLs. - Fixed bug where an error was produced if a editor was removed inside an editor command. - Fixed bug where force_p_newlines didn't effect the paste plugin correctly. - Fixed bug where the paste plugin was producing an exception on IE if you pasted contents with middots. - Fixed bug where delete key could produce exceptions in Gecko sometimes due to the fix for the table cell bug. - Fixed bug where the layer plugin would produce an visual add class called mceVisualAid this one is now renamed to mceItemVisualAid to mark it internal. - Fixed bug where TinyMCE wouldn't initialize properly if ActiveX controls was disabled in IE. - Fixed bug where tables and other elements that had visual aids on them would produce an extra space after any custom class names. - Fixed bug where search with an empty string would produce some odd "invalid pointer" error in IE. - Fixed bug where elements like menus where placed at incorrect positions in Opera 9.26. - Fixed bug where IE was loosing focus of the editor when you clicked some dropmenu and if it was placed in a frame or iframe. - Fixed bug where focus of images could be lost in IE if you focused the accessibility confirm dialog in the advimage plugin. - Fixed bug where nestled font elements would produce odd output like missing font elements. - Fixed bug where text colors and styles got removed if invalid_elements included the font element. - Fixed bug where text-decoration set to underline or line-through would remove other styles from span elements. - Fixed bug where editor contents like \n\n would be incorrectly handled and processed as real line feeds. - Fixed bug where incorrectly encoded urls with ampersands in them would be decoded incorrectly. - Optimized the DOMUtils decode method to be a lot faster if the string doesn't have any entities to decode. -Version 3.0.2.1 (2008-02-26) - Fixed alert/confirm dialogs so they display correctly. -Version 3.0.2 (2008-02-26) - Added new body_id option that enables you to specify the id of the body inside the editor iframe based on ideas by David Bildström (ChronoZ). - Added new body_class option that enables you to set the class for the body of the editor iframe based on ideas by David Bildström (ChronoZ). - Added new CSS class to the default content.css files mceForceColors that forces white background and black text can be used with the body_class option. - Added new type parameter to the Editor.getParam function to reduce redundant logic for parsing hash tables. - Added new isDone method to the ScriptLoaded class, this enables you to check if a script has been loaded or not. - Added new resizeTo and resizeBy methods for the advanced theme. Can be called using tinyMCE.activeEditor.theme.resizeTo(w, h); - Added new skin_variant option this can be used to extend existing skins with slight modifications like color. - Added new variant of the o2k7 skin called "silver" based on a contribution made by Stefan Moonen. - Fixed bug where the template plugin might produce errors if the template_mdate_classes wasn't configured. - Fixed bug where the media plugin didn't convert the URLs for movies once they where inserted. - Fixed bug where the style field for the advlink dialog didn't work correctly if you edited an existing link. - Fixed bug where alignment of toolbars would fail in editor was uses in a quirks mode on IE, fix contributed by Peter Wood & Art Lawry. - Fixed bug where initialization of multiple editors at the same time using the mceAddControl method would produce errors. - Fixed bug where initialization of editors using mceAddControl command or new tinymce.Editor calls would fail during page load. - Fixed bug where the check for domain relaxing could fail if the document.domain property was changed by another script. - Fixed bug where textareas couldn't be named description or any other name that matches the meta elements in IE and Opera. - Fixed bug where the element path would fail sometimes in IE due to "unknown runtime error" on innerHTML. - Fixed bug where Safari would crash if you was hiding the editor before serializing the contents. - Fixed bug where the editor wasn't scaled propertly in fullscreen mode using the old fullscreen_new_window option. - Fixed bug where render method didn't load language packs in IE and Opera if you rendered an editor during page load. - Fixed bug where resizing the browser window in fullscreen didn't resize the editor. - Fixed bug where the blockquote command didn't move the caret inside the new empty blockquote if you used it on an empty document. - Fixed bug where auto in a style width/height for the textarea would produce an editor with the size value of 100. Fix contributed by Shane Tomlinson. - Fixed bug where restoration of selection at the beginning of an element could fail in Gecko. - Fixed bug where caret restoration after a cleanup could place the it at an incorrect location. - Fixed bug where delete key inside td elements would delete the cell in Gecko. - Fixed so the blockquote button toggles individual lines. This behavior is a bit more like the old indentation behavior in the 2.x branch. - Fixed so the dialog language packs only gets loaded the first time you open a dialog. - Fixed so all classes in the whole UI is prefixed with "mce" to avoid collisions, use the skin converter to update your existing skins. - Fixed so all classes in the inlinepopups logic is prefixed with "mce" to avoid collisions, use the skin converter to update your existing skins. - Fixed so that the window in fullscreen mode can be resized when fullscreen_new_window option is enabled. - Fixed so blockquote elements are formatted in the source output with an linefeed before and after it. - Optimized the editor initialization by reducing the number of calls to getBookmark/moveToBookmark. -Version 3.0.1 (2008-02-21) - Added spellchecker plugin into the main package, but without any backend can be specified with the spellchecker_rpc_url option. - Added src attribute for script elements to the default valid_elements option value. - Added extra parameter to the class_filter callback it can now also filter out classes based on the whole CSS rule. - Added support for domain relaxing, TinyMCE can now be loaded from an remote domain as long as they are on the same root domain. - Added support for custom elements the new custom_elements option enables you to add non HTML elements to the editor. - Added support for the W3C Selectors API that was added to latest nightly build of WebKit. - Fixed bug where some object param element wasn't stored correctly using the media plugin. - Fixed bug where Opera was scrolling to top of page is drop menus on list boxes where displayed. - Fixed bug where IE6 was crashing if a format block was used on a container with anchor elements. - Fixed bug where spans with font sizes wasn't handled correctly when editor was loading contents. - Fixed bug where mode exact couldn't convert editors with name only. Id is no longer required but recommended. - Fixed bug where the mceInsertRawHTML command produced an extra undo level. - Fixed bug where the specific_textareas mode didn't work correctly this is the same thing as textareas now. - Fixed bug where the values of input elements in the HTML page of dialogs pages where changed in IE. - Fixed bug where fullscreen and fullpage plugins didn't work well together. - Fixed bug where embed elements wasn't handled properly in the media plugin. - Fixed bug where style information on span elements gets munged when fonts are converted to spans. - Fixed bug where some entities in element attributes where encoded incorrectly in the latest WebKit build. - Fixed bug where initialization would fail in IE if there where two input elements with the name submit in the form. - Fixed bug where fullscreen mode didn't work correctly in IE when the fullscreen_new_window option was used. - Fixed bug where invalid contents like an ul inside a p element would produce odd results in IE. - Fixed bug where Opera 9.2x was placing the drop menus at incorrect locations if the editor was placed in a table. - Fixed bug where Opera was producing odd results if enter/return was pressed while having forced_root_blocks disabled. - Fixed bug where layer plugin was stealing focus in IE on initialization. - Fixed bug where body attributes wasn't set properly in the fullpage plugin, fix contributed by Hiroaki Kawai. - Fixed bug where insert image and insert link dialogs where producing an extra level in the undo history. - Fixed bug where Gecko would produce an error if empty elements like
where inserted using mceInsertContent. - Fixed bug where center alignment of images produced odd results inside table cells. - Fixed bug where center alignment of images couldn't be toggled correctly. - Fixed bug where alignment of images inside tables would produce double float style items in IE if the fix_table_elements option was enabled. - Fixed bug where a variable called 'v' was polluting the global namespace. Objects tinymce and tinyMCE are the only ones allowed to be global. - Fixed bug where insert table from context menu couldn't insert new tables inside existing tables. - Fixed bug where Safari wouldn't produce br elements on enter when the force_br_newlines option was enabled. - Fixed bug where switching cell type in table cell dialog would produce odd attributes in IE. - Fixed bug where Gecko was outputting internal attributes if valid_elements where set to "*[*]". - Fixed bug where the style plugin would produce non hex colors inside the dialog when running on Gecko. - Fixed bug where an empty src value for insert image would remove the currently selected image if it wasn't and image element. - Fixed bug where hidden input elements would break the logic for the tab_focus option. - Fixed bug where save button wasn't working correctly in fullscreen mode. - Fixed bug where the editor was forced to be placed in a form element if the save_onsavecallback option was used. - Fixed bug where upper case param attributes wasn't parsed correctly in the media plugin. - Fixed bug where render method of tinymce.Editor class would produce an exception if the strict_loading_mode option was omitted. - Fixed bug where nodeChanged event could be fired while the editor was loading and there for produce an exception in FF. - Fixed bug where no undo levels where added if the user created new table rows using the tab key on Gecko. - Fixed bug where tables would be broken if you selected a different block format for contents withing an table cell. - Fixed bug where the render method of the tinymce.Editor class didn't setup the tinymce.EditorManager.settings object correctly. - Fixed bug where the advanced image dialog would go to the first tab if the alternative image was changed using the file browser link. - Fixed bug where the forced_root_block option would produce BR elements inside empty blocks if the block wasn't a paragraph. - Fixed bug where the forced_root_block doesn't work correctly on IE if the specified element was something else than paragraphs. - Fixed bug where selection of images would get lost if user selected something from the context menu in IE. - Fixed bug where the context menu plugin would pollute the global namespace with two variables p1 and p2. - Fixed compatibility issue with Mootools, it is destroying document.getElementById on unload in IE. (Mantra: You don't own the internal objects). - Fixed bugs where dialogs/tabs and other UI elements where rendered incorrectly in Firefox 3. - Fixed so the auto CSS class importer is compatible with 2.x. - Fixed so the editor UI and inlinedialogs works correctly with the YUI CSS reset package. - Fixed so header and footer elements are forced to lower case when the fullpage plugin is used. - Fixed so load prefixes "-" for plugins and themes isn't required if the plugin/theme was loaded by the ThemeManager/PluginManager. - Fixed so the JSONRequest uses application/json content type to make Ruby on rails happy. - Fixed so the CSS rule is more exact for the body in the default content.css files. Body is now defined as "body.mceContentBody" instead of just "body". - Fixed so the tiny_mce_dev.js uses XHR instead of document.write to load scripts to resolve an issue with Opera 9.50. - Fixed so language pack loading can be disabled by setting the language option to false. Can be useful for systems with their own language pack management. -Version 3.0 (2008-01-30) - Added map and area elements to the default valid_elements list and also some indentation rules. - Fixed bug where empty paragraphs wasn't padded when loading contents. - Fixed bug where the RowLayout manager didn't work at all. - Fixed bug where style attribute data would get messed up in advimage dialog. - Fixed bug where the table dialogs class select wasn't updated correctly. - Fixed bug where elements would get extra whitespace around on insert when body was present in valid_elements. - Fixed bug where coords attribute of the area element wasn't handled properly in IE. - Fixed bug where Safari didn't produce BR elements on shift+return. - Fixed bug where force blocks would cast odd invalid attribute exception in IE. - Fixed bug where media plugin would produce extra whitespace before and after objects. - Fixed bug where cleanup_callback could break the contents of the editor. But use the new event system instead of this option. - Fixed bug where the tab_focus option didn't work between editor instanced. You can now tab between editors. - Fixed bug where the load function of the ScriptLoader class didn't load single files without the load que as it was supposed to. - Fixed bug where the execcommand_callback parameter order was incorrect. Recommendation use the new addCommand method. - Fixed bug where range.select calls sometimes failed on some IE versions. - Fixed bug where Safari was scrolling to top of document when enter/returned was pressed. - Fixed bug where fullscreen_new_window option didn't work correctly. - Fixed bug where the nonbreaking plugin inserted an space instead of an non breaking space the first time. - Fixed bug where the visualization of non breaking spaces where visual in element path. - Fixed so the focus is restored to the editor after inserting an custom character. - Fixed so the isNotDirty state is set to false if a new undo level is added. - Fixed so pointless style information for borders gets removed in IE. - Fixed so the resize button has a se-resize cursor css value. -Version 3.0rc2 (2008-01-18) - Added new fix_nesting option to fix bug #1867292, this is disabled by default. - Added new indentation option enables you to specify how much each indent/outdent call will add/remove. - Added easier support for enabling/disabling icon columns on drop menues. - Added new menu button control class. This control is very similar to the splitbutton but without any onclick action. - Added support for previous tab focus (shift+tab). The tab_focus setting now takes two items next and previous element. - Fixed bug where iframes inside the editor got removed in Firefox on initial load. - Fixed bug where the CSS for abbr elements wasn't applied correctly in IE. - Fixed bug where mceAddControl on element inside a hidden container produced errors. - Fixed bug where closed anchors like produced strange results. - Fixed bug where caret would jump to the top of the editor if enter was pressed a the end of a list. - Fixed bug where remove editor failed if the editor wasn't properly initialized. - Fixed bug where render call on for a non existing element produced exception. - Fixed bug where parent window was hidden when the color picker was used in a non inlinepopups setup. - Fixed bug where onchange event wasn't fired correctly on IE when color picker was used in dialogs. - Fixed bug where save plugin could not save contents if the converted element wasn't an textarea. - Fixed bug where events might be fired even after an editor instance was removed such as blur events. - Fixed bug where an exception about undefined undo levels could be throwed sometimes. - Fixed bug where the plugin_preview_pageurl option didn't work. - Fixed bug where adding/removing an editor instance very fast could produce problems. - Fixed bug where the link button was highlighted when an anchor element was selected. - Fixed bug where the selected contents where removed if a new anchor element was added. - Fixed bug where splitbuttons where rendered one pixel down in the default theme. - Fixed bug where some buttons where placed at incorrect positions in the o2k7 theme. - Fixed bug that made it impossible to visually disable a custom button that used an image instead of CSS sprites. - Fixed bug where it wasn't possible to press delete/backspace if the editor was added+removed and re-added due to a FF bug. - Fixed bug where an entities option with only 38,amp,60,lt,62,gt would fail in IE. - Fixed bug where innerHTML sometimes generated unknown runtime error on IE. - Fixed bug where content_css files wasn't loaded in the template preview iframe. - Fixed bug where scroll position was incorrect when toggling fullscreen mode. - Fixed bug where restoration of overflow didn't work correctly when disabling fullscreen mode in Opera. - Fixed bug where drop menus where places at incorrect locations if the editor was placed in a scrollable container element. - Fixed bug where hideMenu didn't hide sub menus correctly. It will now hide all menus recursively. - Fixed so theme_advanced_path_location can be used in init options for compatibility reasons. - Fixed so the drop menu colors matches the rest of o2k7 theme. - Fixed so the preview example.html file is updated to the new 3.x API. - Fixed so the margins are the same by default inside the editable area between IE and other browsers. - Fixed so editor contents gets stored before it the onSubmit event is fired. -Version 3.0rc1 (2008-01-08) - Added new classes for toolbar rows in advanced theme mceToolbarRow1..n enabled you to change appearance of individual rows. - Added auto detection for the strict_loading_mode option when running in application/xhtml+xml mode on Gecko. - Optimized the HTML serializer by bundling some post process methods together. - Fixed so that the toolbars have unique IDs, enables you to alter the toolbars using the ControlManager and the DOM. - Fixed bug where delta values for dialog sizes in language packs didn't work correctly due to missing string to number casting. - Fixed bug where paragraph generation logic didn't handle hr or table elements correctly if they where the only element. - Fixed bug where some elements got extra linebreaks added after or before it in HTML output. - Fixed bug where it was hard to modify existing style data on table rows and table cells. - Fixed bug where the dom.getRect method didn't handle non pixel values correctly. - Fixed bug where strikethrough and underline couldn't be toggled on existing span elements. - Fixed bug where the postprocessor searched for nsbp instead of nbsp entities. - Fixed bug where it was impossible to edit links that had child elements within them. - Fixed bug where it was possible to click on the parent item of a submenu. - Fixed bug where mouseover/mouseout images couldn't be removed in advimage dialog. - Fixed bug where drop menus didn't work when running in application/xhtml+xml mode. - Fixed bug where Opera added doctype to output in application/xhtml+xml mode. - Fixed bug where some DOM methods didn't work correctly in the application/xhtml+xml mode. - Fixed bug where the inlinepopups didn't work correctly in the application/xhtml+xml mode. - Fixed bug where the ColorSplitButton didn't display correctly in the application/xhtml+xml mode. - Fixed bug where the UI layout was incorrect on Gecko browsers when running in application/xhtml+xml mode. - Fixed bug where the word paste plugin produced exception while running in application/xhtml+xml mode. - Fixed bug where there wasn't any hidden input element generated for divs while running in application/xhtml+xml mode. - Fixed bug where indentation of script/style/pre elements where incorrect. - Fixed bug where script element contents was removed in IE. - Fixed bug where script element contents got entity encoded. - Fixed bug where you couldn't edit existing element styles using the styles plugin. - Fixed bug where styles wasn't updated properly sometimes due to an performance enhancement. - Fixed bug where font sizes couldn't be changed using the style plugin. - Fixed bug where an error was produced in Gecko browsers when switching back from fullscreen mode. - Fixed bug where Opera was producing br elements after elements like h3. - Fixed bug where TinyMCE couldn't be loaded on a page using - characters in it's URL. - Fixed bug where the editor container element was forced to have a specific name. - Fixed bug with force_br_newlines option on Firefox, even though it should never be used (Read FAQ). - Fixed bug where onclick event had an return true; prefix added when creating an popup. - Fixed bug where the theme_advanced_statusbar_location option couldn't handle the value "none". - Fixed issue with URLs with multiple at characters for example an Zope URI. - Fixed so simple and advanced themes doesn't collide. - Fixed so a elements gets removed when the href field is left empty, the href attribute is required in a link after all. - Fixed so img elements gets removed when the src field is left empty, the src attribute is required for all images after all. - Removed the indent and encode methods from the tinymce.dom.Serializer class due to performance enhancement and reduction of the API size. -Version 3.0b3 (2007-12-14) - Added new getElement method to Editor class, returns the element that was replaced with the editor instance. - Added new unavailable prefix for disabled controls for accessibility reasons. - Fixed bug where regexp patterns couldn't be used for the editor_selector/editor_deselector options. - Fixed bug where the DOM wasn't properly initialized before the onInit event was executed in popups. - Fixed bug where font sizes where reduced by font size actions on previous spans in Safari. - Fixed bug where HR elements got places at the wrong location in IE. - Fixed bug where align/justify didn't work correctly on multiple paragraphs. - Fixed bug with missing translation for cell scope settings. - Fixed bug where selection/caret position was lost on some table actions. - Fixed bug where editor instances couldn't be added to hidden div elements. - Fixed bug where list elements in Safari would get an odd ID attribute. - Fixed bug where IE would return when the editor was completely empty. - Fixed bug where accessibility title attribute for access keys wasn't setup properly. - Fixed bug where forecolorpicker and backcolorpicker control names wasn't working. - Fixed bug where inserting template content didn't work in Safari due to selection exception. - Fixed bug where absolute URLs to remote hosts couldn't be used for background images. - Fixed bug where mysterious span elements where produced in Safari when injecting HTML contents. - Fixed bug where the media plugin didn't work correctly on the latest Opera 9.24. - Fixed bug where indentation of HTML output wasn't applied to all block elements. - Fixed bug where Safari was production DOM exception if you pressed enter in an empty editor. - Fixed bug where media plugin didn't parse script tags correctly patch contributed by Mathieu Campagna. - Fixed bug where the drop menus of list boxes like blockformat could produce scrolling of the page. - Fixed bug where the drop menus where placed at an incorrect location if TinyMCE was placed in a scrollable div. - Fixed bug where submit buttons couldn't be named submit, it's not recommended to name submit buttons submit anyway. - Fixed bug where the stylelistbox produced an exception if there was only one class in the list box. - Fixed bug where the stylelistbox wasn't updated correctly when the current class was removed. - Fixed bug where the formatblock command sometimes removed the body element. - Fixed bug where fullscreen switching in IE sometimes produced an exception when the spellchecker plugin was enabled. - Fixed issue where FF produced an empty paragraph when the editor was completely empty. - Fixed issue with size of image dialog in the advanced theme. - Fixed issues with the bbcode plugin it now also handles spans and the [font] rule. - Fixed so the style compression feature is a bit smarter to resolve issues with Opera. - Reintroduced the remove_linebreaks option, this is enabled by default. -Version 3.0b2 (2007-11-29) - Added type and compact attributes to the default valid_elements list for the ul and ol elements. - Added missing accessibility support to native list boxes in both the toolbar and dialogs. - Added missing access key for the element path for accessibility reasons. - Fixed support for loading themes from external URLs. - Fixed bug where setOuterHTML didn't work correctly when multiple elements where passed to it. - Fixed bug with visualchars plugin was moving elements around in the DOM. - Fixed bug with DIV elements that got converted into editors on IE. - Fixed bug with paste plugin using the old event API. - Fixed bug where the spellchecker was removing the word when it was ignored. - Fixed bug where fullscreen wasn't working properly. - Fixed bug where the base href element and attribute was ignored. - Fixed bug where redo function didn't work in IE. - Fixed bug where content_css didn't work as previous 2.x branch. - Fixed bug where preview dialog was throwing errors if the content_css wasn't defined. - Fixed bug where the theme_advanced_path option didn't work like the 2.x branch. - Fixed bug where the theme_advanced_statusbar_location was called theme_advanced_status_location. - Fixed bug where the strict_loading_mode option didn't work if you created editors dynamically without using the EditorManager. - Fixed bug where some language values wasn't translated such as insert and update in dialogs. - Fixed bug where some image attributes wasn't stored correctly when inserting an image. - Fixed bug where fullscreen mode didn't restore scrollbars when disabled. - Fixed bug where there was no visual representation for tab focus in toolbars on IE. - Fixed bug where HR elements wasn't treated as block elements so forced_root_block would fail on these. - Fixed bug where autosave presented warning message even when the form was submitted normally. - Fixed typo of openBrower it's now openBrowser in form_utils.js. - Fixed various HTML problems like missing TD elements and duplicated doctypes. - Fixed default values for theme_advanced_resize_horizontal, theme_advanced_resizing_use_cookie to be 2.x compatible. - Moved spellchecker JS files into the development package. - Removed support for theme_advanced_path_location since the theme_advanced_statusbar_location is the correct option name. -Version 3.0b1 (2007-11-21) - Added new tab_focus option, that enables you to specify a element id or that the next element to be focused on tab key down. - Added new addQueryValueHandler method to the tinymce.Editor class. - Added new class_filter option, this enables you to specify a function that can filter out CSS classes for the styles list box. - Added support form [url=url]title[/url] to the bbcode plugin. - Renamed the addCommandQueryState method in the tinymce.Editor class to addQueryStateHandler. - Renamed loadQue to loadQueue, to correct spelling. - Removed the createDOM method from the window manager and replace it with a createInstance method. - Removed the add to beginning of class attribute parameter of the DOMUtils.addClass method. - Fixed bug with the forced_root_block option, didn't work correctly with multiple inline elements. - Fixed bug where image dialogs replaced the current image element with a new one even when it was updated. - Fixed bug where the submit trigger wasn't executed when divs where converted into editor instances. - Fixed bug where div elements that got converted into editors didn't get a hidden input element generated for them. - Fixed bug where the the media_use_script option for the media plugin wasn't working correctly. - Fixed bug where the font size and font family listboxes wasn't updated correctly on Safari. - Fixed bug where the height of the fieldset in default image dialog for the advanced theme was to small. - Fixed bug where the font sizes behaved incorrectly after a cleanup on Safari. - Fixed bug where formatblock didn't work correctly in Safari on some elements. - Fixed bug where template plugin didn't insert content correctly unless some options where specified. - Fixed bug where charmap on Safari produced scrollbars. - Fixed bug where there was white artifacts in some dialogs due to missing background color. - Fixed bug where port was added to all external URLs if the editor was loaded from a custom port. - Fixed bug where the context menus got duplicated on Safari 3.0.4 on Mac OS X. - Fixed bug where dialogs like paste from word was huge on Firefox. - Fixed bug with media plugin not working with windows media objects. - Fixed bug where a forever loop was created if multiple instances where submitted using form.submit. - Fixed bug with editing a table produce error in IE when inlinepopups where used. - Fixed bug where the style plugin generated ugly looking style information in IE. - Fixed bug where the inline dialogs that got opened while in fullscreen mode wasn't visible. - Fixed bug where it was difficult to place the caret inside the word paste dialog. - Fixed bug where Opera produced strange border in the word paste dialog. - Fixed bug where viewport constraints could move a inlinepopup to a negative x, y position if the viewport was to small. - Fixed bug where template plugin was producing an error due to a deprecated API call. - Fixed bug where drag drop of images failed in Gecko if a document_base_url was specified. - Fixed bug where Firefox 3 failed to apply block formats like H1-H6 it still breaks on DIVs this has been reported to bugzilla. - Fixed bug where IE was producing a warning dialog about non secure items when running TinyMCE over HTTPS. - Fixed bug where the onbeforeunload event was triggered when menus or dialogs where opened. - Fixed bug where the fullscreen mode of the HTML view source box threw an error. - Fixed bug where the mceFocus command didn't work correctly. - Fixed bug where the selection could get lost in IE using inlinepopups. - Fixed so the body of the editor area has the mceContentBody class just like the 2.x branch. - Fixed so the media icon gets active when a media element is selected. -Version 3.0a3 (2007-11-13) - Added new experimental jQuery and Prototype framework adapters to the development package. - Added new translation.html file for the development package. Helps with the internationalization of TinyMCE. - Added new setup callback option, use this callback to add events to TinyMCE. This method is recommended over the old callbacks. - Added new API documetation to all classes, functions, events, properties to the Wiki with examples etc. - Added new init method to all plugins and themes, since it's shorter to write and it mimics interface capable languages better. - Fixed various CSS issues in the default skin such as alignment of split buttons and separators. - Fixed issues with mod_security. It didn't like that a content type of text/javascript was forced in a XHR. - Fixed all events so that they now pass the sender object as it's first argument. - Fixed some DOM methods so they now can take an array as input. - Fixed so addButton and the methods of the ControlManager uses less arguments and it now uses a settings object instead. - Fixed various issues with the tinymce.util.URI class. - Fixed bug in IE and Safari and the on demand gzip loading feature. - Fixed bug with moving inline windows sometimes failed in IE6. - Fixed bug where save_callback function wasn't executed at all. - Fixed bug where inlinepopups produces scrollbars if windows where moved to the corners of the browser. - Fixed bug where view HTML source failed when inserting a embedded media object. - Fixed bug where the listbox menus didn't display correctly on IE6. - Fixed bug where undo level wasn't added when editor was blurred. - Fixed bug where spellchecker wasn't disabled when fullscreen mode was enabled. - Fixed bug where Firefox could crash some times when the user switched to fullscreen mode. - Fixed bug where tinymce.ui.DropMenu didn't remove all item data when an item was removed from the menu. - Fixed bug where anchor list in advlink dialog wasn't populated correctly in Safari. - Fixed bug where it wasn't possible to edit tables in IE when inlinepopups was enabled. - Fixed bug where it wasn't possible to change the table width of an existing table. - Fixed bug where xhtmlxtras like abbr didn't work correctly on IE. - Fixed bug where IE6 had some graphics rendering issues with the inlinepopups. - Fixed bug where inlinepopup windows where moved incorrectly when they were boundary checked for min width. - Fixed bug where textareas without id or name couldn't be converted into editor instances. - Fixed bug where TinyMCE was stealing element focus on IE. - Fixed bug where the getParam method didn't handle false values correctly. - Fixed bug where inlinepopups was clipped by other TinyMCE instances or relative elements in IE. - Fixed bug where the contextmenu was clipped by other TinyMCE instances or relative elements in IE. - Fixed bug where listbox menus was clipped by other TinyMCE instances or relative elements in IE. - Fixed bug where listboxes wasn't updated correctly when the a value wasn't found by select. - Fixed various CSS issues that produced odd rendering bugs in IE. - Fixed issues with tinymce.ui.DropMenu class, it required some optional settings to be specified. - Fixed so multiple blockquotes can be removed with a easier method than before. - Optimized some of the core API to boost performance. - Removed some functions from the core API that wasn't needed. -Version 3.0a2 (2007-11-02) - Fixed critical bug where IE generaded an error on a hasAttribute call in the serialization engine. - Fixed critical bug where some dialogs didn't open in the non dev package. - Fixed bug when using the theme_advanced_styles option. Error was thrown in some dialogs. - Fixed bug where the close buttons produced an error when native windows where used. - Fixed bug in default skin so that split buttons gets activated correctly. - Fixed so plugins can be loaded from external urls outsite the plugins directory. -Version 3.0a1 (2007-11-01) - Rewrote the core and most of the plugins and themes from scratch. - Added new and improved serialization engine, faster and more powerful. - Added new internal event system, things like editor.onClick.add(func). - Added new inlinepopups plugin, the dialogs are now skinnable and uses clearlooks2 as default. - Added new contextmenu plugin, context menus can now have submenus and plugins can add items on the fly. - Added new skin support for the simple and advanced themes you can alter the whole UI using CSS. - Added new o2k7 skin for the simple and advanced themes. - Added new custom list boxes for font size/format/style etc with preview support. - Added new UI management, enabled plugins to create controls like splitbuttons or menus easier. - Added new JSON parser/serializer and JSON-RPC class to the core API. - Added new cookie utility class to the core API. - Added new Unit testing class to the core API only available in dev mode. - Added new firebug lite integration when loading the dev version of TinyMCE. - Added new Safari plugin, fixes lots compatibility of issues with Safari 3.x. - Added new URI/URL parsing it now handles the hole RFC and even some exceptions. - Added new pagebreak plugin, enables you to insert pagebreak comments like - Added new on demand loading of plugins and themes. Enables you to load and init TinyMCE at any time. - Added new throbber/progress visualization a plugin can show/hide this when it's needed. - Added new blockquote button. Enables you to wrap paragraphs in blockquotes. - Added new compat2x plugin. Will provide a TinyMCE 2.x API for older plugins. - Added new theme_advanced_resizing_min_width, theme_advanced_resizing_min_height options. - Added new theme_advanced_resizing_max_height, theme_advanced_resizing_max_height options. - Added new use_native_selects option. Enables you to toggle native listboxes on and off. - Added new docs_url option enables you to specify where the TinyMCE user documentation is located. - Added new frame and rules options for the table dialog. - Added new global rule for valid_elements/extended_valid_elements enables you to specify global attributes for all elements. - Added new deny attribute rule characher so it's possible to deny global attribute rules on specific elements. - Added new unit tests in the dev package of TinyMCE. Runs tests on the core API, commands and settings of the editor. - Readded the inline_styles option and enabled it by default so deprecated attributes are no longer used. - Removed all button images and replaced them with CSS sprite images. Reduces the number of requests needed. - Removed lots of language files and merged them into the base language files. Reduces the number of requests needed. - Removed lots of unnecessary files and merged many of them together to reduce requests and improve loading speed. - Reduced the over all script size by 33% and the number of files/requests by 75% so it loads a lot faster. - Fixed so convert_fonts_to_spans are enabled by default. So no more font tags. - Fixed so underline and strikethrough uses spans instread of deprecated U and STRIKE elements. - Fixed so indent/outdent adds/removed margin-left instead of blockquotes. - Fixed so alignment of paragraphs results in a text-align style value instead of the deprecated align attribute. - Fixed so alignment of images uses float or vertical-align style values instead of the deprecated align attribute. - Fixed so all classes from @import stylesheets gets imported into the editor. - Fixed so the directionality can toggle the dir attribute on and off. - Fixed so the fullscreen_settings can be used for all types of fullscreen modes. - Fixed so the advanced HR dialog gets displayed when inserting a HR not only on edit. - Fixed bug where word wrap didn't work in the source editor on Safari. - Fixed so non HTML elements can be used within the editor such as - Fixed various memory leaks in IE and reduced the unload cleanups needed. - Fixed so the preformatted option adds an invisible container pre tag inside the editor. - Renamed the _template plugin to example and updated it to use the new 3.x API. +Version 3.4.4 (2011-08-04) + Added new html5 audio support. Patch contributed by Ronald M. Clifford. + Added mute option for video elements and preload options for video/audio patch contributed by Dmitry Kalinkin. + Fixed selection to match visual selection before applying formatting changes. + Fixed browser specific bugs in lists for WebKit and IE. + Fixed bug where IE would scroll the window if you closed an inline dialog that was larger than the viewport. Patch by Laurence Keijmel. + Fixed bug where pasting contents near a span element could remove parts of that span. Patch contributed by Wesley Walser. + Fixed bug where formatting change would be lost after pressing enter. + Fixed bug in WebKit where deleting across blocks would add extra styles. + Fixed bug where moving cursor vertically in tables in WebKit wasn't working. + Fixed bug in IE where deleting would cause error in console. + Fixed bug where the formatter was not applying formats across list elements. + Fixed bug where the wordcount plugin would try and update the wordcount if tinymce had been destroyed. + Fixed bug where tabfocus plugin would attempt to focus elements not displayed when their parent element was hidden. + Fixed bug where the contentEditable state would sometimes be removed if you deleted contents in Gecko. + Fixed bug where inserting contents using mceInsertContent would fail if "span" was disabled in valid_elements. + Fixed bug where initialization might fail if some resource on gecko wouldn't load properly and fire the onload event. + Fixed bug where ctrl+7/8/9 keys wouldn't properly add the specific formats associated with them. + Fixed bug where the HTML tags wasn't properly closed in the style plugins properties dialog. + Fixed bug where the list plugin would produce an exception if the user tried to delete an element at the very first location. +Version 3.4.3.2 (2011-06-30) + Fixed bug where deleting all of a paragraph inside a table cell would behave badly in webkit. + Fixed bugs in tests in firefox5 and WebKit. + Fixed bug where selection of table cells would produce an exception on Gecko. + Fixed bug where the caret wasn't properly rendered on Gecko when the editor was hidden. + Fixed bug where pasting plain text into WebKit would produce a pre element it will now produce more semantic markup. + Fixed bug where selecting list type formats using the advlist plugin on IE8 would loose editor selection. + Fixed bug where forced root blocks logic wouldn't properly pad elements created if they contained data attributes. + Fixed bug where it would remove all contents of the editor if you inserted an image when not having a caret in the document. + Fixed bug where the YUI compressor wouldn't properly encode strings with only a quote in them. + Fixed bug where WebKit on iOS5 wouldn't call nodeChanged when the selection was changed. + Fixed bug where mceFocus command wouldn't work properly on Gecko since it didn't focus the body element. + Fixed performance issue with the noneditable plugin where it would enable/disable controls to often. +Version 3.4.3.1 (2011-06-16) + Fixed bug where listboxes were not being handled correctly by JAWS in firefox with the o2k7 skin. + Fixed bug where custom buttons were not being rendered correctly when in high contrast mode. + Added support for iOS 5 that now supporting contentEditable in it's latest beta. + Fixed bug where urls in style attributes with a _ character followed by a number would cause incorrect output. + Fixed bug where custom_elements option wasn't working properly on IE browsers. + Fixed bug where custom_elements marked as block elements wouldn't get correctly treated as block elements. + Fixed bug where attributes with wasn't properly encoded as XML entities. +Version 3.4.3 (2011-06-09) + Fixed bug where deleting backwards before an image into a list would put the cursor in the wrong location. + Fixed bug where styles plugin would not apply styles across multiple selected block elements correctly. + Fixed bug where cursor would jump to start of document when selection contained empty table cells in IE8. + Fixed bug where applied styles wouldn't be kept if you pressed enter twice to produce two paragraphs. + Fixed bug where a ghost like caret would appear on Gecko when pressing enter while having a text color applied. + Fixed bug where IE would produce absolute urls if you inserted a image/link and reloaded the page. + Fixed bug where applying a heading style to a list item would cascade style to children list items. + Fixed bug where Editor loses focus when backspacing and changing styles in WebKit. + Fixed bug where exception was thrown in tinymce.util.URI when parsing a relative URI and no base_uri setting was provided. + Fixed bug where alt-f10 was not always giving focus to the toolbar on Safari. + Added new 'allow_html_in_named_anchor' option to allow html to occur within a named anchor tag. Use at own risk. + Added plugin dependency support. Will autoload plugins specified as a dependency if they haven't been loaded. + Fixed bug where the autolink plugin didn't work with non-English keyboards when pressing ). + Added possibility to change properties of all table cells in a column. + Added external_image_list option to get images list from user-defined variable or function. + Fixed bug where the autoresize plugin wouldn't reduce the editors height on Chrome. + Fixed bug where table size inputs were to small for values with size units. + Fixed bug where table cell/row size input values were not validated. + Fixed bug where menu item line-height would be set to wrong value by external styles. + Fixed bug where hasUndo() would return wrong answer. + Fixed bug where page title would be set to undefined by fullpage plugin. + Fixed bug where HTML5 video properties were not updated in embedded media settings. + Fixed bug where HTML comment on the first line would cause an error. + Fixed bug where spellchecker menu was positioned incorrectly on IE. + Fixed bug where breaking out of list elements on WebKit would produce a DIV instead of P after the list. + Fixed bug where pasting from Word in IE9 would add extra BR elements when text was word wrapped. + Fixed bug where numeric entities with leading zeros would produce incorrect decoding. + Fixed bug where hexadecimal entities wasn't properly decoded. + Fixed bug where bookmarks wasn't properly stored/restored on undo/redo. + Fixed bug where the mceInsertCommand didn't retain the values of links if they contained non url contents. + Fixed bug where the valid_styles option wouldn't be properly used on styles for specific elements. + Fixed so contentEditable is used for the body of the editor if it's supported. + Fixed so trailing BR elements gets removed even when forced_root_blocks option was set to false/null. + Fixed performance issue with mceInsertCommand and inserting very simple contents. + Fixed performance issue with older IE version and huge documents by optimizing the forced root blocks logic. + Fixed performance issue with table plugin where it checked for selected cells to often. + Fixed bug where creating a link on centered/floated image would produce an error on WebKit browsers. + Fixed bug where Gecko would remove single paragraphs if there where contents before/after it. + Fixed bug where the scrollbar would move up/down when pasting contents using the paste plugin. +Version 3.4.2 (2011-04-07) + Added new 'paste_text_sticky_default' option to paste plugin, enables you to set the default state for paste as plain text. + Added new autoresize_bottom_margin option to autoresize plugin that enables you to add an extra margin at the bottom. Patch contributed by Andrew Ozz. + Rewritten the fullpage plugin to handle style contents better and have a more normalized behavior across browsers. + Fixed bug where contents inserted with mceInsertContent wasn't parsed using the default dom parser. + Fixed bug where blocks containing a single anchor element would be treated as empty. + Fixed bug where merging of table cells on IE 6, 7 wouldn't look correctly until the contents was refreshed. + Fixed bug where context menu wouldn't work properly on Safari since it was passing out the ctrl key as pressed. + Fixed bug where image border color/style values were overwritten by advimage plugin. + Fixed bug where setting border in advimage plugin would throw error in IE. + Fixed bug where empty anchors list in link settings wasn't hidden. + Fixed bug where xhtmlextras popups were missing localized popup-size parameters. + Fixed bug where the context menu wouldn't select images on WebKit browsers. + Fixed bug where paste plugin wouldn't properly extract the contents on WebKit due to recent changes in browser behavior. + Fixed bug where focus of the editor would get on control contents on IE lost due to a bug in the ColorSplitButton control. + Fixed bug where contextmenu wasn't disabled on noneditable elements. + Fixed bug where getStyle function would trigger error when called on element without style property. + Fixed bug where editor fail to load if Javascript Compressor was used. + Fixed bug where list-style-type=lower-greek would produce errors in IE<8. + Fixed bug where spellchecker plugin would produce errors on IE6-7. + Fixed bug where theme_advanced_containers configuration option causes error. + Fixed bug where the mceReplaceContent command would produce an error since it didn't correctly handle a return value. + Fixed bug where you couldn't enter float point values for em in dialog input fields since it wouldn't be considered a valid size. + Fixed bug in xhtmlxtras plugin where it wasn't possible to remove some attributes in the attributes dialog. +Version 3.4.1 (2011-03-24) + Added significantly improved list handling via the new 'lists' plugin. + Added 'autolink' plugin to enable automatically linking URLs. Similar to the behavior IE has by default. + Added 'theme_advanced_show_current_color' setting to enable the forecolor and backcolor buttons to continuously show the current text color. + Added 'contextmenu_never_use_native' setting to disable the ctrl-right-click showing the native browser context menu behaviour. + Added 'paste_enable_default_filters' setting to enable the default paste filters to be disabled. + Fixed bug where selection locations on undo/redo didn't work correctly on specific contents. + Fixed bug where an exception would be trown on IE when loading TinyMCE inside an iframe. + Fixed bug where some ascii numeric entities wasn't properly decoded. + Fixed bug where some non western language codes wasn't properly decoded/encoded. + Fixed bug where undo levels wasn't created when deleting contents on IE. + Fixed bug where the initial undo levels bookmark wasn't updated correctly. + Fixed bug where search/replace wouldn't be scoped to editor instances on IE8. + Fixed bug where IE9 would produce two br elements after block elements when pasting. + Fixed bug where IE would place the caret at an incorrect position after a paste operation. + Fixed bug where a paste operation using the keyboard would add an extra undo level. + Fixed bug where some attributes/elements wasn't correctly filtered when invalid contents was inserted. + Fixed bug where the table plugin couldn't correctly handle invalid table structures. + Fixed bug where charset and title of the page were handled incorrectly by the fullpage plugin. + Fixed bug where toggle states on some of the list boxes didn't update correctly. + Fixed bug where sub/sub wouldn't work correctly when done as a caret action in Chrome 10. + Fixed bug where the constrain proportions checkbox wouldn't work in the media plugin. + Fixed bug where block elements containing trailing br elements wouldn't treated properly if they where invalid. + Fixed bug where the color picker dialog wouldn't be rendered correctly when using the o2k7 theme. + Fixed bug where setting border=0 using advimage plugin invalid style attribute content was created in Chrome. + Fixed bug with references to non-existing images in css of fullpage plugin. + Fixed bug where item could be unselected in spellchecker's language selector. + Fixed bug where some mispelled words could be not highlighted using spellchecker plugin. + Fixed bug where spellchecking would merge some words on IE. + Fixed bug where spellchecker context menu was not always positioned correctly. + Fixed bug with empty anchors list in advlink popup when Invisible Elements feature was disabled. + Fixed bug where older IE versions wouldn't properly handle some elements if they where placed at the top of editor contents. + Fixed bug where selecting the whole table would enable table tools for cells and rows. + Fixed bug where it wasn't possible to replace selected contents on IE when pasting using the paste plugin. + Fixed bug where setting text color in fullpage plugin doesn't work. + Fixed bug where the state of checkboxes in media plugin wouldn't be set correctly. + Fixed bug where black spade suit character was not included in special character selector. + Fixed bug where setting invalid values for table cell size would throw an error in IE. + Fixed bug where spellchecking would remove whitespace characters from PRE block in IE. + Fixed bug where HR was inserted inside P elements instead of splitting them. + Fixed bug where extra, empty span tags were added when using a format with both selector and inline modes. + Fixed bug where bullet lists weren't always detected correctly. + Fixed bug where deleting some paragraphs on IE would cause an exception. + Fixed bug where the json encoder logic wouldn't properly encode \ characters. + Fixed bug where the onChange event would be fired when the editor was first initialized. + Fixed bug where mceSelected wouldn't be removed properly from output even if it's an internal class. + Fixed issue with table background colors not being transparent. This improves compliance with users browser color preferences. + Fixed issue where styles were not included when using the full page plugin. + Fixed issue where drag/drop operations wasn't properly added to the undo levels. + Fixed issue where colors wasn't correctly applied to elements with underline decoration. + Fixed issue where deleting some paragraphs on IE would cause an exception. +Version 3.4 (2011-03-10) + Added accessibility example with various accessibility options contributed by Ephox. + Fixed bug where attributes wasn't properly handled in the xhtmlxtras plugin. + Fixed bug where the image.htm had some strange td artifacts probably due to auto merging. + Fixed bug where the ToolbarGroup had an missing reference to this in it's destroy method. + Fixed bug with the resizeBy function in the advanced theme where it was scaled by the wrong parent. + Fixed bug where an exception would be thrown by the element if the page was served in xhtml mode. + Fixed bug where mceInsertContent would throw an exception when page was served in xhtml mode. + Fixed bug where you couldn't select a forground/background color when page was served in xhtml mode. + Fixed bug where the editor would scroll to the toolbar when clicked due to a call to focus in ListBox. + Fixed bug where pages with rtl dir wouldn't render split buttons correctly when using the o2k7 theme. + Fixed bug where anchor elements with names wasn't properly collapsed as they where in 3.3.x. + Fixed bug where WebKit wouldn't properly handle image selection if it was done left to right. + Fixed bug where the formatter would align images when the selection range was collapsed. + Fixed bug where the image button would be active when the selection range was collapsed. + Fixed bug where the element_format option wasn't used by the new (X)HTML serializer logic. + Fixed bug where the table cell/row dialogs would produce empty attributes. + Fixed bug where the tfoot wouldn't be added to the top of the table. + Fixed bug where the formatter would merge siblings with white space between them. + Fixed bug where pasting headers and paragraphs would produce an extra paragraph. + Fixed bug where the ColorSplitButton would throw an exception if you clicked out side a color. + Fixed bug where IE9 wouldn't properly produce new paragraphs on enter if the current paragraph had formatting. + Fixed bug where multiple BR elements at end of block elements where removed. + Fixed bug where fullscreen plugin wouldn't correctly display the edit area on IE6 for long pages. + Fixed bug where paste plugin wouldn't properly encode raw entities when pasting in plain text mode. + Fixed bug where the search/replace plugin wouldn't work correctly on IE 9. + Fixed so the drop menus doesn't get an outline border visible when focused, patch contributed by Ephox. + Fixed so the values entered in the color picker are forced to hex values. + Removed dialog workaround for IE 9 beta since the RC is now out and people should upgrade. + Removed obsolete calls in various plugins to the mceBeginUndoLevel command. +Version 3.4b3 (2011-02-10) + Added WAI-ARIA support for the main UI and dialogs this feature was contributed by Ephox. + Added iframe support to media plugin in order to handle the new YouTube HTML5 video formats. + Fixed bug where anchors would wrap the text contents after it due to a bug in the DomParser logic. + Fixed bug where the selected state wouldn't be removed on ListBox controls when a menu item was selected. + Fixed bug where IE could throw an unspecified error exception when the getBookmark logic was executed. + Fixed bug where IE would throw an invalid argument error when focus was applied to an empty editor instance. + Fixed bug where applying inline format wouldn't work if the start cell in the selection was empty. + Fixed bug where auto detection logic for YouTube and Google Video wouldn't work in the new media plugin. + Fixed bug where td elements would get a colspan/rowspan of 1 when created by the table plugin. + Fixed bug where removal/padding of empty elements wasn't handled correctly. + Fixed bug where internal elements would show up in element path. + Fixed bug where internal elements would get serialized as valid output. + Fixed bug where color wasn't correctly applied to anchor elements. + Fixed bug where float option in the style plugin dialog wouldn't be handled correctly on WebKit. + Fixed bug where the tinymce.dom.TreeWalker prev function wouldn't walk the DOM correctly. + Fixed bug where mceInsertContent command could produce empty block elements after the inserted content. + Fixed bug where mceInsertContent command wouldn't apply visual aids on tables and similar elements. + Fixed bug where empty block elements would get double br bogus elements in them. + Fixed bug where the color menu wouldn't apply the color correctly on IE when the viewport was to small. + Fixed bug where right clicking out side the body element of the editor iframe would prevent paste from working on IE. + Fixed bug where the onContextMenu event wouldn't fire correctly on IE if you clicked out side the body element. + Fixed bug where the onContextMenu event wouldn't fire correctly on modern Opera versions that now support it by default. + Fixed bug where legacy content wasn't converted correctly when inserted using mceInsertContent or through the source dialog. + Fixed bug where resizing images or tables wouldn't update the style attribute correctly or leave data-mce prefixed attributes. + Fixed bug where adding links wouldn't work correctly when using TinyMCE jQuery version with jQuery 1.5. + Fixed bug where single quotes inside param elements wasn't treated correctly by the media plugin. + Fixed bug where pasting plain text in WebKit wouldn't work correctly. It will now auto detect the WebKit bug and use plain text mode. + Fixed bug where the DomParser would fail to move out invalid elements within invalid elements on complex contents. + Fixed bug where paste as plain text would not decode html entities properly. + Fixed bug where large paragraphs would cause incorrect scrolling behavior if you would split them using enter. + Fixed bug where the SaxParser wouldn't properly parse some specific short ended elements. + Fixed so mceReplaceContent supports caret position and makes sure that the contents inserted gets validated. + Fixed so unnecessary traling br elements in blocks gets removed on Gecko/WebKit when using mceInsertContent command. + Moved some plugin css contents into the skin content css files to reduce the number of http requests. + Moved some plugin specific images into the theme img directory since they can then be shared. +Version 3.4b2 (2011-01-13) + Added new custom flash player, this player supports mp4 and flv and has skin support. + Fixed so mceInsertContent handles context correctly to enforce valid nesting of elements. + Fixed bug where scrolling would become jerky on IE on some contents. + Fixed bug where paste as plain text would throw exception of missing entities setting. + Fixed bug where anchor nodes where removed by the new serializer engine. + Fixed bug where IE would crash if when backspace where used on some specific contents. + Fixed bug where pasting of plain text in WebKit would result in merging of text lines. + Fixed bug where it wasn't possible to delete images or tables using backspace on IE9. + Fixed bug where urls in styles would generate a JS error due to incorrect scope. + Fixed bug where copy paste from Java applications would produce extra contents in FF on Mac. + Fixed bug where the verify_html option wouldn't allow all elements and attributes. +Version 3.4b1 (2010-12-20) + Added new serialization engine that increases performance and enforces valid output according to the specified schema settings. + Added new HTML parser logic used by the serialization engine and can handle malformed html contents. + Added new valid_children config option, enables more fine grain control of elements can be inside other elements. + Added new entities encoding logic boost performance and will only encode entities based on context i.e. attributes/text nodes. + Added new protect setting that enables users to protect template items from being removed by the serializer logic. + Added new {$caret} marker for the mceInsertContent command. Makes it possible to move the caret to a specific position when inserting contents. + Added new validation of anchor names. Only valid W3C names will be accepted. + Replaced the internal _mce_ prefixed attributes to the more standard HTML5 data-mce- prefix. This will also resolve future browser santiaztion issues. + Fixed bug where the paste plugin wouldn't convert Word lists with more than 9 items to real ol lists. Patch contributed by Mike (yogaboy). + Fixed bug where clicking on a format title would produce errors if the current selection didn't have any formats. + Fixed bug where paste of simple texts wouldn't work correctly in Gecko using the paste plugin since it keeps block formatting. + Fixed bug where confirm dialogs didn't display correctly due to resent IE9 fixes. + Fixed bug where spaces in URLs wouldn't be properly encoded to %20 if the user entered them in the link dialogs. Patch contributed by Ephox. + Fixed bug where the image alignment buttons wouldn't reposition the resize handles on FF due to a browser issue. Patch contributed by Ephox. + Fixed bug where the compareBoundaryPoints method of the IE Range class didn't work correctly. Patch contributed by Ephox. + Fixed bug where selection of elements using double click wouldn't select the clicked element but rather the parent node on FF. Patch contributed by Ephox. + Fixed bug where IE would scroll the user to the current selection causing parent document to scroll as well. Patch contributed by Ephox. + Fixed bug where style compression would incorrectly compress items with different values. It now only compresses if the values are the same. Patch contributed by Ephox. + Fixed bug where FF would add non breaking spaces outside TD elements if formatting was applied to table cells. Patch contributed by Ephox. + Fixed bug where the caret position would be lost on WebKit browsers if you pasted images multiple times. Patch contributed by Ephox. + Fixed bug where non word contents like * would be counted as words in the wordcount pluging. Patch contributed by David Balatero. + Fixed bug where the toggle absolute button in the layer plugin wouldn't remove the existing internal style attribute first. + Fixed bug where the autosave plugin would generate an exception on IE if the user had disabled userdata persistence. + Fixed bug where the paste plugin would remove dashed classes on IE since the regexps didn't include that character. + Fixed bug where applying text color would not add spans inside link elements. This is needed due to CSS style inheritance. + Fixed bug where applying block formats to empty elements wouldn't render correctly on IE. + Fixed bug where the searchreplace plugin would add a f or r character when shortcuts where used on IE while using default dialogs. + Fixed bug where Opera wouldn't load scripts correctly since the onreadystate would fire even though the script wasn't loaded. + Fixed issue where   wouldn't be handled correctly in the bbcode plugin if entity_encoding was set to raw. + Fixed issue where contents would flicker since the content css files where asynchronously loaded. + Fixed bug where WebKit wouldn't create links on images with a float style. +Version 3.3.9.3 (2010-12-20) + Fixed issue where WebKit wouldn't correctly apply ins/del in xhtmlxtras plugin. + Fixed bug where paste as plaintext on WebKit wouldn't produce br and p elements correctly. + Fixed bug where the confirm dialog texts would be incorrectly placed due to recent IE 9 workarounds in the window.css. + Fixed bug where applying text color would not add spans inside link elements. This is needed due to CSS style inheritance. +Version 3.3.9.2 (2010-09-29) + Fixed bug where placing the caret in IE 9 beta 1 would not work correctly if you clicked out side the document body element. + Fixed bug where IE 9 beta 1 wouldn't resize the editor correctly since the events didn't fire as previous versions did. + Fixed bug where FF would produce an error message when being rendered inside a hidden div element. + Fixed bug where resize logic could produce a cookie with a width/height less than the size of the container. + Fixed bug where content_css wouldn't populate the styles dropdown correctly. +Version 3.3.9.1 (2010-09-23) + Fixed bug where WebKit browsers wouldn't activate the image button when images where selected. + Fixed bug where Opera Presto 10.60 deletes elements when restoring bookmarks. + Fixed bug where IE9 beta1 doesn't handle regexp replacement values correctly. + Fixed bug where IE9 beta1 didn't render the inline dialogs correctly due to a bug with CSS clip. + Fixed bug where IE9 beta1 would produce error messages on load since they removed the document.recalc method. + Fixed bug where IE9 beta1 would produce since they haven't implemented document.implementation.createDocument correctly. + Fixed bug where IE9 beta1 would searchreplace doesn't work since their native DOM Range doesn't have a find method. + Fixed bug where IE9 beta1 would render the source view incorrectly due to incorrect viewport size measurements. + Fixed bug where IE9 beta1 would crash when running the basic functionality unit tests. + Fixed bug where IE9 beta1 would wrap elements in blocks correctly due to changes to the selection object. + Fixed bug where IE9 beta1 would fail to insert contents since they havn't implemented the createContextualFragment method in their DOM Range. + Fixed bug where IE9 beta1 would fail to handle image selection since they currently doesn't support control selections in their DOM Range. + Fixed bug where IE9 beta1 would fail to load scripts since they fire the onload event before the scripts are parsed and executed. +Version 3.3.9 (2010-09-08) + Fixed bug where inserting table rows into a table with subtable would produce an incorrect column count. + Fixed bug where the selection of cells in a table with subtables could produce invalid selections. + Fixed bug where the table plugin would produce a script error if you tried to move the caret before a first child table. + Fixed bug where the keep_styles feature on IE would move the caret to an incorrect location at the end of list blocks. + Fixed so attributes from legacy elements such as font gets retained when they get converted to spans. + Fixed minor issue where the select boxes wouldn't be set the not set by default in the table dialog. +Version 3.3.8 (2010-06-30) + On IE8+ and FireFox 3.5+, dragging an image now correctly adds an undo + event. + Fixed bug where WebKit would not move the caret to a correct position after a paste operation. + Fixed bug where WebKit would produce a div wrapper element when pasting some contents. + Fixed bug where the visual chars and nonbreaking plugin wouldn't show nbsp elements correctly. + Fixed bug where the format states would be enabled even after the format was removed. + Fixed bug where the delete key would move the caret to an incorrect position. + Fixed bug where it wasn't possible to toggle of the current font size/family/style by clicking the title item. + Fixed bug where the abbr element wouldn't get serialized correctly on IE6. + Fixed so that the examples checks if they are executed from the local file system since that might not work properly. +Version 3.3.7 (2010-06-10) + Fixed bug where context menu would produce an error on IE if you right clicked twice and left clicked once. + Fixed bug where resizing of the window on WebKit browsers in fullscreen mode wouldn't position the statusbar correctly. + Fixed bug where IE would produce an error if the editor was empty and you where undoing to that initial level. + Fixed bug where setting the table background on gecko would produce \" entities inside the url style property. + Fixed bug where the button states wouldn't be updated correctly on IE if you placed the caret inside the new element. + Fixed bug where undo levels wasn't properly added after applying styles or font sizes. + Fixed bug where IE would throw an error if you used "select all" on empty elements and applied formatting to that. + Fixed bug where IE could select one extra character when you did a bookmark call on a caret location. + Fixed bug where IE could produce a script error on delete since it would sometimes produce an invalid DOM. + Fixed bug where IE would return the wrong start element if the whole element was selected. + Fixed bug where formatting states wasn't updated on IE if you pressed enter at the end of a block with formatting. + Fixed bug where submenus for the context menu wasn't removed correctly when the editor was destroyed. + Fixed bug where Gecko could select the wrong element after applying format to multiple elements. + Fixed bug where Gecko would delete parts of the previous element if the selection range was a element selection. + Fixed bug where Gecko would not merge paragraph elements correctly if they contained br elements. + Fixed bug where the cleanup button could produce span artifacts if you pressed it twice in a row. + Fixed bug where the fullpage plugin header/footer would be have it's header reseted to it's initial state on undo. + Fixed bug where an empty paragraph would be collapsed if you performed a cleanup while having the caret inside it. + Fixed a few memory leaks on IE especially with drop menus in listboxes and the spellchecker. + Fixed so formats applied to the current caret gets merged to reduce the number of output elements. + Added the latest version of Sizzle for the CSS selector logic to fix a compatibility issue with prototype. +Version 3.3.6 (2010-05-20) + Fixed bug where a editor.focus call could produce errors on IE in very specific scenarios. + Fixed bug where Gecko would produce an error if you unformatted text inside an empty element. + Fixed bug where IE would produce an error if the caret was placed before a table and you used the align buttons. + Fixed bug where the font size drop down didn't display the a preview correctly. + Fixed bug where the paste plugin wouldn't include all contents some times on WebKit browsers. + Fixed bug where the plain text mode toggle wouldn't work properly on WebKit. + Fixed bug where the editors statusbar would become invisible when you resized the window in fullscreen mode. +Version 3.3.5.1 (2010-05-07) + Fixed a critical bug with the fullscreen plugin. Produced error messages when the state was toggled on/off. +Version 3.3.5 (2010-05-06) + Added new merge_with_parents option to formats, enables the control of removal of elements with similar parents. + Fixed so the default behavior for applying classes isn't a toggle state but the old behavior from before the 3.3 release. + Fixed bug where selecting contents using double click on Gecko would produce errors when using removing format. + Fixed bug where the IE DOM could get messed up when non valid contents was pasted into the editor. + Fixed bug where merging selected table cells using the context menu didn't work as expected. + Fixed bug where some nestled formatting would be applied incorrectly. + Fixed bug with enter in list items when using the force_br_newlines mode on WebKit patch contributed by Ryan Koopmans. + Fixed bug where undo/redo could produce js errors on some specific operations. + Fixed bug where the theme_advanced_font_sizes didn't work as before 3.3 when complex settings where used. + Fixed bug where the table plugin would copy cell/row id attributes when making new rows/cells. +Version 3.3.4 (2010-04-27) + Fixed bug where fullscreen plugin would add two editor instances to EditorManager collection. + Fixed bug where it was difficult to enter text on non western languages such as Japanese on IE. + Fixed bug where removing contents from nodes could result in an exception when using undo/redo. + Fixed bug with selection of images inside layers or other resizable containers on IE. + Fixed so editors isn't initialized on iPhone/iPad devices since they don't have caret support. +Version 3.3.3 (2010-04-19) + Added new script_loaded callback function setting for the jQuery plugin. + Added various fixes and new rpc methods for the spellchecker plugin. Patch contributed by Michael Peters. + Removed some unnecessary inline style information from some of the dialogs. + Fixed some issues with the chaining for the TinyMCE jQuery plugin. + Fixed so any extra arguments passed to patched jQuery functions gets passed through. Patch contributed by Lee Henson. + Fixed so spellchecking/contextmenu can be toggled on/off if the browser has native spellchecker support. + Fixed bug where some texts in the new paste plugin wasn't placed in language pack. + Fixed bug where IE would produce an incorrect information message when cutting. + Fixed bug where removing items using the xhtmlxtras plugin wouldn't work correctly. + Fixed bug where setting table background images would add extra quotes on Gecko. + Fixed bug where shortcut for bold/italic/underline wouldn't work properly on WebKit. + Fixed bug where IE would produce an error message if only contents was an image tag and bold was used. + Fixed bug where the caret would move if alignment was applied to empty block elements. + Fixed bug where some shortcut key commands wouldn't apply formatting correctly. +Version 3.3.2 (2010-03-25) + Fixed bug where it was possible to scale the editor iframe smaller than the editor UI. + Fixed bug where some of the resizing option didn't work with the new live resize. + Fixed bug where the format listbox didn't show nestled formats correctly. + Fixed bug where the native listboxes didn't work correctly. + Fixed bug where font size selection in using the legacyoutput plugin would produce errors. + Fixed so block and blockquote formats remove their matching element regardless of it's attributes. +Version 3.3.1 (2010-03-18) + Added new live resize feature, the editor contents is now visible while resizing. + Fixed bug where some valid_element patterns would produce an unknown property error. + Fixed bug where it wasn't possible to toggle off blockquotes. + Fixed bug where an undo level wasn't produced when applying formatting using the styles dropdown. + Fixed bug where IE 6/7 wouldn't perform caret formatting due to a focus/event bug in IE. + Fixed bug where undo/redo wasn't restoring the previous selection correctly. + Fixed bug where the caret would become invisible if you resized the editor in latest Gecko. + Fixed bug where the class attribute wasn't completely removed in IE 6/7 when the removeClass function was used. + Fixed so the matchNode method of the Formatter class returns the matched format rule. + Fixed so it's possible to apply formatting to both blocks and as inline elements. +Version 3.3 (2010-03-10) + Fixed bug where backspace on a table on IE would produce an empty tbody and some JS exceptions. + Fixed bug where some redundant children wasn't removed properly when applying inline styles to them. + Fixed bug where Chrome would produce incorect dialog sizes if the inlinepopups plugin wasn't used. + Fixed bug where spans with different classes would get merged if they where siblings to each other. + Fixed bug where IE 8 would crash if you used the spellchecker. + Fixed bug where Input Method for non western languages didn't work correctly. + Fixed bug where the UI would render incorrectly in FF 3.6 on Mac due to a bug n their rendering engine. + Fixed bug where WebKit wouldn't scroll down correctly if Shift+Enter was used. Patch contributed by Thomas Andersen. +Version 3.3rc1 (2010-02-23) + Fixed bug with new legacyoutput plugin not working correctly on it's own. + Fixed bug some performance issues with removing text formats. + Fixed bug where TinyMCE specific attributes wasn't removed properly by remove format. + Fixed bug where it wasn't possible to align images within inline elements. + Fixed bug where Ctrl+Delete/Backspace would produce an invalid argument exception on IE. + Fixed bug where the search/replace logic could produce an infinite loop on IE for reverse searches. + Fixed bug where cloning formats in cells didn't work properly on IE. + Fixed bug where IE6 would produce a horizontal scroll bar. + Fixed so remove jQuery method removes the TinyMCE instance as well as the specified textarea. + Fixed so selected rows and cells gets updated using the row/cell properties dialogs. +Version 3.3b2 (2010-02-04) + Fixed bug where sometimes img elements would be removed by split method in DOMUtils. + Fixed bug where merging of span elements could occur on bookmark nodes. + Fixed bug where classes wasn't properly removed when removeformat was used on IE 6. + Fixed bug where multiple calls to an tinyMCE.init with mode set to exact could produce the same unique ID. + Fixed bug with the IE selection implementation when it was feeded an document range. + Fixed bug where block elements formatting wasn't properly removed by removeformat on all browsers. + Fixed bug where selection location was lost if you performed a manual cleanup. + Fixed bug where removeformat wouldn't remove span elements within styled block elements. + Fixed bug where an error would be thrown if you clicked on the separator lines in menus. + Fixed bug with the jQuery plugin adding always adding a querystring value to other resources. + Fixed bug where IE would produce an error message if you had an empty editor instance. + Fixed bug where Shift+Enter didn't produce br elements on WebKit browsers. + Fixed bug where a temporary marker element wasn't removed by the paste plugin. + Fixed bug where inserting a table would produce two undo levels instead of one. +Version 3.3b1 (2010-01-25) + Added new text formatting engine. Fixes a lot of browser quirks and adds new possibilities. + Added new advlist plugin that enables you to set the formats of list elements. + Added new paste plugin logic that enables you to retain style information from Office. + Added new autosave plugin logic that automatically saves contents in local storage. + Added new valid_styles option. Adds the possibility to restrict styles and their order. + Added new theme_advanced_runtime_fontsize option to display the runtime font size in font size select box. + Added new jquery plugin version that handles the gzip compressor amongst other things. Contributed by Speednet. + Added new $ function to tinymce namespace and editor instances for the jQuery build. + Added the possibility to get editors by index as well as name in the tinyMCE.editors collection. + Fixed so the contents inside the editor renders in standards mode by default. + Fixed bug where it wasn't possible to move the caret on short documents running in standards mode on IE. + Fixed bug where the decode method of the DOMUtils class could end up in an endless loop. + Fixed bug where it was possible to bypass the paste cleanup on non IE browsers if you clicked while pasting. + Fixed bug where some attributes wasn't serialized correctly on IE if wildcard attribute patters where used. + Fixed bug where entity decoding was performed on strings that didn't have any valid entities in them. + Fixed bugs with the insertNode method of the IE DOMRange implementation. Patch contributed by Scott McNaught. + Rewrote the getBookmark/moveToBookmark selection logic to boost performance on larger documents. + Rewrote the table plugin to include new cell selection logic and fixed various bugs and issues. + Merged the tinyMCE, tinymce and tinymce.EditorManager into the same instance makes more sense. + Removed browser setting since the browser support for TinyMCE is not far better than it was when that setting was introduced. + Changed the mce_ attribute prefix to the more standard _mce_ prefix. This is similar to browser vendors prefixes. + Optimized performance with named entities on Gecko. Regexp replace was executing very slowly probably due to a Gecko bug. + Optimized performance of the IE specific selection/range implementation. + Removed the safari plugin since we now replaced all text formatting logic to custom code. +Version 3.2.7 (2009-09-22) + Fixed bug where uppercase paragraphs could still produce an invalid DOM tree on IE. + Fixed bug where split command didn't work on WebKit since the node serializer needs a real document to work with. + Fixed bug where it was impossible in Gecko to place the caret before a table if it was the first one. + Fixed bug where linking to urls like ../../ would produce an extra traling slash ../..//. + Fixed bug where the template cdate functionality was using an old 2.x API call. Patch contributed by vectorjohn. + Fixed bug where urls to the same site but different protocol would be converted when relative_urls where set to false. Patch contributed by Ted Rust. + Fixed bug where the paste plugin would remove mceItem prefixed classes. + Fixed bug where the paste plugin would sometimes add items in a reverse order on WebKit. + Fixed bug where the paste buttons would present an error message on Gecko even if you changed user.js. Patch contributed by Todd (teeaykay). + Fixed bug where Opera would crash if you had tables incorrectly placed inside paragraphs. + Fixed bug where styles elements wasn't properly processed if you had bad input HTML. + Fixed bug where style attributes wasn't properly forced into a specific format. + Fixed bug and issues with boolean attributes like checked, nowrap etc. + Fixed bug where input elements could override attributes on form elements. + Fixed bug where script or style elements could get modified by the DOMUtils processHTML method. + Fixed bug where the selected attribute could get lost when force root blocks logic got executed on IE. Patch contributed by Attila Mezei-Horvati. + Fixed bug where getAttribs method didn't handle boolean attributes correctly on IE. + Fixed so the paste from word dialog is presented if you paste content on an IE with to restrictive security settings. + Fixed so the paste_strip_class_attributes option is set to none by default in the paste plugin. + Removed default border=0 on tables for the default value of valid_elements. +Version 3.2.6 (2009-08-19) + Added new wordcount plugin, this will display the number of typed words as you write. Contributed by Andrew Ozz. + Added new getNext and getPrev methods to DOM utils. These will return the first matching sibling. + Fixed bug where it was impossible to place the caret after a table on Gecko. It will now add a paragraph after tables. + Fixed bug where inline dialogs would fail if used in a window opened using a showModalDialog. Patch contributed by Derek Britt. + Fixed bug where IE could sometimes render a unknown runtime error on invalid input HTML. + Fixed bug where some incorrectly placed tables wouldn't be moved outside the paragraphs on IE. + Fixed bug where uppercase script/style element wouldn't be handled correctly and converted to valid lowercase. + Fixed bug where some WebKit versions on Mac OS X would produce issues with hidden select fields. + Fixed bug where the media plugin would fail on WebKit since the node wasn't properly imported to the right document. + Fixed bug where absolute URLs for the TinyMCE script using a base href element would cause loading problems in IE 6/7. + Fixed bug where pasting using the paste plugin wasn't possible on IE with to restrictive security settings. + Fixed bug where pasting of whitespace was impossible using the new custom paste method. + Fixed bug where pasting on some WebKit browsers would not work if you pasted specific contents due to a WebKit bug. + Fixed bug where doctypes with multiple lines would not be parsed correctly by the fullpage plugin. Patch contributed by Colin. + Fixed bug where the autoresize plugin would break the fullscreen functionality. + Fixed bug where tables would be chopped up running on IE using invalid contents and pasting paragraphs into a cell. + Fixed bug where the each method of jQuery build didn't iterate styleSheets. We now use the TinyMCE API one instead. + Fixed bug where auto switching to paragraphs after headers some times failed in Gecko. + Fixed so all editor options gets passed to the Serializer class. Patch contributed by Jasper Mattsson. + Fixed so script/style blocks isn't wrapped in paragraphs as other inline elements. + Fixed so the XHR requests sends the X-Requested-With HTTP header. + Fixed so the data url scheme is handled in the tinymce.util.URI class. + Changed inline documentation to use moxiedoc style comments. + Removed the compat2x plugin people should have upgraded to the 3.x API by now. 3.0 was released more then a year ago. + Re-added Gecko specific message for users who doesn't understand the security concept regarding paste. +Version 3.2.5 (2009-06-29) + Added new jQuery plugin for the jQuery specific package. This enables you to more easily load and use TinyMCE. + Added new autoresize plugin contributed by Peter Dekkers. This plugin will auto resize the editor to the size of the contents. + Fixed so all packages have the same directory structure. Previous releases had a different structure for the production package. + Fixed so the paste from word dialog forces the contents to be processed as word contents even if it's not. + Fixed so the jQuery build adapter build works. It's currently only excluding Sizzle. + Fixed so noscript element contents is retained during the editing process. + Fixed bug where the getBookmark method would need a "simple" string input when the documented way is a boolean. + Fixed bug where invalid contents could break the fix_table_elements logic. + Fixed bug where Sizzle specific attributes would be serialized if the valid_elements was set to *[*]. + Fixed bug where IE would produce an error if you specified a relative content_css and opened the paste dialog. + Fixed bug where pasting images on IE would produce broken images if they came from an external site. + Fixed bug where memory was leaked if you add/remove controls dynamically. Some event handlers wasn't removed properly. + Fixed bug where domain relaxing wasn't treated correctly if you added it after the TinyMCE script element. + Fixed bug where the activeEditor wasn't set to null if the last editor instance was removed. + Fixed bug where IE was leaking memory on the onbeforeunload event due to some recently introduced logic. Patch contributed by Options. + Fixed bug where inserting tables in Safari 4 didn't work due to a new WebKit bug where some element names are reserved. + Fixed bug where URLs having a :// value in the query string would make it absolute regardless of URL settings. + Fixed the WebKit specific bug where DOM Ranges would fail if the node wasn't attached to something in a different way. + Removed the auto_resize option and the resizeToContent method from the tinymce.Editor class. Use the new autoresize plugin instead. +Version 3.2.4.1 (2009-05-25) + Fixed bug where Gecko browsers would produce an extra space after for example strong when loaded from sub domains. + Fixed bug where script elements would be removed if they where placed inside a paragraph element. + Fixed bug where IE 8 would produce 1 item remaining when loading CSS files dynamically with an empty cache. + Fixed bug where bound events would be removed from other editor instances if a specific one was removed. + Fixed various bugs and issues with script and style elements inside the editor. + Fixed so all script contents gets wrapped in CDATA sections so that they can be parsed using a XML parser. + Fixed so it's impossible for elements marked as closed to have child nodes rendered in output. +Version 3.2.4 (2009-05-21) + Added new paste_remove_styles/paste_remove_styles_if_webkit option to paste plugin concept contributed by Hadrien Gardeur. + Added new functionality to paste plugin contributed by Scott Eade aka monkeybrain. + Added new paste_block_drop option to the paste plugin this is disabled by default and will block any drag/drop event. + Added new bind/unbind methods to DOMUtils these works like Event.add/Event.remove but is easier to access. + Added new paste_dialog_width/paste_dialog_height options to paste pluign. Enables you to change the dialog sizes. + Fixed bug on IE 8 where it would sometimes produce a "1 item remaining" status message that would never finish. + Fixed bug on Safari 4 beta that would produce DOM Range exceptions on the DOMUtils split method since the browser has a bug. + Fixed bug where the paste plugin could accidentally think that some word sentences was supposed to be list elements. + Fixed bug where paste plugin would produce one extra empty undo level on some browsers. + Fixed bug where spans wasn't produced correctly on new line when the keep_styles option was enabled. + Fixed bug where the caret would be placed at the beginning of contents in IE 8 if you selected colors from the color pickers. + Fixed so the Event class is a normal class instead of a static one. The tinymce.dom.Event is now a global instance of that class. + Fixed so internal events for instances gets removed when the DOMUtils instance is removed. + Fixed so preventDefault and stopPropagation methods can be used on the event object in all browsers. +Version 3.2.3.1 (2009-05-05) + Fixed bug where paragraphs containing form elements such as input or textarea would be removed. + Fixed bug where some IE versions would produce a wrapper function for events attributes. + Fixed bug where table cell contents could be removed if you pressed return/enter at the end of the cell contents. + Fixed bug where the paste plugin would remove a extra character if the selection range was collapsed. + Fixed bug where creating tables with % width wouldn't be handled correctly on WebKit browsers. +Version 3.2.3 (2009-04-23) + Added new paste plugin logic. This new version will autodetect Word contents and clean it up. + Added a optional root element argument to getPos so you can tell it where to stop the calculation. + Added new DOM ready logic to remove the usage of document.write. We now use basically the same method as jQuery. + Fixed bug where WebKit browsers would fail when selecting all contents in the area using Ctrl+A. + Fixed bug where IE would produce paragraphs with empty inline style elements. + Fixed bug where WebKit browsers would fail when inserting tables with a non pixel width. + Fixed bug where block elements could get a redundant br element at the end of the element. + Fixed bug where the tabfocus plugin only worked with a single editor instance on page. + Fixed bug where IE 8 was loosing caret position if the selection was collapsed and a menu was clicked. + Fixed bug with application/xhtml+xml mode where menus wasn't working properly. + Fixed bug where the onstop workaround fix for IE would produce errors in an ASP update panel. + Fixed bug where the submit function override could produce errors if executed in the wrong scope. + Fixed bug where the area element wasn't closed by a short ending. + Fixed various number issues in the style plugins properties dialog. Contributed by datpaulchen. + Fixed issues with size suffix values in the style plugin dialog. + Fixed issue where hasDuplicate variable would leak out to the global space due to a bug in the Sizzle engine. + Fixed issue where the paste event would fire a dialog warning on IE since we extracted the text contents. + Updated Sizzle engine to the latest version, this version fixes a few bugs that was reported. +Version 3.2.2.3 (2009-03-26) + Fixed regression bug with the getPos method, it would return invalid if the view port was to small. +Version 3.2.2.2 (2009-03-25) + Fixed so the DOMUtils getPos method can be used cross documents if needed. + Fixed bug where undo/redo wasn't working correctly in Gecko browsers. +Version 3.2.2.1 (2009-03-19) + Added support for tel: URL prefixes. Even though this doesn't match any official RFC. + Fixed so the select method of the Selection class selects the first best suitable contents. + Fixed bug where the regexps for www. prefixes for link and advlink dialogs would match wwwX. + Fixed bug where the preview dialog would fail to open if the content_css wasn't defined. Patch contributed by David Bildström (ChronoZ). + Fixed bug where editors wasn't converted in application/xhtml+xml mode due to an issue with Sizzle. + Fixed bug where alignment would fail if multiple lines where selected. + Updated Sizzle engine to the latest version, this version fixes a few bugs that was reported. +Version 3.2.2 (2009-03-05) + Added new CSS selector engine. Sizzle the same one that jQuery and other libraries are using. + Added new is and getParents methods to the DOMUtils class. These use the new Sizzle engine to select elements. + Added new removeformat_selector option, enables you to specify a CSS selector pattern of elements to remove when using removeformat. + Fixed so the getParent method can take CSS expressions when selecting it's parents. + Added new ant based build process, includes a new javabased preprocessor and a yuicompressor ant task. + Moved the tab_focus logic into a plugin called tabfocus, so the old tab_focus option has been removed from the core. + Replaced the TinyMCE custom unit testing framework with Qunit and rewrote all tests to match the new logic. + Moved the examples/testcases to a root directory called tests since it now includes slickspeed. + Fixed bug where nbsp wasn't replaced correctly in ForceBlocks.js. Patch contributed by thorn. + Fixed bug where an dom exception would be thrown in Gecko when the theme_advanced_path path was set to false under xml application mode. + Fixed bug where it was impossible to get out of a link at the end of a block element in Gecko. + Fixed bug where the latest WebKit nightly would fail when changing font size and font family. + Fixed bug where the latest WebKit nightly would fail when opening dialogs due to changes to the arguments object. + Fixed bug where paragraphs wasn't added to elements positioned absolute using classes. + Fixed bug where font size values with dot's like 1.4em would produce a class instead of the style value. + Fixed bug where IE 8 would return an incorrect position for elements. + Fixed bug where IE 8 would render colorpicker/filepicker icons incorrectly. + Fixed bug where trailing slashes for directories in URLs would be removed. + Fixed bug where autostart and other boolean values in the media dialog wouldn't be stored/parsed correctly. + Fixed bug where the repaint call for the media plugin wouldn't be executed due to a typo in the source. + Fixed bug where id attribute of object elements wasn't kept intact by the media plugin. + Fixed bug where preview of embeded elements when the media_use_script option was used would fail. + Fixed bug where inlinepopups could be rendered at an incorrect location on IE 6 while dragging. + Fixed bug where the blocker shim could be placed at an incorrect location on IE 6. + Fixed bug where the multiple and size attributes of select elements would produce incorrect values while running in IE. + Fixed bug where IE would loose the caret position is you selected a color from the color drop down. + Fixed bug where remove format wouldn't work on IE since it couldn't remove span elements that had style information. + Fixed bug where Opera was removing links when removing formatting from selected contents. + Fixed bug where paragraphs could be produced inside non positional elements styled with the CSS position value of static. + Fixed bug where removeformat wouldn't work if you selected part of a span in IE. + Fixed bug where media plugin didn't retain the style attribute on embed/object elements. + Fixed bug where auto focus on empty editor instances could produce strange results if you inserted an image into it. + Fixed bug where   characters would be removed in FF when inserted with the mceInsertContent or selection.setContent methods. + Fixed bug where warning message of missing paste support wasn't displayed on WebKit browsers. + Fixed bug where anchor links could include other links. The selected range is now unlinked before adding news links to it. + Fixed memory leak when TinyMCE was used with prototype. Patch contributed by James Ots. + Fixed so the non documented fullpage_hide_in_source_view option for the fullpage plugin works again in the 3.x branch. + Fixed so tables doesn't get inserted into paragraphs by default since it's not W3C valid. Can be disabled by using the fix_table_elements option. + Fixed so the source view dialog sets a source_view state to the event object. Enables plugins to intercept the source view mode. + Fixed various validation issues with the html dialogs and pages. + Removed ask mode option since there is way better ways of doing this now. Use the add/remove control methods instead. + Removed logic for compatibility with Safari 2.x, this browser is no longer supported since no one is using it. + Removed the auto domain relaxing feature. If loading scripts cross sub domains it's better to specify the document.domain by hand. +Version 3.2.1.1 (2008-11-27) + Added new theme_advanced_default_background_color/theme_advanced_default_foreground_color options. Patch contributed by David Bildström (ChronoZ). + Fixed font style formatting compatibility issue with Adobe Air. + Fixed so legacy font elements get converted into spans even if cleanup_on_startup isn't enabled. + Fixed bug where pre elements could be incorrectly modified by an IE bug workaround. Patch contributed by hu vime. + Fixed bug where input elements inside inlinepopups wasn't editable in Firefox 2. + Fixed bug where the xhtmlxtras plugin wasn't replacing attribute values correctly. + Fixed bug where menu buttons in skin variants would look strange due to IE 8 fixes. + Fixed bug where WebKit browsers would on backspace take you back to the previous page if the editor was empty. + Fixed bug where DOMUtils decode method wouldn't handle strings larger than 4096kb due to node chunking. + Fixed bug where meta key wasn't handled as ctrl key on Mac OS X for custom keyboard short cuts. + Fixed bug where init event would get fired twice on WebKit on Mac OS X. +Version 3.2.1 (2008-11-04) + Added support for custom icon image for drop menus. Use icon_src to set a custom image directly. + Added new media_strict option to media plugin. Enables you to control if the flash embed is strict or not. Enabled by default. + Fixed so the editors script files gets dynamically loaded without using XHR or eval. + Fixed so the media plugin outputs valid XHTML object elements for Flash movies. Can be disabled with the media_strict option. + Fixed so dynamic loading doesn't require eval calls on non IE browsers for better Air support. + Fixed bug where the editor wasn't treated as empty if the remaining paragraph had attributes. + Fixed bug where id's of elements was removed ones they got wrapped in paragraphs. Patch contributed by ChronoZ. + Fixed bug where WebKit browsers where placing list elements inside paragraph elements. + Fixed bug where inserting images or links would produce absolute urls on WebKit browsers. + Fixed bug where values for checked, readonly, disabled and selected attributes was incorrect on IE. + Fixed bug where positive values for checked, readonly, disabled and selected attributes wasn't forced to valid values. + Fixed bug where selecting the first option in a native select box would produce an undefined error. + Fixed bug where tabindex 32768 could be outputted on IE if element attributes where cloned. + Fixed bug where the media dialogs preview window would display incorrect contents due to duplicate clsid prefixes. + Fixed bug where non pixel or percent heights for textarea elements would produce errors on IE. + Fixed bug where cdata sections in script elements wasn't handled correctly. + Fixed bug where nowrap of table cells would produce a 65535 value output. + Fixed bug where media plugin would produce an error if you selected the first item in the items list. + Fixed bug where media plugin would modify links with the item _value in them. + Fixed so table width/height is better forced if inline_styles is enabled. Patch contributed by daKmoR. + Fixed css for IE 8 such as opacity and other rendering quirks. +Version 3.2.0.2 (2008-10-02) + Fixed bug where the SelectBox and NativeSelectBox wasn't updated correctly if undefined was passed to them. + Fixed bug where the style dropdown wasn't correctly changed back to it's original state when element had no class. + Fixed bug where multiple pending font styles wasn't handled correctly. + Fixed so you can disable all auto css loading for dialogs by setting the popups_css option to false. +Version 3.2.0.1 (2008-09-17) + Fixed bug where font sizes and faces wouldn't be changed correctly when there was a parent with a different style. + Fixed bug where adding fonts to the same selection would produce redundant spans. +Version 3.2 (2008-09-11) + Added new text style support, it will now use span elements internally instead of font elements. + Added new improved support for the theme_advanced_font_sizes option, check the Wiki for details. + Added new keep_style setting that maintains the text style on return/enter on non IE browsers, enabled by default. + Added new onBeforeSetContent/onBeforeGetContent/onSetContent/onGetContent events to the Selection class. + Added new selectByIndex method to ListBox class. This enables you to select list items by an index instead of a value. + Added new possibility to the select method of the ListBox class. This can now have a selector function as it's value argument. + Added new possibility to skip the loading of popups css by setting the feature popup_css to the value false. + Added new possibility to skip translation of popups by setting the translate_i18n feature to false. + Added new element_format option enables you to produce HTML element endings instead of XHTML. But we are still in the XHTML is better camp. + Added missing allowfullscreen and quality options for flash elements, this will now get correctly stored. + Fixed bug where table cell dialog didn't close properly unless the accessibility_warnings option was set to false. + Fixed bug where the modal dialog blocker element for inlinepopups wasn't placed at a correct location if the page had scroll. + Fixed bug where non inline dialogs didn't close correctly if the inlinepopups plugin was used. + Fixed bug where non inline dialogs could make the modal dialog blocker to work incorrectly. + Fixed bug where style select wasn't populated correctly if you pressed the arrow. Patch by Hari Karam Singh. + Fixed bug where toggling the fullscreen mode didn't restore scrollbars on IE when the editor was inside a frame. Patch by Jacob Barrett. + Fixed bug where inserting flash contents using the template plugin didn't work correctly. + Fixed bug where inserting flash contents using the selection.setContent or mceInsertContent command didn't work correctly. + Fixed bug where IE would produce an exception if a comment started with -. + Fixed bug where the blockquote button would wrap lists incorrectly on non IE browsers. + Fixed bug where Opera would display BR elements in the element path. + Fixed bug where xhtmlxtras didn't insert elements correctly on IE. + Fixed bug where the buttons wasn't activated correctly in the xhtmlxtras plugin. + Fixed bug where adding an object as the style attribute for the dom setAttribs method wouldn't work. + Fixed bug where the background color would bleed out to parent container element in Gecko. + Fixed bug where the insert column actions for tables would fail if you did it in a thead or tfoot. Patch contributed by T Andersen (tan73). + Fixed bug where event blocker element wasn't positioned correctly for the inlinepopups plugin. + Fixed bug where pasting from Office 2007 would produce an odd comment in the contents. + Fixed bug where the paste as plain text could remove an extra character. Patch contributed by Speednet. + Fixed bug where some characters where missing for the paste_replace_list option. Patch contributed by Speednet. + Fixed bug where removing non existing editor instances by the mceRemoveControl command would produce an error. + Fixed bug where meta elements with the name description would produce errors in IE. + Fixed bug where color and background colors wouldn't be updated properly. + Fixed bug where the createMenuButton of tinymce.ControlManager didn't implement the last class argument. + Fixed bug where the editor_css option was relative from the TinyMCE installation directory not the current page. + Fixed bug where elements wouldn't be padded if the element contained bogus br elements. For example TD elements. + Fixed bug where parsing of in fullpage plugin would produce an error. + Fixed bug where relative urls with just ./ would become an empty string. + Fixed bug where outdent button would be disabled if inline_styles where set to false. + Fixed bug where replace with an empty search string would produce an error on IE. + Fixed bug where restoring the overflow state of the body in fullscreen plugin running on IE would produce vertical scrollbars. + Fixed bug where pressing return/enter in list items would sometimes move the caret the to top of the content area in FF. + Fixed bug where the style listbox wouldn't be updated correctly if you used the use_native_selects option. + Fixed bug where WebKit browsers would produce a div element when ending list elements using return. + Fixed so translation of popup contents only occurs if it's needed. + Optimized the URI object in regards or converting absolute URIs to relative URIs. +Version 3.1.1 (2008-08-18) + Added new getSize method to DOMUtils it will return the dimensions only of an element. + Added new alert/confirm methods to the tinyMCEPopup class to prevent focus problems and also to shorten method calls. + Added new plugin_preview_inline option to preview plugin to enable/disable native/inline dialogs. + Added new readonly option. If this is set the editor will only display the contents for the user. + Added missing tabindex and accesskey to input elements in the default valid_elements setup. + Updated firebug lite to 1.2, to enable it use the tiny_mce_dev.js?debug=1 on the development package. + Fixed so the preview dialog in the preview plugin uses inline dialogs/popups. + Fixed so CDATA sections remains intact through the serialization process of the DOM tree. + Fixed various issues with the getAttrib command. It will now return more correct values. + Fixed bug where the embed element wasn't properly parsed in the media plugin it now supports 3 formats. + Fixed bug where the noshade attribute was serialized incorrectly on IE. + Fixed bug where editing an existing link element didn't force it relative. + Fixed bug where image link creation fails on Safari if the image is aligned. + Fixed bug where it was possible to scroll the fullscreen mode in Opera 9.50. + Fixed bug where removal of center image alignment would fail. Patch contributed by Andrew Ozz. + Fixed bug where inlinedialogs didn't work properly if the doctype was incorrect in IE. + Fixed bug where cross domain loading didn't work correctly in Opera 9.50. + Fixed bug where breaking huge text blocks with return/enter key would scroll to end of block. + Fixed bug where replace button kept inserting the replacement text even if there is no more matches. + Fixed bug with fullpage plugin where value wasn't set correctly. Patch contributed by Pascal Chantelois. + Fixed bug where the dom utils setAttrib method call could produce an exception if the input was null/false. + Fixed bug where pressing backspace would sometimes remove one extra character in Gecko browsers. + Fixed bug where the native confirm/alert boxes would move focus to parent document if fired in dialogs. + Fixed bug where Opera 9.50 was telling you that the selection is collapsed even when it isn't. + Fixed bug where mceInsertContent would break up existing elements in Opera and Gecko. + Fixed bug where TinyMCE fails to detect some keyboard combos on Mac, contributed by MattyRob. + Fixed bug where replace all didn't move the caret to beginning of text before searching. + Fixed bug where the oninit callback wasn't executed correctly when the strict_loading_mode option was used, thanks goes to Nicholas Oxhoej. + Fixed bug where a access denied exception was thrown if some other script specified document.domain before loading TinyMCE. + Fixed so setting language to empty string will skip language loading if translations are made by some backend. + Fixed so dialog_type is automatically modal if you use the inlinepopups plugin use dialog_type : "window" to re-enable the old behavior. +Version 3.1.0.1 (2008-06-18) + Fixed bug where the Opera line break fix didn't work correctly on Mac OS X and Unix. + Fixed bug where IE was producing the default value the maxlength attribute of input elements. +Version 3.1.0 (2008-06-17) + Fixed bug where the paste as text didn't work correctly it encoded produced paragraphs and br elements. + Fixed bug where embed element in XHTML style didn't work correctly in the media plugin. + Fixed bug where style elements was forced empty in IE. The will now be wrapped in a comment just like script elements. + Fixed bug where some script elements wrapped in CDATA could fail to be serialized correctly. + Fixed bug where FF 3 produced -moz- internal styles in some style attributes. + Fixed bug where query strings and external URLs didn't work correctly in style attributes. + Fixed bug where shape attribute of area elements got serialized as rect regardless of it's initial value in IE 6. + Fixed bug where selection of elements inside layers would fail in IE since focus was moved to the document body. + Fixed bug where pressing enter/return in an editable select box would produce an __mce_add_custom__ class value. + Fixed bug where changing font size of text placed inside a colored text chunk would remove the parent node. + Fixed bug where Opera 9.5 final produced a strange line break behavior due to a workaround for previous Opera versions. + Fixed bug where text/background color would produce a strange focus problem when you tried to click on the body in IE. + Fixed issue where selecting the title of an listbox equals the old 2.x behavior of changing the value to an empty string. + Fixed issue where it was common for the media plugin to break if the _value attribute wasn't added for the param element. + Fixed issue where the wrong parent editor instance might be updated if you use fullscreen mode in an incorrect way. + Fixed issue where Safari was producing a warning about the base element not being closed correctly. + Removed redundant form element name matching from regexp in the DOMUtils class. +Version 3.0.9 (2008-06-02) + Added new contextmenu_offset_x/contextmenu_offset_y options for the contextmenu plugin. + Added cite attribute to the default rule for the blockquote element. + Added support for using arrow keys for selection of items in listboxes. + Added support for using arrow keys for selection of items in dropmenus. + Fixed bug where blockformat change on elements with BR inside them didn't change correctly on Firefox. + Fixed bug where removing table rows inside thead or tfoot would remove the whole table if it was the last one. + Fixed bug where XHR synchronous mode didn't execute the callback handlers synchronously. + Fixed bug where setting border to 0 didn't add border: 0 to the style attribute when using the advimage dialog. + Fixed bug where the selection of images and table cells didn't work correctly when the editor is placed in a frame and running on IE. + Fixed bug where the store/restore of a selection didn't work correctly in non IE browsers. + Fixed bug where only the first element would be invalid for the invalid_elements option. + Fixed bug where paste as plain text didn't encode the characters correctly when they where inserted. + Fixed bug where HTML source window couldn't be maximized on Gecko when the maximizable feature was enabled. + Fixed bug where color selection using the color picker could produce exception in IE. + Fixed bug where font size changes could produce produce extra redundant elements. + Fixed bug where IE could produce unknown runtime error if you replaced a image with another image from a separate frame. + Fixed bug where the domLoaded state for the Event class wasn't set correctly if the editor was loaded dynamically using the gzip compressor. + Fixed bug where handling of the base element for a page would produce incorrect urls. Based on a patch contributed by John LeSueur. + Fixed bug where table constraint alert boxes was presented with an empty value and wasn't the skinned inline ones. + Fixed bug where the onChange event wasn't fired when the form was submitted. It's now also triggered when the save method is called. + Fixed bug where encoding set to xml didn't work as expected. It now encodes the contents into XML entities. + Fixed bug where numrows didn't work correctly for the merge cells dialog of the table plugin. + Fixed bug where the onGetContent event was fired even when the no_events flag was set. + Fixed bug where the preview panels for the advimage and the media plugin could overflow on Safari and FF 3. + Fixed bug where the editing and removal of abbr elements using the xhtmlxtras plugin working correctly on IE. + Fixed bug where save button in the save plugin didn't work correctly on IE. + Fixed bug where dragging layers didn't work as expected since it would snap back to it's original location if you saved. + Fixed bug where the description of the template plugin dialog wasn't updated correctly. + Fixed bug where the values for frame and rules in the table dialogs where swapped. + Fixed bug where the elements like ins, del, cite, acronym and abbr didn't have the default editing style as the old 2.x branch. + Fixed bug where ask mode would lock the focused textarea if you pressed cancel in the confirm dialog on FF 3. + Fixed bug where ask mode would produce contents for empty textareas if you reloaded the page. + Fixed so the onGetContent event gets the full pass through object just like the other events. + Fixed so attributes for block elements remains the same when you change format of a element. +Version 3.0.8 (2008-04-30) + Fixed bug where IE would produce an error if textareas without names where converted. + Fixed bug where editor wasn't forced empty when there was only a single br or empty paragraph left. + Fixed bug where IE would produce an warning message if object elements where produced in the media plugins preview running on https. + Fixed bug where new addVer function didn't handle hash items correctly. Patch contributed by Mirek Burkon. + Fixed bug where font_size_style_values option wasn't applied correctly to fonts inside the editor. + Fixed bug where image selection could be lost if a image was edited using context menu on IE. + Fixed bug where style values wasn't updated properly due to an invalid regexp. + Fixed bug where IE 6 where displaying warning message about insecure items when inserting an image while using https. Patch contributed by Norifumi Sunaoka. + Fixed bug where IE was producing an auto save message if you selected a color from the color split button. + Fixed bug where backspace sometimes would move the caret to the end of the previous block in Gecko. + Fixed bug where the rowlayout manager didn't work as described in the documentation. + Fixed bug where the default options for the fullpage plugin wasn't applied correctly. + Fixed bug where selection would jump one character if you applied a styles to a words in non IE browsers. + Fixed bug where undo levels wasn't added correctly if you went back in undo history and added a new event. + Fixed bug where font size dropdown didn't mark the selected size in IE. + Fixed bug where the size of the editor was determined using clientWidth instead of offsetWidth. + Fixed so the onchange event doesn't fire on the initial undo level, it will also fire when the editor is blurred. + Fixed so the advhr plugin produces XHTML valid output instead of non standard attributes. + Fixed so blockquote gets converted into [quote] in when the bbcode plugin is enabled. + Fixed so theme_advanced_font_sizes can be named for example Font 1=1, Font 2=2 etc. + Fixed so editor_selector/editor_deselector can be regexps. By default only strings are allowed not part regexps like before. + Fixed so that the version suffix is optional. It still requires the build process so you need to export it manually. + Fixed so it's possible to tab to table cells in non Gecko browsers and also produce new rows if you tab at the end of a table. Contributed by Josh Peek. +Version 3.0.7 (2008-04-14) + Added new version suffix to all internal GET requests to make sure that the users cache gets cleared correctly. + Fixed issue with isDirty returning true event if it wasn't dirty on IE due to changes in tables during initialization. + Fixed memory leak in IE where if a page was unloaded before all images on the page was loaded it would leak. + Fixed bug in IE where underline and strikethrough could produce an exception error message. + Fixed bug where inserting paragraphs in totally empty table cells would produce odd effects. + Fixed bug where layer style data wasn't updated correctly due to some performance enhancements with the DOM serializer. + Fixed bug where it would convert the wrong element if there was two elements with the same name and id on the page. + Fixed bug where it was possible to add style information to the body element using the style plugin. + Fixed bug where Gecko would add an extra undo level some times due to the blur event. + Fixed bug where the underline icon would get active if the caret was inside a link element. + Fixed bug where merging th cells not working correctly. Patch contributed by André R. + Fixed bug where forecolorpicker and backcolorpicker buttons where rendered incorrectly when the o2k7 skin was used. + Fixed bug where comment couldn't contain -- since it's invalid markup. It will now at least not break on those invalid comments. + Fixed bug where apos wasn't handled correctly in IE. It will now convert apos to ' on IE since that browser doesn't support that entity. + Fixed bug where entities wasn't encoded correctly inside pre elements since they where protected from whitespace removal. + Fixed bug where color split buttons where rendered incorrectly on IE6 when using the non default theme. + Fixed so caret is placed after links ones they are created, to improve usability of the editor. + Fixed so you can select tables by clicking on it's borders in non IE browsers to normalize the behavior. + Fixed so the menus can be toggled by clicking once more on the icon in listboxes, menubuttons and splitbuttons based on code contributed by Josh Peek. + Fixed so buttons can be labeled, currently only works with the default skin, so it's kind of experimental. Patch contributed by Daniel Insley. + Fixed so forecolorpicker and backcolorpicker remembers the last selected color. Patch contributed by Shane Tomlinson. + Fixed so that you can only execute the mceAddEditor command once for the same instance name. + Fixed so command functions added with addCommand can pass though the call to default handles if it returns true. +Version 3.0.6.2 (2008-04-07) + Fixed bug where empty tables couldn't be edited correctly on non IE browsers if they where loaded into the editor. + Fixed bug where it was impossible to resize layers correctly in IE since it thought it was an image. + Fixed bug where an editor instance was stealing focus in IE resulting in a scroll to the editor on page reloads. + Fixed bug where Safari was crashing on Mac OS X if you closed dialogs using the Esc key. +Version 3.0.6.1 (2008-04-04) + Added support for the missing mceAddFrameControl command. The input for this command has changed so consult the Wiki. + Fixed bug where sub menus for the drop menus would leave an empty element behind. + Fixed memory leak in IE if the editor was placed in a frame or iframe. +Version 3.0.6 (2008-04-03) + Added elements to the default value of valid_elements option. It now contains all XHTML strict elements and a few transitional. + Added more accessibility fixes, it's now possible to navigate and close list boxes and split button menus with the keyboard. + Added missing getInfo method to the contextmenu and safari plugin, this caused problems for the Drupal module. + Added new inlinepopups_zindex option to the inlinepopups plugin so that you can configure the default start z-index. + Added new setControlType method to the tinymce.ControlManager class. This method enables you to override the default classes. + Added ability to specific an optional control class to use instead of the default one for the ControlManager methods. Based on concept by Josh Peek. + Fixed bug where attribute rules for the DOM Serializer couldn't contain - or _ characters in their names. + Fixed bug where inlinepopups event blocker and modal dialog blocker elements produced vertical scrollbars. + Fixed bug where there was a rendering issue with quirks mode in Safari moving the resize handle to an incorrect position. + Fixed bug with forecolor/backcolor controls on IE. Sometimes elements positioned relative will generate display errors. + Fixed bug where a p2 was leaking out in the global name space when you selected a color from the forecolor/backcolor controls. + Fixed bug where empty paragraphs didn't work as expected in browsers other than IE. + Fixed bug where the load method of the tinymce.dom.ScriptLoader didn't check if the file was already loaded. + Fixed bug where the load method for the PluginManager and ThemeManager didn't check if a plugin/theme by a specific name was all ready loaded. + Fixed bug where the theme_advanced_link_targets option didn't work correctly with the advanced themes link dialog. Patch contributed by Arnold B. + Fixed bug where the style command would merge classes into empty span elements. + Fixed bug where the style command would remove empty span elements outside the current selection. + Fixed bug where the fix for the Safari backspace bug removed all editor contents if it was filled with empty paragraphs. + Fixed bug where alert and confirm boxes opened by the inlinepopups plugin would produce an exception if domain relaxing was used. + Fixed bug where Safari was adding style attributes to all elements when you paste them into the editor. + Fixed bug where the spellchecker menus was visually incorrect since the space for the non existing icon was still there. + Fixed bug where remove_linebreaks option didn't remove line breaks inside the text contents of a element. + Fixed bug where Safari 3.1 was introducing _mc_tmp into paragraphs due to the new querySelectorAll and a TinyMCE specific workaround. + Fixed bug where getParam method in the Editor class was returning incorrect objects and would mess up the font drop down. Patch contributed by speednet. + Fixed bug where the table dialog would produce an exception in IE when you edited tables since it tried to place focus in a disabled field. + Fixed bug where class attribute on some span elements was removed on cleanup. + Fixed bug where resizing the editor in IE could produce an exception if the editor width/height got to be a negative value. + Fixed bug where wmv files wouldn't play since the src param was used instead of the url param. + Fixed bug where br elements would be added here and there in Gecko. Geckos internal _moz_dirty br elements where serialized as well. + Fixed bug where editing named anchors would produce two anchors instead of one updated one. + Fixed bug where arrow and function keys didn't work when an noneditable element was focused within the editor. + Fixed bug where the dispatcher could produce an exception if the listener list was altered inside an event callback. + Fixed bug where it was impossible to totally empty the editor contents on Safari due to an mistreatment of nbsp as whitespace. Patch contributed by Andrew Ozz. + Fixed bug where TinyMCE would not convert textareas with the same name attribute value. It will now generate an unique id for those textareas. + Fixed bug where backspace/delete key was deleting td elements inside tables while running on Gecko. + Fixed bug where Firefox 3.0b4 and Opera 9.26 where scrolling to the top of document when pressing return/enter. + Fixed bug where the template plugin wasn't just inserting the mceTmpl tagged element. + Fixed bug where the alert method of the default WindowManager implementation didn't translate input language strings like the inlinepopups dialog does. + Fixed bugs with the backspace behavior in Gecko. The caret was placed on incorrect locations in the DOM sometimes. + Fixed so advimage dialog and table dialogs has support for editable select boxes for the class value. + Fixed so the media, pagebreak and spellchecker doesn't load it's default content.css file if the content_css option is set to false. + Fixed so the paste_use_dialog option works again it's enabled by default but can be disabled on IE. Patch contributed by Speednet. + Fixed so that the fullscreen editor is focused when switching fullscreen editing on. + Fixed so it's possible to edit images and links inside tables using the context menu. + Fixed so table dialogs and the advanced image dialog doesn't loose selection in IE if the dialogs where navigated/submitted with the keyboard. + Fixed so the theme_advanced_blockformats options can have named items for example title 1=h1;title 2=h2. + Fixed so it's possible to add a custom editor_css for the simple theme. + Fixed quirks with directionality rtl, patch contributed by Andrew Ozz. + Fixed so the inlinepopups default start zIndex is 300000. + Fixed typo in media plugin Shockware is now replaced with Shockwave. + Fixed psuedo memory leak in IE with the replaceChild method inside the DOMUtils.replace method. + Fixed so memory is released when an editor instance is removed from page. + Optimized the color split button menus so that they use less event handlers. + Removed the util/mclayer.js file since it's no longer used by any of the TinyMCE dialogs and is considered deprecated. +Version 3.0.5 (2008-03-12) + Added new black skin variant to the o2k7 skin contributed by Stefan Moonen. + Added new explode method to the tinymce core class. This does a split but removed whitespace it also defaults to a , delimiter. + Added new detection logic for IE 8 standards mode into the DOMUtils class strMode can now be checked to see if that mode is on/off. + Added new noscale option value for the scale select box for Flash in the media plugin. + Fixed bug where the menu for the ColorSplitButton wasn't removed when the editor was removed. + Fixed bug where font colors couldn't be edited correctly since the style of the element didn't get updated correctly. + Fixed bug where class of elements would get lost when TinyMCE was fixing incorrect HTML markup. + Fixed bug where table editing would produce double height values. + Fixed bug where width style value wouldn't be removed if you switched width unit from cm/em to pixels or percent. + Fixed bug where the search/replace input box wasn't auto focused like the other dialogs. + Fixed bug where the old mceAddControl command would use the fullscreen settings next time it created an instance. + Fixed bug where multiple lines where added to the target cell if you merged multiple empty cells. + Fixed bug where drop down menus would be incorrectly positioned inside scrollable divs. + Fixed bug where the separators of the silver skin variant didn't display correctly in IE 6. + Fixed bug where createStyleSheet seems to load scripts at opposite order in some IE versions. + Fixed bug where directionality could produce odd results for the UI and the dialogs. + Fixed bug where the DOM serializer wouldn't serialize custom namespaced attributes in IE 6 using the *[*] valid elements rule. + Fixed bug where table caption would be inserted after the thead element if you swapped a tr to be inside the thead. + Fixed bug where the youtube detection logic for the media plugin was to generic. + Fixed so the deprecated and undocumented theme_advanced_path_location set to none won't hide the whole statusbar. + Fixed so most input lists can have whitespace in them they are now split using the new tinymce.explode method. + Fixed so the popup_css and popup_css_add URLs are relative to where the current document is located. + Fixed various bugs and quirks with the store/restore selection logic. + Fixed so the editor starts in IE 8 standards mode but still that browser is very very buggy. + Fixed so dialog_type set to modal will block the background and other inline windows and only give access to the front most window. +Version 3.0.4.1 (2008-03-08) + Fixed critical bug where it was impossible to edit images when inlinepopups where used due to lost selection in IE. +Version 3.0.4 (2008-03-07) + Added new option constrain_menus, this enables you to force view port constraints on all menus. Contributed by Shane Tomlinson. + Fixed bug where table background wasn't visible inside the editor due to a default CSS rule overriding the style attribute. + Fixed bug where links would get a null class added if no styles was used in IE. + Fixed bug where spellchecker was auto focusing the editor in IE. + Fixed bug where document.domain would produce invalid argument if the editor was loaded in IE6 over a network UNC path. + Fixed bug where table height attribute was used, this is deprecated in XHTML so it now adds it as an style. + Fixed bug where textareas with style values would produce error in IE. + Fixed so the first element in each dialog is focused by default to enhance keyboard usage. + Fixed so you can add a mceFocus class to elements to make it auto focused. + Fixed so you can close dialogs using the esc key. + Fixed so you can press return/enter to submit the action of each dialog. + Fixed so tabbing inside an inline popups wont focus the resize anchor elements. + Fixed so you can press ok in inline alert messages using the return/enter key. + Fixed so textareas can be set to non px or % sizes for example em, cm, pt etc. + Fixed so non pixel values can be used in width/height properties for tables. + Fixed so the custom context menu can be disabled by holding down ctrl key while clicking. + Fixed so the layout for the o2k7 skin looks better if you don't have separators before and after list boxes. + Fixed so the sub classes get a copy of the super class constructor function to ease up type checking. + Fixed so font sizes for the format block previews are normalized according to http://www.w3.org/TR/CSS21/sample.html (it can be overridden). + Fixed so font sizes for h1-h6 in the default content.css is normalized according to http://www.w3.org/TR/CSS21/sample.html (it can be overridden). +Version 3.0.3 (2008-03-03) + Fixed bug where an error about document.domain would be thrown if TinyMCE was loaded using a different port. + Fixed bug where mode exact would convert textareas without id or name if the elements option was omitted. + Fixed bug where the caret could be placed at an incorrect location when backspace was used in Gecko. + Fixed bug where local file:// URLs where converted into absolute domain URLs. + Fixed bug where an error was produced if a editor was removed inside an editor command. + Fixed bug where force_p_newlines didn't effect the paste plugin correctly. + Fixed bug where the paste plugin was producing an exception on IE if you pasted contents with middots. + Fixed bug where delete key could produce exceptions in Gecko sometimes due to the fix for the table cell bug. + Fixed bug where the layer plugin would produce an visual add class called mceVisualAid this one is now renamed to mceItemVisualAid to mark it internal. + Fixed bug where TinyMCE wouldn't initialize properly if ActiveX controls was disabled in IE. + Fixed bug where tables and other elements that had visual aids on them would produce an extra space after any custom class names. + Fixed bug where search with an empty string would produce some odd "invalid pointer" error in IE. + Fixed bug where elements like menus where placed at incorrect positions in Opera 9.26. + Fixed bug where IE was loosing focus of the editor when you clicked some dropmenu and if it was placed in a frame or iframe. + Fixed bug where focus of images could be lost in IE if you focused the accessibility confirm dialog in the advimage plugin. + Fixed bug where nestled font elements would produce odd output like missing font elements. + Fixed bug where text colors and styles got removed if invalid_elements included the font element. + Fixed bug where text-decoration set to underline or line-through would remove other styles from span elements. + Fixed bug where editor contents like \n\n would be incorrectly handled and processed as real line feeds. + Fixed bug where incorrectly encoded urls with ampersands in them would be decoded incorrectly. + Optimized the DOMUtils decode method to be a lot faster if the string doesn't have any entities to decode. +Version 3.0.2.1 (2008-02-26) + Fixed alert/confirm dialogs so they display correctly. +Version 3.0.2 (2008-02-26) + Added new body_id option that enables you to specify the id of the body inside the editor iframe based on ideas by David Bildström (ChronoZ). + Added new body_class option that enables you to set the class for the body of the editor iframe based on ideas by David Bildström (ChronoZ). + Added new CSS class to the default content.css files mceForceColors that forces white background and black text can be used with the body_class option. + Added new type parameter to the Editor.getParam function to reduce redundant logic for parsing hash tables. + Added new isDone method to the ScriptLoaded class, this enables you to check if a script has been loaded or not. + Added new resizeTo and resizeBy methods for the advanced theme. Can be called using tinyMCE.activeEditor.theme.resizeTo(w, h); + Added new skin_variant option this can be used to extend existing skins with slight modifications like color. + Added new variant of the o2k7 skin called "silver" based on a contribution made by Stefan Moonen. + Fixed bug where the template plugin might produce errors if the template_mdate_classes wasn't configured. + Fixed bug where the media plugin didn't convert the URLs for movies once they where inserted. + Fixed bug where the style field for the advlink dialog didn't work correctly if you edited an existing link. + Fixed bug where alignment of toolbars would fail in editor was uses in a quirks mode on IE, fix contributed by Peter Wood & Art Lawry. + Fixed bug where initialization of multiple editors at the same time using the mceAddControl method would produce errors. + Fixed bug where initialization of editors using mceAddControl command or new tinymce.Editor calls would fail during page load. + Fixed bug where the check for domain relaxing could fail if the document.domain property was changed by another script. + Fixed bug where textareas couldn't be named description or any other name that matches the meta elements in IE and Opera. + Fixed bug where the element path would fail sometimes in IE due to "unknown runtime error" on innerHTML. + Fixed bug where Safari would crash if you was hiding the editor before serializing the contents. + Fixed bug where the editor wasn't scaled propertly in fullscreen mode using the old fullscreen_new_window option. + Fixed bug where render method didn't load language packs in IE and Opera if you rendered an editor during page load. + Fixed bug where resizing the browser window in fullscreen didn't resize the editor. + Fixed bug where the blockquote command didn't move the caret inside the new empty blockquote if you used it on an empty document. + Fixed bug where auto in a style width/height for the textarea would produce an editor with the size value of 100. Fix contributed by Shane Tomlinson. + Fixed bug where restoration of selection at the beginning of an element could fail in Gecko. + Fixed bug where caret restoration after a cleanup could place the it at an incorrect location. + Fixed bug where delete key inside td elements would delete the cell in Gecko. + Fixed so the blockquote button toggles individual lines. This behavior is a bit more like the old indentation behavior in the 2.x branch. + Fixed so the dialog language packs only gets loaded the first time you open a dialog. + Fixed so all classes in the whole UI is prefixed with "mce" to avoid collisions, use the skin converter to update your existing skins. + Fixed so all classes in the inlinepopups logic is prefixed with "mce" to avoid collisions, use the skin converter to update your existing skins. + Fixed so that the window in fullscreen mode can be resized when fullscreen_new_window option is enabled. + Fixed so blockquote elements are formatted in the source output with an linefeed before and after it. + Optimized the editor initialization by reducing the number of calls to getBookmark/moveToBookmark. +Version 3.0.1 (2008-02-21) + Added spellchecker plugin into the main package, but without any backend can be specified with the spellchecker_rpc_url option. + Added src attribute for script elements to the default valid_elements option value. + Added extra parameter to the class_filter callback it can now also filter out classes based on the whole CSS rule. + Added support for domain relaxing, TinyMCE can now be loaded from an remote domain as long as they are on the same root domain. + Added support for custom elements the new custom_elements option enables you to add non HTML elements to the editor. + Added support for the W3C Selectors API that was added to latest nightly build of WebKit. + Fixed bug where some object param element wasn't stored correctly using the media plugin. + Fixed bug where Opera was scrolling to top of page is drop menus on list boxes where displayed. + Fixed bug where IE6 was crashing if a format block was used on a container with anchor elements. + Fixed bug where spans with font sizes wasn't handled correctly when editor was loading contents. + Fixed bug where mode exact couldn't convert editors with name only. Id is no longer required but recommended. + Fixed bug where the mceInsertRawHTML command produced an extra undo level. + Fixed bug where the specific_textareas mode didn't work correctly this is the same thing as textareas now. + Fixed bug where the values of input elements in the HTML page of dialogs pages where changed in IE. + Fixed bug where fullscreen and fullpage plugins didn't work well together. + Fixed bug where embed elements wasn't handled properly in the media plugin. + Fixed bug where style information on span elements gets munged when fonts are converted to spans. + Fixed bug where some entities in element attributes where encoded incorrectly in the latest WebKit build. + Fixed bug where initialization would fail in IE if there where two input elements with the name submit in the form. + Fixed bug where fullscreen mode didn't work correctly in IE when the fullscreen_new_window option was used. + Fixed bug where invalid contents like an ul inside a p element would produce odd results in IE. + Fixed bug where Opera 9.2x was placing the drop menus at incorrect locations if the editor was placed in a table. + Fixed bug where Opera was producing odd results if enter/return was pressed while having forced_root_blocks disabled. + Fixed bug where layer plugin was stealing focus in IE on initialization. + Fixed bug where body attributes wasn't set properly in the fullpage plugin, fix contributed by Hiroaki Kawai. + Fixed bug where insert image and insert link dialogs where producing an extra level in the undo history. + Fixed bug where Gecko would produce an error if empty elements like
where inserted using mceInsertContent. + Fixed bug where center alignment of images produced odd results inside table cells. + Fixed bug where center alignment of images couldn't be toggled correctly. + Fixed bug where alignment of images inside tables would produce double float style items in IE if the fix_table_elements option was enabled. + Fixed bug where a variable called 'v' was polluting the global namespace. Objects tinymce and tinyMCE are the only ones allowed to be global. + Fixed bug where insert table from context menu couldn't insert new tables inside existing tables. + Fixed bug where Safari wouldn't produce br elements on enter when the force_br_newlines option was enabled. + Fixed bug where switching cell type in table cell dialog would produce odd attributes in IE. + Fixed bug where Gecko was outputting internal attributes if valid_elements where set to "*[*]". + Fixed bug where the style plugin would produce non hex colors inside the dialog when running on Gecko. + Fixed bug where an empty src value for insert image would remove the currently selected image if it wasn't and image element. + Fixed bug where hidden input elements would break the logic for the tab_focus option. + Fixed bug where save button wasn't working correctly in fullscreen mode. + Fixed bug where the editor was forced to be placed in a form element if the save_onsavecallback option was used. + Fixed bug where upper case param attributes wasn't parsed correctly in the media plugin. + Fixed bug where render method of tinymce.Editor class would produce an exception if the strict_loading_mode option was omitted. + Fixed bug where nodeChanged event could be fired while the editor was loading and there for produce an exception in FF. + Fixed bug where no undo levels where added if the user created new table rows using the tab key on Gecko. + Fixed bug where tables would be broken if you selected a different block format for contents withing an table cell. + Fixed bug where the render method of the tinymce.Editor class didn't setup the tinymce.EditorManager.settings object correctly. + Fixed bug where the advanced image dialog would go to the first tab if the alternative image was changed using the file browser link. + Fixed bug where the forced_root_block option would produce BR elements inside empty blocks if the block wasn't a paragraph. + Fixed bug where the forced_root_block doesn't work correctly on IE if the specified element was something else than paragraphs. + Fixed bug where selection of images would get lost if user selected something from the context menu in IE. + Fixed bug where the context menu plugin would pollute the global namespace with two variables p1 and p2. + Fixed compatibility issue with Mootools, it is destroying document.getElementById on unload in IE. (Mantra: You don't own the internal objects). + Fixed bugs where dialogs/tabs and other UI elements where rendered incorrectly in Firefox 3. + Fixed so the auto CSS class importer is compatible with 2.x. + Fixed so the editor UI and inlinedialogs works correctly with the YUI CSS reset package. + Fixed so header and footer elements are forced to lower case when the fullpage plugin is used. + Fixed so load prefixes "-" for plugins and themes isn't required if the plugin/theme was loaded by the ThemeManager/PluginManager. + Fixed so the JSONRequest uses application/json content type to make Ruby on rails happy. + Fixed so the CSS rule is more exact for the body in the default content.css files. Body is now defined as "body.mceContentBody" instead of just "body". + Fixed so the tiny_mce_dev.js uses XHR instead of document.write to load scripts to resolve an issue with Opera 9.50. + Fixed so language pack loading can be disabled by setting the language option to false. Can be useful for systems with their own language pack management. +Version 3.0 (2008-01-30) + Added map and area elements to the default valid_elements list and also some indentation rules. + Fixed bug where empty paragraphs wasn't padded when loading contents. + Fixed bug where the RowLayout manager didn't work at all. + Fixed bug where style attribute data would get messed up in advimage dialog. + Fixed bug where the table dialogs class select wasn't updated correctly. + Fixed bug where elements would get extra whitespace around on insert when body was present in valid_elements. + Fixed bug where coords attribute of the area element wasn't handled properly in IE. + Fixed bug where Safari didn't produce BR elements on shift+return. + Fixed bug where force blocks would cast odd invalid attribute exception in IE. + Fixed bug where media plugin would produce extra whitespace before and after objects. + Fixed bug where cleanup_callback could break the contents of the editor. But use the new event system instead of this option. + Fixed bug where the tab_focus option didn't work between editor instanced. You can now tab between editors. + Fixed bug where the load function of the ScriptLoader class didn't load single files without the load que as it was supposed to. + Fixed bug where the execcommand_callback parameter order was incorrect. Recommendation use the new addCommand method. + Fixed bug where range.select calls sometimes failed on some IE versions. + Fixed bug where Safari was scrolling to top of document when enter/returned was pressed. + Fixed bug where fullscreen_new_window option didn't work correctly. + Fixed bug where the nonbreaking plugin inserted an space instead of an non breaking space the first time. + Fixed bug where the visualization of non breaking spaces where visual in element path. + Fixed so the focus is restored to the editor after inserting an custom character. + Fixed so the isNotDirty state is set to false if a new undo level is added. + Fixed so pointless style information for borders gets removed in IE. + Fixed so the resize button has a se-resize cursor css value. +Version 3.0rc2 (2008-01-18) + Added new fix_nesting option to fix bug #1867292, this is disabled by default. + Added new indentation option enables you to specify how much each indent/outdent call will add/remove. + Added easier support for enabling/disabling icon columns on drop menues. + Added new menu button control class. This control is very similar to the splitbutton but without any onclick action. + Added support for previous tab focus (shift+tab). The tab_focus setting now takes two items next and previous element. + Fixed bug where iframes inside the editor got removed in Firefox on initial load. + Fixed bug where the CSS for abbr elements wasn't applied correctly in IE. + Fixed bug where mceAddControl on element inside a hidden container produced errors. + Fixed bug where closed anchors like
produced strange results. + Fixed bug where caret would jump to the top of the editor if enter was pressed a the end of a list. + Fixed bug where remove editor failed if the editor wasn't properly initialized. + Fixed bug where render call on for a non existing element produced exception. + Fixed bug where parent window was hidden when the color picker was used in a non inlinepopups setup. + Fixed bug where onchange event wasn't fired correctly on IE when color picker was used in dialogs. + Fixed bug where save plugin could not save contents if the converted element wasn't an textarea. + Fixed bug where events might be fired even after an editor instance was removed such as blur events. + Fixed bug where an exception about undefined undo levels could be throwed sometimes. + Fixed bug where the plugin_preview_pageurl option didn't work. + Fixed bug where adding/removing an editor instance very fast could produce problems. + Fixed bug where the link button was highlighted when an anchor element was selected. + Fixed bug where the selected contents where removed if a new anchor element was added. + Fixed bug where splitbuttons where rendered one pixel down in the default theme. + Fixed bug where some buttons where placed at incorrect positions in the o2k7 theme. + Fixed bug that made it impossible to visually disable a custom button that used an image instead of CSS sprites. + Fixed bug where it wasn't possible to press delete/backspace if the editor was added+removed and re-added due to a FF bug. + Fixed bug where an entities option with only 38,amp,60,lt,62,gt would fail in IE. + Fixed bug where innerHTML sometimes generated unknown runtime error on IE. + Fixed bug where content_css files wasn't loaded in the template preview iframe. + Fixed bug where scroll position was incorrect when toggling fullscreen mode. + Fixed bug where restoration of overflow didn't work correctly when disabling fullscreen mode in Opera. + Fixed bug where drop menus where places at incorrect locations if the editor was placed in a scrollable container element. + Fixed bug where hideMenu didn't hide sub menus correctly. It will now hide all menus recursively. + Fixed so theme_advanced_path_location can be used in init options for compatibility reasons. + Fixed so the drop menu colors matches the rest of o2k7 theme. + Fixed so the preview example.html file is updated to the new 3.x API. + Fixed so the margins are the same by default inside the editable area between IE and other browsers. + Fixed so editor contents gets stored before it the onSubmit event is fired. +Version 3.0rc1 (2008-01-08) + Added new classes for toolbar rows in advanced theme mceToolbarRow1..n enabled you to change appearance of individual rows. + Added auto detection for the strict_loading_mode option when running in application/xhtml+xml mode on Gecko. + Optimized the HTML serializer by bundling some post process methods together. + Fixed so that the toolbars have unique IDs, enables you to alter the toolbars using the ControlManager and the DOM. + Fixed bug where delta values for dialog sizes in language packs didn't work correctly due to missing string to number casting. + Fixed bug where paragraph generation logic didn't handle hr or table elements correctly if they where the only element. + Fixed bug where some elements got extra linebreaks added after or before it in HTML output. + Fixed bug where it was hard to modify existing style data on table rows and table cells. + Fixed bug where the dom.getRect method didn't handle non pixel values correctly. + Fixed bug where strikethrough and underline couldn't be toggled on existing span elements. + Fixed bug where the postprocessor searched for nsbp instead of nbsp entities. + Fixed bug where it was impossible to edit links that had child elements within them. + Fixed bug where it was possible to click on the parent item of a submenu. + Fixed bug where mouseover/mouseout images couldn't be removed in advimage dialog. + Fixed bug where drop menus didn't work when running in application/xhtml+xml mode. + Fixed bug where Opera added doctype to output in application/xhtml+xml mode. + Fixed bug where some DOM methods didn't work correctly in the application/xhtml+xml mode. + Fixed bug where the inlinepopups didn't work correctly in the application/xhtml+xml mode. + Fixed bug where the ColorSplitButton didn't display correctly in the application/xhtml+xml mode. + Fixed bug where the UI layout was incorrect on Gecko browsers when running in application/xhtml+xml mode. + Fixed bug where the word paste plugin produced exception while running in application/xhtml+xml mode. + Fixed bug where there wasn't any hidden input element generated for divs while running in application/xhtml+xml mode. + Fixed bug where indentation of script/style/pre elements where incorrect. + Fixed bug where script element contents was removed in IE. + Fixed bug where script element contents got entity encoded. + Fixed bug where you couldn't edit existing element styles using the styles plugin. + Fixed bug where styles wasn't updated properly sometimes due to an performance enhancement. + Fixed bug where font sizes couldn't be changed using the style plugin. + Fixed bug where an error was produced in Gecko browsers when switching back from fullscreen mode. + Fixed bug where Opera was producing br elements after elements like h3. + Fixed bug where TinyMCE couldn't be loaded on a page using - characters in it's URL. + Fixed bug where the editor container element was forced to have a specific name. + Fixed bug with force_br_newlines option on Firefox, even though it should never be used (Read FAQ). + Fixed bug where onclick event had an return true; prefix added when creating an popup. + Fixed bug where the theme_advanced_statusbar_location option couldn't handle the value "none". + Fixed issue with URLs with multiple at characters for example an Zope URI. + Fixed so simple and advanced themes doesn't collide. + Fixed so a elements gets removed when the href field is left empty, the href attribute is required in a link after all. + Fixed so img elements gets removed when the src field is left empty, the src attribute is required for all images after all. + Removed the indent and encode methods from the tinymce.dom.Serializer class due to performance enhancement and reduction of the API size. +Version 3.0b3 (2007-12-14) + Added new getElement method to Editor class, returns the element that was replaced with the editor instance. + Added new unavailable prefix for disabled controls for accessibility reasons. + Fixed bug where regexp patterns couldn't be used for the editor_selector/editor_deselector options. + Fixed bug where the DOM wasn't properly initialized before the onInit event was executed in popups. + Fixed bug where font sizes where reduced by font size actions on previous spans in Safari. + Fixed bug where HR elements got places at the wrong location in IE. + Fixed bug where align/justify didn't work correctly on multiple paragraphs. + Fixed bug with missing translation for cell scope settings. + Fixed bug where selection/caret position was lost on some table actions. + Fixed bug where editor instances couldn't be added to hidden div elements. + Fixed bug where list elements in Safari would get an odd ID attribute. + Fixed bug where IE would return when the editor was completely empty. + Fixed bug where accessibility title attribute for access keys wasn't setup properly. + Fixed bug where forecolorpicker and backcolorpicker control names wasn't working. + Fixed bug where inserting template content didn't work in Safari due to selection exception. + Fixed bug where absolute URLs to remote hosts couldn't be used for background images. + Fixed bug where mysterious span elements where produced in Safari when injecting HTML contents. + Fixed bug where the media plugin didn't work correctly on the latest Opera 9.24. + Fixed bug where indentation of HTML output wasn't applied to all block elements. + Fixed bug where Safari was production DOM exception if you pressed enter in an empty editor. + Fixed bug where media plugin didn't parse script tags correctly patch contributed by Mathieu Campagna. + Fixed bug where the drop menus of list boxes like blockformat could produce scrolling of the page. + Fixed bug where the drop menus where placed at an incorrect location if TinyMCE was placed in a scrollable div. + Fixed bug where submit buttons couldn't be named submit, it's not recommended to name submit buttons submit anyway. + Fixed bug where the stylelistbox produced an exception if there was only one class in the list box. + Fixed bug where the stylelistbox wasn't updated correctly when the current class was removed. + Fixed bug where the formatblock command sometimes removed the body element. + Fixed bug where fullscreen switching in IE sometimes produced an exception when the spellchecker plugin was enabled. + Fixed issue where FF produced an empty paragraph when the editor was completely empty. + Fixed issue with size of image dialog in the advanced theme. + Fixed issues with the bbcode plugin it now also handles spans and the [font] rule. + Fixed so the style compression feature is a bit smarter to resolve issues with Opera. + Reintroduced the remove_linebreaks option, this is enabled by default. +Version 3.0b2 (2007-11-29) + Added type and compact attributes to the default valid_elements list for the ul and ol elements. + Added missing accessibility support to native list boxes in both the toolbar and dialogs. + Added missing access key for the element path for accessibility reasons. + Fixed support for loading themes from external URLs. + Fixed bug where setOuterHTML didn't work correctly when multiple elements where passed to it. + Fixed bug with visualchars plugin was moving elements around in the DOM. + Fixed bug with DIV elements that got converted into editors on IE. + Fixed bug with paste plugin using the old event API. + Fixed bug where the spellchecker was removing the word when it was ignored. + Fixed bug where fullscreen wasn't working properly. + Fixed bug where the base href element and attribute was ignored. + Fixed bug where redo function didn't work in IE. + Fixed bug where content_css didn't work as previous 2.x branch. + Fixed bug where preview dialog was throwing errors if the content_css wasn't defined. + Fixed bug where the theme_advanced_path option didn't work like the 2.x branch. + Fixed bug where the theme_advanced_statusbar_location was called theme_advanced_status_location. + Fixed bug where the strict_loading_mode option didn't work if you created editors dynamically without using the EditorManager. + Fixed bug where some language values wasn't translated such as insert and update in dialogs. + Fixed bug where some image attributes wasn't stored correctly when inserting an image. + Fixed bug where fullscreen mode didn't restore scrollbars when disabled. + Fixed bug where there was no visual representation for tab focus in toolbars on IE. + Fixed bug where HR elements wasn't treated as block elements so forced_root_block would fail on these. + Fixed bug where autosave presented warning message even when the form was submitted normally. + Fixed typo of openBrower it's now openBrowser in form_utils.js. + Fixed various HTML problems like missing TD elements and duplicated doctypes. + Fixed default values for theme_advanced_resize_horizontal, theme_advanced_resizing_use_cookie to be 2.x compatible. + Moved spellchecker JS files into the development package. + Removed support for theme_advanced_path_location since the theme_advanced_statusbar_location is the correct option name. +Version 3.0b1 (2007-11-21) + Added new tab_focus option, that enables you to specify a element id or that the next element to be focused on tab key down. + Added new addQueryValueHandler method to the tinymce.Editor class. + Added new class_filter option, this enables you to specify a function that can filter out CSS classes for the styles list box. + Added support form [url=url]title[/url] to the bbcode plugin. + Renamed the addCommandQueryState method in the tinymce.Editor class to addQueryStateHandler. + Renamed loadQue to loadQueue, to correct spelling. + Removed the createDOM method from the window manager and replace it with a createInstance method. + Removed the add to beginning of class attribute parameter of the DOMUtils.addClass method. + Fixed bug with the forced_root_block option, didn't work correctly with multiple inline elements. + Fixed bug where image dialogs replaced the current image element with a new one even when it was updated. + Fixed bug where the submit trigger wasn't executed when divs where converted into editor instances. + Fixed bug where div elements that got converted into editors didn't get a hidden input element generated for them. + Fixed bug where the the media_use_script option for the media plugin wasn't working correctly. + Fixed bug where the font size and font family listboxes wasn't updated correctly on Safari. + Fixed bug where the height of the fieldset in default image dialog for the advanced theme was to small. + Fixed bug where the font sizes behaved incorrectly after a cleanup on Safari. + Fixed bug where formatblock didn't work correctly in Safari on some elements. + Fixed bug where template plugin didn't insert content correctly unless some options where specified. + Fixed bug where charmap on Safari produced scrollbars. + Fixed bug where there was white artifacts in some dialogs due to missing background color. + Fixed bug where port was added to all external URLs if the editor was loaded from a custom port. + Fixed bug where the context menus got duplicated on Safari 3.0.4 on Mac OS X. + Fixed bug where dialogs like paste from word was huge on Firefox. + Fixed bug with media plugin not working with windows media objects. + Fixed bug where a forever loop was created if multiple instances where submitted using form.submit. + Fixed bug with editing a table produce error in IE when inlinepopups where used. + Fixed bug where the style plugin generated ugly looking style information in IE. + Fixed bug where the inline dialogs that got opened while in fullscreen mode wasn't visible. + Fixed bug where it was difficult to place the caret inside the word paste dialog. + Fixed bug where Opera produced strange border in the word paste dialog. + Fixed bug where viewport constraints could move a inlinepopup to a negative x, y position if the viewport was to small. + Fixed bug where template plugin was producing an error due to a deprecated API call. + Fixed bug where drag drop of images failed in Gecko if a document_base_url was specified. + Fixed bug where Firefox 3 failed to apply block formats like H1-H6 it still breaks on DIVs this has been reported to bugzilla. + Fixed bug where IE was producing a warning dialog about non secure items when running TinyMCE over HTTPS. + Fixed bug where the onbeforeunload event was triggered when menus or dialogs where opened. + Fixed bug where the fullscreen mode of the HTML view source box threw an error. + Fixed bug where the mceFocus command didn't work correctly. + Fixed bug where the selection could get lost in IE using inlinepopups. + Fixed so the body of the editor area has the mceContentBody class just like the 2.x branch. + Fixed so the media icon gets active when a media element is selected. +Version 3.0a3 (2007-11-13) + Added new experimental jQuery and Prototype framework adapters to the development package. + Added new translation.html file for the development package. Helps with the internationalization of TinyMCE. + Added new setup callback option, use this callback to add events to TinyMCE. This method is recommended over the old callbacks. + Added new API documetation to all classes, functions, events, properties to the Wiki with examples etc. + Added new init method to all plugins and themes, since it's shorter to write and it mimics interface capable languages better. + Fixed various CSS issues in the default skin such as alignment of split buttons and separators. + Fixed issues with mod_security. It didn't like that a content type of text/javascript was forced in a XHR. + Fixed all events so that they now pass the sender object as it's first argument. + Fixed some DOM methods so they now can take an array as input. + Fixed so addButton and the methods of the ControlManager uses less arguments and it now uses a settings object instead. + Fixed various issues with the tinymce.util.URI class. + Fixed bug in IE and Safari and the on demand gzip loading feature. + Fixed bug with moving inline windows sometimes failed in IE6. + Fixed bug where save_callback function wasn't executed at all. + Fixed bug where inlinepopups produces scrollbars if windows where moved to the corners of the browser. + Fixed bug where view HTML source failed when inserting a embedded media object. + Fixed bug where the listbox menus didn't display correctly on IE6. + Fixed bug where undo level wasn't added when editor was blurred. + Fixed bug where spellchecker wasn't disabled when fullscreen mode was enabled. + Fixed bug where Firefox could crash some times when the user switched to fullscreen mode. + Fixed bug where tinymce.ui.DropMenu didn't remove all item data when an item was removed from the menu. + Fixed bug where anchor list in advlink dialog wasn't populated correctly in Safari. + Fixed bug where it wasn't possible to edit tables in IE when inlinepopups was enabled. + Fixed bug where it wasn't possible to change the table width of an existing table. + Fixed bug where xhtmlxtras like abbr didn't work correctly on IE. + Fixed bug where IE6 had some graphics rendering issues with the inlinepopups. + Fixed bug where inlinepopup windows where moved incorrectly when they were boundary checked for min width. + Fixed bug where textareas without id or name couldn't be converted into editor instances. + Fixed bug where TinyMCE was stealing element focus on IE. + Fixed bug where the getParam method didn't handle false values correctly. + Fixed bug where inlinepopups was clipped by other TinyMCE instances or relative elements in IE. + Fixed bug where the contextmenu was clipped by other TinyMCE instances or relative elements in IE. + Fixed bug where listbox menus was clipped by other TinyMCE instances or relative elements in IE. + Fixed bug where listboxes wasn't updated correctly when the a value wasn't found by select. + Fixed various CSS issues that produced odd rendering bugs in IE. + Fixed issues with tinymce.ui.DropMenu class, it required some optional settings to be specified. + Fixed so multiple blockquotes can be removed with a easier method than before. + Optimized some of the core API to boost performance. + Removed some functions from the core API that wasn't needed. +Version 3.0a2 (2007-11-02) + Fixed critical bug where IE generaded an error on a hasAttribute call in the serialization engine. + Fixed critical bug where some dialogs didn't open in the non dev package. + Fixed bug when using the theme_advanced_styles option. Error was thrown in some dialogs. + Fixed bug where the close buttons produced an error when native windows where used. + Fixed bug in default skin so that split buttons gets activated correctly. + Fixed so plugins can be loaded from external urls outsite the plugins directory. +Version 3.0a1 (2007-11-01) + Rewrote the core and most of the plugins and themes from scratch. + Added new and improved serialization engine, faster and more powerful. + Added new internal event system, things like editor.onClick.add(func). + Added new inlinepopups plugin, the dialogs are now skinnable and uses clearlooks2 as default. + Added new contextmenu plugin, context menus can now have submenus and plugins can add items on the fly. + Added new skin support for the simple and advanced themes you can alter the whole UI using CSS. + Added new o2k7 skin for the simple and advanced themes. + Added new custom list boxes for font size/format/style etc with preview support. + Added new UI management, enabled plugins to create controls like splitbuttons or menus easier. + Added new JSON parser/serializer and JSON-RPC class to the core API. + Added new cookie utility class to the core API. + Added new Unit testing class to the core API only available in dev mode. + Added new firebug lite integration when loading the dev version of TinyMCE. + Added new Safari plugin, fixes lots compatibility of issues with Safari 3.x. + Added new URI/URL parsing it now handles the hole RFC and even some exceptions. + Added new pagebreak plugin, enables you to insert pagebreak comments like + Added new on demand loading of plugins and themes. Enables you to load and init TinyMCE at any time. + Added new throbber/progress visualization a plugin can show/hide this when it's needed. + Added new blockquote button. Enables you to wrap paragraphs in blockquotes. + Added new compat2x plugin. Will provide a TinyMCE 2.x API for older plugins. + Added new theme_advanced_resizing_min_width, theme_advanced_resizing_min_height options. + Added new theme_advanced_resizing_max_height, theme_advanced_resizing_max_height options. + Added new use_native_selects option. Enables you to toggle native listboxes on and off. + Added new docs_url option enables you to specify where the TinyMCE user documentation is located. + Added new frame and rules options for the table dialog. + Added new global rule for valid_elements/extended_valid_elements enables you to specify global attributes for all elements. + Added new deny attribute rule characher so it's possible to deny global attribute rules on specific elements. + Added new unit tests in the dev package of TinyMCE. Runs tests on the core API, commands and settings of the editor. + Readded the inline_styles option and enabled it by default so deprecated attributes are no longer used. + Removed all button images and replaced them with CSS sprite images. Reduces the number of requests needed. + Removed lots of language files and merged them into the base language files. Reduces the number of requests needed. + Removed lots of unnecessary files and merged many of them together to reduce requests and improve loading speed. + Reduced the over all script size by 33% and the number of files/requests by 75% so it loads a lot faster. + Fixed so convert_fonts_to_spans are enabled by default. So no more font tags. + Fixed so underline and strikethrough uses spans instread of deprecated U and STRIKE elements. + Fixed so indent/outdent adds/removed margin-left instead of blockquotes. + Fixed so alignment of paragraphs results in a text-align style value instead of the deprecated align attribute. + Fixed so alignment of images uses float or vertical-align style values instead of the deprecated align attribute. + Fixed so all classes from @import stylesheets gets imported into the editor. + Fixed so the directionality can toggle the dir attribute on and off. + Fixed so the fullscreen_settings can be used for all types of fullscreen modes. + Fixed so the advanced HR dialog gets displayed when inserting a HR not only on edit. + Fixed bug where word wrap didn't work in the source editor on Safari. + Fixed so non HTML elements can be used within the editor such as + Fixed various memory leaks in IE and reduced the unload cleanups needed. + Fixed so the preformatted option adds an invisible container pre tag inside the editor. + Renamed the _template plugin to example and updated it to use the new 3.x API. diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinyMCEPopup.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinyMCEPopup.html index 689cb28d6c..ea50c27671 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinyMCEPopup.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinyMCEPopup.html @@ -188,6 +188,26 @@

Public Methods

+

Public Events

+ + + + + + + + + + + + + +
EventDefined By
+
+onInit(editor:Editor)
+
+[static] Fires when the popup is initialized.
+
tinyMCEPopup
@@ -453,6 +473,27 @@

storeSelectionmethod

+
+

Event details

+
+

onInitevent +

+public static + event onInit(editor:
Editor) +
Fires when the popup is initialized. +
+

Parameters

+ + + + + +
editor:Editor +Editor instance.
+

Example

+
+
+
diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.AddOnManager.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.AddOnManager.html index ce9e6ab56c..1c22fcb3dc 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.AddOnManager.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.AddOnManager.html @@ -122,6 +122,8 @@

Parameters

Returns

Theme/Plugin - The same theme or plugin instance that got passed in.
+

Example

+
 
 

getmethod @@ -168,6 +170,8 @@

Parameters

Optional scope to execute the callback in. +

Example

+
 

requireLangPackmethod diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Editor.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Editor.html index 2dbf334a61..1f801c13e1 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Editor.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Editor.html @@ -30,8 +30,6 @@

tinymce.Editor

This class contains the core logic for a TinyMCE editor.
-
-Author(s):Moxiecode

Example

 
@@ -151,7 +149,8 @@

Public Properties

-serializer : tinymce.dom.Serializer
+serializer : Serializer +
DOM serializer for the editor.
Editor @@ -728,7 +727,7 @@

Public Events

-onRedo(sender:Editor, evt:Event)
+onRedo(sender:Editor, level:Object)
Fires when the contents is redo:ed.
Editor @@ -784,7 +783,7 @@

Public Events

-onUndo(sender:Editor, evt:Event)
+onUndo(sender:Editor, level:Object)
Fires when the contents is undo:ed.
Editor @@ -810,6 +809,8 @@

baseURIproperty
URI object to current document that holds the TinyMCE editor instance.
+

Example

+
 
 

contentCSSproperty @@ -825,6 +826,8 @@

controlManagerproperty
Control manager instance for the editor. Will enables you to create new UI elements and change their states etc.
+

Example

+
 

documentBaseURIproperty @@ -833,6 +836,8 @@

documentBaseURIproperty
URI object to document configured for the TinyMCE instance.
+

Example

+
 

domproperty @@ -841,6 +846,8 @@

domproperty
DOM instance for the editor.
+

Example

+
 

formatterproperty @@ -863,6 +870,8 @@

isNotDirtyproperty public isNotDirty : Boolean
State to force the editor to return false on a isDirty call.
+

Example

+
 

parserproperty @@ -878,6 +887,8 @@

pluginsproperty public plugins : Object
Name/Value object containting plugin instances.
+

Example

+
 

schemaproperty @@ -894,13 +905,18 @@

selectionproperty
Selection instance for the editor.
+

Example

+
 

serializerproperty

-public serializer : tinymce.dom.Serializer +public serializer : Serializer +
DOM serializer for the editor. Will be used when contents is extracted from the editor.
+

Example

+
 

settingsproperty @@ -908,6 +924,8 @@

settingsproperty public settings : Object
Name/value collection with editor settings.
+

Example

+
 

themeproperty @@ -916,6 +934,8 @@

themeproperty
Reference to the theme instance that was used to generate the UI.
+

Example

+
 

undoManagerproperty @@ -924,6 +944,8 @@

undoManagerproperty
Undo manager instance, responsible for handling undo levels.
+

Example

+
 

windowManagerproperty @@ -932,6 +954,8 @@

windowManagerproperty
Window manager reference, use this to open new windows and dialogs.
+

Example

+
 
@@ -977,6 +1001,8 @@

Parameters

Settings object with title, cmd etc. +

Example

+
 

addCommandmethod @@ -1001,6 +1027,8 @@

Parameters

Optional scope to execute the function in. +

Example

+
 

addQueryStateHandlermethod @@ -1242,6 +1270,8 @@

Parameters

Returns

String - Cleaned content string, normally HTML contents.
+

Example

+
 

getContentAreaContainermethod @@ -1317,6 +1347,8 @@

Parameters

Returns

String - Configuration parameter value or default value.
+

Example

+
 

getWinmethod @@ -1355,6 +1387,8 @@

isDirtymethod

Returns

Boolean - True/false if the editor is dirty or not. It will get dirty if the user has made modifications to the contents.
+

Example

+
 
 

isHiddenmethod @@ -1491,6 +1525,8 @@

Parameters

Returns

String - HTML string that got set into the editor.
+

Example

+
 

setProgressStatemethod @@ -1517,6 +1553,8 @@

Parameters

Returns

Boolean - Same as the input state.
+

Example

+
 

setupContentEditablemethod @@ -1580,6 +1618,8 @@

Parameters

Editor instance. +

Example

+
 

onBeforeExecCommandevent @@ -1596,6 +1636,8 @@

Parameters

Editor instance. +

Example

+
 

onBeforeGetContentevent @@ -1616,6 +1658,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onBeforeRenderUIevent @@ -1632,6 +1676,8 @@

Parameters

Editor instance. +

Example

+
 

onBeforeSetContentevent @@ -1648,6 +1694,8 @@

Parameters

Editor instance. +

Example

+
 

onChangeevent @@ -1664,6 +1712,8 @@

Parameters

Editor instance. +

Example

+
 

onClickevent @@ -1684,6 +1734,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onContextMenuevent @@ -1704,6 +1756,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onDblClickevent @@ -1724,6 +1778,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onDeactivateevent @@ -1740,6 +1796,8 @@

Parameters

Editor instance. +

Example

+
 

onEventevent @@ -1760,6 +1818,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onExecCommandevent @@ -1776,6 +1836,8 @@

Parameters

Editor instance. +

Example

+
 

onGetContentevent @@ -1792,6 +1854,8 @@

Parameters

Editor instance. +

Example

+
 

onInitevent @@ -1814,6 +1878,8 @@

See Also

onPreInit +

Example

+
 

onKeyDownevent @@ -1834,6 +1900,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onKeyPressevent @@ -1854,6 +1922,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onKeyUpevent @@ -1874,6 +1944,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onLoadContentevent @@ -1890,6 +1962,8 @@

Parameters

Editor instance. +

Example

+
 

onMouseDownevent @@ -1910,6 +1984,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onMouseUpevent @@ -1930,6 +2006,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onNodeChangeevent @@ -1946,6 +2024,8 @@

Parameters

Editor instance. +

Example

+
 

onPasteevent @@ -1966,6 +2046,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onPostProcessevent @@ -1986,6 +2068,8 @@

Parameters

PreProcess object. +

Example

+
 

onPostRenderevent @@ -2002,6 +2086,8 @@

Parameters

Editor instance. +

Example

+
 

onPreInitevent @@ -2024,6 +2110,8 @@

See Also

onInit +

Example

+
 

onPreProcessevent @@ -2044,12 +2132,14 @@

Parameters

PreProcess object. +

Example

+
 

onRedoevent

public - event onRedo(sender:Editor, evt:Event) + event onRedo(sender:Editor, level:Object)
Fires when the contents is redo:ed.

Parameters

@@ -2060,10 +2150,12 @@

Parameters

Editor instance. -evt:Event -W3C DOM Event instance. +level:Object +Undo level object. +

Example

+
 

onRemoveevent @@ -2080,6 +2172,8 @@

Parameters

Editor instance. +

Example

+
 

onResetevent @@ -2100,6 +2194,8 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onSaveContentevent @@ -2116,6 +2212,8 @@

Parameters

Editor instance. +

Example

+
 

onSetContentevent @@ -2132,6 +2230,8 @@

Parameters

Editor instance. +

Example

+
 

onSetProgressStateevent @@ -2148,6 +2248,8 @@

Parameters

Editor instance. +

Example

+
 

onSubmitevent @@ -2168,12 +2270,14 @@

Parameters

W3C DOM Event instance. +

Example

+
 

onUndoevent

public - event onUndo(sender:Editor, evt:Event) + event onUndo(sender:Editor, level:Object)
Fires when the contents is undo:ed.

Parameters

@@ -2184,8 +2288,18 @@

Parameters

Editor instance. -evt:Event -W3C DOM Event instance. +level:Object +{Object} level Undo level object. +@ example +// Adds an observer to the onUndo event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onUndo.add(function(ed, level) { + console.debug('Undo was performed: ' + level.content); + }); + } +});
@@ -2204,6 +2318,8 @@

Parameters

Editor instance. +

Example

+
 
 
 
diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Plugin.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Plugin.html
index 17b8a5e02f..b3f2a04065 100644
--- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Plugin.html
+++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Plugin.html
@@ -28,10 +28,113 @@ 

tinymce.Plugin

Plugin -
TinyMCE plugin class. +
Plugin base class, this is a pseudo class that describes how a plugin is to be created for TinyMCE. The methods below are all optional. +
+

Example

+
+
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
+
+createControl(name:String, controlman:ControlManager):Control +
+
Gets called when a new control instance is created.
+
Plugin
+
+getInfo():Object
+
Meta info method, this method gets executed when TinyMCE wants to present information about the plugin for example in th...
+
Plugin
+
+init(editor:Editor, url:String):void
+
Initialization function for the plugin.
+
Plugin
+
+
+
+

Method details

+
+

createControlmethod +

+public + function createControl(name:String, controlman:ControlManager):Control + +
Gets called when a new control instance is created. +
+

Parameters

+ + + + + + + + + +
name:StringControl name to create for example "mylistbox"
controlman:ControlManager +Control manager/factory to use to create the control.
+

Returns

+
+Control - Returns a new control instance or null.
+

Example

+
+
+
+

getInfomethod +

+public + function getInfo():Object +
Meta info method, this method gets executed when TinyMCE wants to present information about the plugin for example in the about/help dialog. +
+

Returns

+
Object - Returns an object with meta information about the plugin the current items are longname, author, authorurl, infourl and version.
+

Example

+
+
+
+

initmethod +

+public + function init(editor:Editor, url:String):void +
Initialization function for the plugin. This will be called when the plugin is created. +
+

Parameters

+ + + + + + + + + +
editor:Editor +Editor instance that created the plugin instance.
url:StringAbsolute URL where the plugin is located.
+

Example

+
+
+
-
-
diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Theme.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Theme.html index 9a066677e9..749774057d 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Theme.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.Theme.html @@ -30,8 +30,95 @@

tinymce.Theme

TinyMCE theme class.
-
-
+
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
+
+getInfo():Object
+
Meta info method, this method gets executed when TinyMCE wants to present information about the theme for example in the...
+
Theme
+
+init(editor:Editor, url:String):void
+
Initializes the theme.
+
Theme
+
+renderUI(obj:Object):Object
+
This method is responsible for rendering/generating the overall user interface with toolbars, buttons, iframe containers...
+
Theme
+
+
+
+

Method details

+
+

getInfomethod +

+public + function getInfo():Object +
Meta info method, this method gets executed when TinyMCE wants to present information about the theme for example in the about/help dialog. +
+

Returns

+
Object - Returns an object with meta information about the theme the current items are longname, author, authorurl, infourl and version.
+
+
+

initmethod +

+public + function init(editor:Editor, url:String):void +
Initializes the theme. +
+

Parameters

+ + + + + + + + + +
editor:Editor +Editor instance that created the theme instance.
url:StringAbsolute URL where the theme is located.
+
+
+

renderUImethod +

+public + function renderUI(obj:Object):Object +
This method is responsible for rendering/generating the overall user interface with toolbars, buttons, iframe containers etc. +
+

Parameters

+ + + + + +
obj:ObjectObject parameter containing the targetNode DOM node that will be replaced visually with an editor instance.
+

Returns

+
Object - an object with items like iframeContainer, editorContainer, sizeContainer, deltaWidth, deltaHeight.
+
+
+
diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.UndoManager.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.UndoManager.html index 7ecfb3a6f4..fe157d2562 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.UndoManager.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.UndoManager.html @@ -51,12 +51,20 @@

Public Methods

+beforeChange():void
+
Stores away a bookmark to be used when performing an undo action so that the selection is before the change has been mad...
+ +UndoManager + + + +
clear():void
Removes all undo levels.
UndoManager - +
hasRedo():Boolean
@@ -64,7 +72,7 @@

Public Methods

UndoManager - +
hasUndo():Boolean
@@ -72,7 +80,7 @@

Public Methods

UndoManager - +
redo():Object
@@ -80,7 +88,7 @@

Public Methods

UndoManager - +
undo():Object
@@ -146,6 +154,15 @@

Parameters

Returns

Object - Undo level that got added or null it a level wasn't needed.
+
+

beforeChangemethod +

+public + function beforeChange():void +
Stores away a bookmark to be used when performing an undo action so that the selection is before +the change has been made. +
+

clearmethod

diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.WindowManager.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.WindowManager.html index d1b3a3531a..2266f6a8db 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.WindowManager.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.WindowManager.html @@ -28,7 +28,10 @@

tinymce.WindowManager

WindowManager -
This class handles the creation of native windows and dialogs. This class can be extended to provide for example inline dialogs.
+
This class handles the creation of native windows and dialogs. This class can be extended to provide for example inline dialogs. +
+

Example

+
 

Public Methods

@@ -132,6 +135,8 @@

Parameters

Optional scope to execute the callback in.
+

Example

+
 

closemethod @@ -171,6 +176,8 @@

Parameters

Optional scope to execute the callback in. +

Example

+
 

createInstancemethod @@ -190,6 +197,8 @@

Parameters

Returns

Object - Instance of the specified class.
+

Example

+
 

openmethod diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.DOMUtils.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.DOMUtils.html index 108181ebba..ab5f146494 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.DOMUtils.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.DOMUtils.html @@ -28,7 +28,10 @@

tinymce.dom.DOMUtils

DOMUtils -
Utility class for various DOM manipulation and retrival functions.
+
Utility class for various DOM manipulation and retrival functions. +
+

Example

+
 

Public Methods

@@ -162,12 +165,20 @@

Public Methods

+ + + + - + - + - + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
+getNext(node:Node, selector:String/function):Node
+
Returns the next node that matches selector or function
+
DOMUtils
+
getOuterHTML(elm:String/Element):String
Returns the outer HTML of an element.
DOMUtils
getParent(n:Node/String, f:function, r:Node):Node
@@ -175,7 +186,7 @@

Public Methods

DOMUtils
getParents(n:Node/String, f:function, r:Node):Array
@@ -183,7 +194,7 @@

Public Methods

DOMUtils
getPos(n:Element/String, ro:Element):object
@@ -191,6 +202,14 @@

Public Methods

DOMUtils
+
+getPrev(node:Node, selector:String/function):Node
+
Returns the previous node that matches selector or function
+
DOMUtils
@@ -274,12 +293,20 @@

Public Methods

+isEmpty(elements:Object):Boolean
+
Returns true/false if the specified node is to be considered empty or not.
+
DOMUtils
+
isHidden(e:String/Element):Boolean
Returns true/false if the element is hidden or not by checking the "display" style.
DOMUtils
loadCSS(u:String):void
@@ -287,7 +314,7 @@

Public Methods

DOMUtils
parseStyle(st:String):Object
@@ -295,7 +322,7 @@

Public Methods

DOMUtils
remove(node:String/Element/Array, keep_children:Boolean):Element/Array
@@ -303,7 +330,7 @@

Public Methods

DOMUtils
removeClass(Element:String/Element/Array, c:String):String/Array
@@ -311,7 +338,7 @@

Public Methods

DOMUtils
rename(elm:Element, name:String):Object
@@ -319,7 +346,7 @@

Public Methods

DOMUtils
replace(n:Element, o:Element/String/Array, k:Boolean):void
@@ -327,7 +354,7 @@

Public Methods

DOMUtils
run(Element:String/Element/Array, f:function, s:Object):Object/Array
@@ -335,7 +362,7 @@

Public Methods

DOMUtils
select(p:String, s:Object):Array
@@ -343,7 +370,7 @@

Public Methods

DOMUtils
serializeStyle(o:Object, name:String):String
@@ -351,7 +378,7 @@

Public Methods

DOMUtils
setAttrib(e:Element/String/Array, n:String, v:String):void
@@ -359,7 +386,7 @@

Public Methods

DOMUtils
setAttribs(e:Element/String/Array, o:Object):void
@@ -367,7 +394,7 @@

Public Methods

DOMUtils
setHTML(e:Element/String/Array, h:String):void
@@ -375,7 +402,7 @@

Public Methods

DOMUtils
setOuterHTML(e:Element/String/Array, h:Object, d:Document):void
@@ -383,7 +410,7 @@

Public Methods

DOMUtils
setStyle(n:String/Element/Array, na:String, v:String):void
@@ -391,7 +418,7 @@

Public Methods

DOMUtils
setStyles(e:Element/String/Array, o:Object):void
@@ -399,7 +426,7 @@

Public Methods

DOMUtils
show(e:String/Element/Array):void
@@ -407,7 +434,7 @@

Public Methods

DOMUtils
split(pe:Element, e:Element, re:Element):Element
@@ -415,7 +442,7 @@

Public Methods

DOMUtils
toHex(s:String):String
@@ -423,7 +450,7 @@

Public Methods

DOMUtils
unbind(o:String/Element/Array, n:String, f:function):bool/Array
@@ -431,7 +458,7 @@

Public Methods

DOMUtils
uniqueId(p:String):String
@@ -496,6 +523,8 @@

Parameters

Returns

Element/Array - Element that got created or array with elements if multiple elements where passed.
+

Example

+
 

addClassmethod @@ -517,6 +546,8 @@

Parameters

Returns

String/Array - String with new class value or array with new class values for all elements.
+

Example

+
 

bindmethod @@ -571,13 +602,15 @@

Parameters

Returns

Element - HTML DOM node element that got created.
+

Example

+
 

createHTMLmethod

public function createHTML(n:String, a:Object, h:String):String -
Create HTML string for element. The elemtn will be closed unless an empty inner HTML string is passed. +
Create HTML string for element. The element will be closed unless an empty inner HTML string is passed.

Parameters

@@ -596,6 +629,8 @@

Parameters

Returns

String - String with new HTML element like for example: <a href="#">test</a>.
+

Example

+
 

createRngmethod @@ -607,6 +642,8 @@

createRngmethod

Returns

DOMRange - DOM Range object.
+

Example

+
 

decodemethod @@ -741,6 +778,27 @@

getClassesmethod

Returns

Array - Array with class objects each object has a class field might be other fields in the future.
+
+

getNextmethod +

+public + function getNext(node:Node, selector:String/function):Node +
Returns the next node that matches selector or function +
+

Parameters

+ + + + + + + + + +
node:NodeNode to find siblings from.
selector:String/functionSelector CSS expression or function.
+

Returns

+
Node - Next node item matching the selector or null if it wasn't found.
+

getOuterHTMLmethod

@@ -757,6 +815,8 @@

Parameters

Returns

String - Outer HTML string.
+

Example

+
 

getParentmethod @@ -833,6 +893,27 @@

Parameters

Returns

object - Absolute position of the specified element object with x, y fields.
+
+

getPrevmethod +

+public + function getPrev(node:Node, selector:String/function):Node +
Returns the previous node that matches selector or function +
+

Parameters

+ + + + + + + + + +
node:NodeNode to find siblings from.
selector:String/functionSelector CSS expression or function.
+

Returns

+
Node - Previous node item matching the selector or null if it wasn't found.
+

getRectmethod

@@ -955,6 +1036,8 @@

Parameters

ID of DOM element or DOM element or array with elements or IDs to hide. +

Example

+
 

insertAftermethod @@ -1013,6 +1096,25 @@

Parameters

Returns

Boolean - True/False state if the node is a block element or not.
+
+

isEmptymethod +

+public + function isEmpty(elements:Object):Boolean +
Returns true/false if the specified node is to be considered empty or not. +
+

Parameters

+ + + + + +
elements:ObjectOptional name/value object with elements that are automatically treated as non empty elements.
+

Returns

+
Boolean - true/false if the node is empty or not.
+

Example

+
+

isHiddenmethod

@@ -1044,6 +1146,8 @@

Parameters

URL to CSS file to load. +

Example

+
 

parseStylemethod @@ -1084,6 +1188,8 @@

Parameters

Returns

Element/Array - HTML DOM element that got removed or array of elements depending on input.
+

Example

+
 

removeClassmethod @@ -1105,6 +1211,8 @@

Parameters

Returns

String/Array - String with new class value or array with new class values for all elements.
+

Example

+
 

renamemethod @@ -1198,6 +1306,8 @@

Parameters

Returns

Array - Array with all matched elements.
+

Example

+
 

serializeStylemethod @@ -1242,6 +1352,8 @@

Parameters

Value to set on the attribute of this value is falsy like null 0 or '' it will remove the attribute instead. +

Example

+
 

setAttribsmethod @@ -1261,6 +1373,8 @@

Parameters

Name/Value collection of attribute items to add to the element(s). +

Example

+
 

setHTMLmethod @@ -1281,6 +1395,8 @@

Parameters

HTML content to set as inner HTML of the element. +

Example

+
 

setOuterHTMLmethod @@ -1304,6 +1420,8 @@

Parameters

Optional document scope to use in this process defaults to the document of the DOM class. +

Example

+
 

setStylemethod @@ -1328,6 +1446,8 @@

Parameters

Value to set on the style. +

Example

+
 

setStylesmethod @@ -1347,6 +1467,8 @@

Parameters

Name/Value collection of style items to add to the element(s). +

Example

+
 

showmethod diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Element.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Element.html index 3c0f26c11e..dd1efd6ec3 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Element.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Element.html @@ -32,6 +32,8 @@

tinymce.dom.Element

gets visible though DIVs on IE 6 it uses a iframe for this blocking. This class also shortens the length of some DOM API calls since it's bound to an element.
+

Example

+
 

Public Methods

diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.EventUtils.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.EventUtils.html index b55bebad3b..4c36a79049 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.EventUtils.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.EventUtils.html @@ -147,6 +147,8 @@

Parameters

Returns

function - Function callback handler the same as the one passed in.
+

Example

+
 

cancelmethod @@ -179,6 +181,8 @@

Parameters

DOM element or object to remove all events from. +

Example

+
 

destroymethod @@ -229,6 +233,8 @@

Parameters

Returns

bool/Array - Bool state if true if the handler was removed or an array with states if multiple elements where passed in.
+

Example

+
 

stopmethod diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Schema.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Schema.html deleted file mode 100644 index aad12533fd..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Schema.html +++ /dev/null @@ -1,86 +0,0 @@ - - - -Class: tinymce.dom.Schema - - - - - - - - - - - - -
-

tinymce.dom.Schema

- - - - - - - - - -
Namespacetinymce.dom
ClassSchema
-
Schema validator class. -
-

Example

-
if (tinymce.activeEditor.schema.isValid('p', 'span'))
-   alert('span is valid child of p.');
-
-

Public Methods

- - - - - - - - - - - - - -
MethodDefined By
-
-isValid(name:String, child_name:String):boolean
-
Returns true/false if the specified element and optionally it's child is valid or not according to the XHTML transitiona...
-
Schema
-
-
-
-

Method details

-
-

isValidmethod -

-public - function isValid(name:String, child_name:String):boolean -
Returns true/false if the specified element and optionally it's child is valid or not -according to the XHTML transitional DTD. -
-

Parameters

- - - - - - - - - -
name:StringElement name to check for.
child_name:StringElement child name to check for.
-

Returns

-
boolean - true/false if the element is valid or not.
-
-
-
-
- - diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.ScriptLoader.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.ScriptLoader.html new file mode 100644 index 0000000000..3140b7b6be --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.ScriptLoader.html @@ -0,0 +1,225 @@ + + + +Class: tinymce.dom.ScriptLoader + + + + + + + + + + + + +
+

tinymce.dom.ScriptLoader

+ + + + + + + + + +
Namespacetinymce.dom
ClassScriptLoader
+
This class handles asynchronous/synchronous loading of JavaScript files it will execute callbacks when various items gets loaded. This class is useful to load external JavaScript files. +
+

Example

+
+
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
+
+add(url:String, callback:function, scope:Object):void
+
Adds a specific script to the load queue of the script loader.
+
ScriptLoader
+
+isDone(url:String):Object
+
Returns true/false if a script has been loaded or not.
+
ScriptLoader
+
+load(url:String, callback:function, scope:Object):void
+
Loads a specific script directly without adding it to the load queue.
+
ScriptLoader
+
+loadQueue(callback:function, scope:Object):void
+
Starts the loading of the queue.
+
ScriptLoader
+
+loadScripts(scripts:Array, callback:function, scope:Object):void
+
Loads the specified queue of files and executes the callback ones they are loaded.
+
ScriptLoader
+
+markDone(u:string):void
+
Marks a specific script to be loaded.
+
ScriptLoader
+
+
+
+

Method details

+
+

addmethod +

+public + function add(url:String, callback:function, scope:Object):void +
Adds a specific script to the load queue of the script loader. +
+

Parameters

+ + + + + + + + + + + + + +
url:StringAbsolute URL to script to add.
callback:functionOptional callback function to execute ones this script gets loaded.
scope:ObjectOptional scope to execute callback in.
+
+
+

isDonemethod +

+public + function isDone(url:String):Object +
Returns true/false if a script has been loaded or not. +
+

Parameters

+ + + + + +
url:StringURL to check for.
+

Returns

+
Object - [Boolean} true/false if the URL is loaded.
+
+
+

loadmethod +

+public + function load(url:String, callback:function, scope:Object):void +
Loads a specific script directly without adding it to the load queue. +
+

Parameters

+ + + + + + + + + + + + + +
url:StringAbsolute URL to script to add.
callback:functionOptional callback function to execute ones this script gets loaded.
scope:ObjectOptional scope to execute callback in.
+
+
+

loadQueuemethod +

+public + function loadQueue(callback:function, scope:Object):void +
Starts the loading of the queue. +
+

Parameters

+ + + + + + + + + +
callback:functionOptional callback to execute when all queued items are loaded.
scope:ObjectOptional scope to execute the callback in.
+
+
+

loadScriptsmethod +

+public + function loadScripts(scripts:Array, callback:function, scope:Object):void +
Loads the specified queue of files and executes the callback ones they are loaded. +This method is generally not used outside this class but it might be useful in some scenarios. +
+

Parameters

+ + + + + + + + + + + + + +
scripts:ArrayArray of queue items to load.
callback:functionOptional callback to execute ones all items are loaded.
scope:ObjectOptional scope to execute callback in.
+
+
+

markDonemethod +

+public + function markDone(u:string):void +
Marks a specific script to be loaded. This can be useful if a script got loaded outside +the script loader or to skip it from loading some script. +
+

Parameters

+ + + + + +
u:stringAbsolute URL to the script to mark as loaded.
+
+
+
+
+ + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Selection.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Selection.html index 0a29ac43f6..25114b9846 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Selection.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Selection.html @@ -29,7 +29,10 @@

tinymce.dom.Selection

This class handles text and control selection it's an crossbrowser utility class. -Consult the TinyMCE Wiki API for more details and examples on how to use this class.
+Consult the TinyMCE Wiki API for more details and examples on how to use this class. +
+

Example

+
 

Public Methods

@@ -43,7 +46,7 @@

Public Methods

@@ -51,7 +54,7 @@

Public Methods

@@ -139,7 +142,7 @@

Public Methods

@@ -162,6 +165,49 @@

Public Methods

-Selection(dom:DOMUtils, win:Window, serializer:tinymce.dom.Serializer)
+Selection(dom:DOMUtils, win:Window, serializer:Serializer)
Constructs a new selection instance.
Selection
-collapse(b:Boolean):void
+collapse(to_start:Boolean):void
Collapse the selection to start or end of range.
Selection
-setContent(h:String, s:Object):void
+setContent(content:String, args:Object):void
Sets the current selection to the specified content.
Selection
+

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
+
+onBeforeGetContent(selection:Selection, args:Object)
+
This event gets executed before contents is inserted into selection.
+
Selection
+
+onBeforeSetContent(selection:Selection, args:Object)
+
This event gets executed before contents is extracted from the selection.
+
Selection
+
+onGetContent(selection:Selection, args:Object)
+
This event gets executed when contents is extracted from the selection.
+
Selection
+
+onSetContent(selection:Selection, args:Object)
+
This event gets executed when contents is inserted into selection.
+
Selection
@@ -170,7 +216,7 @@

Method details

Selectionconstructor

public - function Selection(dom:DOMUtils, win:Window, serializer:tinymce.dom.Serializer) + function Selection(dom:DOMUtils, win:Window, serializer:Serializer)
Constructs a new selection instance.

Parameters

@@ -185,7 +231,8 @@

Parameters

Window to bind the selection object to. -serializer:tinymce.dom.Serializer +serializer:Serializer + DOM serialization class to use for getContent. @@ -194,13 +241,13 @@

Parameters

collapsemethod

public - function collapse(b:Boolean):void + function collapse(to_start:Boolean):void
Collapse the selection to start or end of range.

Parameters

- +
b:Booleanto_start:Boolean Optional boolean state if to collapse to end or not. Defaults to start.
@@ -226,6 +273,8 @@

Parameters

Returns

Object - Bookmark object, use moveToBookmark with this object to restore the selection.
+

Example

+
 

getContentmethod @@ -243,6 +292,8 @@

Parameters

Returns

String - Selected contents in for example HTML format.
+

Example

+
 

getEndmethod @@ -264,6 +315,8 @@

getNodemethod

Returns

Element - Currently selected element or common ancestor element.
+

Example

+
 

getRngmethod @@ -281,6 +334,15 @@

Parameters

Returns

Range - Internal browser range object.
+

See Also

+

getSelmethod @@ -329,6 +391,8 @@

Parameters

Returns

Boolean - true/false if it was successful or not.
+

Example

+
 

selectmethod @@ -350,12 +414,14 @@

Parameters

Returns

Element - Selected element the same element as the one that got passed in.
+

Example

+
 

setContentmethod

public - function setContent(h:String, s:Object):void + function setContent(content:String, args:Object):void
Sets the current selection to the specified content. If any contents is selected it will be replaced with the contents passed in to this function. If there is no selection the contents will be inserted where the caret is placed in the editor/page. @@ -363,14 +429,16 @@

setContentmethod

Parameters

- + - +
h:Stringcontent:String HTML contents to set could also be other formats depending on settings.
s:Objectargs:Object Optional settings object with for example data format.
+

Example

+
 

setNodemethod @@ -388,6 +456,8 @@

Parameters

Returns

Element - Returns the element that got passed in.
+

Example

+
 

setRngmethod @@ -405,6 +475,89 @@

Parameters

+
+

Event details

+
+

onBeforeGetContentevent +

+public + event onBeforeGetContent(selection:
Selection, args:Object) +
This event gets executed before contents is inserted into selection. +
+

Parameters

+ + + + + + + + + +
selection:Selection +Selection object that fired the event.
args:ObjectContains things like the contents that will be inserted.
+
+
+

onBeforeSetContentevent +

+public + event onBeforeSetContent(selection:Selection, args:Object) +
This event gets executed before contents is extracted from the selection. +
+

Parameters

+ + + + + + + + + +
selection:Selection +Selection object that fired the event.
args:ObjectContains things like the contents that will be returned.
+
+
+

onGetContentevent +

+public + event onGetContent(selection:Selection, args:Object) +
This event gets executed when contents is extracted from the selection. +
+

Parameters

+ + + + + + + + + +
selection:Selection +Selection object that fired the event.
args:ObjectContains things like the contents that will be returned.
+
+
+

onSetContentevent +

+public + event onSetContent(selection:Selection, args:Object) +
This event gets executed when contents is inserted into selection. +
+

Parameters

+ + + + + + + + + +
selection:Selection +Selection object that fired the event.
args:ObjectContains things like the contents that will be inserted.
+
+
diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Serializer.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Serializer.html index 295b0293b5..02a0031c1a 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Serializer.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.Serializer.html @@ -28,8 +28,8 @@

tinymce.dom.Serializer

Serializer -
This class is used to serialize DOM trees into a string. -Consult the TinyMCE Wiki API for more details and examples on how to use this class.
+
This class is used to serialize DOM trees into a string. Consult the TinyMCE Wiki API for more details and examples on how to use this class. +

Public Methods

@@ -43,7 +43,7 @@

Public Methods

@@ -51,48 +51,83 @@

Public Methods

+ + + + + + + +
-Serializer(s:Object)
+Serializer(settings:Object, dom:DOMUtils, schema:Schema)
Constucts a new DOM serializer class.
Serializer
-addRules(s:String):void
-
Adds valid elements rules to the serializer this enables you to specify things like what elements should be outputted an...
+addAttributeFilter(callback:function):void +
Adds a attribute filter function to the parser used by the serializer, the parser will collect nodes that has the specif...
Serializer
-findAttribRule(ru:Object, n:String):Object
-
Finds an attribute rule object by name.
+addNodeFilter(callback:function):void +
Adds a node filter function to the parser used by the serializer, the parser will collect the specified nodes by name an...
Serializer
-findRule(n:String):Object
-
Finds a rule object by name.
+addRules(rules:String):void +
Adds valid elements rules to the serializers schema instance this enables you to specify things like what elements shoul...
Serializer
-serialize(n:Element, o:Object):String
-
Serializes the specified node into a HTML string.
+serialize(node:DOMNode, args:Object):void +
Serializes the specified browser DOM node into a HTML string.
+
Serializer
+
+setRules(rules:String):void
+
Sets the valid elements rules to the serializers schema instance this enables you to specify things like what elements s...
+
Serializer
+

Public Events

+ + + + + + + + + + + + + + @@ -106,122 +141,200 @@

Method details

Serializerconstructor

public - function Serializer(s:Object) + function Serializer(settings:Object, dom:DOMUtils, schema:Schema)
Constucts a new DOM serializer class.

Parameters

EventDefined By
+
+onPostProcess(sender:Editor, obj:Object)
+
Fires when the Serializer does a postProcess on the contents.
Serializer
-setEntities(s:String):void
-
Sets a list of entities to use for the named entity encoded.
+onPreProcess(sender:Serializer, args:Object) +
This event gets executed before a HTML fragment gets serialized into a HTML string.
Serializer
-setRules(s:String):void
-
Sets the valid elements rules of the serializer this enables you to specify things like what elements should be outputte...
+onPreProcess(sender:Serializer, args:Object) +
This event gets executed after a HTML fragment has been serialized into a HTML string.
+
Serializer
+
+onPreProcess(sender:Editor, obj:Object)
+
Fires when the Serializer does a preProcess on the contents.
Serializer
- - + + + + + + + + + + + +
s:ObjectOptional name/Value collection of settings for the serializer.settings:ObjectSerializer settings object.
dom:DOMUtils +DOMUtils instance reference.
schema:Schema +Optional schema reference.
+
+
+

addAttributeFiltermethod +

+public + function addAttributeFilter(callback:function):void +
Adds a attribute filter function to the parser used by the serializer, the parser will collect nodes that has the specified attributes +and then execute the callback ones it has finished parsing the document. +
+

Parameters

+ + + +
callback:functionCallback function to execute once it has collected nodes.
+

Example

+
+
+
+

addNodeFiltermethod +

+public + function addNodeFilter(callback:function):void +
Adds a node filter function to the parser used by the serializer, the parser will collect the specified nodes by name +and then execute the callback ones it has finished parsing the document. +
+

Parameters

+ + + + + +
callback:functionCallback function to execute once it has collected nodes.
+

Example

+
 

addRulesmethod

public - function addRules(s:String):void -
Adds valid elements rules to the serializer this enables you to specify things like what elements should be -outputted and what attributes specific elements might have. + function addRules(rules:String):void +
Adds valid elements rules to the serializers schema instance this enables you to specify things +like what elements should be outputted and what attributes specific elements might have. Consult the Wiki for more details on this format.

Parameters

- - + +
s:StringValid elements rules string to add.rules:StringValid elements rules string to add to schema.
-
-

findAttribRulemethod +
+

serializemethod

public - function findAttribRule(ru:Object, n:String):Object -
Finds an attribute rule object by name. + function serialize(node:DOMNode, args:Object):void +
Serializes the specified browser DOM node into a HTML string.

Parameters

- - + + - - + +
ru:ObjectRule object to search though.node:DOMNodeDOM node to serialize.
n:StringName of the rule to retrive.args:ObjectArguments option that gets passed to event handlers.
-

Returns

-
Object - Rule object of the specified attribute.
-
-

findRulemethod +
+

setRulesmethod

public - function findRule(n:String):Object -
Finds a rule object by name. + function setRules(rules:String):void +
Sets the valid elements rules to the serializers schema instance this enables you to specify things +like what elements should be outputted and what attributes specific elements might have. +Consult the Wiki for more details on this format.

Parameters

- - + +
n:StringName to look for in rules collection.rules:StringValid elements rules string.
-

Returns

-
Object - Rule object found or null if it wasn't found.
-
-

serializemethod +

+
+

Event details

+
+

onPostProcessevent +

+public + event onPostProcess(sender:Editor, obj:Object) +
Fires when the Serializer does a postProcess on the contents. +
+

Parameters

+ + + + + + + + + +
sender:Editor +Editor instance.
obj:ObjectPreProcess object.
+
+
+

onPreProcessevent

public - function serialize(n:Element, o:Object):String -
Serializes the specified node into a HTML string. + event onPreProcess(sender:Serializer, args:Object) +
This event gets executed before a HTML fragment gets serialized into a HTML string. This event enables you to do modifications to the DOM before the serialization occurs. It's important to know that the element that is getting serialized is cloned so it's not inside a document.

Parameters

- - + + - - + +
n:ElementElement/Node to serialize.sender:Serializer +object/Serializer instance that is serializing an element.
o:ObjectObject to add serialized contents to, this object will also be passed to the event listeners.args:ObjectObject containing things like the current node.
-

Returns

-
String - Serialized HTML contents.
+

Example

+
 
-
-

setEntitiesmethod +
+

onPreProcessevent

public - function setEntities(s:String):void -
Sets a list of entities to use for the named entity encoded. + event onPreProcess(sender:Serializer, args:Object) +
This event gets executed after a HTML fragment has been serialized into a HTML string. This event enables you to do modifications to the HTML string like regexp replaces etc.

Parameters

- - + + + + + +
s:StringList of entities in the following format: number,name,....sender:Serializer +object/Serializer instance that is serializing an element.
args:ObjectObject containing things like the current contents.
+

Example

+
 
-
-

setRulesmethod +
+

onPreProcessevent

public - function setRules(s:String):void -
Sets the valid elements rules of the serializer this enables you to specify things like what elements should be -outputted and what attributes specific elements might have. -Consult the Wiki for more details on this format. + event onPreProcess(sender:Editor, obj:Object) +
Fires when the Serializer does a preProcess on the contents.

Parameters

- - + + + + + +
s:StringValid elements rules string.sender:Editor +Editor instance.
obj:ObjectPreProcess object.
diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.StringWriter.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.StringWriter.html deleted file mode 100644 index 5c16200bc0..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.StringWriter.html +++ /dev/null @@ -1,308 +0,0 @@ - - - -Class: tinymce.dom.StringWriter - - - - - - - - - - - - -
-

tinymce.dom.StringWriter

- - - - - - - - - -
Namespacetinymce.dom
ClassStringWriter
-
This class writes nodes into a string.
-
-

Public Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDefined By
-
-StringWriter(s:Object)
-
Constructs a new StringWriter.
-
StringWriter
-
-encode(s:String):String
-
String writer specific method.
-
StringWriter
-
-getContent():String
-
Returns a string representation of the elements/nodes written.
-
StringWriter
-
-reset():void
-
Resets the writer so it can be reused the contents of the writer is cleared.
-
StringWriter
-
-writeAttribute(n:String, v:String):void
-
Writes an attrubute like for example: myattr="valie"
-
StringWriter
-
-writeCDATA(v:String):void
-
Writes a CDATA section.
-
StringWriter
-
-writeComment(v:String):void
-
Writes a comment.
-
StringWriter
- -
Write the end of a element.
-
StringWriter
- -
Writes the end of a element.
-
StringWriter
-
-writeRaw(v:String):void
-
String writer specific function.
-
StringWriter
-
-writeStartElement(n:String):void
-
Writes the start of an element like for example: <tag.
-
StringWriter
-
-writeText(v:String):void
-
Writes a text node value.
-
StringWriter
-
-
-
-

Method details

-
-

StringWriterconstructor -

-public - function StringWriter(s:Object) -
Constructs a new StringWriter. -
-

Parameters

- - - - - -
s:ObjectOptional settings object.
-
-
-

encodemethod -

-public - function encode(s:String):String -
String writer specific method. This encodes the raw entities of a string. -
-

Parameters

- - - - - -
s:StringString to encode.
-

Returns

-
String - String with entity encoding of the raw elements like <>&".
-
-
-

getContentmethod -

-public - function getContent():String -
Returns a string representation of the elements/nodes written. -
-

Returns

-
String - String representation of the written elements/nodes.
-
-
-

resetmethod -

-public - function reset():void -
Resets the writer so it can be reused the contents of the writer is cleared. -
-
-
-

writeAttributemethod -

-public - function writeAttribute(n:String, v:String):void -
Writes an attrubute like for example: myattr="valie" -
-

Parameters

- - - - - - - - - -
n:StringAttribute name to write.
v:StringAttribute value to write.
-
-
-

writeCDATAmethod -

-public - function writeCDATA(v:String):void -
Writes a CDATA section. -
-

Parameters

- - - - - -
v:StringValue to write in CDATA.
-
-
-

writeCommentmethod -

-public - function writeComment(v:String):void -
Writes a comment. -
-

Parameters

- - - - - -
v:StringValue of the comment.
-
-
-

writeEndElementmethod -

-public - function writeEndElement():void -
Write the end of a element. This will add a short end for elements with out children like for example a img element. -
-
-
-

writeFullEndElementmethod -

-public - function writeFullEndElement():void -
Writes the end of a element. This will add a full end to the element even if it didn't have any children. -
-
-
-

writeRawmethod -

-public - function writeRaw(v:String):void -
String writer specific function. Enables you to write raw contents to the string. -
-

Parameters

- - - - - -
v:StringString with raw contents to write.
-
-
-

writeStartElementmethod -

-public - function writeStartElement(n:String):void -
Writes the start of an element like for example: -

Parameters

- - - - - -
n:StringName of element to write.
-
-
-

writeTextmethod -

-public - function writeText(v:String):void -
Writes a text node value. -
-

Parameters

- - - - - -
v:StringValue to append as a text node.
-
-
-
-
- - diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.XMLWriter.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.XMLWriter.html deleted file mode 100644 index d10a6c6169..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.dom.XMLWriter.html +++ /dev/null @@ -1,261 +0,0 @@ - - - -Class: tinymce.dom.XMLWriter - - - - - - - - - - - - -
-

tinymce.dom.XMLWriter

- - - - - - - - - -
Namespacetinymce.dom
ClassXMLWriter
-
This class writes nodes into a XML document structure. This structure can then be -serialized down to a HTML string later on.
-
-

Public Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDefined By
-
-XMLWriter(s:Object)
-
Constructs a new XMLWriter.
-
XMLWriter
-
-getContent():String
-
Returns a string representation of the elements/nodes written.
-
XMLWriter
-
-reset():void
-
Resets the writer so it can be reused the contents of the writer is cleared.
-
XMLWriter
-
-writeAttribute(n:String, v:String):void
-
Writes an attrubute like for example: myattr="valie"
-
XMLWriter
-
-writeCDATA(v:String):void
-
Writes a CDATA section.
-
XMLWriter
-
-writeComment(v:String):void
-
Writes a comment.
-
XMLWriter
- -
Write the end of a element.
-
XMLWriter
- -
Writes the end of a element.
-
XMLWriter
-
-writeStartElement(n:String):void
-
Writes the start of an element like for example: <tag.
-
XMLWriter
-
-writeText(v:String):void
-
Writes a text node value.
-
XMLWriter
-
-
-
-

Method details

-
-

XMLWriterconstructor -

-public - function XMLWriter(s:Object) -
Constructs a new XMLWriter. -
-

Parameters

- - - - - -
s:ObjectOptional settings object.
-
-
-

getContentmethod -

-public - function getContent():String -
Returns a string representation of the elements/nodes written. -
-

Returns

-
String - String representation of the written elements/nodes.
-
-
-

resetmethod -

-public - function reset():void -
Resets the writer so it can be reused the contents of the writer is cleared. -
-
-
-

writeAttributemethod -

-public - function writeAttribute(n:String, v:String):void -
Writes an attrubute like for example: myattr="valie" -
-

Parameters

- - - - - - - - - -
n:StringAttribute name to write.
v:StringAttribute value to write.
-
-
-

writeCDATAmethod -

-public - function writeCDATA(v:String):void -
Writes a CDATA section. -
-

Parameters

- - - - - -
v:StringValue to write in CDATA.
-
-
-

writeCommentmethod -

-public - function writeComment(v:String):void -
Writes a comment. -
-

Parameters

- - - - - -
v:StringValue of the comment.
-
-
-

writeEndElementmethod -

-public - function writeEndElement():void -
Write the end of a element. This will add a short end for elements with out children like for example a img element. -
-
-
-

writeFullEndElementmethod -

-public - function writeFullEndElement():void -
Writes the end of a element. This will add a full end to the element even if it didn't have any children. -
-
-
-

writeStartElementmethod -

-public - function writeStartElement(n:String):void -
Writes the start of an element like for example: -

Parameters

- - - - - -
n:StringName of element to write.
-
-
-

writeTextmethod -

-public - function writeText(v:String):void -
Writes a text node value. -
-

Parameters

- - - - - -
v:StringValue to append as a text node.
-
-
-
-
- - diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html index f41d43ab85..170245ec7f 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html @@ -124,6 +124,42 @@

Public Properties

+isIE7 : Boolean
+
+[static] Constant that is true if the browser is IE 7.
+ +tinymce + + + +
+isIE8 : Boolean
+
+[static] Constant that is true if the browser is IE 8.
+ +tinymce + + + +
+isIE9 : Boolean
+
+[static] Constant that is true if the browser is IE 9.
+ +tinymce + + + +
+isIOS5 : Boolean
+
+[static] Constant that is true if the current browser is running on iOS 5 or greater.
+ +tinymce + + + +
isMac : Boolean
[static] Constant that is true if the os is Mac OS.
@@ -439,6 +475,8 @@

activeEditorproperty
Currently active editor instance.
+

Example

+
 

baseURIproperty @@ -454,6 +492,8 @@

editorsproperty public editors : Object
Collection of editor instances.
+

Example

+
 

i18nproperty @@ -497,6 +537,34 @@

isIE6property
Constant that is true if the browser is IE 6 or older.

+
+

isIE7property +

+public static isIE7 : Boolean +
Constant that is true if the browser is IE 7. +
+
+
+

isIE8property +

+public static isIE8 : Boolean +
Constant that is true if the browser is IE 8. +
+
+
+

isIE9property +

+public static isIE9 : Boolean +
Constant that is true if the browser is IE 9. +
+
+
+

isIOS5property +

+public static isIOS5 : Boolean +
Constant that is true if the current browser is running on iOS 5 or greater. +
+

isMacproperty

@@ -602,6 +670,8 @@

Parameters

Returns

function - Returns the specified unload handler function.
+

Example

+
 

createmethod @@ -626,6 +696,8 @@

Parameters

Optional root object defaults to the global window object. +

Example

+
 

createNSmethod @@ -647,6 +719,8 @@

Parameters

Returns

Object - New namespace object the last item in path.
+

Example

+
 

eachmethod @@ -749,6 +823,8 @@

Parameters

Delimiter to split by. +

Example

+
 

extendmethod @@ -770,6 +846,8 @@

Parameters

Returns

Object - o New extended object, same reference as the input object.
+

Example

+
 

getmethod @@ -789,6 +867,8 @@

Parameters

Returns

Editor - Editor instance to return.
+

Example

+
 

getInstanceByIdmethod @@ -838,6 +918,8 @@

Parameters

Returns

Array - New array with values imported and filtered based in input.
+

Example

+
 

inArraymethod @@ -859,6 +941,8 @@

Parameters

Returns

Number/String - Index of item inside the array inside an object. Or -1 if it wasn't found.
+

Example

+
 

initmethod @@ -874,6 +958,8 @@

Parameters

Settings object to be passed to each editor instance. +

Example

+
 

ismethod @@ -1000,6 +1086,8 @@

Parameters

Returns

Object - Last object in path or null if it couldn't be resolved.
+

Example

+
 

triggerSavemethod @@ -1008,6 +1096,8 @@

triggerSavemethod function triggerSave():void
Calls the save method on all editor instances in the collection. This can be useful when a form is to be submitted.
+

Example

+
 

trimmethod @@ -1076,6 +1166,8 @@

Parameters

Editor instance. +

Example

+
 

onRemoveEditorevent diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html.Node.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html.Node.html index a8651e37ed..be0d54379b 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html.Node.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html.Node.html @@ -118,7 +118,7 @@

Public Methods

isEmpty(elements:Object):Boolean
-
Returns true/false if the node is to be considered empty or not
+
Returns true/false if the node is to be considered empty or not.
Node @@ -151,6 +151,15 @@

Public Methods

+walk(prev:Boolean):Node +
+
Walks to the next or previous node and returns that node or null if it wasn't found.
+ +Node + + + +
wrap():void
Wraps the node in in another node.
@@ -326,7 +335,7 @@

isEmptymethod

public function isEmpty(elements:Object):Boolean -
Returns true/false if the node is to be considered empty or not +
Returns true/false if the node is to be considered empty or not.

Parameters

@@ -386,6 +395,25 @@

unwrapmethod

Example

 
+
+

walkmethod +

+public + function walk(prev:Boolean):Node + +
Walks to the next or previous node and returns that node or null if it wasn't found. +
+

Parameters

+
+ + + + +
prev:BooleanOptional previous node state defaults to false.
+

Returns

+
+Node - Node that is next to or previous of the current node.
+

wrapmethod

diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html.Schema.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html.Schema.html index eadb52af90..8ad0b3093e 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html.Schema.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.html.Schema.html @@ -95,28 +95,52 @@

Public Methods

+
Returns an map object of all custom elements.
+ +Schema + + + +
getElementRule(name:String):Object
Returns true/false if the specified element is valid or not according to the schema.
Schema + + + +
Returns a map with elements that should be treated as contents regardless if it has text content in them or not such as ...
+ +Schema +
-getEmptyElements():Object
-
Returns a map with empty elements.
+getSelfClosingElements():Object
+
Returns a map with self closing tags such as .
Schema +
Returns a map with short ended elements such as BR or IMG.
+ +Schema + + + +
Returns a map with elements where white space is to be preserved like PRE or SCRIPT.
Schema - +
isValidChild(name:String, child:String):Boolean
@@ -124,7 +148,7 @@

Public Methods

Schema - +
setValidElements(valid_elements:String):void
@@ -219,6 +243,16 @@

getBoolAttrsmethod

Returns

Object - Name/value lookup map for block elements.
+
+

getCustomElementsmethod +

+public + function getCustomElements():Object +
Returns an map object of all custom elements. +
+

Returns

+
Object - Name/value map object of all custom elements.
+

getElementRulemethod

@@ -237,15 +271,36 @@

Parameters

Returns

Object - Element object or undefined if the element isn't valid.
-
-

getEmptyElementsmethod +
+

getNonEmptyElementsmethod +

+public + function getNonEmptyElements():Object +
Returns a map with elements that should be treated as contents regardless if it has text +content in them or not such as TD, VIDEO or IMG. +
+

Returns

+
Object - Name/value lookup map for non empty elements.
+
+
+

getSelfClosingElementsmethod +

+public + function getSelfClosingElements():Object +
Returns a map with self closing tags such as
  • . +
  • +

    Returns

    +
    Object - Name/value lookup map for self closing tags elements.
    +
    +
    +

    getShortEndedElementsmethod

    public - function getEmptyElements():Object -
    Returns a map with empty elements. + function getShortEndedElements():Object +
    Returns a map with short ended elements such as BR or IMG.

    Returns

    -
    Object - Name/value lookup map for empty elements.
    +
    Object - Name/value lookup map for short ended elements.

    getWhiteSpaceElementsmethod diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Button.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Button.html index b509a040ed..e9dc34b05f 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Button.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Button.html @@ -59,7 +59,7 @@

    Public Methods

    -Button(id:String, s:Object)
    +Button(id:String, s:Object, ed:Editor)
    Constructs a new button control instance.
    Button @@ -180,7 +180,7 @@

    Method details

    Buttonconstructor

    public - function Button(id:String, s:Object) + function Button(id:String, s:Object, ed:Editor)
    Constructs a new button control instance.

    Parameters

    @@ -193,6 +193,10 @@

    Parameters

    s:Object Optional name/value settings object. + +ed:Editor +Optional the editor instance this button is for. +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ColorSplitButton.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ColorSplitButton.html index 198cfacd6d..7cddfb0582 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ColorSplitButton.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ColorSplitButton.html @@ -86,7 +86,7 @@

    Public Methods

    -ColorSplitButton(id:String, s:Object)
    +ColorSplitButton(id:String, s:Object, ed:Editor)
    Constructs a new color split button control instance.
    ColorSplitButton @@ -102,12 +102,20 @@

    Public Methods

    +displayColor(c:String):void
    +
    Change the currently selected color for the control.
    + +ColorSplitButton + + + +
    hideMenu(e:Event):void
    Hides the color menu.
    ColorSplitButton - +
    isActive():Boolean
    @@ -117,7 +125,7 @@

    Public Methods

    Control - +
    isDisabled():Boolean
    @@ -127,7 +135,7 @@

    Public Methods

    Control - +
    isRendered():Boolean
    @@ -137,7 +145,7 @@

    Public Methods

    Control - +
    postRender():void
    @@ -145,7 +153,7 @@

    Public Methods

    ColorSplitButton - +
    remove():void
    @@ -155,7 +163,7 @@

    Public Methods

    Control - +
    renderHTML():String
    @@ -165,7 +173,7 @@

    Public Methods

    SplitButton - +
    renderMenu():void
    @@ -173,7 +181,7 @@

    Public Methods

    ColorSplitButton - +
    renderTo(n:Element):void
    @@ -183,7 +191,7 @@

    Public Methods

    Control - +
    setActive(s:Boolean):void
    @@ -193,7 +201,7 @@

    Public Methods

    Control - +
    setColor(c:String):void
    @@ -201,7 +209,7 @@

    Public Methods

    ColorSplitButton - +
    setDisabled(s:Boolean):void
    @@ -211,7 +219,7 @@

    Public Methods

    Control - +
    setState(c:String, s:Boolean):void
    @@ -221,7 +229,7 @@

    Public Methods

    Control - +
    showMenu():void
    @@ -283,7 +291,7 @@

    Method details

    ColorSplitButtonconstructor

    public - function ColorSplitButton(id:String, s:Object) + function ColorSplitButton(id:String, s:Object, ed:Editor)
    Constructs a new color split button control instance.

    Parameters

    @@ -296,6 +304,10 @@

    Parameters

    s:Object Optional name/value settings object. + +ed:Editor +The editor instance this button is for. +
    @@ -307,6 +319,21 @@

    destroymethod events tied to it will also be removed.

    +
    +

    displayColormethod +

    +public + function displayColor(c:String):void +
    Change the currently selected color for the control. +
    +

    Parameters

    + + + + + +
    c:StringColor code value in hex for example: #FF00FF
    +

    hideMenumethod

    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Container.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Container.html index 984e7aac49..27ef0f5911 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Container.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.Container.html @@ -39,7 +39,7 @@

    tinymce.ui.Container

    Subclasses -Toolbar +Toolbar, ToolbarGroup diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.KeyboardNavigation.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.KeyboardNavigation.html new file mode 100644 index 0000000000..c016ca8b39 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.KeyboardNavigation.html @@ -0,0 +1,97 @@ + + + +Class: tinymce.ui.KeyboardNavigation + + + + + + + + + + + + +
    +

    tinymce.ui.KeyboardNavigation

    + + + + + + + + + +
    Namespacetinymce.ui
    ClassKeyboardNavigation
    +
    This class provides basic keyboard navigation using the arrow keys to children of a component. +For example, this class handles moving between the buttons on the toolbars. +
    +
    +

    Public Methods

    + + + + + + + + + + + + + + + + + +
    MethodDefined By
    +
    +KeyboardNavigation(settings:Object, dom:DOMUtils)
    +
    Create a new KeyboardNavigation instance to handle the focus for a specific element.
    +
    KeyboardNavigation
    +
    +destroy():void
    +
    Destroys the KeyboardNavigation and unbinds any focus/blur event handles it might have added.
    +
    KeyboardNavigation
    +
    +
    +
    +

    Method details

    +
    +

    KeyboardNavigationconstructor +

    +public + function KeyboardNavigation(settings:Object, dom:DOMUtils) +
    Create a new KeyboardNavigation instance to handle the focus for a specific element. +
    +

    Parameters

    + + + + + + + + + +
    settings:Objectthe settings object to define how keyboard navigation works.
    dom:DOMUtilsthe DOMUtils instance to use.
    +
    +
    +

    destroymethod +

    +public + function destroy():void +
    Destroys the KeyboardNavigation and unbinds any focus/blur event handles it might have added. +
    +
    +
    +
    +
    + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ListBox.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ListBox.html index 497485570e..66f7e6005d 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ListBox.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ListBox.html @@ -46,6 +46,8 @@

    tinymce.ui.ListBox

    This class is used to create list boxes/select list. This one will generate a non native control. This one has the benefits of having visual items added.
    +

    Example

    +
     

    Public Properties

    @@ -78,7 +80,7 @@

    Public Methods

    @@ -306,7 +308,7 @@

    Method details

    ListBoxconstructor

    public - function ListBox(id:String, s:Object) + function ListBox(id:String, s:Object, ed:Editor)
    Constructs a new listbox control instance.

    Parameters

    @@ -319,6 +321,10 @@

    Parameters

    + + + +
    -ListBox(id:String, s:Object)
    +ListBox(id:String, s:Object, ed:Editor)
    Constructs a new listbox control instance.
    ListBox s:Object Optional name/value settings object.
    ed:EditorOptional the editor instance this button is for.
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.MenuButton.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.MenuButton.html index 4303de80a5..62600190bd 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.MenuButton.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.MenuButton.html @@ -40,6 +40,8 @@

    tinymce.ui.MenuButton

    This class is used to create a UI button. A button is basically a link that is styled to look like a button or icon.
    +

    Example

    +
     

    Public Methods

    @@ -53,7 +55,7 @@

    Public Methods

    @@ -219,7 +221,7 @@

    Method details

    MenuButtonconstructor

    public - function MenuButton(id:String, s:Object) + function MenuButton(id:String, s:Object, ed:Editor)
    Constructs a new split button control instance.

    Parameters

    @@ -232,6 +234,10 @@

    Parameters

    + + + +
    -MenuButton(id:String, s:Object)
    +MenuButton(id:String, s:Object, ed:Editor)
    Constructs a new split button control instance.
    MenuButton s:Object Optional name/value settings object.
    ed:EditorOptional the editor instance this button is for.
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.SplitButton.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.SplitButton.html index d091279a4c..923f7823b6 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.SplitButton.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.SplitButton.html @@ -48,6 +48,8 @@

    tinymce.ui.SplitButton

    This class is used to create a split button. A button with a menu attached to it.
    +

    Example

    +
     

    Public Methods

    @@ -61,7 +63,7 @@

    Public Methods

    @@ -182,7 +184,7 @@

    Method details

    SplitButtonconstructor

    public - function SplitButton(id:String, s:Object) + function SplitButton(id:String, s:Object, ed:Editor)
    Constructs a new split button control instance.

    Parameters

    @@ -195,6 +197,10 @@

    Parameters

    + + + +
    -SplitButton(id:String, s:Object)
    +SplitButton(id:String, s:Object, ed:Editor)
    Constructs a new split button control instance.
    SplitButton s:Object Optional name/value settings object.
    ed:EditorOptional the editor instance this button is for.
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ToolbarGroup.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ToolbarGroup.html new file mode 100644 index 0000000000..e987e07e75 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.ui.ToolbarGroup.html @@ -0,0 +1,226 @@ + + + +Class: tinymce.ui.ToolbarGroup + + + + + + + + + + + + +
    +

    tinymce.ui.ToolbarGroup

    + + + + + + + + + + + + + +
    Namespacetinymce.ui
    ClassToolbarGroup
    Inheritance +ToolbarGroup + +Container + + +Control + +
    +
    This class is used to group a set of toolbars together and control the keyboard navigation and focus. +
    +
    +

    Public Properties

    + + + + + + + + + + + + + +
    PropertyDefined By
    +
    +controls : Array
    +
    Array of controls added to the container.
    +
    +Container +
    +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
    + +
    Adds a control to the collection of controls for the container.
    +
    +Container +
    +
    +destroy():void
    +
    Destroys the control will free any memory by removing event listeners etc.
    +
    +Control +
    +
    +get(n:String):Control +
    +
    Returns a control by id from the containers collection.
    +
    +Container +
    +
    +isActive():Boolean
    +
    Returns true/false if the control is disabled or not.
    +
    +Control +
    +
    +isDisabled():Boolean
    +
    Returns true/false if the control is disabled or not.
    +
    +Control +
    +
    +isRendered():Boolean
    +
    Returns true/false if the control has been rendered or not.
    +
    +Control +
    +
    +postRender():void
    +
    Post render event.
    +
    +Control +
    +
    +remove():void
    +
    Removes the control.
    +
    +Control +
    +
    +renderHTML():String
    +
    Renders the toolbar group as a HTML string.
    +
    ToolbarGroup
    +
    +renderTo(n:Element):void
    +
    Renders the control to the specified container element.
    +
    +Control +
    +
    +setActive(s:Boolean):void
    +
    Sets the activated state for the control.
    +
    +Control +
    +
    +setDisabled(s:Boolean):void
    +
    Sets the disabled state for the control.
    +
    +Control +
    +
    +setState(c:String, s:Boolean):void
    +
    Sets the specified class state for the control.
    +
    +Control +
    +
    +
    +
    +

    Method details

    +
    +

    renderHTMLmethod +

    +public + function renderHTML():String +
    Renders the toolbar group as a HTML string. +
    +

    Returns

    +
    String - HTML for the toolbar control.
    +
    +
    +
    +
    + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.Cookie.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.Cookie.html index 2d6db649e8..abb641f5fe 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.Cookie.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.Cookie.html @@ -34,6 +34,8 @@

    tinymce.util.Cookie

    This class contains simple cookie manangement functions.
    +

    Example

    +
     

    Public Methods

    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.Dispatcher.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.Dispatcher.html index baa0dfc6ac..eb2151665e 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.Dispatcher.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.Dispatcher.html @@ -31,6 +31,8 @@

    tinymce.util.Dispatcher

    This class is used to dispatch event to observers/listeners. All internal events inside TinyMCE uses this class.
    +

    Example

    +
     

    Public Methods

    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.JSON.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.JSON.html index 559cf764e1..62fdbddf6c 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.JSON.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.JSON.html @@ -34,6 +34,8 @@

    tinymce.util.JSON

    JSON parser and serializer class.
    +

    Example

    +
     

    Public Methods

    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.JSONRequest.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.JSONRequest.html index 38b0434db6..c91ab70672 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.JSONRequest.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.JSONRequest.html @@ -30,6 +30,8 @@

    tinymce.util.JSONRequest

    This class enables you to use JSON-RPC to call backend methods.
    +

    Example

    +
     

    Public Methods

    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.URI.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.URI.html index 381a73ab86..1acffa9a12 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.URI.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.URI.html @@ -170,6 +170,8 @@

    Parameters

    Returns

    String - Absolute URI from the point specified in the current URI instance.
    +

    Example

    +
     

    toAbsPathmethod @@ -206,6 +208,8 @@

    Parameters

    Returns

    String - Relative URI from the point specified in the current URI instance.
    +

    Example

    +
     

    toRelPathmethod diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.XHR.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.XHR.html index 4d2e46b8ef..8737e2ccef 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.XHR.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/class_tinymce.util.XHR.html @@ -33,6 +33,8 @@

    tinymce.util.XHR

    This class enables you to send XMLHTTPRequests cross browser.
    +

    Example

    +
     

    Public Methods

    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/index.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/index.html index 872d7bc3bf..87201e2434 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/index.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/index.html @@ -63,10 +63,20 @@

    TinyMCE API

  • +ScriptLoader + +
  • +
  • + Selection
  • + +Serializer + +
  • +
  • Event @@ -147,6 +157,11 @@

    TinyMCE API

  • +KeyboardNavigation + +
  • +
  • + ListBox
  • @@ -185,6 +200,11 @@

    TinyMCE API

    Toolbar +
  • + +ToolbarGroup + +
  • @@ -288,6 +308,11 @@

    TinyMCE API

  • +EditorManager + +
  • +
  • + DOM
  • diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinyMCE.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinyMCE.html index c5b87b0d89..a456222ac4 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinyMCE.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinyMCE.html @@ -25,6 +25,8 @@

    tinyMCEproperty
    Alternative name for tinymce added for 2.x compatibility.
    +

    Example

    +
     
     
     
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinymce.DOM.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinymce.DOM.html
    index cec88e0cd7..0d1f0861f8 100644
    --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinymce.DOM.html
    +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinymce.DOM.html
    @@ -25,6 +25,8 @@ 

    DOMproperty
    Instance of DOMUtils for the current document.
    +

    Example

    +
     
     
     
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinymce.EditorManager.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinymce.EditorManager.html
    new file mode 100644
    index 0000000000..f77d3db8cb
    --- /dev/null
    +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/member_tinymce.EditorManager.html
    @@ -0,0 +1,33 @@
    +
    +
    +
    +Member: 
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    tinymce.EditorManager

    +
    +

    EditorManagerproperty +

    +public EditorManager : tinymce + +
    Alternative name for tinymce added for compatibility. +
    +

    Example

    +
    +
    +
    + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/model.xml b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/model.xml index 3174c31511..75c4dfabfa 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/model.xml +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/model.xml @@ -45,6 +45,23 @@ The same theme or plugin instance that got passed in. +// Create a simple plugin +tinymce.create('tinymce.plugins.TestPlugin', { + TestPlugin : function(ed, url) { + ed.onClick.add(function(ed, e) { + ed.windowManager.alert('Hello World!'); + }); + } +}); + +// Register plugin using the add method +tinymce.PluginManager.add('test', tinymce.plugins.TestPlugin); + +// Initialize TinyMCE +tinyMCE.init({ + ... + plugins : '-test' // Init the plugin but don't try to load it +}); Loads an add-on from a specific url. @@ -61,16 +78,197 @@ Optional scope to execute the callback in. +// Loads a plugin from an external URL +tinymce.PluginManager.load('myplugin', '/some/dir/someplugin/editor_plugin.js'); + +// Initialize TinyMCE +tinyMCE.init({ + ... + plugins : '-myplugin' // Don't try to load it again +}); TinyMCE theme class. + + +Initializes the theme. + + +Editor instance that created the theme instance. + + +Absolute URL where the theme is located. + + + +Meta info method, this method gets executed when TinyMCE wants to present information about the theme for example in the about/help dialog. + + +Returns an object with meta information about the theme the current items are longname, author, authorurl, infourl and version. + + + +This method is responsible for rendering/generating the overall user interface with toolbars, buttons, iframe containers etc. + + +Object parameter containing the targetNode DOM node that will be replaced visually with an editor instance. + + +an object with items like iframeContainer, editorContainer, sizeContainer, deltaWidth, deltaHeight. + + + - -TinyMCE plugin class. + +Plugin base class, this is a pseudo class that describes how a plugin is to be created for TinyMCE. The methods below are all optional. + +// Create a new plugin class +tinymce.create('tinymce.plugins.ExamplePlugin', { + init : function(ed, url) { + // Register an example button + ed.addButton('example', { + title : 'example.desc', + onclick : function() { + // Display an alert when the user clicks the button + ed.windowManager.alert('Hello world!'); + }, + 'class' : 'bold' // Use the bold icon from the theme + }); + } +}); + +// Register plugin with a short name +tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin); + +// Initialize TinyMCE with the new plugin and button +tinyMCE.init({ + ... + plugins : '-example', // - means TinyMCE will not try to load it + theme_advanced_buttons1 : 'example' // Add the new example button to the toolbar +}); + + +Initialization function for the plugin. This will be called when the plugin is created. + + +Editor instance that created the plugin instance. + + +Absolute URL where the plugin is located. + +// Creates a new plugin class +tinymce.create('tinymce.plugins.ExamplePlugin', { + init : function(ed, url) { + // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); + ed.addCommand('mceExample', function() { + ed.windowManager.open({ + file : url + '/dialog.htm', + width : 320 + ed.getLang('example.delta_width', 0), + height : 120 + ed.getLang('example.delta_height', 0), + inline : 1 + }, { + plugin_url : url, // Plugin absolute URL + some_custom_arg : 'custom arg' // Custom argument + }); + }); + + // Register example button + ed.addButton('example', { + title : 'example.desc', + cmd : 'mceExample', + image : url + '/img/example.gif' + }); + + // Add a node change handler, selects the button in the UI when a image is selected + ed.onNodeChange.add(function(ed, cm, n) { + cm.setActive('example', n.nodeName == 'IMG'); + }); + } +}); + +// Register plugin +tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin); + + +Meta info method, this method gets executed when TinyMCE wants to present information about the plugin for example in the about/help dialog. + + +Returns an object with meta information about the plugin the current items are longname, author, authorurl, infourl and version. + +// Creates a new plugin class +tinymce.create('tinymce.plugins.ExamplePlugin', { + // Meta info method + getInfo : function() { + return { + longname : 'Example plugin', + author : 'Some author', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example', + version : "1.0" + }; + } +}); + +// Register plugin +tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin); + +// Initialize TinyMCE with the new plugin +tinyMCE.init({ + ... + plugins : '-example' // - means TinyMCE will not try to load it +}); + + +Gets called when a new control instance is created. + +Control name to create for example "mylistbox" + + +Control manager/factory to use to create the control. + + +Returns a new control instance or null. + +// Creates a new plugin class +tinymce.create('tinymce.plugins.ExamplePlugin', { + createControl: function(n, cm) { + switch (n) { + case 'mylistbox': + var mlb = cm.createListBox('mylistbox', { + title : 'My list box', + onselect : function(v) { + tinyMCE.activeEditor.windowManager.alert('Value selected:' + v); + } + }); + + // Add some values to the list box + mlb.add('Some item 1', 'val1'); + mlb.add('some item 2', 'val2'); + mlb.add('some item 3', 'val3'); + + // Return the new listbox instance + return mlb; + } + + return null; + } +}); + +// Register plugin +tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin); + +// Initialize TinyMCE with the new plugin and button +tinyMCE.init({ + ... + plugins : '-example', // - means TinyMCE will not try to load it + theme_advanced_buttons1 : 'mylistbox' // Add the new mylistbox control to the toolbar +}); + + This class is responsible for managing UI control instances. It's both a factory and a collection for the controls. @@ -286,7 +484,7 @@ depends on the use_native_selects settings state. - + This class contains the core logic for a TinyMCE editor. // Add a class to all paragraphs in the editor. @@ -324,10 +522,20 @@ ed.render(); State to force the editor to return false on a isDirty call. +function ajaxSave() { + var ed = tinyMCE.get('elm1'); + + // Save contents using some XHR call + alert(ed.getContent()); + + ed.isNotDirty = 1; // Force not dirty state +} Name/Value object containting plugin instances. +// Execute a method inside a plugin directly +tinyMCE.activeEditor.plugins.someplugin.someMethod(); Fires before the initialization of the editor. @@ -335,6 +543,15 @@ ed.render(); Editor instance. +// Adds an observer to the onPreInit event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onPreInit.add(function(ed) { + console.debug('PreInit: ' + ed.id); + }); + } +}); @@ -343,6 +560,15 @@ ed.render(); Editor instance. +// Adds an observer to the onBeforeRenderUI event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onBeforeRenderUI.add(function(ed, cm) { + console.debug('Before render: ' + ed.id); + }); + } +}); Fires after the rendering has completed. @@ -350,6 +576,15 @@ ed.render(); Editor instance. +// Adds an observer to the onPostRender event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onPostRender.add(function(ed, cm) { + console.debug('After render: ' + ed.id); + }); + } +}); Fires after the initialization of the editor is done. @@ -357,6 +592,15 @@ ed.render(); Editor instance. +// Adds an observer to the onInit event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onInit.add(function(ed) { + console.debug('Editor is done: ' + ed.id); + }); + } +}); @@ -365,6 +609,15 @@ ed.render(); Editor instance. +// Adds an observer to the onRemove event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onRemove.add(function(ed) { + console.debug('Editor was removed: ' + ed.id); + }); + } +}); Fires when the editor is activated. @@ -372,6 +625,15 @@ ed.render(); Editor instance. +// Adds an observer to the onActivate event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onActivate.add(function(ed) { + console.debug('Editor was activated: ' + ed.id); + }); + } +}); Fires when the editor is deactivated. @@ -379,6 +641,15 @@ ed.render(); Editor instance. +// Adds an observer to the onDeactivate event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onDeactivate.add(function(ed) { + console.debug('Editor was deactivated: ' + ed.id); + }); + } +}); Fires when something in the body of the editor is clicked. @@ -389,6 +660,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onClick event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onClick.add(function(ed, e) { + console.debug('Editor was clicked: ' + e.target.nodeName); + }); + } +}); Fires when a registered event is intercepted. @@ -399,6 +679,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onEvent event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onEvent.add(function(ed, e) { + console.debug('Editor event occured: ' + e.target.nodeName); + }); + } +}); Fires when a mouseup event is intercepted inside the editor. @@ -409,6 +698,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onMouseUp event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onMouseUp.add(function(ed, e) { + console.debug('Mouse up event: ' + e.target.nodeName); + }); + } +}); Fires when a mousedown event is intercepted inside the editor. @@ -419,6 +717,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onMouseDown event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onMouseDown.add(function(ed, e) { + console.debug('Mouse down event: ' + e.target.nodeName); + }); + } +}); Fires when a dblclick event is intercepted inside the editor. @@ -429,6 +736,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onDblClick event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onDblClick.add(function(ed, e) { + console.debug('Double click event: ' + e.target.nodeName); + }); + } +}); Fires when a keydown event is intercepted inside the editor. @@ -439,6 +755,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onKeyDown event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onKeyDown.add(function(ed, e) { + console.debug('Key down event: ' + e.keyCode); + }); + } +}); Fires when a keydown event is intercepted inside the editor. @@ -449,6 +774,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onKeyUp event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onKeyUp.add(function(ed, e) { + console.debug('Key up event: ' + e.keyCode); + }); + } +}); Fires when a keypress event is intercepted inside the editor. @@ -459,6 +793,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onKeyPress event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onKeyPress.add(function(ed, e) { + console.debug('Key press event: ' + e.keyCode); + }); + } +}); Fires when a contextmenu event is intercepted inside the editor. @@ -469,6 +812,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onContextMenu event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onContextMenu.add(function(ed, e) { + console.debug('Context menu event:' + e.target); + }); + } +}); Fires when a form submit event is intercepted. @@ -479,6 +831,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onSubmit event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onSubmit.add(function(ed, e) { + console.debug('Form submit:' + e.target); + }); + } +}); Fires when a form reset event is intercepted. @@ -489,6 +850,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onReset event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onReset.add(function(ed, e) { + console.debug('Form reset:' + e.target); + }); + } +}); Fires when a paste event is intercepted inside the editor. @@ -499,6 +869,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onPaste event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onPaste.add(function(ed, e) { + console.debug('Pasted plain text'); + }); + } +}); Fires when the Serializer does a preProcess on the contents. @@ -524,6 +903,16 @@ ed.render(); Is true if the process is on a cleanup operation. +// Adds an observer to the onPreProcess event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onPreProcess.add(function(ed, o) { + // Add a class to each paragraph in the editor + ed.dom.addClass(ed.dom.select('p', o.node), 'myclass'); + }); + } +}); Fires when the Serializer does a postProcess on the contents. @@ -534,6 +923,17 @@ ed.render(); PreProcess object. +// Adds an observer to the onPostProcess event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onPostProcess.add(function(ed, o) { + // Remove all paragraphs and replace with BR + o.content = o.content.replace(/<p[^>]+>|<p>/g, ''); + o.content = o.content.replace(/<\/p>/g, '<br />'); + }); + } +}); Fires before new contents is added to the editor. Using for example setContent. @@ -541,6 +941,16 @@ ed.render(); Editor instance. +// Adds an observer to the onBeforeSetContent event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onBeforeSetContent.add(function(ed, o) { + // Replaces all a characters with b characters + o.content = o.content.replace(/a/g, 'b'); + }); + } +}); Fires before contents is extracted from the editor using for example getContent. @@ -551,6 +961,15 @@ ed.render(); W3C DOM Event instance. +// Adds an observer to the onBeforeGetContent event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onBeforeGetContent.add(function(ed, o) { + console.debug('Before get content.'); + }); + } +}); Fires after the contents has been added to the editor using for example onSetContent. @@ -558,6 +977,16 @@ ed.render(); Editor instance. +// Adds an observer to the onSetContent event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onSetContent.add(function(ed, o) { + // Replaces all a characters with b characters + o.content = o.content.replace(/a/g, 'b'); + }); + } +}); Fires after the contents has been extracted from the editor using for example getContent. @@ -565,6 +994,16 @@ ed.render(); Editor instance. +// Adds an observer to the onGetContent event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onGetContent.add(function(ed, o) { + // Replace all a characters with b + o.content = o.content.replace(/a/g, 'b'); + }); + } +}); Fires when the editor gets loaded with contents for example when the load method is executed. @@ -572,6 +1011,16 @@ ed.render(); Editor instance. +// Adds an observer to the onLoadContent event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onLoadContent.add(function(ed, o) { + // Output the element name + console.debug(o.element.nodeName); + }); + } +}); Fires when the editor contents gets saved for example when the save method is executed. @@ -579,6 +1028,16 @@ ed.render(); Editor instance. +// Adds an observer to the onSaveContent event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onSaveContent.add(function(ed, o) { + // Output the element name + console.debug(o.element.nodeName); + }); + } +}); Fires when the user changes node location using the mouse or keyboard. @@ -586,6 +1045,17 @@ ed.render(); Editor instance. +// Adds an observer to the onNodeChange event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onNodeChange.add(function(ed, cm, e) { + // Activates the link button when the caret is placed in a anchor element + if (e.nodeName == 'A') + cm.setActive('link', true); + }); + } +}); Fires when a new undo level is added to the editor. @@ -593,6 +1063,15 @@ ed.render(); Editor instance. +// Adds an observer to the onChange event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onChange.add(function(ed, l) { + console.debug('Editor contents was modified. Contents: ' + l.content); + }); + } +}); Fires before a command gets executed for example "Bold". @@ -600,6 +1079,15 @@ ed.render(); Editor instance. +// Adds an observer to the onBeforeExecCommand event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) { + console.debug('Command is to be executed: ' + cmd); + }); + } +}); Fires after a command is executed for example "Bold". @@ -607,6 +1095,15 @@ ed.render(); Editor instance. +// Adds an observer to the onExecCommand event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onExecCommand.add(function(ed, cmd, ui, val) { + console.debug('Command was executed: ' + cmd); + }); + } +}); Fires when the contents is undo:ed. @@ -614,8 +1111,18 @@ ed.render(); Editor instance. - -W3C DOM Event instance. + +{Object} level Undo level object. +@ example +// Adds an observer to the onUndo event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onUndo.add(function(ed, level) { + console.debug('Undo was performed: ' + level.content); + }); + } +}); @@ -624,9 +1131,18 @@ ed.render(); Editor instance. - -W3C DOM Event instance. - + +Undo level object. + +// Adds an observer to the onRedo event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onRedo.add(function(ed, level) { + console.debug('Redo was performed: ' +level.content); + }); + } +}); Fires when visual aids is enabled/disabled. @@ -634,6 +1150,15 @@ ed.render(); Editor instance. +// Adds an observer to the onVisualAid event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onVisualAid.add(function(ed, e, s) { + console.debug('onVisualAid event: ' + ed.id + ", State: " + s); + }); + } +}); Fires when the progress throbber is shown above the editor. @@ -641,18 +1166,42 @@ ed.render(); Editor instance. +// Adds an observer to the onSetProgressState event using tinyMCE.init +tinyMCE.init({ + ... + setup : function(ed) { + ed.onSetProgressState.add(function(ed, b) { + if (b) + console.debug('SHOW!'); + else + console.debug('HIDE!'); + }); + } +}); Name/value collection with editor settings. +// Get the value of the theme setting +tinyMCE.activeEditor.windowManager.alert("You are using the " + tinyMCE.activeEditor.settings.theme + " theme"); URI object to document configured for the TinyMCE instance. +// Get relative URL from the location of document_base_url +tinyMCE.activeEditor.documentBaseURI.toRelative('/somedir/somefile.htm'); + +// Get absolute URL from the location of document_base_url +tinyMCE.activeEditor.documentBaseURI.toAbsolute('somefile.htm'); URI object to current document that holds the TinyMCE editor instance. +// Get relative URL from the location of the API +tinyMCE.activeEditor.baseURI.toRelative('/somedir/somefile.htm'); + +// Get absolute URL from the location of the API +tinyMCE.activeEditor.baseURI.toAbsolute('somefile.htm'); Array with CSS files to load into the iframe. @@ -665,6 +1214,18 @@ ed.render(); Window manager reference, use this to open new windows and dialogs. +// Shows an alert message +tinyMCE.activeEditor.windowManager.alert('Hello world!'); + +// Opens a new dialog with the file.htm file and the size 320x240 +// It also adds a custom parameter this can be retrieved by using tinyMCEPopup.getWindowArg inside the dialog. +tinyMCE.activeEditor.windowManager.open({ + url : 'file.htm', + width : 320, + height : 240 +}, { + custom_param : 1 +}); Initializes the editor this will be called automatically when @@ -675,10 +1236,14 @@ This method will setup the iframe and create the theme and plugin instances. Reference to the theme instance that was used to generate the UI. +// Executes a method on the theme directly +tinyMCE.activeEditor.theme.someMethod(); Control manager instance for the editor. Will enables you to create new UI elements and change their states etc. +// Disables the bold button +tinyMCE.activeEditor.controlManager.setDisabled('bold', true); This method get called by the init method ones the iframe is loaded. @@ -693,6 +1258,8 @@ This method should not be called directly. DOM instance for the editor. +// Adds a class to all paragraphs within the editor +tinyMCE.activeEditor.dom.addClass(tinyMCE.activeEditor.dom.select('p'), 'someclass'); HTML parser will be used when contents is inserted into the editor. @@ -701,10 +1268,20 @@ This method should not be called directly. DOM serializer for the editor. Will be used when contents is extracted from the editor. +// Serializes the first paragraph in the editor into a string +tinyMCE.activeEditor.serializer.serialize(tinyMCE.activeEditor.dom.select('p')[0]); Selection instance for the editor. +// Sets some contents to the current selection in the editor +tinyMCE.activeEditor.selection.setContent('Some contents'); + +// Gets the current selection +alert(tinyMCE.activeEditor.selection.getContent()); + +// Selects the first paragraph found +tinyMCE.activeEditor.selection.select(tinyMCE.activeEditor.dom.select('p')[0]); Formatter instance. @@ -713,6 +1290,8 @@ This method should not be called directly. Undo manager instance, responsible for handling undo levels. +// Undoes the last modification to the editor +tinyMCE.activeEditor.undoManager.undo(); Sets up the contentEditable mode. @@ -773,6 +1352,11 @@ a key mathcin the input. Configuration parameter value or default value. +// Returns a specific config value from the currently active editor +var someval = tinyMCE.activeEditor.getParam('myvalue'); + +// Returns a specific config value from a specific editor instance by id +var someval2 = tinyMCE.get('my_editor').getParam('myvalue'); Distpaches out a onNodeChange event to all observers. This method should be called when you @@ -793,6 +1377,24 @@ powerfull if you need more control use the ControlManagers factory methods inste Settings object with title, cmd etc. +// Adds a custom button to the editor and when a user clicks the button it will open +// an alert box with the selected contents as plain text. +tinyMCE.init({ + ... + + theme_advanced_buttons1 : 'example,..' + + setup : function(ed) { + // Register example button + ed.addButton('example', { + title : 'example.desc', + image : '../jscripts/tiny_mce/plugins/example/img/example.gif', + onclick : function() { + ed.windowManager.alert('Hello world!! Selection: ' + ed.selection.getContent({format : 'text'})); + } + }); + } +}); Adds a custom command to the editor, you can also override existing commands with this method. @@ -807,6 +1409,17 @@ The command that you add can be executed with execCommand. Optional scope to execute the function in. +// Adds a custom command that later can be executed using execCommand +tinyMCE.init({ + ... + + setup : function(ed) { + // Register example command + ed.addCommand('mycommand', function(ui, v) { + ed.windowManager.alert('Hello world!! Selection: ' + ed.selection.getContent({format : 'text'})); + }); + } +}); Callback function that gets called when a command is executed. @@ -957,6 +1570,14 @@ This is ideal for asycronous operations like an AJAX save call. Same as the input state. +// Show progress for the active editor +tinyMCE.activeEditor.setProgressState(true); + +// Hide progress for the active editor +tinyMCE.activeEditor.setProgressState(false); + +// Show progress after 3 seconds +tinyMCE.activeEditor.setProgressState(true, 3000); Loads contents from the textarea or div element that got converted into an editor instance. @@ -995,6 +1616,17 @@ the different cleanup rules options. HTML string that got set into the editor. +// Sets the HTML contents of the activeEditor editor +tinyMCE.activeEditor.setContent('<span>some</span> html'); + +// Sets the raw contents of the activeEditor editor +tinyMCE.activeEditor.setContent('<span>some</span> html', {format : 'raw'}); + +// Sets the content of a specific editor (my_editor in this example) +tinyMCE.get('my_editor').setContent(data); + +// Sets the bbcode contents of the activeEditor editor if the bbcode plugin was added +tinyMCE.activeEditor.setContent('[b]some[/b] html', {format : 'bbcode'}); Gets the content from the editor instance, this will cleanup the content before it gets returned using @@ -1006,6 +1638,14 @@ the different cleanup rules options. Cleaned content string, normally HTML contents. +// Get the HTML contents of the currently active editor +console.debug(tinyMCE.activeEditor.getContent()); + +// Get the raw contents of the currently active editor +tinyMCE.activeEditor.getContent({format : 'raw'}); + +// Get content of a specific editor: +tinyMCE.get('content id').getContent() Returns true/false if the editor is dirty or not. It will get dirty if the user has made modifications to the contents. @@ -1013,6 +1653,8 @@ the different cleanup rules options. True/false if the editor is dirty or not. It will get dirty if the user has made modifications to the contents. +if (tinyMCE.activeEditor.isDirty()) + alert("You must save your contents."); Returns the editors container element. The container element wrappes in @@ -1326,6 +1968,11 @@ default formatting logic for execCommand due to it's inconsistant and buggy beha The old level object containing a bookmark and contents. + +Stores away a bookmark to be used when performing an undo action so that the selection is before +the change has been made. + + Adds a new undo level/snapshot to the undo list. @@ -1371,7 +2018,28 @@ default formatting logic for execCommand due to it's inconsistant and buggy beha -This class handles the creation of native windows and dialogs. This class can be extended to provide for example inline dialogs. +This class handles the creation of native windows and dialogs. This class can be extended to provide for example inline dialogs. + +// Opens a new dialog with the file.htm file and the size 320x240 +// It also adds a custom parameter this can be retrieved by using tinyMCEPopup.getWindowArg inside the dialog. +tinyMCE.activeEditor.windowManager.open({ + url : 'file.htm', + width : 320, + height : 240 +}, { + custom_param : 1 +}); + +// Displays an alert box using the active editors window manager instance +tinyMCE.activeEditor.windowManager.alert('Hello world!'); + +// Displays an confirm box and an alert message will be displayed depending on what you choose in the confirm +tinyMCE.activeEditor.windowManager.confirm("Do you want to do something", function(s) { + if (s) + tinyMCE.activeEditor.windowManager.alert("Ok"); + else + tinyMCE.activeEditor.windowManager.alert("Cancel"); +}); Constructs a new window manager instance. @@ -1385,9 +2053,51 @@ default formatting logic for execCommand due to it's inconsistant and buggy beha Optional name/value settings collection contains things like width/height/url etc. + + + + + + + + + + + Optional parameters/arguments collection can be used by the dialogs to retrive custom parameters. + @@ -1408,6 +2118,8 @@ will be passed as arguments to the constructor. Instance of the specified class. +var uri = tinyMCEPopup.editor.windowManager.createInstance('tinymce.util.URI', 'http://www.somesite.com'); +alert(uri.getURI()); Creates a confirm dialog. Please don't use the blocking behavior of this @@ -1422,6 +2134,13 @@ native version use the callback method instead then it can be extended. Optional scope to execute the callback in. +// Displays an confirm box and an alert message will be displayed depending on what you choose in the confirm +tinyMCE.activeEditor.windowManager.confirm("Do you want to do something", function(s) { + if (s) + tinyMCE.activeEditor.windowManager.alert("Ok"); + else + tinyMCE.activeEditor.windowManager.alert("Cancel"); +}); Creates a alert dialog. Please don't use the blocking behavior of this @@ -1436,13 +2155,21 @@ native version use the callback method instead then it can be extended. Optional scope to execute the callback in. +// Displays an alert box using the active editors window manager instance +tinyMCE.activeEditor.windowManager.alert('Hello world!'); Contains classes for handling the browsers DOM. -Utility class for various DOM manipulation and retrival functions. +Utility class for various DOM manipulation and retrival functions. + +// Add a class to an element by id in the page +tinymce.DOM.addClass('someid', 'someclass'); + +// Add a class to an element by id inside the editor +tinyMCE.activeEditor.dom.addClass('someid', 'someclass'); Constructs a new DOMUtils instance. Consult the Wiki for more details on settings etc for this class. @@ -1548,6 +2275,36 @@ If the function then returns true indicating that it has found what it was looki Element matching the specified id or null if it wasn't found. + +Returns the next node that matches selector or function + + +Node to find siblings from. + + + + +Selector CSS expression or function. + + +Next node item matching the selector or null if it wasn't found. + + + +Returns the previous node that matches selector or function + + +Node to find siblings from. + + + + +Selector CSS expression or function. + + +Previous node item matching the selector or null if it wasn't found. + + Selects specific elements by a CSS level 3 pattern. For example "div#a1 p.test". This function is optimized for the most common patterns needed in TinyMCE but it also performes good enough @@ -1562,6 +2319,11 @@ on more complex patterns. Array with all matched elements. +// Adds a class to all paragraphs in the currently active editor +tinyMCE.activeEditor.dom.addClass(tinyMCE.activeEditor.dom.select('p'), 'someclass'); + +// Adds a class to all spans that has the test class in the currently active editor +tinyMCE.activeEditor.dom.addClass(tinyMCE.activeEditor.dom.select('span.test'), 'someclass') Returns true/false if the specified element matches the specified css pattern. @@ -1603,6 +2365,8 @@ on more complex patterns. Element that got created or array with elements if multiple elements where passed. +// Adds a new paragraph to the end of the active editor +tinyMCE.activeEditor.dom.add(tinyMCE.activeEditor.getBody(), 'p', {title : 'my title'}, 'Some content'); Creates a new element. @@ -1619,9 +2383,12 @@ on more complex patterns. HTML DOM node element that got created. +// Adds an element where the caret/selection is in the active editor +var el = tinyMCE.activeEditor.dom.create('div', {id : 'test', 'class' : 'myclass'}, 'some content'); +tinyMCE.activeEditor.selection.setNode(el); -Create HTML string for element. The elemtn will be closed unless an empty inner HTML string is passed. +Create HTML string for element. The element will be closed unless an empty inner HTML string is passed. Name of new element. @@ -1635,6 +2402,8 @@ on more complex patterns. String with new HTML element like for example: <a href="#">test</a>. +// Creates a html chunk and inserts it at the current selection/caret location +tinyMCE.activeEditor.selection.setContent(tinyMCE.activeEditor.dom.createHTML('a', {href : 'test.html'}, 'some line')); Removes/deletes the specified element(s) from the DOM. @@ -1653,6 +2422,11 @@ on more complex patterns. HTML DOM element that got removed or array of elements depending on input. +// Removes all paragraphs in the active editor +tinyMCE.activeEditor.dom.remove(tinyMCE.activeEditor.dom.select('p')); + +// Removes a element by id in the document +tinyMCE.DOM.remove('mydiv'); Sets the CSS style value on a HTML element. The name can be a camelcase string @@ -1670,6 +2444,11 @@ or the CSS style name like background-color. Value to set on the style. +// Sets a style value on all paragraphs in the currently active editor +tinyMCE.activeEditor.dom.setStyle(tinyMCE.activeEditor.dom.select('p'), 'background-color', 'red'); + +// Sets a style value to an element by id in the current document +tinyMCE.DOM.setStyle('mydiv', 'background-color', 'red'); Returns the current style or runtime/computed value of a element. @@ -1701,6 +2480,11 @@ or the CSS style name like background-color. Name/Value collection of style items to add to the element(s). +// Sets styles on all paragraphs in the currently active editor +tinyMCE.activeEditor.dom.setStyles(tinyMCE.activeEditor.dom.select('p'), {'background-color' : 'red', 'color' : 'green'}); + +// Sets styles to an element by id in the current document +tinyMCE.DOM.setStyles('mydiv', {'background-color' : 'red', 'color' : 'green'}); Sets the specified attributes value of a element or elements. @@ -1717,6 +2501,11 @@ or the CSS style name like background-color. Value to set on the attribute of this value is falsy like null 0 or '' it will remove the attribute instead. +// Sets an attribute to all paragraphs in the active editor +tinyMCE.activeEditor.dom.setAttrib(tinyMCE.activeEditor.dom.select('p'), 'class', 'myclass'); + +// Sets an attribute to a specific element in the current page +tinyMCE.dom.setAttrib('mydiv', 'class', 'myclass'); Sets the specified attributes of a element or elements. @@ -1730,6 +2519,11 @@ or the CSS style name like background-color. Name/Value collection of attribute items to add to the element(s). +// Sets some attributes to all paragraphs in the active editor +tinyMCE.activeEditor.dom.setAttribs(tinyMCE.activeEditor.dom.select('p'), {'class' : 'myclass', title : 'some title'}); + +// Sets some attributes to a specific element in the current page +tinyMCE.DOM.setAttribs('mydiv', {'class' : 'myclass', title : 'some title'}); Returns the specified attribute by name. @@ -1795,6 +2589,17 @@ colors to hex values. Urls inside the styles will also be converted to absolute/ URL to CSS file to load. +// Loads a CSS file dynamically into the current document +tinymce.DOM.loadCSS('somepath/some.css'); + +// Loads a CSS file into the currently active editor instance +tinyMCE.activeEditor.dom.loadCSS('somepath/some.css'); + +// Loads a CSS file into an editor instance by id +tinyMCE.get('someid').dom.loadCSS('somepath/some.css'); + +// Loads multiple CSS files into the current document +tinymce.DOM.loadCSS('somepath/some.css,somepath/someother.css'); Adds a class to the specified element or elements. @@ -1813,6 +2618,11 @@ colors to hex values. Urls inside the styles will also be converted to absolute/ String with new class value or array with new class values for all elements. +// Adds a class to all paragraphs in the active editor +tinyMCE.activeEditor.dom.addClass(tinyMCE.activeEditor.dom.select('p'), 'myclass'); + +// Adds a class to a specific element in the current page +tinyMCE.DOM.addClass('mydiv', 'myclass'); Removes a class from the specified element or elements. @@ -1831,6 +2641,11 @@ colors to hex values. Urls inside the styles will also be converted to absolute/ String with new class value or array with new class values for all elements. +// Removes a class from all paragraphs in the active editor +tinyMCE.activeEditor.dom.removeClass(tinyMCE.activeEditor.dom.select('p'), 'myclass'); + +// Removes a class from a specific element in the current page +tinyMCE.DOM.removeClass('mydiv', 'myclass'); Returns true if the specified element has the specified class. @@ -1866,6 +2681,8 @@ colors to hex values. Urls inside the styles will also be converted to absolute/ ID of DOM element or DOM element or array with elements or IDs to hide. +// Hides a element by id in the document +tinymce.DOM.hide('myid'); Returns true/false if the element is hidden or not by checking the "display" style. @@ -1903,6 +2720,11 @@ URLs will get converted, hex color values fixed etc. Check processHTML for detai HTML content to set as inner HTML of the element. +// Sets the inner HTML of all paragraphs in the active editor +tinyMCE.activeEditor.dom.setHTML(tinyMCE.activeEditor.dom.select('p'), 'some inner html'); + +// Sets the inner HTML of a element by id in the document +tinyMCE.DOM.setHTML('mydiv', 'some inner html'); Returns the outer HTML of an element. @@ -1915,6 +2737,8 @@ URLs will get converted, hex color values fixed etc. Check processHTML for detai Outer HTML string. +tinymce.DOM.getOuterHTML(editorElement); +tinyMCE.activeEditor.getOuterHTML(tinyMCE.activeEditor.getBody()); Sets the specified outer HTML on a element or elements. @@ -1931,6 +2755,11 @@ URLs will get converted, hex color values fixed etc. Check processHTML for detai Optional document scope to use in this process defaults to the document of the DOM class. +// Sets the outer HTML of all paragraphs in the active editor +tinyMCE.activeEditor.dom.setOuterHTML(tinyMCE.activeEditor.dom.select('p'), '<div>some html</div>'); + +// Sets the outer HTML of a element by id in the document +tinyMCE.DOM.setOuterHTML('mydiv', '<div>some html</div>'); Entity decode a string, resolves any HTML entities like &aring;. @@ -2076,6 +2905,17 @@ rule like ".class" complex ones like "div td.class" will not be added to output. NodeList with attributes. + +Returns true/false if the specified node is to be considered empty or not. + + +Optional name/value object with elements that are automatically treated as non empty elements. + + +true/false if the node is empty or not. + +tinymce.DOM.isEmpty(node, {img : true}); + Destroys all internal references to the DOM to solve IE leak issues. @@ -2087,6 +2927,8 @@ available if it's not it will fallback to the custom TinyMCE implementation. DOM Range object. +var rng = tinymce.DOM.createRng(); +alert(rng.startContainer + "," + rng.startOffset); Splits an element into two new elements and places the specified split @@ -2158,6 +3000,11 @@ this example <p>abc<b>abc</b>123</p> would produce <p gets visible though DIVs on IE 6 it uses a iframe for this blocking. This class also shortens the length of some DOM API calls since it's bound to an element. +// Creates an basic element for an existing element +var elm = new tinymce.dom.Element('someid'); + +elm.setStyle('background-color', 'red'); +elm.moveTo(10, 10); Constructs a new Element instance. Consult the Wiki for more details on this class. @@ -2282,6 +3129,10 @@ and handler references to be able to clean elements to reduce IE memory leaks. Function callback handler the same as the one passed in. +// Adds a click handler to the current document +tinymce.dom.Event.add(document, 'click', function(e) { + console.debug(e.target); +}); Removes the specified event handler by name and function from a element or collection of elements. @@ -2303,6 +3154,13 @@ and handler references to be able to clean elements to reduce IE memory leaks. Bool state if true if the handler was removed or an array with states if multiple elements where passed in. +// Adds a click handler to the current document +var func = tinymce.dom.Event.add(document, 'click', function(e) { + console.debug(e.target); +}); + +// Removes the click handler from the document +tinymce.dom.Event.remove(document, 'click', func); Clears all events of a specific object. @@ -2310,6 +3168,10 @@ and handler references to be able to clean elements to reduce IE memory leaks. DOM element or object to remove all events from. +// Cancels all mousedown events in the active editor +tinyMCE.activeEditor.onMouseDown.add(function(ed, e) { + return tinymce.dom.Event.cancel(e); +}); Cancels an event for both bubbeling and the default browser behavior. @@ -2347,9 +3209,104 @@ and handler references to be able to clean elements to reduce IE memory leaks. + +This class handles asynchronous/synchronous loading of JavaScript files it will execute callbacks when various items gets loaded. This class is useful to load external JavaScript files. + +// Load a script from a specific URL using the global script loader +tinymce.ScriptLoader.load('somescript.js'); + +// Load a script using a unique instance of the script loader +var scriptLoader = new tinymce.dom.ScriptLoader(); + +scriptLoader.load('somescript.js'); + +// Load multiple scripts +var scriptLoader = new tinymce.dom.ScriptLoader(); + +scriptLoader.add('somescript1.js'); +scriptLoader.add('somescript2.js'); +scriptLoader.add('somescript3.js'); + +scriptLoader.loadQueue(function() { + alert('All scripts are now loaded.'); +}); + + +Loads a specific script directly without adding it to the load queue. + + +Absolute URL to script to add. + + +Optional callback function to execute ones this script gets loaded. + + +Optional scope to execute callback in. + + + +Returns true/false if a script has been loaded or not. + + +URL to check for. + + +[Boolean} true/false if the URL is loaded. + + + +Marks a specific script to be loaded. This can be useful if a script got loaded outside +the script loader or to skip it from loading some script. + + +Absolute URL to the script to mark as loaded. + + + +Adds a specific script to the load queue of the script loader. + + +Absolute URL to script to add. + + +Optional callback function to execute ones this script gets loaded. + + +Optional scope to execute callback in. + + + +Starts the loading of the queue. + + +Optional callback to execute when all queued items are loaded. + + +Optional scope to execute the callback in. + + + +Loads the specified queue of files and executes the callback ones they are loaded. +This method is generally not used outside this class but it might be useful in some scenarios. + + +Array of queue items to load. + + +Optional callback to execute ones all items are loaded. + + +Optional scope to execute callback in. + + + + This class handles text and control selection it's an crossbrowser utility class. -Consult the TinyMCE Wiki API for more details and examples on how to use this class. +Consult the TinyMCE Wiki API for more details and examples on how to use this class. + +// Getting the currently selected node for the active editor +alert(tinymce.activeEditor.selection.getNode().nodeName); Constructs a new selection instance. @@ -2360,10 +3317,50 @@ Consult the TinyMCE Wiki API for more details and examples on how to use this cl Window to bind the selection object to. - -DOM serialization class to use for getContent. + +DOM serialization class to use for getContent. + + + +This event gets executed before contents is extracted from the selection. + + +Selection object that fired the event. + + +Contains things like the contents that will be returned. + + + +This event gets executed before contents is inserted into selection. + + +Selection object that fired the event. + + +Contains things like the contents that will be inserted. + + + +This event gets executed when contents is inserted into selection. + + +Selection object that fired the event. + + +Contains things like the contents that will be inserted. + + + +This event gets executed when contents is extracted from the selection. + + +Selection object that fired the event. - + +Contains things like the contents that will be returned. + + Returns the selected contents using the DOM serializer passed in to this class. @@ -2373,18 +3370,25 @@ Consult the TinyMCE Wiki API for more details and examples on how to use this cl Selected contents in for example HTML format. +// Alerts the currently selected contents +alert(tinyMCE.activeEditor.selection.getContent()); + +// Alerts the currently selected contents as plain text +alert(tinyMCE.activeEditor.selection.getContent({format : 'text'})); Sets the current selection to the specified content. If any contents is selected it will be replaced with the contents passed in to this function. If there is no selection the contents will be inserted where the caret is placed in the editor/page. - + HTML contents to set could also be other formats depending on settings. - + Optional settings object with for example data format. +// Inserts some HTML contents at the current selection +tinyMCE.activeEditor.selection.setContent('<strong>Some contents</strong>'); Returns the start element of a selection range. If the start is in a text @@ -2415,6 +3419,13 @@ can then be used to restore the selection after some content modification to the Bookmark object, use moveToBookmark with this object to restore the selection. +// Stores a bookmark of the current selection +var bm = tinyMCE.activeEditor.selection.getBookmark(); + +tinyMCE.activeEditor.setContent(tinyMCE.activeEditor.getContent() + 'Some new content'); + +// Restore the selection bookmark +tinyMCE.activeEditor.selection.moveToBookmark(bm); Restores the selection to the specified bookmark. @@ -2425,6 +3436,13 @@ can then be used to restore the selection after some content modification to the true/false if it was successful or not. +// Stores a bookmark of the current selection +var bm = tinyMCE.activeEditor.selection.getBookmark(); + +tinyMCE.activeEditor.setContent(tinyMCE.activeEditor.getContent() + 'Some new content'); + +// Restore the selection bookmark +tinyMCE.activeEditor.selection.moveToBookmark(bm); Selects the specified element. This will place the start and end of the selection range around the element. @@ -2438,6 +3456,8 @@ can then be used to restore the selection after some content modification to the Selected element the same element as the one that got passed in. +// Select the first paragraph in the active editor +tinyMCE.activeEditor.selection.select(tinyMCE.activeEditor.dom.select('p')[0]); Returns true/false if the selection range is collapsed or not. Collapsed means if it's a caret or a larger selection. @@ -2449,7 +3469,7 @@ can then be used to restore the selection after some content modification to the Collapse the selection to start or end of range. - + Optional boolean state if to collapse to end or not. Defaults to start. @@ -2469,6 +3489,8 @@ can then be used to restore the selection after some content modification to the Internal browser range object. + + Changes the selection to the specified DOM range. @@ -2486,6 +3508,8 @@ can then be used to restore the selection after some content modification to the Returns the element that got passed in. +// Inserts a DOM node at current selection/caret location +tinyMCE.activeEditor.selection.setNode(tinyMCE.activeEditor.dom.create('img', {src : 'some.gif', title : 'some title'})); Returns the currently selected element or the common ancestor element for both start and end of the selection. @@ -2493,6 +3517,147 @@ can then be used to restore the selection after some content modification to the Currently selected element or common ancestor element. +// Alerts the currently selected elements node name +alert(tinyMCE.activeEditor.selection.getNode().nodeName); + + + + +This class is used to serialize DOM trees into a string. Consult the TinyMCE Wiki API for more details and examples on how to use this class. + + + +Constucts a new DOM serializer class. + + +Serializer settings object. + + +DOMUtils instance reference. + + +Optional schema reference. + + + +This event gets executed before a HTML fragment gets serialized into a HTML string. This event enables you to do modifications to the DOM before the serialization occurs. It's important to know that the element that is getting serialized is cloned so it's not inside a document. + + +object/Serializer instance that is serializing an element. + + +Object containing things like the current node. + +// Adds an observer to the onPreProcess event +serializer.onPreProcess.add(function(se, o) { + // Add a class to each paragraph + se.dom.addClass(se.dom.select('p', o.node), 'myclass'); +}); + + +This event gets executed after a HTML fragment has been serialized into a HTML string. This event enables you to do modifications to the HTML string like regexp replaces etc. + + +object/Serializer instance that is serializing an element. + + +Object containing things like the current contents. + +// Adds an observer to the onPostProcess event +serializer.onPostProcess.add(function(se, o) { + // Remove all paragraphs and replace with BR + o.content = o.content.replace(/<p[^>]+>|<p>/g, ''); + o.content = o.content.replace(/<\/p>/g, '<br />'); +}); + + +Adds a node filter function to the parser used by the serializer, the parser will collect the specified nodes by name +and then execute the callback ones it has finished parsing the document. + + +Callback function to execute once it has collected nodes. + +parser.addNodeFilter('p,h1', function(nodes, name) { + for (var i = 0; i < nodes.length; i++) { + console.log(nodes[i].name); + } +}); + + +Adds a attribute filter function to the parser used by the serializer, the parser will collect nodes that has the specified attributes +and then execute the callback ones it has finished parsing the document. + + +Callback function to execute once it has collected nodes. + +parser.addAttributeFilter('src,href', function(nodes, name) { + for (var i = 0; i < nodes.length; i++) { + console.log(nodes[i].name); + } +}); + + +Fires when the Serializer does a preProcess on the contents. + + +Editor instance. + + +PreProcess object. + + + + + + + + +Fires when the Serializer does a postProcess on the contents. + + +Editor instance. + + +PreProcess object. + + + +Serializes the specified browser DOM node into a HTML string. + + +DOM node to serialize. + + +Arguments option that gets passed to event handlers. + + + +Adds valid elements rules to the serializers schema instance this enables you to specify things +like what elements should be outputted and what attributes specific elements might have. +Consult the Wiki for more details on this format. + + +Valid elements rules string to add to schema. + + + +Sets the valid elements rules to the serializers schema instance this enables you to specify things +like what elements should be outputted and what attributes specific elements might have. +Consult the Wiki for more details on this format. + + +Valid elements rules string. + @@ -2688,7 +3853,7 @@ and attributes that doesn't fit the schema if the validate setting is enabled. }, doctype: function(text) { - console.log('DocType:', name); + console.log('DocType:', text); } }, schema); @@ -2809,8 +3974,8 @@ there should only be one id per document. The current node that got cleared. - -Returns true/false if the node is to be considered empty or not + +Returns true/false if the node is to be considered empty or not. Name/value object with elements that are automatically treated as non empty elements. @@ -2820,6 +3985,16 @@ there should only be one id per document. node.isEmpty({img : true}); + +Walks to the next or previous node and returns that node or null if it wasn't found. + + +Optional previous node state defaults to false. + + +Node that is next to or previous of the current node. + + Creates a node of a specific type. @@ -2862,11 +4037,26 @@ there should only be one id per document. Name/value lookup map for block elements. - -Returns a map with empty elements. + +Returns a map with short ended elements such as BR or IMG. + + +Name/value lookup map for short ended elements. + + + +Returns a map with self closing tags such as <li>. + + +Name/value lookup map for self closing tags elements. + + + +Returns a map with elements that should be treated as contents regardless if it has text +content in them or not such as TD, VIDEO or IMG. -Name/value lookup map for empty elements. +Name/value lookup map for non empty elements. @@ -2901,6 +4091,13 @@ according to the schema. Element object or undefined if the element isn't valid. + +Returns an map object of all custom elements. + + +Name/value map object of all custom elements. + + Parses a valid elements string and adds it to the schema. The valid elements format is for example "element[attr=default|otherattr]". Existing rules will be replaced with the ones specified, so this extends the schema. @@ -3118,6 +4315,9 @@ that is styled to look like a button or icon. Optional name/value settings object. + +Optional the editor instance this button is for. + Renders the button as a HTML string. This method is much faster than using the DOM and when @@ -3160,6 +4360,9 @@ when you press the open menu. Optional name/value settings object. + +The editor instance this button is for. + Settings object. @@ -3201,6 +4404,13 @@ doesn't close them menu if it was a event inside the menu. Color code value in hex for example: #FF00FF + +Change the currently selected color for the control. + + +Color code value in hex for example: #FF00FF + + Post render event. This will be executed after the control has been rendered and can be used to set states, add events to the control etc. It's recommended for subclasses of the control to call this method by using this.parent(). @@ -3485,10 +4695,65 @@ context menu, or a menu for a list box or a menu bar. + +This class provides basic keyboard navigation using the arrow keys to children of a component. +For example, this class handles moving between the buttons on the toolbars. + + + +Create a new KeyboardNavigation instance to handle the focus for a specific element. + + +the settings object to define how keyboard navigation works. + + +the DOMUtils instance to use. + + + +Destroys the KeyboardNavigation and unbinds any focus/blur event handles it might have added. + + + + This class is used to create list boxes/select list. This one will generate a non native control. This one has the benefits of having visual items added. +// Creates a new plugin class and a custom listbox +tinymce.create('tinymce.plugins.ExamplePlugin', { + createControl: function(n, cm) { + switch (n) { + case 'mylistbox': + var mlb = cm.createListBox('mylistbox', { + title : 'My list box', + onselect : function(v) { + tinyMCE.activeEditor.windowManager.alert('Value selected:' + v); + } + }); + + // Add some values to the list box + mlb.add('Some item 1', 'val1'); + mlb.add('some item 2', 'val2'); + mlb.add('some item 3', 'val3'); + + // Return the new listbox instance + return mlb; + } + + return null; + } +}); + +// Register plugin with a short name +tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin); + +// Initialize TinyMCE with the new plugin and button +tinyMCE.init({ + ... + plugins : '-example', // - means TinyMCE will not try to load it + theme_advanced_buttons1 : 'mylistbox' // Add the new example listbox to the toolbar +}); Constructs a new listbox control instance. @@ -3499,6 +4764,9 @@ a non native control. This one has the benefits of having visual items added. Optional name/value settings object. + +Optional the editor instance this button is for. + Array of ListBox items. @@ -3716,6 +4984,35 @@ be instantiated directly other menu controls should inherit from this one. This class is used to create a UI button. A button is basically a link that is styled to look like a button or icon. +// Creates a new plugin class and a custom menu button +tinymce.create('tinymce.plugins.ExamplePlugin', { + createControl: function(n, cm) { + switch (n) { + case 'mymenubutton': + var c = cm.createSplitButton('mysplitbutton', { + title : 'My menu button', + image : 'some.gif' + }); + + c.onRenderMenu.add(function(c, m) { + m.add({title : 'Some title', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + + m.add({title : 'Some item 1', onclick : function() { + alert('Some item 1 was clicked.'); + }}); + + m.add({title : 'Some item 2', onclick : function() { + alert('Some item 2 was clicked.'); + }}); + }); + + // Return the new menubutton instance + return c; + } + + return null; + } +}); Constructs a new split button control instance. @@ -3726,6 +5023,9 @@ that is styled to look like a button or icon. Optional name/value settings object. + +Optional the editor instance this button is for. + Fires when the menu is rendered. @@ -3957,6 +5257,38 @@ creating a whole toolbar with buttons it does make a lot of difference. This class is used to create a split button. A button with a menu attached to it. +// Creates a new plugin class and a custom split button +tinymce.create('tinymce.plugins.ExamplePlugin', { + createControl: function(n, cm) { + switch (n) { + case 'mysplitbutton': + var c = cm.createSplitButton('mysplitbutton', { + title : 'My split button', + image : 'some.gif', + onclick : function() { + alert('Button was clicked.'); + } + }); + + c.onRenderMenu.add(function(c, m) { + m.add({title : 'Some title', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + + m.add({title : 'Some item 1', onclick : function() { + alert('Some item 1 was clicked.'); + }}); + + m.add({title : 'Some item 2', onclick : function() { + alert('Some item 2 was clicked.'); + }}); + }); + + // Return the new splitbutton instance + return c; + } + + return null; + } +}); Constructs a new split button control instance. @@ -3967,6 +5299,9 @@ creating a whole toolbar with buttons it does make a lot of difference. Optional name/value settings object. + +Optional the editor instance this button is for. + Renders the split button as a HTML string. This method is much faster than using the DOM and when @@ -4027,12 +5362,50 @@ creating a whole toolbar with buttons it does make a lot of difference. + +This class is used to group a set of toolbars together and control the keyboard navigation and focus. + + + +Renders the toolbar group as a HTML string. + + +HTML for the toolbar control. + + + + + + + + + + + + + + + + + + + + + Contains various utility classes such as json parser, cookies etc. This class contains simple cookie manangement functions. +// Gets a cookie from the browser +console.debug(tinymce.util.Cookie.get('mycookie')); + +// Gets a hash table cookie from the browser and takes out the x parameter from it +console.debug(tinymce.util.Cookie.getHash('mycookie').x); + +// Sets a hash table cookie to the browser +tinymce.util.Cookie.setHash({x : '1', y : '2'}); Parses the specified query string into an name/value object. @@ -4114,6 +5487,11 @@ creating a whole toolbar with buttons it does make a lot of difference. This class is used to dispatch event to observers/listeners. All internal events inside TinyMCE uses this class. +// Creates a custom event +this.onSomething = new tinymce.util.Dispatcher(this); + +// Dispatch/fire the event +this.onSomething.dispatch('some string'); Constructs a new event dispatcher object. @@ -4173,6 +5551,11 @@ All internal events inside TinyMCE uses this class. JSON parser and serializer class. +// JSON parse a string into an object +var obj = tinymce.util.JSON.parse(somestring); + +// JSON serialize a object into an string +var str = tinymce.util.JSON.serialize(obj); Serializes the specified object as a JSON string. @@ -4202,6 +5585,27 @@ All internal events inside TinyMCE uses this class. This class enables you to use JSON-RPC to call backend methods. +var json = new tinymce.util.JSONRequest({ + url : 'somebackend.php' +}); + +// Send RPC call 1 +json.send({ + method : 'someMethod1', + params : ['a', 'b'], + success : function(result) { + console.dir(result); + } +}); + +// Send RPC call 2 +json.send({ + method : 'someMethod2', + params : ['a', 'b'], + success : function(result) { + console.dir(result); + } +}); Constructs a new JSONRequest instance. @@ -4256,6 +5660,8 @@ Consult the Wiki API documentation for more details on what you can pass to this Relative URI from the point specified in the current URI instance. +// Converts an absolute URL to an relative URL url will be somedir/somefile.htm +var url = new tinymce.util.URI('http://www.site.com/dir/').toRelative('http://www.site.com/dir/somedir/somefile.htm'); Converts the specified URI into a absolute URI based on the current URI instance location. @@ -4269,6 +5675,8 @@ Consult the Wiki API documentation for more details on what you can pass to this Absolute URI from the point specified in the current URI instance. +// Converts an relative URL to an absolute URL url will be http://www.site.com/dir/somedir/somefile.htm +var url = new tinymce.util.URI('http://www.site.com/dir/').toAbsolute('somedir/somefile.htm'); Converts a absolute path into a relative path. @@ -4301,6 +5709,13 @@ Consult the Wiki API documentation for more details on what you can pass to this This class enables you to send XMLHTTPRequests cross browser. +// Sends a low level Ajax request +tinymce.util.XHR.send({ + url : 'someurl', + success : function(text) { + console.debug(text); + } +}); Sends a XMLHTTPRequest. @@ -4440,9 +5855,17 @@ The current keys are longname, author, authorurl, infourl and version. + +Alternative name for tinymce added for compatibility. + +// To initialize editor instances +tinymce.EditorManager.get('editor'); + Instance of DOMUtils for the current document. +// Example of how to add a class to some element by id +tinymce.DOM.addClass('someid', 'someclass'); @@ -4462,6 +5885,10 @@ The current keys are longname, author, authorurl, infourl and version. Editor instance. +tinyMCE.execCommand("mceAddControl", false, "some_textarea"); +tinyMCE.onAddEditor.add(function(mgr,ed) { + console.debug('A new editor is available' + ed.id); +}); Fires when an editor instance is removed from the tinymce collection. @@ -4476,6 +5903,8 @@ The current keys are longname, author, authorurl, infourl and version. Collection of editor instances. +for (edId in tinyMCE.editors) + tinyMCE.editors[edId].save(); Collection of language pack data. @@ -4484,6 +5913,8 @@ The current keys are longname, author, authorurl, infourl and version. Currently active editor instance. +tinyMCE.activeEditor.selection.getContent(); +tinymce.EditorManager.activeEditor.selection.getContent(); Initializes a set of editors. This method will create a bunch of editors based in the input. @@ -4491,6 +5922,15 @@ The current keys are longname, author, authorurl, infourl and version. Settings object to be passed to each editor instance. +// Initializes a editor using the longer method +tinymce.EditorManager.init({ + some_settings : 'some value' +}); + +// Initializes a editor instance using the shorter version +tinyMCE.init({ + some_settings : 'some value' +}); Returns a editor instance by id. @@ -4503,6 +5943,15 @@ The current keys are longname, author, authorurl, infourl and version. Editor instance to return. +// Adds an onclick event to an editor by id (shorter version) +tinyMCE.get('mytextbox').onClick.add(function(ed, e) { + ed.windowManager.alert('Hello world!'); +}); + +// Adds an onclick event to an editor by id (longer version) +tinymce.EditorManager.get('mytextbox').onClick.add(function(ed, e) { + ed.windowManager.alert('Hello world!'); +}); Returns a editor instance by id. This method was added for compatibility with the 2.x branch. @@ -4573,6 +6022,8 @@ The current keys are longname, author, authorurl, infourl and version. Calls the save method on all editor instances in the collection. This can be useful when a form is to be submitted. +// Saves all contents +tinyMCE.triggerSave(); Adds a language pack, this gets called by the loaded language files like en.js. @@ -4612,6 +6063,18 @@ The current keys are longname, author, authorurl, infourl and version. Constant that is true if the browser is IE 6 or older. + +Constant that is true if the browser is IE 7. + + + +Constant that is true if the browser is IE 8. + + + +Constant that is true if the browser is IE 9. + + Constant that is true if the browser is Gecko. @@ -4628,6 +6091,10 @@ The current keys are longname, author, authorurl, infourl and version. Constant that tells if the current browser is an iPhone or iPad. + +Constant that is true if the current browser is running on iOS 5 or greater. + + Checks if a object is of a specific type for example an array. @@ -4673,8 +6140,14 @@ The callback has the following format: cb(value, key_or_index). Optional scope to execute the callback in. -tinymce.each([1, 2, 3], function(v, i) { - console.log(i + '=' + v); +// Iterate an array +tinymce.each([1,2,3], function(v, i) { + console.debug("Value: " + v + ", Index: " + i); +}); + +// Iterate an object +tinymce.each({a : 1, b : 2, c: 3], function(v, k) { + console.debug("Value: " + v + ", Key: " + k); }); @@ -4704,6 +6177,8 @@ If the function returns false the item will be excluded if it returns true it wi New array with values imported and filtered based in input. +// Filter out some items, this will return an array with 4 and 5 +var items = tinymce.grep([1,2,3,4,5], function(v) {return v > 3;}); Returns the index of a value in an array, this method will return -1 if the item wasn't found. @@ -4719,6 +6194,8 @@ If the function returns false the item will be excluded if it returns true it wi Index of item inside the array inside an object. Or -1 if it wasn't found. +// Get index of value in array this will alert 1 since 2 is at that index +alert(tinymce.inArray([1,2,3], 2)); Extends an object with the specified other object(s). @@ -4732,6 +6209,14 @@ If the function returns false the item will be excluded if it returns true it wi o New extended object, same reference as the input object. +// Extends obj1 with two new fields +var obj = tinymce.extend(obj1, { + somefield1 : 'a', + somefield2 : 'a' +}); + +// Extends obj with obj2 and obj3 +tinymce.extend(obj, obj2, obj3); Removes whitespace from the beginning and end of a string. @@ -4756,6 +6241,42 @@ More details on this method can be found in the Wiki. Optional root object defaults to the global window object. +// Creates a basic class +tinymce.create('tinymce.somepackage.SomeClass', { + SomeClass : function() { + // Class constructor + }, + + method : function() { + // Some method + } +}); + +// Creates a basic subclass class +tinymce.create('tinymce.somepackage.SomeSubClass:tinymce.somepackage.SomeClass', { + SomeSubClass: function() { + // Class constructor + this.parent(); // Call parent constructor + }, + + method : function() { + // Some method + this.parent(); // Call parent method + }, + + 'static' : { + staticMethod : function() { + // Static method + } + } +}); + +// Creates a singleton/static class +tinymce.create('static tinymce.somepackage.SomeSingletonClass', { + method : function() { + // Some method + } +}); Executed the specified function for each item in a object tree. @@ -4785,6 +6306,15 @@ More details on this method can be found in the Wiki. New namespace object the last item in path. +// Create some namespace +tinymce.createNS('tinymce.somepackage.subpackage'); + +// Add a singleton +var tinymce.somepackage.subpackage.SomeSingleton = { + method : function() { + // Some method + } +}; Resolves a string and returns the object from a specific structure. @@ -4798,6 +6328,8 @@ More details on this method can be found in the Wiki. Last object in path or null if it couldn't be resolved. +// Resolve a path into an object reference +var obj = tinymce.resolve('a.b.c.d'); Adds an unload handler to the document. This handler will be executed when the document gets unloaded. @@ -4812,6 +6344,11 @@ This method is useful for dealing with browser memory leaks where it might be vi Returns the specified unload handler function. +// Fixes a leak with a DOM element that was palces in the someObject +tinymce.addUnload(function() { + // Null DOM element to reduce IE memory leak + someObject.someElement = null; +}); Removes the specified function form the unload handler list. @@ -4832,6 +6369,8 @@ This method is useful for dealing with browser memory leaks where it might be vi Delimiter to split by. +// Split a string into an array with a,b,c +var arr = tinymce.explode('a, b, c'); Core namespace with core functionality for the TinyMCE API all sub classes will be added to this namespace/object. @@ -4855,6 +6394,20 @@ that you load this script into your dialogs. Initializes the popup this will be called automatically. + +Fires when the popup is initialized. + + +Editor instance. + +// Alerts the selected contents when the dialog is loaded +tinyMCEPopup.onInit.add(function(ed) { + alert(ed.selection.getContent()); +}); + +// Executes the init method on page load in some object using the SomeObject scope +tinyMCEPopup.onInit.add(SomeObject.init, SomeObject); + Returns the reference to the parent window that opened the dialog. @@ -5008,6 +6561,10 @@ native version use the callback method instead then it can be extended. Alternative name for tinymce added for 2.x compatibility. +// To initialize editor instances +tinyMCE.init({ + ... +}); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/tinymce.vsdoc.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/tinymce.vsdoc.js index d4049c7444..623fc27fb7 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/tinymce.vsdoc.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/docs/api/tinymce.vsdoc.js @@ -42,8 +42,43 @@ tinymce.Theme = function() { /// TinyMCE theme class. } +tinymce.Theme.prototype.init = function(editor, url) { + /// Initializes the theme. + /// Editor instance that created the theme instance. + /// Absolute URL where the theme is located. +} + +tinymce.Theme.prototype.getInfo = function() { + /// Meta info method, this method gets executed when TinyMCE wants to present information about the theme for example in the... + /// Returns an object with meta information about the theme the current items are longname, author, authorurl, infourl and version. +} + +tinymce.Theme.prototype.renderUI = function(obj) { + /// This method is responsible for rendering/generating the overall user interface with toolbars, buttons, iframe containers... + /// Object parameter containing the targetNode DOM node that will be replaced visually with an editor instance. + /// an object with items like iframeContainer, editorContainer, sizeContainer, deltaWidth, deltaHeight. +} + tinymce.Plugin = function() { - /// TinyMCE plugin class. + /// Plugin base class, this is a pseudo class that describes how a plugin is to be created for TinyMCE. +} + +tinymce.Plugin.prototype.init = function(editor, url) { + /// Initialization function for the plugin. + /// Editor instance that created the plugin instance. + /// Absolute URL where the plugin is located. +} + +tinymce.Plugin.prototype.getInfo = function() { + /// Meta info method, this method gets executed when TinyMCE wants to present information about the plugin for example in th... + /// Returns an object with meta information about the plugin the current items are longname, author, authorurl, infourl and version. +} + +tinymce.Plugin.prototype.createControl = function(name, controlman) { + /// Gets called when a new control instance is created. + /// Control name to create for example "mylistbox" + /// Control manager/factory to use to create the control. + /// Returns a new control instance or null. } tinymce.ControlManager = function(ed, s) { @@ -162,57 +197,57 @@ tinymce.Editor = function(id, s) { /// Unique id for the editor. /// Optional settings string for the editor. /// Editor instance id, normally the same as the div/textarea that was replaced. - /// State to force the editor to return false on a isDirty call. - /// Name/Value object containting plugin instances. - /// Name/value collection with editor settings. - /// URI object to document configured for the TinyMCE instance. - /// URI object to current document that holds the TinyMCE editor instance. + /// State to force the editor to return false on a isDirty call. function ajaxSave() { var ed = tinyMCE.get('elm1'); // Save contents using some XHR call alert(ed.getContent()); ed.isNotDirty = 1; // Force not dirty state } + /// Name/Value object containting plugin instances. // Execute a method inside a plugin directly tinyMCE.activeEditor.plugins.someplugin.someMethod(); + /// Name/value collection with editor settings. // Get the value of the theme setting tinyMCE.activeEditor.windowManager.alert("You are using the " + tinyMCE.activeEditor.settings.theme + " theme"); + /// URI object to document configured for the TinyMCE instance. // Get relative URL from the location of document_base_url tinyMCE.activeEditor.documentBaseURI.toRelative('/somedir/somefile.htm'); // Get absolute URL from the location of document_base_url tinyMCE.activeEditor.documentBaseURI.toAbsolute('somefile.htm'); + /// URI object to current document that holds the TinyMCE editor instance. // Get relative URL from the location of the API tinyMCE.activeEditor.baseURI.toRelative('/somedir/somefile.htm'); // Get absolute URL from the location of the API tinyMCE.activeEditor.baseURI.toAbsolute('somefile.htm'); /// Array with CSS files to load into the iframe. - /// Window manager reference, use this to open new windows and dialogs. - /// Reference to the theme instance that was used to generate the UI. - /// Control manager instance for the editor. Will enables you to create new UI elements and change their states etc. + /// Window manager reference, use this to open new windows and dialogs. // Shows an alert message tinyMCE.activeEditor.windowManager.alert('Hello world!'); // Opens a new dialog with the file.htm file and the size 320x240 // It also adds a custom parameter this can be retrieved by using tinyMCEPopup.getWindowArg inside the dialog. tinyMCE.activeEditor.windowManager.open({ url : 'file.htm', width : 320, height : 240 }, { custom_param : 1 }); + /// Reference to the theme instance that was used to generate the UI. // Executes a method on the theme directly tinyMCE.activeEditor.theme.someMethod(); + /// Control manager instance for the editor. Will enables you to create new UI elements and change their states etc. // Disables the bold button tinyMCE.activeEditor.controlManager.setDisabled('bold', true); /// Schema instance, enables you to validate elements and it's children. - /// DOM instance for the editor. + /// DOM instance for the editor. // Adds a class to all paragraphs within the editor tinyMCE.activeEditor.dom.addClass(tinyMCE.activeEditor.dom.select('p'), 'someclass'); /// HTML parser will be used when contents is inserted into the editor. - /// DOM serializer for the editor. Will be used when contents is extracted from the editor. - /// Selection instance for the editor. + /// DOM serializer for the editor. Will be used when contents is extracted from the editor. // Serializes the first paragraph in the editor into a string tinyMCE.activeEditor.serializer.serialize(tinyMCE.activeEditor.dom.select('p')[0]); + /// Selection instance for the editor. // Sets some contents to the current selection in the editor tinyMCE.activeEditor.selection.setContent('Some contents'); // Gets the current selection alert(tinyMCE.activeEditor.selection.getContent()); // Selects the first paragraph found tinyMCE.activeEditor.selection.select(tinyMCE.activeEditor.dom.select('p')[0]); /// Formatter instance. - /// Undo manager instance, responsible for handling undo levels. - /// Fires before the initialization of the editor. Editor instance. - /// Fires before the initialization of the editor. Editor instance. - /// Fires after the rendering has completed. Editor instance. - /// Fires after the initialization of the editor is done. Editor instance. - /// Fires when the editor instance is removed from page. Editor instance. - /// Fires when the editor is activated. Editor instance. - /// Fires when the editor is deactivated. Editor instance. - /// Fires when something in the body of the editor is clicked. Editor instance.W3C DOM Event instance. - /// Fires when a registered event is intercepted. Editor instance.W3C DOM Event instance. - /// Fires when a mouseup event is intercepted inside the editor. Editor instance.W3C DOM Event instance. - /// Fires when a mousedown event is intercepted inside the editor. Editor instance.W3C DOM Event instance. - /// Fires when a dblclick event is intercepted inside the editor. Editor instance.W3C DOM Event instance. - /// Fires when a keydown event is intercepted inside the editor. Editor instance.W3C DOM Event instance. - /// Fires when a keydown event is intercepted inside the editor. Editor instance.W3C DOM Event instance. - /// Fires when a keypress event is intercepted inside the editor. Editor instance.W3C DOM Event instance. - /// Fires when a contextmenu event is intercepted inside the editor. Editor instance.W3C DOM Event instance. - /// Fires when a form submit event is intercepted. Editor instance.W3C DOM Event instance. - /// Fires when a form reset event is intercepted. Editor instance.W3C DOM Event instance. - /// Fires when a paste event is intercepted inside the editor. Editor instance.W3C DOM Event instance. - /// Fires when the Serializer does a preProcess on the contents. Editor instance.PreProcess object.DOM node for the item being serialized.The specified output format normally "html".Is true if the process is on a getContent operation.Is true if the process is on a setContent operation.Is true if the process is on a cleanup operation. - /// Fires when the Serializer does a postProcess on the contents. Editor instance.PreProcess object. - /// Fires before new contents is added to the editor. Using for example setContent. Editor instance. - /// Fires before contents is extracted from the editor using for example getContent. Editor instance.W3C DOM Event instance. - /// Fires after the contents has been added to the editor using for example onSetContent. Editor instance. - /// Fires after the contents has been extracted from the editor using for example getContent. Editor instance. - /// Fires when the editor gets loaded with contents for example when the load method is executed. Editor instance. - /// Fires when the editor contents gets saved for example when the save method is executed. Editor instance. - /// Fires when the user changes node location using the mouse or keyboard. Editor instance. - /// Fires when a new undo level is added to the editor. Editor instance. - /// Fires before a command gets executed for example "Bold". Editor instance. - /// Fires after a command is executed for example "Bold". Editor instance. - /// Fires when the contents is undo:ed. Editor instance.W3C DOM Event instance. - /// Fires when the contents is redo:ed. Editor instance.W3C DOM Event instance. - /// Fires when visual aids is enabled/disabled. Editor instance. - /// Fires when the progress throbber is shown above the editor. Editor instance. + /// Undo manager instance, responsible for handling undo levels. // Undoes the last modification to the editor tinyMCE.activeEditor.undoManager.undo(); + /// Fires before the initialization of the editor. Editor instance.// Adds an observer to the onPreInit event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onPreInit.add(function(ed) { console.debug('PreInit: ' + ed.id); }); } }); + /// Fires before the initialization of the editor. Editor instance.// Adds an observer to the onBeforeRenderUI event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onBeforeRenderUI.add(function(ed, cm) { console.debug('Before render: ' + ed.id); }); } }); + /// Fires after the rendering has completed. Editor instance.// Adds an observer to the onPostRender event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onPostRender.add(function(ed, cm) { console.debug('After render: ' + ed.id); }); } }); + /// Fires after the initialization of the editor is done. Editor instance.// Adds an observer to the onInit event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onInit.add(function(ed) { console.debug('Editor is done: ' + ed.id); }); } }); + /// Fires when the editor instance is removed from page. Editor instance.// Adds an observer to the onRemove event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onRemove.add(function(ed) { console.debug('Editor was removed: ' + ed.id); }); } }); + /// Fires when the editor is activated. Editor instance.// Adds an observer to the onActivate event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onActivate.add(function(ed) { console.debug('Editor was activated: ' + ed.id); }); } }); + /// Fires when the editor is deactivated. Editor instance.// Adds an observer to the onDeactivate event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onDeactivate.add(function(ed) { console.debug('Editor was deactivated: ' + ed.id); }); } }); + /// Fires when something in the body of the editor is clicked. Editor instance.W3C DOM Event instance.// Adds an observer to the onClick event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onClick.add(function(ed, e) { console.debug('Editor was clicked: ' + e.target.nodeName); }); } }); + /// Fires when a registered event is intercepted. Editor instance.W3C DOM Event instance.// Adds an observer to the onEvent event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onEvent.add(function(ed, e) { console.debug('Editor event occured: ' + e.target.nodeName); }); } }); + /// Fires when a mouseup event is intercepted inside the editor. Editor instance.W3C DOM Event instance.// Adds an observer to the onMouseUp event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onMouseUp.add(function(ed, e) { console.debug('Mouse up event: ' + e.target.nodeName); }); } }); + /// Fires when a mousedown event is intercepted inside the editor. Editor instance.W3C DOM Event instance.// Adds an observer to the onMouseDown event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onMouseDown.add(function(ed, e) { console.debug('Mouse down event: ' + e.target.nodeName); }); } }); + /// Fires when a dblclick event is intercepted inside the editor. Editor instance.W3C DOM Event instance.// Adds an observer to the onDblClick event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onDblClick.add(function(ed, e) { console.debug('Double click event: ' + e.target.nodeName); }); } }); + /// Fires when a keydown event is intercepted inside the editor. Editor instance.W3C DOM Event instance.// Adds an observer to the onKeyDown event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onKeyDown.add(function(ed, e) { console.debug('Key down event: ' + e.keyCode); }); } }); + /// Fires when a keydown event is intercepted inside the editor. Editor instance.W3C DOM Event instance.// Adds an observer to the onKeyUp event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onKeyUp.add(function(ed, e) { console.debug('Key up event: ' + e.keyCode); }); } }); + /// Fires when a keypress event is intercepted inside the editor. Editor instance.W3C DOM Event instance.// Adds an observer to the onKeyPress event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onKeyPress.add(function(ed, e) { console.debug('Key press event: ' + e.keyCode); }); } }); + /// Fires when a contextmenu event is intercepted inside the editor. Editor instance.W3C DOM Event instance.// Adds an observer to the onContextMenu event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onContextMenu.add(function(ed, e) { console.debug('Context menu event:' + e.target); }); } }); + /// Fires when a form submit event is intercepted. Editor instance.W3C DOM Event instance.// Adds an observer to the onSubmit event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onSubmit.add(function(ed, e) { console.debug('Form submit:' + e.target); }); } }); + /// Fires when a form reset event is intercepted. Editor instance.W3C DOM Event instance.// Adds an observer to the onReset event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onReset.add(function(ed, e) { console.debug('Form reset:' + e.target); }); } }); + /// Fires when a paste event is intercepted inside the editor. Editor instance.W3C DOM Event instance.// Adds an observer to the onPaste event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onPaste.add(function(ed, e) { console.debug('Pasted plain text'); }); } }); + /// Fires when the Serializer does a preProcess on the contents. Editor instance.PreProcess object.DOM node for the item being serialized.The specified output format normally "html".Is true if the process is on a getContent operation.Is true if the process is on a setContent operation.Is true if the process is on a cleanup operation.// Adds an observer to the onPreProcess event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onPreProcess.add(function(ed, o) { // Add a class to each paragraph in the editor ed.dom.addClass(ed.dom.select('p', o.node), 'myclass'); }); } }); + /// Fires when the Serializer does a postProcess on the contents. Editor instance.PreProcess object.// Adds an observer to the onPostProcess event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onPostProcess.add(function(ed, o) { // Remove all paragraphs and replace with BR o.content = o.content.replace(/]+>|

    /g, ''); o.content = o.content.replace(/<\/p>/g, '
    '); }); } }); + /// Fires before new contents is added to the editor. Using for example setContent. Editor instance.// Adds an observer to the onBeforeSetContent event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onBeforeSetContent.add(function(ed, o) { // Replaces all a characters with b characters o.content = o.content.replace(/a/g, 'b'); }); } }); + /// Fires before contents is extracted from the editor using for example getContent. Editor instance.W3C DOM Event instance.// Adds an observer to the onBeforeGetContent event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onBeforeGetContent.add(function(ed, o) { console.debug('Before get content.'); }); } }); + /// Fires after the contents has been added to the editor using for example onSetContent. Editor instance.// Adds an observer to the onSetContent event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onSetContent.add(function(ed, o) { // Replaces all a characters with b characters o.content = o.content.replace(/a/g, 'b'); }); } }); + /// Fires after the contents has been extracted from the editor using for example getContent. Editor instance.// Adds an observer to the onGetContent event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onGetContent.add(function(ed, o) { // Replace all a characters with b o.content = o.content.replace(/a/g, 'b'); }); } }); + /// Fires when the editor gets loaded with contents for example when the load method is executed. Editor instance.// Adds an observer to the onLoadContent event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onLoadContent.add(function(ed, o) { // Output the element name console.debug(o.element.nodeName); }); } }); + /// Fires when the editor contents gets saved for example when the save method is executed. Editor instance.// Adds an observer to the onSaveContent event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onSaveContent.add(function(ed, o) { // Output the element name console.debug(o.element.nodeName); }); } }); + /// Fires when the user changes node location using the mouse or keyboard. Editor instance.// Adds an observer to the onNodeChange event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onNodeChange.add(function(ed, cm, e) { // Activates the link button when the caret is placed in a anchor element if (e.nodeName == 'A') cm.setActive('link', true); }); } }); + /// Fires when a new undo level is added to the editor. Editor instance.// Adds an observer to the onChange event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onChange.add(function(ed, l) { console.debug('Editor contents was modified. Contents: ' + l.content); }); } }); + /// Fires before a command gets executed for example "Bold". Editor instance.// Adds an observer to the onBeforeExecCommand event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) { console.debug('Command is to be executed: ' + cmd); }); } }); + /// Fires after a command is executed for example "Bold". Editor instance.// Adds an observer to the onExecCommand event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onExecCommand.add(function(ed, cmd, ui, val) { console.debug('Command was executed: ' + cmd); }); } }); + /// Fires when the contents is undo:ed. Editor instance.{Object} level Undo level object. @ example // Adds an observer to the onUndo event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onUndo.add(function(ed, level) { console.debug('Undo was performed: ' + level.content); }); } }); + /// Fires when the contents is redo:ed. Editor instance.Undo level object.// Adds an observer to the onRedo event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onRedo.add(function(ed, level) { console.debug('Redo was performed: ' +level.content); }); } }); + /// Fires when visual aids is enabled/disabled. Editor instance.// Adds an observer to the onVisualAid event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onVisualAid.add(function(ed, e, s) { console.debug('onVisualAid event: ' + ed.id + ", State: " + s); }); } }); + /// Fires when the progress throbber is shown above the editor. Editor instance.// Adds an observer to the onSetProgressState event using tinyMCE.init tinyMCE.init({ ... setup : function(ed) { ed.onSetProgressState.add(function(ed, b) { if (b) console.debug('SHOW!'); else console.debug('HIDE!'); }); } }); } tinymce.Editor.prototype.render = function() { @@ -531,6 +566,10 @@ tinymce.UndoManager = function() { /// This event will fire when the user make an redo of a change. UndoManager instance that got the new level.The old level object containing a bookmark and contents. } +tinymce.UndoManager.prototype.beforeChange = function() { + ///

    Stores away a bookmark to be used when performing an undo action so that the selection is before the change has been mad... +} + tinymce.UndoManager.prototype.add = function(l) { /// Adds a new undo level/snapshot to the undo list. /// Optional undo level object to add. @@ -568,8 +607,8 @@ tinymce.WindowManager = function(ed) { tinymce.WindowManager.prototype.open = function(s, p) { /// Opens a new window. - /// Optional name/value settings collection contains things like width/height/url etc. - /// Optional parameters/arguments collection can be used by the dialogs to retrive custom parameters. + /// Optional name/value settings collection contains things like width/height/url etc.Window title.URL of the file to open in the window.Width in pixels.Height in pixels.Specifies whether the popup window is resizable or not.Specifies whether the popup window has a "maximize" button and can get maximized or not.Specifies whether to display in-line (set to 1 or true for in-line display; requires inlinepopups plugin).Optional CSS to use in the popup. Set to false to remove the default one.Specifies whether translation should occur or not of i18 key strings. Default is true.Specifies whether a previously opened popup window is to be closed or not (like when calling the file browser window over the advlink popup).Specifies whether the popup window can have scrollbars if required (i.e. content larger than the popup size specified). + /// Optional parameters/arguments collection can be used by the dialogs to retrive custom parameters.url to plugin if opening plugin window that calls tinyMCEPopup.requireLangPack() and needs access to the plugin language js files } tinymce.WindowManager.prototype.close = function(w) { @@ -648,6 +687,20 @@ tinymce.dom.DOMUtils.prototype.get = function(n) { /// Element matching the specified id or null if it wasn't found. } +tinymce.dom.DOMUtils.prototype.getNext = function(node, selector) { + /// Returns the next node that matches selector or function + /// Node to find siblings from. + /// Selector CSS expression or function. + /// Next node item matching the selector or null if it wasn't found. +} + +tinymce.dom.DOMUtils.prototype.getPrev = function(node, selector) { + /// Returns the previous node that matches selector or function + /// Node to find siblings from. + /// Selector CSS expression or function. + /// Previous node item matching the selector or null if it wasn't found. +} + tinymce.dom.DOMUtils.prototype.select = function(p, s) { /// Selects specific elements by a CSS level 3 pattern. /// CSS level 1 pattern to select/find elements by. @@ -894,6 +947,12 @@ tinymce.dom.DOMUtils.prototype.getAttribs = function(n) { /// NodeList with attributes. } +tinymce.dom.DOMUtils.prototype.isEmpty = function(elements) { + /// Returns true/false if the specified node is to be considered empty or not. + /// Optional name/value object with elements that are automatically treated as non empty elements. + /// true/false if the node is empty or not. +} + tinymce.dom.DOMUtils.prototype.destroy = function() { /// Destroys all internal references to the DOM to solve IE leak issues. } @@ -1029,11 +1088,57 @@ tinymce.dom.EventUtils.prototype.destroy = function() { /// Destroys the instance. } +tinymce.dom.ScriptLoader = function() { + /// This class handles asynchronous/synchronous loading of JavaScript files it will execute callbacks when various items get... +} + +tinymce.dom.ScriptLoader.prototype.load = function(url, callback, scope) { + /// Loads a specific script directly without adding it to the load queue. + /// Absolute URL to script to add. + /// Optional callback function to execute ones this script gets loaded. + /// Optional scope to execute callback in. +} + +tinymce.dom.ScriptLoader.prototype.isDone = function(url) { + /// Returns true/false if a script has been loaded or not. + /// URL to check for. + /// [Boolean} true/false if the URL is loaded. +} + +tinymce.dom.ScriptLoader.prototype.markDone = function(u) { + /// Marks a specific script to be loaded. + /// Absolute URL to the script to mark as loaded. +} + +tinymce.dom.ScriptLoader.prototype.add = function(url, callback, scope) { + /// Adds a specific script to the load queue of the script loader. + /// Absolute URL to script to add. + /// Optional callback function to execute ones this script gets loaded. + /// Optional scope to execute callback in. +} + +tinymce.dom.ScriptLoader.prototype.loadQueue = function(callback, scope) { + /// Starts the loading of the queue. + /// Optional callback to execute when all queued items are loaded. + /// Optional scope to execute the callback in. +} + +tinymce.dom.ScriptLoader.prototype.loadScripts = function(scripts, callback, scope) { + /// Loads the specified queue of files and executes the callback ones they are loaded. + /// Array of queue items to load. + /// Optional callback to execute ones all items are loaded. + /// Optional scope to execute callback in. +} + tinymce.dom.Selection = function(dom, win, serializer) { /// This class handles text and control selection it's an crossbrowser utility class. /// DOMUtils object reference. /// Window to bind the selection object to. /// DOM serialization class to use for getContent. + /// This event gets executed before contents is extracted from the selection. Selection object that fired the event.Contains things like the contents that will be returned. + /// This event gets executed before contents is inserted into selection. Selection object that fired the event.Contains things like the contents that will be inserted. + /// This event gets executed when contents is inserted into selection. Selection object that fired the event.Contains things like the contents that will be inserted. + /// This event gets executed when contents is extracted from the selection. Selection object that fired the event.Contains things like the contents that will be returned. } tinymce.dom.Selection.prototype.getContent = function(s) { @@ -1042,10 +1147,10 @@ tinymce.dom.Selection.prototype.getContent = function(s) { /// Selected contents in for example HTML format. } -tinymce.dom.Selection.prototype.setContent = function(h, s) { +tinymce.dom.Selection.prototype.setContent = function(content, args) { /// Sets the current selection to the specified content. - /// HTML contents to set could also be other formats depending on settings. - /// Optional settings object with for example data format. + /// HTML contents to set could also be other formats depending on settings. + /// Optional settings object with for example data format. } tinymce.dom.Selection.prototype.getStart = function() { @@ -1083,9 +1188,9 @@ tinymce.dom.Selection.prototype.isCollapsed = function() { /// true/false state if the selection range is collapsed or not. Collapsed means if it's a caret or a larger selection. } -tinymce.dom.Selection.prototype.collapse = function(b) { +tinymce.dom.Selection.prototype.collapse = function(to_start) { /// Collapse the selection to start or end of range. - /// Optional boolean state if to collapse to end or not. Defaults to start. + /// Optional boolean state if to collapse to end or not. Defaults to start. } tinymce.dom.Selection.prototype.getSel = function() { @@ -1115,6 +1220,43 @@ tinymce.dom.Selection.prototype.getNode = function() { /// Currently selected element or common ancestor element. } +tinymce.dom.Serializer = function(settings, dom, schema) { + /// This class is used to serialize DOM trees into a string. + /// Serializer settings object. + /// DOMUtils instance reference. + /// Optional schema reference. + /// This event gets executed before a HTML fragment gets serialized into a HTML string. This event enables you to do modifications to the DOM before the serialization occurs. It's important to know that the element that is getting serialized is cloned so it's not inside a document. object/Serializer instance that is serializing an element.Object containing things like the current node.// Adds an observer to the onPreProcess event serializer.onPreProcess.add(function(se, o) { // Add a class to each paragraph se.dom.addClass(se.dom.select('p', o.node), 'myclass'); }); + /// This event gets executed after a HTML fragment has been serialized into a HTML string. This event enables you to do modifications to the HTML string like regexp replaces etc. object/Serializer instance that is serializing an element.Object containing things like the current contents.// Adds an observer to the onPostProcess event serializer.onPostProcess.add(function(se, o) { // Remove all paragraphs and replace with BR o.content = o.content.replace(/]+>|

    /g, ''); o.content = o.content.replace(/<\/p>/g, '
    '); }); + /// Fires when the Serializer does a preProcess on the contents. Editor instance.PreProcess object.DOM node for the item being serialized.The specified output format normally "html".Is true if the process is on a getContent operation.Is true if the process is on a setContent operation.Is true if the process is on a cleanup operation. + /// Fires when the Serializer does a postProcess on the contents. Editor instance.PreProcess object. +} + +tinymce.dom.Serializer.prototype.addNodeFilter = function(callback) { + ///

    Adds a node filter function to the parser used by the serializer, the parser will collect the specified nodes by name an... + /// Callback function to execute once it has collected nodes. +} + +tinymce.dom.Serializer.prototype.addAttributeFilter = function(callback) { + /// Adds a attribute filter function to the parser used by the serializer, the parser will collect nodes that has the specif... + /// Callback function to execute once it has collected nodes. +} + +tinymce.dom.Serializer.prototype.serialize = function(node, args) { + /// Serializes the specified browser DOM node into a HTML string. + /// DOM node to serialize. + /// Arguments option that gets passed to event handlers. +} + +tinymce.dom.Serializer.prototype.addRules = function(rules) { + /// Adds valid elements rules to the serializers schema instance this enables you to specify things like what elements shoul... + /// Valid elements rules string to add to schema. +} + +tinymce.dom.Serializer.prototype.setRules = function(rules) { + /// Sets the valid elements rules to the serializers schema instance this enables you to specify things like what elements s... + /// Valid elements rules string. +} + tinymce.html.DomParser = function(settings, schema) { /// This class parses HTML code into a DOM like structure of nodes it will remove redundant whitespace and make sure that th... /// Name/value collection of settings. comment, cdata, text, start and end are callbacks. @@ -1247,11 +1389,17 @@ tinymce.html.Node.prototype.empty = function() { } tinymce.html.Node.prototype.isEmpty = function(elements) { - /// Returns true/false if the node is to be considered empty or not + /// Returns true/false if the node is to be considered empty or not. /// Name/value object with elements that are automatically treated as non empty elements. /// true/false if the node is empty or not. } +tinymce.html.Node.prototype.walk = function(prev) { + /// Walks to the next or previous node and returns that node or null if it wasn't found. + /// Optional previous node state defaults to false. + /// Node that is next to or previous of the current node. +} + tinymce.html.Node.create = function(name, attrs) { /// Creates a node of a specific type. /// Name of the node type to create for example "b" or "#text". @@ -1273,9 +1421,19 @@ tinymce.html.Schema.prototype.getBoolAttrs = function() { /// Name/value lookup map for block elements. } -tinymce.html.Schema.prototype.getEmptyElements = function() { - /// Returns a map with empty elements. - /// Name/value lookup map for empty elements. +tinymce.html.Schema.prototype.getShortEndedElements = function() { + /// Returns a map with short ended elements such as BR or IMG. + /// Name/value lookup map for short ended elements. +} + +tinymce.html.Schema.prototype.getSelfClosingElements = function() { + /// Returns a map with self closing tags such as . + /// Name/value lookup map for self closing tags elements. +} + +tinymce.html.Schema.prototype.getNonEmptyElements = function() { + /// Returns a map with elements that should be treated as contents regardless if it has text content in them or not such as ... + /// Name/value lookup map for non empty elements. } tinymce.html.Schema.prototype.getWhiteSpaceElements = function() { @@ -1296,6 +1454,11 @@ tinymce.html.Schema.prototype.getElementRule = function(name) { /// Element object or undefined if the element isn't valid. } +tinymce.html.Schema.prototype.getCustomElements = function() { + /// Returns an map object of all custom elements. + /// Name/value map object of all custom elements. +} + tinymce.html.Schema.prototype.addValidElements = function(valid_elements) { /// Parses a valid elements string and adds it to the schema. /// String in the valid elements format to be parsed. @@ -1404,10 +1567,11 @@ tinymce.html.Writer.prototype.getContent = function() { /// HTML contents that got written down. } -tinymce.ui.Button = function(id, s) { +tinymce.ui.Button = function(id, s, ed) { /// This class is used to create a UI button. /// Control id for the button. /// Optional name/value settings object. + /// Optional the editor instance this button is for. } tinymce.ui.Button.prototype.renderHTML = function() { @@ -1455,10 +1619,11 @@ tinymce.ui.Button.prototype.destroy = function() { /// } -tinymce.ui.ColorSplitButton = function(id, s) { +tinymce.ui.ColorSplitButton = function(id, s, ed) { /// This class is used to create UI color split button. /// Control id for the color split button. /// Optional name/value settings object. + /// The editor instance this button is for. /// Settings object. /// Current color value. /// Fires when the menu is shown. @@ -1483,6 +1648,11 @@ tinymce.ui.ColorSplitButton.prototype.setColor = function(c) { /// Color code value in hex for example: #FF00FF } +tinymce.ui.ColorSplitButton.prototype.displayColor = function(c) { + /// Change the currently selected color for the control. + /// Color code value in hex for example: #FF00FF +} + tinymce.ui.ColorSplitButton.prototype.postRender = function() { /// Post render event. } @@ -1770,10 +1940,21 @@ tinymce.ui.DropMenu.prototype.renderTo = function() { /// } -tinymce.ui.ListBox = function(id, s) { +tinymce.ui.KeyboardNavigation = function(settings, dom) { + /// This class provides basic keyboard navigation using the arrow keys to children of a component. + /// the settings object to define how keyboard navigation works. + /// the DOMUtils instance to use. +} + +tinymce.ui.KeyboardNavigation.prototype.destroy = function() { + /// Destroys the KeyboardNavigation and unbinds any focus/blur event handles it might have added. +} + +tinymce.ui.ListBox = function(id, s, ed) { /// This class is used to create list boxes/select list. /// Control id for the list box. /// Optional name/value settings object. + /// Optional the editor instance this button is for. /// Array of ListBox items. /// Fires when the selection has been changed. /// Fires after the element has been rendered to DOM. @@ -1967,10 +2148,11 @@ tinymce.ui.Menu.prototype.destroy = function() { /// } -tinymce.ui.MenuButton = function(id, s) { +tinymce.ui.MenuButton = function(id, s, ed) { /// This class is used to create a UI button. /// Control id for the split button. /// Optional name/value settings object. + /// Optional the editor instance this button is for. /// Fires when the menu is rendered. } @@ -2233,10 +2415,11 @@ tinymce.ui.Separator.prototype.destroy = function() { /// } -tinymce.ui.SplitButton = function(id, s) { +tinymce.ui.SplitButton = function(id, s, ed) { /// This class is used to create a split button. /// Control id for the split button. /// Optional name/value settings object. + /// Optional the editor instance this button is for. } tinymce.ui.SplitButton.prototype.renderHTML = function() { @@ -2342,6 +2525,64 @@ tinymce.ui.Toolbar.prototype.destroy = function() { /// } +tinymce.ui.ToolbarGroup = function() { + /// This class is used to group a set of toolbars together and control the keyboard navigation and focus. + /// +} + +tinymce.ui.ToolbarGroup.prototype.renderHTML = function() { + /// Renders the toolbar group as a HTML string. + /// HTML for the toolbar control. +} + +tinymce.ui.ToolbarGroup.prototype.add = function() { + /// +} + +tinymce.ui.ToolbarGroup.prototype.get = function() { + /// +} + +tinymce.ui.ToolbarGroup.prototype.setDisabled = function() { + /// +} + +tinymce.ui.ToolbarGroup.prototype.isDisabled = function() { + /// +} + +tinymce.ui.ToolbarGroup.prototype.setActive = function() { + /// +} + +tinymce.ui.ToolbarGroup.prototype.isActive = function() { + /// +} + +tinymce.ui.ToolbarGroup.prototype.setState = function() { + /// +} + +tinymce.ui.ToolbarGroup.prototype.isRendered = function() { + /// +} + +tinymce.ui.ToolbarGroup.prototype.renderTo = function() { + /// +} + +tinymce.ui.ToolbarGroup.prototype.postRender = function() { + /// +} + +tinymce.ui.ToolbarGroup.prototype.remove = function() { + /// +} + +tinymce.ui.ToolbarGroup.prototype.destroy = function() { + /// +} + tinymce.util.Cookie = function() { /// This class contains simple cookie manangement functions. } @@ -2559,6 +2800,7 @@ tinymce.plugins.ContextMenu.prototype.getInfo = function() { tinyMCEPopup = function() { /// TinyMCE popup/dialog helper class. + /// Fires when the popup is initialized. Editor instance.// Alerts the selected contents when the dialog is loaded tinyMCEPopup.onInit.add(function(ed) { alert(ed.selection.getContent()); }); // Executes the init method on page load in some object using the SomeObject scope tinyMCEPopup.onInit.add(SomeObject.init, SomeObject); } tinyMCEPopup.init = function() { @@ -2652,6 +2894,7 @@ tinyMCEPopup.close = function() { } // Namespaces +tinymce.EditorManager = new tinymce(); tinymce.DOM = new tinymce.dom.DOMUtils(); tinymce.baseURI = new tinymce.util.URI(); tinymce.editors = new Object(); @@ -2664,10 +2907,14 @@ tinymce.isOpera = new Boolean(); tinymce.isWebKit = new Boolean(); tinymce.isIE = new Boolean(); tinymce.isIE6 = new Boolean(); +tinymce.isIE7 = new Boolean(); +tinymce.isIE8 = new Boolean(); +tinymce.isIE9 = new Boolean(); tinymce.isGecko = new Boolean(); tinymce.isMac = new Boolean(); tinymce.isAir = new Boolean(); tinymce.isIDevice = new Boolean(); +tinymce.isIOS5 = new Boolean(); tinymce.onAddEditor = new tinymce.util.Dispatcher(); tinymce.onRemoveEditor = new tinymce.util.Dispatcher(); tinymce.prototype.init = function(s) { diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/accessibility.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/accessibility.html new file mode 100644 index 0000000000..69059403cc --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/accessibility.html @@ -0,0 +1,101 @@ + + + +Full featured example + + + + + + + + + +
    +
    +

    Full featured example, with Accessibility settings enabled

    + +

    + This page has got the TinyMCE set up to work with configurations related to accessiblity enabled. + In particular +

      +
    • the content_css is set to false, to ensure that all default browser styles are used,
    • +
    • the browser_preferred_colors dialog option is used to ensure that default css is used for dialogs,
    • +
    • and the detect_highcontrast option has been set to ensure that highcontrast mode in Windows browsers + is detected and the toolbars are displayed in a high contrast mode.
    • +
    +

    + + +
    + +
    + +
    + + +
    + + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/custom_formats.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/custom_formats.html index 1f8dac4899..ba9d1eb0c7 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/custom_formats.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/custom_formats.html @@ -10,7 +10,7 @@ // General options mode : "textareas", theme : "advanced", - plugins : "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,wordcount,advlist,autosave", + plugins : "autolink,lists,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,wordcount,advlist,autosave", // Theme options theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect", diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/full.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/full.html index a72dfd0b44..e4d187e885 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/full.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/full.html @@ -2,7 +2,7 @@ Full featured example - + - - - - - - -
    -

    Translation

    - -

    This page enables you to translate TinyMCE by using XML files.

    -

    Steps to translate:

    -
      -
    1. Download one of the language XML files from the TinyMCE site.
    2. -
    3. Place it in /jscripts/tiny_mce/langs directory, for example /jscripts/tiny_mce/langs/sv.xml.
    4. -
    5. Change the language init option in this file to match the XML file code. For example: sv
    6. -
    7. TinyMCE will now use the XML file instead of the .js versions.
    8. -
    9. Modify the XML file until everything is translated
    10. -
    11. Modify the author information, this is optional.
    12. -
    13. Upload the XML file to the TinyMCE site to share it with others.
    14. -
    15. You can now download the .js versions of the language pack from the TinyMCE site.
    16. -
    - - - - - - diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/word.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/word.html index 64cd1d4ae8..d827b6fedb 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/word.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/examples/word.html @@ -2,7 +2,7 @@ Word processor example - + '; - - bi = s.body_id || 'tinymce'; - if (bi.indexOf('=') != -1) { - bi = t.getParam('body_id', '', 'hash'); - bi = bi[t.id] || bi; - } - - bc = s.body_class || ''; - if (bc.indexOf('=') != -1) { - bc = t.getParam('body_class', '', 'hash'); - bc = bc[t.id] || ''; - } - - t.iframeHTML += ''; - - // Domain relaxing enabled, then set document domain - if (tinymce.relaxedDomain) { - // We need to write the contents here in IE since multiple writes messes up refresh button and back button - if (isIE || (tinymce.isOpera && parseFloat(opera.version()) >= 9.5)) - u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + t.id + '");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'; - else if (tinymce.isOpera) - u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";document.close();ed.setupIframe();})()'; - } - - // Create iframe - n = DOM.add(o.iframeContainer, 'iframe', { - id : t.id + "_ifr", - src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7 - frameBorder : '0', - style : { - width : '100%', - height : h - } - }); - - t.contentAreaContainer = o.iframeContainer; - DOM.get(o.editorContainer).style.display = t.orgDisplay; - DOM.get(t.id).style.display = 'none'; - - if (!isIE || !tinymce.relaxedDomain) - t.setupIframe(); - - e = n = o = null; // Cleanup - }, - - /** - * This method get called by the init method ones the iframe is loaded. - * It will fill the iframe with contents, setups DOM and selection objects for the iframe. - * This method should not be called directly. - * - * @method setupIframe - */ - setupIframe : function() { - var t = this, s = t.settings, e = DOM.get(t.id), d = t.getDoc(), h, b; - - // Setup iframe body - if (!isIE || !tinymce.relaxedDomain) { - d.open(); - d.write(t.iframeHTML); - d.close(); - } - - // Design mode needs to be added here Ctrl+A will fail otherwise - if (!isIE) { - try { - if (!s.readonly) - d.designMode = 'On'; - } catch (ex) { - // Will fail on Gecko if the editor is placed in an hidden container element - // The design mode will be set ones the editor is focused - } - } - - // IE needs to use contentEditable or it will display non secure items for HTTPS - if (isIE) { - // It will not steal focus if we hide it while setting contentEditable - b = t.getBody(); - DOM.hide(b); - - if (!s.readonly) - b.contentEditable = true; - - DOM.show(b); - } - - /** - * DOM instance for the editor. - * - * @property dom - * @type tinymce.dom.DOMUtils - */ - t.dom = new tinymce.dom.DOMUtils(t.getDoc(), { - keep_values : true, - url_converter : t.convertURL, - url_converter_scope : t, - hex_colors : s.force_hex_style_colors, - class_filter : s.class_filter, - update_styles : 1, - fix_ie_paragraphs : 1, - valid_styles : s.valid_styles - }); - - /** - * Schema instance, enables you to validate elements and it's children. - * - * @property schema - * @type tinymce.dom.Schema - */ - t.schema = new tinymce.dom.Schema(); - - /** - * DOM serializer for the editor. - * - * @property serializer - * @type tinymce.dom.Serializer - */ - t.serializer = new tinymce.dom.Serializer(extend(s, { - valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements, - dom : t.dom, - schema : t.schema - })); - - /** - * Selection instance for the editor. - * - * @property selection - * @type tinymce.dom.Selection - */ - t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer); - - /** - * Formatter instance. - * - * @property formatter - * @type tinymce.Formatter - */ - t.formatter = new tinymce.Formatter(this); - - // Register default formats - t.formatter.register({ - alignleft : [ - {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'}}, - {selector : 'img,table', styles : {'float' : 'left'}} - ], - - aligncenter : [ - {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'}}, - {selector : 'img', styles : {display : 'block', marginLeft : 'auto', marginRight : 'auto'}}, - {selector : 'table', styles : {marginLeft : 'auto', marginRight : 'auto'}} - ], - - alignright : [ - {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}}, - {selector : 'img,table', styles : {'float' : 'right'}} - ], - - alignfull : [ - {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'justify'}} - ], - - bold : [ - {inline : 'strong'}, - {inline : 'span', styles : {fontWeight : 'bold'}}, - {inline : 'b'} - ], - - italic : [ - {inline : 'em'}, - {inline : 'span', styles : {fontStyle : 'italic'}}, - {inline : 'i'} - ], - - underline : [ - {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}, - {inline : 'u'} - ], - - strikethrough : [ - {inline : 'span', styles : {textDecoration : 'line-through'}, exact : true}, - {inline : 'u'} - ], - - forecolor : {inline : 'span', styles : {color : '%value'}, wrap_links : false}, - hilitecolor : {inline : 'span', styles : {backgroundColor : '%value'}, wrap_links : false}, - fontname : {inline : 'span', styles : {fontFamily : '%value'}}, - fontsize : {inline : 'span', styles : {fontSize : '%value'}}, - fontsize_class : {inline : 'span', attributes : {'class' : '%value'}}, - blockquote : {block : 'blockquote', wrapper : 1, remove : 'all'}, - - removeformat : [ - {selector : 'b,strong,em,i,font,u,strike', remove : 'all', split : true, expand : false, block_expand : true, deep : true}, - {selector : 'span', attributes : ['style', 'class'], remove : 'empty', split : true, expand : false, deep : true}, - {selector : '*', attributes : ['style', 'class'], split : false, expand : false, deep : true} - ] - }); - - // Register default block formats - each('p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp'.split(/\s/), function(name) { - t.formatter.register(name, {block : name, remove : 'all'}); - }); - - // Register user defined formats - t.formatter.register(t.settings.formats); - - /** - * Undo manager instance, responsible for handling undo levels. - * - * @property undoManager - * @type tinymce.UndoManager - */ - t.undoManager = new tinymce.UndoManager(t); - - // Pass through - t.undoManager.onAdd.add(function(um, l) { - if (!l.initial) - return t.onChange.dispatch(t, l, um); - }); - - t.undoManager.onUndo.add(function(um, l) { - return t.onUndo.dispatch(t, l, um); - }); - - t.undoManager.onRedo.add(function(um, l) { - return t.onRedo.dispatch(t, l, um); - }); - - t.forceBlocks = new tinymce.ForceBlocks(t, { - forced_root_block : s.forced_root_block - }); - - t.editorCommands = new tinymce.EditorCommands(t); - - // Pass through - t.serializer.onPreProcess.add(function(se, o) { - return t.onPreProcess.dispatch(t, o, se); - }); - - t.serializer.onPostProcess.add(function(se, o) { - return t.onPostProcess.dispatch(t, o, se); - }); - - t.onPreInit.dispatch(t); - - if (!s.gecko_spellcheck) - t.getBody().spellcheck = 0; - - if (!s.readonly) - t._addEvents(); - - t.controlManager.onPostRender.dispatch(t, t.controlManager); - t.onPostRender.dispatch(t); - - if (s.directionality) - t.getBody().dir = s.directionality; - - if (s.nowrap) - t.getBody().style.whiteSpace = "nowrap"; - - if (s.custom_elements) { - function handleCustom(ed, o) { - each(explode(s.custom_elements), function(v) { - var n; - - if (v.indexOf('~') === 0) { - v = v.substring(1); - n = 'span'; - } else - n = 'div'; - - o.content = o.content.replace(new RegExp('<(' + v + ')([^>]*)>', 'g'), '<' + n + ' _mce_name="$1"$2>'); - o.content = o.content.replace(new RegExp('', 'g'), ''); - }); - }; - - t.onBeforeSetContent.add(handleCustom); - t.onPostProcess.add(function(ed, o) { - if (o.set) - handleCustom(ed, o); - }); - } - - if (s.handle_node_change_callback) { - t.onNodeChange.add(function(ed, cm, n) { - t.execCallback('handle_node_change_callback', t.id, n, -1, -1, true, t.selection.isCollapsed()); - }); - } - - if (s.save_callback) { - t.onSaveContent.add(function(ed, o) { - var h = t.execCallback('save_callback', t.id, o.content, t.getBody()); - - if (h) - o.content = h; - }); - } - - if (s.onchange_callback) { - t.onChange.add(function(ed, l) { - t.execCallback('onchange_callback', t, l); - }); - } - - if (s.convert_newlines_to_brs) { - t.onBeforeSetContent.add(function(ed, o) { - if (o.initial) - o.content = o.content.replace(/\r?\n/g, '
    '); - }); - } - - if (s.fix_nesting && isIE) { - t.onBeforeSetContent.add(function(ed, o) { - o.content = t._fixNesting(o.content); - }); - } - - if (s.preformatted) { - t.onPostProcess.add(function(ed, o) { - o.content = o.content.replace(/^\s*/, ''); - o.content = o.content.replace(/<\/pre>\s*$/, ''); - - if (o.set) - o.content = '
    ' + o.content + '
    '; - }); - } - - if (s.verify_css_classes) { - t.serializer.attribValueFilter = function(n, v) { - var s, cl; - - if (n == 'class') { - // Build regexp for classes - if (!t.classesRE) { - cl = t.dom.getClasses(); - - if (cl.length > 0) { - s = ''; - - each (cl, function(o) { - s += (s ? '|' : '') + o['class']; - }); - - t.classesRE = new RegExp('(' + s + ')', 'gi'); - } - } - - return !t.classesRE || /(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v) || t.classesRE.test(v) ? v : ''; - } - - return v; - }; - } - - if (s.cleanup_callback) { - t.onBeforeSetContent.add(function(ed, o) { - o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); - }); - - t.onPreProcess.add(function(ed, o) { - if (o.set) - t.execCallback('cleanup_callback', 'insert_to_editor_dom', o.node, o); - - if (o.get) - t.execCallback('cleanup_callback', 'get_from_editor_dom', o.node, o); - }); - - t.onPostProcess.add(function(ed, o) { - if (o.set) - o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); - - if (o.get) - o.content = t.execCallback('cleanup_callback', 'get_from_editor', o.content, o); - }); - } - - if (s.save_callback) { - t.onGetContent.add(function(ed, o) { - if (o.save) - o.content = t.execCallback('save_callback', t.id, o.content, t.getBody()); - }); - } - - if (s.handle_event_callback) { - t.onEvent.add(function(ed, e, o) { - if (t.execCallback('handle_event_callback', e, ed, o) === false) - Event.cancel(e); - }); - } - - // Add visual aids when new contents is added - t.onSetContent.add(function() { - t.addVisual(t.getBody()); - }); - - // Remove empty contents - if (s.padd_empty_editor) { - t.onPostProcess.add(function(ed, o) { - o.content = o.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
    [\r\n]*)$/, ''); - }); - } - - if (isGecko) { - // Fix gecko link bug, when a link is placed at the end of block elements there is - // no way to move the caret behind the link. This fix adds a bogus br element after the link - function fixLinks(ed, o) { - each(ed.dom.select('a'), function(n) { - var pn = n.parentNode; - - if (ed.dom.isBlock(pn) && pn.lastChild === n) - ed.dom.add(pn, 'br', {'_mce_bogus' : 1}); - }); - }; - - t.onExecCommand.add(function(ed, cmd) { - if (cmd === 'CreateLink') - fixLinks(ed); - }); - - t.onSetContent.add(t.selection.onSetContent.add(fixLinks)); - - if (!s.readonly) { - try { - // Design mode must be set here once again to fix a bug where - // Ctrl+A/Delete/Backspace didn't work if the editor was added using mceAddControl then removed then added again - d.designMode = 'Off'; - d.designMode = 'On'; - } catch (ex) { - // Will fail on Gecko if the editor is placed in an hidden container element - // The design mode will be set ones the editor is focused - } - } - } - - // A small timeout was needed since firefox will remove. Bug: #1838304 - setTimeout(function () { - if (t.removed) - return; - - t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')}); - t.startContent = t.getContent({format : 'raw'}); - t.initialized = true; - - t.onInit.dispatch(t); - t.execCallback('setupcontent_callback', t.id, t.getBody(), t.getDoc()); - t.execCallback('init_instance_callback', t); - t.focus(true); - t.nodeChanged({initial : 1}); - - // Load specified content CSS last - if (s.content_css) { - tinymce.each(explode(s.content_css), function(u) { - t.dom.loadCSS(t.documentBaseURI.toAbsolute(u)); - }); - } - - // Handle auto focus - if (s.auto_focus) { - setTimeout(function () { - var ed = tinymce.get(s.auto_focus); - - ed.selection.select(ed.getBody(), 1); - ed.selection.collapse(1); - ed.getWin().focus(); - }, 100); - } - }, 1); - - e = null; - }, - - // #ifdef contentEditable - - /** - * Sets up the contentEditable mode. - * - * @method setupContentEditable - */ - setupContentEditable : function() { - var t = this, s = t.settings, e = t.getElement(); - - t.contentDocument = s.content_document || document; - t.contentWindow = s.content_window || window; - t.bodyElement = e; - - // Prevent leak in IE - s.content_document = s.content_window = null; - - DOM.hide(e); - e.contentEditable = t.getParam('content_editable_state', true); - DOM.show(e); - - if (!s.gecko_spellcheck) - t.getDoc().body.spellcheck = 0; - - // Setup objects - t.dom = new tinymce.dom.DOMUtils(t.getDoc(), { - keep_values : true, - url_converter : t.convertURL, - url_converter_scope : t, - hex_colors : s.force_hex_style_colors, - class_filter : s.class_filter, - root_element : t.id, - fix_ie_paragraphs : 1, - update_styles : 1, - valid_styles : s.valid_styles - }); - - t.serializer = new tinymce.dom.Serializer({ - entity_encoding : s.entity_encoding, - entities : s.entities, - valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements, - extended_valid_elements : s.extended_valid_elements, - valid_child_elements : s.valid_child_elements, - invalid_elements : s.invalid_elements, - fix_table_elements : s.fix_table_elements, - fix_list_elements : s.fix_list_elements, - fix_content_duplication : s.fix_content_duplication, - font_size_classes : s.font_size_classes, - apply_source_formatting : s.apply_source_formatting, - dom : t.dom, - schema : schema - }); - - t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer); - t.forceBlocks = new tinymce.ForceBlocks(t, { - forced_root_block : s.forced_root_block - }); - - t.editorCommands = new tinymce.EditorCommands(t); - - // Pass through - t.serializer.onPreProcess.add(function(se, o) { - return t.onPreProcess.dispatch(t, o, se); - }); - - t.serializer.onPostProcess.add(function(se, o) { - return t.onPostProcess.dispatch(t, o, se); - }); - - t.onPreInit.dispatch(t); - t._addEvents(); - - t.controlManager.onPostRender.dispatch(t, t.controlManager); - t.onPostRender.dispatch(t); - - t.onSetContent.add(function() { - t.addVisual(t.getBody()); - }); - - //t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')}); - t.startContent = t.getContent({format : 'raw'}); - t.undoManager.add({initial : true}); - t.initialized = true; - - t.onInit.dispatch(t); - t.focus(true); - t.nodeChanged({initial : 1}); - - // Load specified content CSS last - if (s.content_css) { - each(explode(s.content_css), function(u) { - t.dom.loadCSS(t.documentBaseURI.toAbsolute(u)); - }); - } - - if (isIE) { - // Store away selection - t.dom.bind(t.getElement(), 'beforedeactivate', function() { - t.lastSelectionBookmark = t.selection.getBookmark(1); - }); - - t.onBeforeExecCommand.add(function(ed, cmd, ui, val, o) { - if (!DOM.getParent(ed.selection.getStart(), function(n) {return n == ed.getBody();})) - o.terminate = 1; - - if (!DOM.getParent(ed.selection.getEnd(), function(n) {return n == ed.getBody();})) - o.terminate = 1; - }); - } - - e = null; // Cleanup - }, - - // #endif - - /** - * Focuses/activates the editor. This will set this editor as the activeEditor in the tinymce collection - * it will also place DOM focus inside the editor. - * - * @method focus - * @param {Boolean} sf Skip DOM focus. Just set is as the active editor. - */ - focus : function(sf) { - var oed, t = this, ce = t.settings.content_editable, ieRng, controlElm, doc = t.getDoc(); - - if (!sf) { - // Get selected control element - ieRng = t.selection.getRng(); - if (ieRng.item) { - controlElm = ieRng.item(0); - } - - // Is not content editable - if (!ce) - t.getWin().focus(); - - // Restore selected control element - // This is needed when for example an image is selected within a - // layer a call to focus will then remove the control selection - if (controlElm && controlElm.ownerDocument == doc) { - ieRng = doc.body.createControlRange(); - ieRng.addElement(controlElm); - ieRng.select(); - } - - // #ifdef contentEditable - - // Content editable mode ends here - if (ce) { - if (tinymce.isWebKit) - t.getWin().focus(); - else { - if (tinymce.isIE) - t.getElement().setActive(); - else - t.getElement().focus(); - } - } - - // #endif - } - - if (tinymce.activeEditor != t) { - if ((oed = tinymce.activeEditor) != null) - oed.onDeactivate.dispatch(oed, t); - - t.onActivate.dispatch(t, oed); - } - - tinymce._setActive(t); - }, - - /** - * Executes a legacy callback. This method is useful to call old 2.x option callbacks. - * There new event model is a better way to add callback so this method might be removed in the future. - * - * @method execCallback - * @param {String} n Name of the callback to execute. - * @return {Object} Return value passed from callback function. - */ - execCallback : function(n) { - var t = this, f = t.settings[n], s; - - if (!f) - return; - - // Look through lookup - if (t.callbackLookup && (s = t.callbackLookup[n])) { - f = s.func; - s = s.scope; - } - - if (is(f, 'string')) { - s = f.replace(/\.\w+$/, ''); - s = s ? tinymce.resolve(s) : 0; - f = tinymce.resolve(f); - t.callbackLookup = t.callbackLookup || {}; - t.callbackLookup[n] = {func : f, scope : s}; - } - - return f.apply(s || t, Array.prototype.slice.call(arguments, 1)); - }, - - /** - * Translates the specified string by replacing variables with language pack items it will also check if there is - * a key mathcin the input. - * - * @method translate - * @param {String} s String to translate by the language pack data. - * @return {String} Translated string. - */ - translate : function(s) { - var c = this.settings.language || 'en', i18n = tinymce.i18n; - - if (!s) - return ''; - - return i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) { - return i18n[c + '.' + b] || '{#' + b + '}'; - }); - }, - - /** - * Returns a language pack item by name/key. - * - * @method getLang - * @param {String} n Name/key to get from the language pack. - * @param {String} dv Optional default value to retrive. - */ - getLang : function(n, dv) { - return tinymce.i18n[(this.settings.language || 'en') + '.' + n] || (is(dv) ? dv : '{#' + n + '}'); - }, - - /** - * Returns a configuration parameter by name. - * - * @method getParam - * @param {String} n Configruation parameter to retrive. - * @param {String} dv Optional default value to return. - * @param {String} ty Optional type parameter. - * @return {String} Configuration parameter value or default value. - */ - getParam : function(n, dv, ty) { - var tr = tinymce.trim, v = is(this.settings[n]) ? this.settings[n] : dv, o; - - if (ty === 'hash') { - o = {}; - - if (is(v, 'string')) { - each(v.indexOf('=') > 0 ? v.split(/[;,](?![^=;,]*(?:[;,]|$))/) : v.split(','), function(v) { - v = v.split('='); - - if (v.length > 1) - o[tr(v[0])] = tr(v[1]); - else - o[tr(v[0])] = tr(v); - }); - } else - o = v; - - return o; - } - - return v; - }, - - /** - * Distpaches out a onNodeChange event to all observers. This method should be called when you - * need to update the UI states or element path etc. - * - * @method nodeChanged - * @param {Object} o Optional object to pass along for the node changed event. - */ - nodeChanged : function(o) { - var t = this, s = t.selection, n = (isIE ? s.getNode() : s.getStart()) || t.getBody(); - - // Fix for bug #1896577 it seems that this can not be fired while the editor is loading - if (t.initialized) { - o = o || {}; - n = isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n; // Fix for IE initial state - - // Get parents and add them to object - o.parents = []; - t.dom.getParent(n, function(node) { - if (node.nodeName == 'BODY') - return true; - - o.parents.push(node); - }); - - t.onNodeChange.dispatch( - t, - o ? o.controlManager || t.controlManager : t.controlManager, - n, - s.isCollapsed(), - o - ); - } - }, - - /** - * Adds a button that later gets created by the ControlManager. This is a shorter and easier method - * of adding buttons without the need to deal with the ControlManager directly. But it's also less - * powerfull if you need more control use the ControlManagers factory methods instead. - * - * @method addButton - * @param {String} n Button name to add. - * @param {Object} s Settings object with title, cmd etc. - */ - addButton : function(n, s) { - var t = this; - - t.buttons = t.buttons || {}; - t.buttons[n] = s; - }, - - /** - * Adds a custom command to the editor, you can also override existing commands with this method. - * The command that you add can be executed with execCommand. - * - * @method addCommand - * @param {String} n Command name to add/override. - * @param {function} f Function to execute when the command occurs. - * @param {Object} s Optional scope to execute the function in. - */ - addCommand : function(n, f, s) { - this.execCommands[n] = {func : f, scope : s || this}; - }, - - /** - * Adds a custom query state command to the editor, you can also override existing commands with this method. - * The command that you add can be executed with queryCommandState function. - * - * @method addQueryStateHandler - * @param {String} n Command name to add/override. - * @param {function} f Function to execute when the command state retrival occurs. - * @param {Object} s Optional scope to execute the function in. - */ - addQueryStateHandler : function(n, f, s) { - this.queryStateCommands[n] = {func : f, scope : s || this}; - }, - - /** - * Adds a custom query value command to the editor, you can also override existing commands with this method. - * The command that you add can be executed with queryCommandValue function. - * - * @method addQueryValueHandler - * @param {String} n Command name to add/override. - * @param {function} f Function to execute when the command value retrival occurs. - * @param {Object} s Optional scope to execute the function in. - */ - addQueryValueHandler : function(n, f, s) { - this.queryValueCommands[n] = {func : f, scope : s || this}; - }, - - /** - * Adds a keyboard shortcut for some command or function. - * - * @method addShortcut - * @param {String} pa Shortcut pattern. Like for example: ctrl+alt+o. - * @param {String} desc Text description for the command. - * @param {String/Function} cmd_func Command name string or function to execute when the key is pressed. - * @param {Object} sc Optional scope to execute the function in. - * @return {Boolean} true/false state if the shortcut was added or not. - */ - addShortcut : function(pa, desc, cmd_func, sc) { - var t = this, c; - - if (!t.settings.custom_shortcuts) - return false; - - t.shortcuts = t.shortcuts || {}; - - if (is(cmd_func, 'string')) { - c = cmd_func; - - cmd_func = function() { - t.execCommand(c, false, null); - }; - } - - if (is(cmd_func, 'object')) { - c = cmd_func; - - cmd_func = function() { - t.execCommand(c[0], c[1], c[2]); - }; - } - - each(explode(pa), function(pa) { - var o = { - func : cmd_func, - scope : sc || this, - desc : desc, - alt : false, - ctrl : false, - shift : false - }; - - each(explode(pa, '+'), function(v) { - switch (v) { - case 'alt': - case 'ctrl': - case 'shift': - o[v] = true; - break; - - default: - o.charCode = v.charCodeAt(0); - o.keyCode = v.toUpperCase().charCodeAt(0); - } - }); - - t.shortcuts[(o.ctrl ? 'ctrl' : '') + ',' + (o.alt ? 'alt' : '') + ',' + (o.shift ? 'shift' : '') + ',' + o.keyCode] = o; - }); - - return true; - }, - - /** - * Executes a command on the current instance. These commands can be TinyMCE internal commands prefixed with "mce" or - * they can be build in browser commands such as "Bold". A compleate list of browser commands is available on MSDN or Mozilla.org. - * This function will dispatch the execCommand function on each plugin, theme or the execcommand_callback option if none of these - * return true it will handle the command as a internal browser command. - * - * @method execCommand - * @param {String} cmd Command name to execute, for example mceLink or Bold. - * @param {Boolean} ui True/false state if a UI (dialog) should be presented or not. - * @param {mixed} val Optional command value, this can be anything. - * @param {Object} a Optional arguments object. - * @return {Boolean} True/false if the command was executed or not. - */ - execCommand : function(cmd, ui, val, a) { - var t = this, s = 0, o, st; - - if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus)) - t.focus(); - - o = {}; - t.onBeforeExecCommand.dispatch(t, cmd, ui, val, o); - if (o.terminate) - return false; - - // Command callback - if (t.execCallback('execcommand_callback', t.id, t.selection.getNode(), cmd, ui, val)) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - return true; - } - - // Registred commands - if (o = t.execCommands[cmd]) { - st = o.func.call(o.scope, ui, val); - - // Fall through on true - if (st !== true) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - return st; - } - } - - // Plugin commands - each(t.plugins, function(p) { - if (p.execCommand && p.execCommand(cmd, ui, val)) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - s = 1; - return false; - } - }); - - if (s) - return true; - - // Theme commands - if (t.theme && t.theme.execCommand && t.theme.execCommand(cmd, ui, val)) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - return true; - } - - // Execute global commands - if (tinymce.GlobalCommands.execCommand(t, cmd, ui, val)) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - return true; - } - - // Editor commands - if (t.editorCommands.execCommand(cmd, ui, val)) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - return true; - } - - // Browser commands - t.getDoc().execCommand(cmd, ui, val); - t.onExecCommand.dispatch(t, cmd, ui, val, a); - }, - - /** - * Returns a command specific state, for example if bold is enabled or not. - * - * @method queryCommandState - * @param {string} cmd Command to query state from. - * @return {Boolean} Command specific state, for example if bold is enabled or not. - */ - queryCommandState : function(cmd) { - var t = this, o, s; - - // Is hidden then return undefined - if (t._isHidden()) - return; - - // Registred commands - if (o = t.queryStateCommands[cmd]) { - s = o.func.call(o.scope); - - // Fall though on true - if (s !== true) - return s; - } - - // Registred commands - o = t.editorCommands.queryCommandState(cmd); - if (o !== -1) - return o; - - // Browser commands - try { - return this.getDoc().queryCommandState(cmd); - } catch (ex) { - // Fails sometimes see bug: 1896577 - } - }, - - /** - * Returns a command specific value, for example the current font size. - * - * @method queryCommandValue - * @param {string} c Command to query value from. - * @return {Object} Command specific value, for example the current font size. - */ - queryCommandValue : function(c) { - var t = this, o, s; - - // Is hidden then return undefined - if (t._isHidden()) - return; - - // Registred commands - if (o = t.queryValueCommands[c]) { - s = o.func.call(o.scope); - - // Fall though on true - if (s !== true) - return s; - } - - // Registred commands - o = t.editorCommands.queryCommandValue(c); - if (is(o)) - return o; - - // Browser commands - try { - return this.getDoc().queryCommandValue(c); - } catch (ex) { - // Fails sometimes see bug: 1896577 - } - }, - - /** - * Shows the editor and hides any textarea/div that the editor is supposed to replace. - * - * @method show - */ - show : function() { - var t = this; - - DOM.show(t.getContainer()); - DOM.hide(t.id); - t.load(); - }, - - /** - * Hides the editor and shows any textarea/div that the editor is supposed to replace. - * - * @method hide - */ - hide : function() { - var t = this, d = t.getDoc(); - - // Fixed bug where IE has a blinking cursor left from the editor - if (isIE && d) - d.execCommand('SelectAll'); - - // We must save before we hide so Safari doesn't crash - t.save(); - DOM.hide(t.getContainer()); - DOM.setStyle(t.id, 'display', t.orgDisplay); - }, - - /** - * Returns true/false if the editor is hidden or not. - * - * @method isHidden - * @return {Boolean} True/false if the editor is hidden or not. - */ - isHidden : function() { - return !DOM.isHidden(this.id); - }, - - /** - * Sets the progress state, this will display a throbber/progess for the editor. - * This is ideal for asycronous operations like an AJAX save call. - * - * @method setProgressState - * @param {Boolean} b Boolean state if the progress should be shown or hidden. - * @param {Number} ti Optional time to wait before the progress gets shown. - * @param {Object} o Optional object to pass to the progress observers. - * @return {Boolean} Same as the input state. - */ - setProgressState : function(b, ti, o) { - this.onSetProgressState.dispatch(this, b, ti, o); - - return b; - }, - - /** - * Loads contents from the textarea or div element that got converted into an editor instance. - * This method will move the contents from that textarea or div into the editor by using setContent - * so all events etc that method has will get dispatched as well. - * - * @method load - * @param {Object} o Optional content object, this gets passed around through the whole load process. - * @return {String} HTML string that got set into the editor. - */ - load : function(o) { - var t = this, e = t.getElement(), h; - - if (e) { - o = o || {}; - o.load = true; - - // Double encode existing entities in the value - h = t.setContent(is(e.value) ? e.value : e.innerHTML, o); - o.element = e; - - if (!o.no_events) - t.onLoadContent.dispatch(t, o); - - o.element = e = null; - - return h; - } - }, - - /** - * Saves the contents from a editor out to the textarea or div element that got converted into an editor instance. - * This method will move the HTML contents from the editor into that textarea or div by getContent - * so all events etc that method has will get dispatched as well. - * - * @method save - * @param {Object} o Optional content object, this gets passed around through the whole save process. - * @return {String} HTML string that got set into the textarea/div. - */ - save : function(o) { - var t = this, e = t.getElement(), h, f; - - if (!e || !t.initialized) - return; - - o = o || {}; - o.save = true; - - // Add undo level will trigger onchange event - if (!o.no_events) { - t.undoManager.typing = 0; - t.undoManager.add(); - } - - o.element = e; - h = o.content = t.getContent(o); - - if (!o.no_events) - t.onSaveContent.dispatch(t, o); - - h = o.content; - - if (!/TEXTAREA|INPUT/i.test(e.nodeName)) { - e.innerHTML = h; - - // Update hidden form element - if (f = DOM.getParent(t.id, 'form')) { - each(f.elements, function(e) { - if (e.name == t.id) { - e.value = h; - return false; - } - }); - } - } else - e.value = h; - - o.element = e = null; - - return h; - }, - - /** - * Sets the specified content to the editor instance, this will cleanup the content before it gets set using - * the different cleanup rules options. - * - * @method setContent - * @param {String} h Content to set to editor, normally HTML contents but can be other formats as well. - * @param {Object} o Optional content object, this gets passed around through the whole set process. - * @return {String} HTML string that got set into the editor. - */ - setContent : function(h, o) { - var t = this; - - o = o || {}; - o.format = o.format || 'html'; - o.set = true; - o.content = h; - - if (!o.no_events) - t.onBeforeSetContent.dispatch(t, o); - - // Padd empty content in Gecko and Safari. Commands will otherwise fail on the content - // It will also be impossible to place the caret in the editor unless there is a BR element present - if (!tinymce.isIE && (h.length === 0 || /^\s+$/.test(h))) { - o.content = t.dom.setHTML(t.getBody(), '
    '); - o.format = 'raw'; - } - - o.content = t.dom.setHTML(t.getBody(), tinymce.trim(o.content)); - - if (o.format != 'raw' && t.settings.cleanup) { - o.getInner = true; - o.content = t.dom.setHTML(t.getBody(), t.serializer.serialize(t.getBody(), o)); - } - - if (!o.no_events) - t.onSetContent.dispatch(t, o); - - return o.content; - }, - - /** - * Gets the content from the editor instance, this will cleanup the content before it gets returned using - * the different cleanup rules options. - * - * @method getContent - * @param {Object} o Optional content object, this gets passed around through the whole get process. - * @return {String} Cleaned content string, normally HTML contents. - */ - getContent : function(o) { - var t = this, h; - - o = o || {}; - o.format = o.format || 'html'; - o.get = true; - - if (!o.no_events) - t.onBeforeGetContent.dispatch(t, o); - - if (o.format != 'raw' && t.settings.cleanup) { - o.getInner = true; - h = t.serializer.serialize(t.getBody(), o); - } else - h = t.getBody().innerHTML; - - h = h.replace(/^\s*|\s*$/g, ''); - o.content = h; - - if (!o.no_events) - t.onGetContent.dispatch(t, o); - - return o.content; - }, - - /** - * Returns true/false if the editor is dirty or not. It will get dirty if the user has made modifications to the contents. - * - * @method isDirty - * @return {Boolean} True/false if the editor is dirty or not. It will get dirty if the user has made modifications to the contents. - */ - isDirty : function() { - var t = this; - - return tinymce.trim(t.startContent) != tinymce.trim(t.getContent({format : 'raw', no_events : 1})) && !t.isNotDirty; - }, - - /** - * Returns the editors container element. The container element wrappes in - * all the elements added to the page for the editor. Such as UI, iframe etc. - * - * @method getContainer - * @return {Element} HTML DOM element for the editor container. - */ - getContainer : function() { - var t = this; - - if (!t.container) - t.container = DOM.get(t.editorContainer || t.id + '_parent'); - - return t.container; - }, - - /** - * Returns the editors content area container element. The this element is the one who - * holds the iframe or the editable element. - * - * @method getContentAreaContainer - * @return {Element} HTML DOM element for the editor area container. - */ - getContentAreaContainer : function() { - return this.contentAreaContainer; - }, - - /** - * Returns the target element/textarea that got replaced with a TinyMCE editor instance. - * - * @method getElement - * @return {Element} HTML DOM element for the replaced element. - */ - getElement : function() { - return DOM.get(this.settings.content_element || this.id); - }, - - /** - * Returns the iframes window object. - * - * @method getWin - * @return {Window} Iframe DOM window object. - */ - getWin : function() { - var t = this, e; - - if (!t.contentWindow) { - e = DOM.get(t.id + "_ifr"); - - if (e) - t.contentWindow = e.contentWindow; - } - - return t.contentWindow; - }, - - /** - * Returns the iframes document object. - * - * @method getDoc - * @return {Document} Iframe DOM document object. - */ - getDoc : function() { - var t = this, w; - - if (!t.contentDocument) { - w = t.getWin(); - - if (w) - t.contentDocument = w.document; - } - - return t.contentDocument; - }, - - /** - * Returns the iframes body element. - * - * @method getBody - * @return {Element} Iframe body element. - */ - getBody : function() { - return this.bodyElement || this.getDoc().body; - }, - - /** - * URL converter function this gets executed each time a user adds an img, a or - * any other element that has a URL in it. This will be called both by the DOM and HTML - * manipulation functions. - * - * @method convertURL - * @param {string} u URL to convert. - * @param {string} n Attribute name src, href etc. - * @param {string/HTMLElement} Tag name or HTML DOM element depending on HTML or DOM insert. - * @return {string} Converted URL string. - */ - convertURL : function(u, n, e) { - var t = this, s = t.settings; - - // Use callback instead - if (s.urlconverter_callback) - return t.execCallback('urlconverter_callback', u, e, true, n); - - // Don't convert link href since thats the CSS files that gets loaded into the editor also skip local file URLs - if (!s.convert_urls || (e && e.nodeName == 'LINK') || u.indexOf('file:') === 0) - return u; - - // Convert to relative - if (s.relative_urls) - return t.documentBaseURI.toRelative(u); - - // Convert to absolute - u = t.documentBaseURI.toAbsolute(u, s.remove_script_host); - - return u; - }, - - /** - * Adds visual aid for tables, anchors etc so they can be more easily edited inside the editor. - * - * @method addVisual - * @param {Element} e Optional root element to loop though to find tables etc that needs the visual aid. - */ - addVisual : function(e) { - var t = this, s = t.settings; - - e = e || t.getBody(); - - if (!is(t.hasVisual)) - t.hasVisual = s.visual; - - each(t.dom.select('table,a', e), function(e) { - var v; - - switch (e.nodeName) { - case 'TABLE': - v = t.dom.getAttrib(e, 'border'); - - if (!v || v == '0') { - if (t.hasVisual) - t.dom.addClass(e, s.visual_table_class); - else - t.dom.removeClass(e, s.visual_table_class); - } - - return; - - case 'A': - v = t.dom.getAttrib(e, 'name'); - - if (v) { - if (t.hasVisual) - t.dom.addClass(e, 'mceItemAnchor'); - else - t.dom.removeClass(e, 'mceItemAnchor'); - } - - return; - } - }); - - t.onVisualAid.dispatch(t, e, t.hasVisual); - }, - - /** - * Removes the editor from the dom and tinymce collection. - * - * @method remove - */ - remove : function() { - var t = this, e = t.getContainer(); - - t.removed = 1; // Cancels post remove event execution - t.hide(); - - t.execCallback('remove_instance_callback', t); - t.onRemove.dispatch(t); - - // Clear all execCommand listeners this is required to avoid errors if the editor was removed inside another command - t.onExecCommand.listeners = []; - - tinymce.remove(t); - DOM.remove(e); - }, - - /** - * Destroys the editor instance by removing all events, element references or other resources - * that could leak memory. This method will be called automatically when the page is unloaded - * but you can also call it directly if you know what you are doing. - * - * @method destroy - * @param {Boolean} s Optional state if the destroy is an automatic destroy or user called one. - */ - destroy : function(s) { - var t = this; - - // One time is enough - if (t.destroyed) - return; - - if (!s) { - tinymce.removeUnload(t.destroy); - tinyMCE.onBeforeUnload.remove(t._beforeUnload); - - // Manual destroy - if (t.theme && t.theme.destroy) - t.theme.destroy(); - - // Destroy controls, selection and dom - t.controlManager.destroy(); - t.selection.destroy(); - t.dom.destroy(); - - // Remove all events - - // Don't clear the window or document if content editable - // is enabled since other instances might still be present - if (!t.settings.content_editable) { - Event.clear(t.getWin()); - Event.clear(t.getDoc()); - } - - Event.clear(t.getBody()); - Event.clear(t.formElement); - } - - if (t.formElement) { - t.formElement.submit = t.formElement._mceOldSubmit; - t.formElement._mceOldSubmit = null; - } - - t.contentAreaContainer = t.formElement = t.container = t.settings.content_element = t.bodyElement = t.contentDocument = t.contentWindow = null; - - if (t.selection) - t.selection = t.selection.win = t.selection.dom = t.selection.dom.doc = null; - - t.destroyed = 1; - }, - - // Internal functions - - _addEvents : function() { - // 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset - var t = this, i, s = t.settings, dom = t.dom, lo = { - mouseup : 'onMouseUp', - mousedown : 'onMouseDown', - click : 'onClick', - keyup : 'onKeyUp', - keydown : 'onKeyDown', - keypress : 'onKeyPress', - submit : 'onSubmit', - reset : 'onReset', - contextmenu : 'onContextMenu', - dblclick : 'onDblClick', - paste : 'onPaste' // Doesn't work in all browsers yet - }; - - function eventHandler(e, o) { - var ty = e.type; - - // Don't fire events when it's removed - if (t.removed) - return; - - // Generic event handler - if (t.onEvent.dispatch(t, e, o) !== false) { - // Specific event handler - t[lo[e.fakeType || e.type]].dispatch(t, e, o); - } - }; - - // Add DOM events - each(lo, function(v, k) { - switch (k) { - case 'contextmenu': - if (tinymce.isOpera) { - // Fake contextmenu on Opera - dom.bind(t.getBody(), 'mousedown', function(e) { - if (e.ctrlKey) { - e.fakeType = 'contextmenu'; - eventHandler(e); - } - }); - } else - dom.bind(t.getBody(), k, eventHandler); - break; - - case 'paste': - dom.bind(t.getBody(), k, function(e) { - eventHandler(e); - }); - break; - - case 'submit': - case 'reset': - dom.bind(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler); - break; - - default: - dom.bind(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler); - } - }); - - dom.bind(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) { - t.focus(true); - }); - - // #ifdef contentEditable - - if (s.content_editable && tinymce.isOpera) { - // Opera doesn't support focus event for contentEditable elements so we need to fake it - function doFocus(e) { - t.focus(true); - }; - - dom.bind(t.getBody(), 'click', doFocus); - dom.bind(t.getBody(), 'keydown', doFocus); - } - - // #endif - - // Fixes bug where a specified document_base_uri could result in broken images - // This will also fix drag drop of images in Gecko - if (tinymce.isGecko) { - dom.bind(t.getDoc(), 'DOMNodeInserted', function(e) { - var v; - - e = e.target; - - if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('_mce_src'))) - e.src = t.documentBaseURI.toAbsolute(v); - }); - } - - // Set various midas options in Gecko - if (isGecko) { - function setOpts() { - var t = this, d = t.getDoc(), s = t.settings; - - if (isGecko && !s.readonly) { - if (t._isHidden()) { - try { - if (!s.content_editable) - d.designMode = 'On'; - } catch (ex) { - // Fails if it's hidden - } - } - - try { - // Try new Gecko method - d.execCommand("styleWithCSS", 0, false); - } catch (ex) { - // Use old method - if (!t._isHidden()) - try {d.execCommand("useCSS", 0, true);} catch (ex) {} - } - - if (!s.table_inline_editing) - try {d.execCommand('enableInlineTableEditing', false, false);} catch (ex) {} - - if (!s.object_resizing) - try {d.execCommand('enableObjectResizing', false, false);} catch (ex) {} - } - }; - - t.onBeforeExecCommand.add(setOpts); - t.onMouseDown.add(setOpts); - } - - // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250 - // WebKit can't even do simple things like selecting an image - // This also fixes so it's possible to select mceItemAnchors - if (tinymce.isWebKit) { - t.onClick.add(function(ed, e) { - e = e.target; - - // Needs tobe the setBaseAndExtend or it will fail to select floated images - if (e.nodeName == 'IMG' || (e.nodeName == 'A' && dom.hasClass(e, 'mceItemAnchor'))) { - t.selection.getSel().setBaseAndExtent(e, 0, e, 1); - t.nodeChanged(); - } - }); - } - - // Add node change handlers - t.onMouseUp.add(t.nodeChanged); - //t.onClick.add(t.nodeChanged); - t.onKeyUp.add(function(ed, e) { - var c = e.keyCode; - - if ((c >= 33 && c <= 36) || (c >= 37 && c <= 40) || c == 13 || c == 45 || c == 46 || c == 8 || (tinymce.isMac && (c == 91 || c == 93)) || e.ctrlKey) - t.nodeChanged(); - }); - - // Add reset handler - t.onReset.add(function() { - t.setContent(t.startContent, {format : 'raw'}); - }); - - // Add shortcuts - if (s.custom_shortcuts) { - if (s.custom_undo_redo_keyboard_shortcuts) { - t.addShortcut('ctrl+z', t.getLang('undo_desc'), 'Undo'); - t.addShortcut('ctrl+y', t.getLang('redo_desc'), 'Redo'); - } - - // Add default shortcuts for gecko - t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold'); - t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic'); - t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline'); - - // BlockFormat shortcuts keys - for (i=1; i<=6; i++) - t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, 'h' + i]); - - t.addShortcut('ctrl+7', '', ['FormatBlock', false, '

    ']); - t.addShortcut('ctrl+8', '', ['FormatBlock', false, '

    ']); - t.addShortcut('ctrl+9', '', ['FormatBlock', false, '
    ']); - - function find(e) { - var v = null; - - if (!e.altKey && !e.ctrlKey && !e.metaKey) - return v; - - each(t.shortcuts, function(o) { - if (tinymce.isMac && o.ctrl != e.metaKey) - return; - else if (!tinymce.isMac && o.ctrl != e.ctrlKey) - return; - - if (o.alt != e.altKey) - return; - - if (o.shift != e.shiftKey) - return; - - if (e.keyCode == o.keyCode || (e.charCode && e.charCode == o.charCode)) { - v = o; - return false; - } - }); - - return v; - }; - - t.onKeyUp.add(function(ed, e) { - var o = find(e); - - if (o) - return Event.cancel(e); - }); - - t.onKeyPress.add(function(ed, e) { - var o = find(e); - - if (o) - return Event.cancel(e); - }); - - t.onKeyDown.add(function(ed, e) { - var o = find(e); - - if (o) { - o.func.call(o.scope); - return Event.cancel(e); - } - }); - } - - if (tinymce.isIE) { - // Fix so resize will only update the width and height attributes not the styles of an image - // It will also block mceItemNoResize items - dom.bind(t.getDoc(), 'controlselect', function(e) { - var re = t.resizeInfo, cb; - - e = e.target; - - // Don't do this action for non image elements - if (e.nodeName !== 'IMG') - return; - - if (re) - dom.unbind(re.node, re.ev, re.cb); - - if (!dom.hasClass(e, 'mceItemNoResize')) { - ev = 'resizeend'; - cb = dom.bind(e, ev, function(e) { - var v; - - e = e.target; - - if (v = dom.getStyle(e, 'width')) { - dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, '')); - dom.setStyle(e, 'width', ''); - } - - if (v = dom.getStyle(e, 'height')) { - dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, '')); - dom.setStyle(e, 'height', ''); - } - }); - } else { - ev = 'resizestart'; - cb = dom.bind(e, 'resizestart', Event.cancel, Event); - } - - re = t.resizeInfo = { - node : e, - ev : ev, - cb : cb - }; - }); - - t.onKeyDown.add(function(ed, e) { - switch (e.keyCode) { - case 8: - // Fix IE control + backspace browser bug - if (t.selection.getRng().item) { - ed.dom.remove(t.selection.getRng().item(0)); - return Event.cancel(e); - } - } - }); - - /*if (t.dom.boxModel) { - t.getBody().style.height = '100%'; - - Event.add(t.getWin(), 'resize', function(e) { - var docElm = t.getDoc().documentElement; - - docElm.style.height = (docElm.offsetHeight - 10) + 'px'; - }); - }*/ - } - - if (tinymce.isOpera) { - t.onClick.add(function(ed, e) { - Event.prevent(e); - }); - } - - // Add custom undo/redo handlers - if (s.custom_undo_redo) { - function addUndo() { - t.undoManager.typing = 0; - t.undoManager.add(); - }; - - dom.bind(t.getDoc(), 'focusout', function(e) { - if (!t.removed && t.undoManager.typing) - addUndo(); - }); - - t.onKeyUp.add(function(ed, e) { - if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey) - addUndo(); - }); - - t.onKeyDown.add(function(ed, e) { - var rng, parent, bookmark; - - // IE has a really odd bug where the DOM might include an node that doesn't have - // a proper structure. If you try to access nodeValue it would throw an illegal value exception. - // This seems to only happen when you delete contents and it seems to be avoidable if you refresh the element - // after you delete contents from it. See: #3008923 - if (isIE && e.keyCode == 46) { - rng = t.selection.getRng(); - - if (rng.parentElement) { - parent = rng.parentElement(); - - // Select next word when ctrl key is used in combo with delete - if (e.ctrlKey) { - rng.moveEnd('word', 1); - rng.select(); - } - - // Delete contents - t.selection.getSel().clear(); - - // Check if we are within the same parent - if (rng.parentElement() == parent) { - bookmark = t.selection.getBookmark(); - - try { - // Update the HTML and hopefully it will remove the artifacts - parent.innerHTML = parent.innerHTML; - } catch (ex) { - // And since it's IE it can sometimes produce an unknown runtime error - } - - // Restore the caret position - t.selection.moveToBookmark(bookmark); - } - - // Block the default delete behavior since it might be broken - e.preventDefault(); - return; - } - } - - // Is caracter positon keys - if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45) { - if (t.undoManager.typing) - addUndo(); - - return; - } - - if (!t.undoManager.typing) { - t.undoManager.add(); - t.undoManager.typing = 1; - } - }); - - t.onMouseDown.add(function() { - if (t.undoManager.typing) - addUndo(); - }); - } - }, - - _isHidden : function() { - var s; - - if (!isGecko) - return 0; - - // Weird, wheres that cursor selection? - s = this.selection.getSel(); - return (!s || !s.rangeCount || s.rangeCount == 0); - }, - - // Fix for bug #1867292 - _fixNesting : function(s) { - var d = [], i; - - s = s.replace(/<(\/)?([^\s>]+)[^>]*?>/g, function(a, b, c) { - var e; - - // Handle end element - if (b === '/') { - if (!d.length) - return ''; - - if (c !== d[d.length - 1].tag) { - for (i=d.length - 1; i>=0; i--) { - if (d[i].tag === c) { - d[i].close = 1; - break; - } - } - - return ''; - } else { - d.pop(); - - if (d.length && d[d.length - 1].close) { - a = a + ''; - d.pop(); - } - } - } else { - // Ignore these - if (/^(br|hr|input|meta|img|link|param)$/i.test(c)) - return a; - - // Ignore closed ones - if (/\/>$/.test(a)) - return a; - - d.push({tag : c}); // Push start element - } - - return a; - }); - - // End all open tags - for (i=d.length - 1; i>=0; i--) - s += ''; - - return s; - } - }); -})(tinymce); +/** + * Editor.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + // Shorten these names + var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, + Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isGecko = tinymce.isGecko, + isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, is = tinymce.is, + ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, + inArray = tinymce.inArray, grep = tinymce.grep, explode = tinymce.explode; + + /** + * This class contains the core logic for a TinyMCE editor. + * + * @class tinymce.Editor + * @example + * // Add a class to all paragraphs in the editor. + * tinyMCE.activeEditor.dom.addClass(tinyMCE.activeEditor.dom.select('p'), 'someclass'); + * + * // Gets the current editors selection as text + * tinyMCE.activeEditor.selection.getContent({format : 'text'}); + * + * // Creates a new editor instance + * var ed = new tinymce.Editor('textareaid', { + * some_setting : 1 + * }); + * + * // Select each item the user clicks on + * ed.onClick.add(function(ed, e) { + * ed.selection.select(e.target); + * }); + * + * ed.render(); + */ + tinymce.create('tinymce.Editor', { + /** + * Constructs a editor instance by id. + * + * @constructor + * @method Editor + * @param {String} id Unique id for the editor. + * @param {Object} s Optional settings string for the editor. + * @author Moxiecode + */ + Editor : function(id, s) { + var t = this; + + /** + * Editor instance id, normally the same as the div/textarea that was replaced. + * + * @property id + * @type String + */ + t.id = t.editorId = id; + + t.execCommands = {}; + t.queryStateCommands = {}; + t.queryValueCommands = {}; + + /** + * State to force the editor to return false on a isDirty call. + * + * @property isNotDirty + * @type Boolean + * @example + * function ajaxSave() { + * var ed = tinyMCE.get('elm1'); + * + * // Save contents using some XHR call + * alert(ed.getContent()); + * + * ed.isNotDirty = 1; // Force not dirty state + * } + */ + t.isNotDirty = false; + + /** + * Name/Value object containting plugin instances. + * + * @property plugins + * @type Object + * @example + * // Execute a method inside a plugin directly + * tinyMCE.activeEditor.plugins.someplugin.someMethod(); + */ + t.plugins = {}; + + // Add events to the editor + each([ + /** + * Fires before the initialization of the editor. + * + * @event onPreInit + * @param {tinymce.Editor} sender Editor instance. + * @see #onInit + * @example + * // Adds an observer to the onPreInit event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onPreInit.add(function(ed) { + * console.debug('PreInit: ' + ed.id); + * }); + * } + * }); + */ + 'onPreInit', + + /** + * Fires before the initialization of the editor. + * + * @event onBeforeRenderUI + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onBeforeRenderUI event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onBeforeRenderUI.add(function(ed, cm) { + * console.debug('Before render: ' + ed.id); + * }); + * } + * }); + */ + 'onBeforeRenderUI', + + /** + * Fires after the rendering has completed. + * + * @event onPostRender + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onPostRender event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onPostRender.add(function(ed, cm) { + * console.debug('After render: ' + ed.id); + * }); + * } + * }); + */ + 'onPostRender', + + /** + * Fires after the initialization of the editor is done. + * + * @event onInit + * @param {tinymce.Editor} sender Editor instance. + * @see #onPreInit + * @example + * // Adds an observer to the onInit event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onInit.add(function(ed) { + * console.debug('Editor is done: ' + ed.id); + * }); + * } + * }); + */ + 'onInit', + + /** + * Fires when the editor instance is removed from page. + * + * @event onRemove + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onRemove event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onRemove.add(function(ed) { + * console.debug('Editor was removed: ' + ed.id); + * }); + * } + * }); + */ + 'onRemove', + + /** + * Fires when the editor is activated. + * + * @event onActivate + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onActivate event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onActivate.add(function(ed) { + * console.debug('Editor was activated: ' + ed.id); + * }); + * } + * }); + */ + 'onActivate', + + /** + * Fires when the editor is deactivated. + * + * @event onDeactivate + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onDeactivate event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onDeactivate.add(function(ed) { + * console.debug('Editor was deactivated: ' + ed.id); + * }); + * } + * }); + */ + 'onDeactivate', + + /** + * Fires when something in the body of the editor is clicked. + * + * @event onClick + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onClick event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onClick.add(function(ed, e) { + * console.debug('Editor was clicked: ' + e.target.nodeName); + * }); + * } + * }); + */ + 'onClick', + + /** + * Fires when a registered event is intercepted. + * + * @event onEvent + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onEvent event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onEvent.add(function(ed, e) { + * console.debug('Editor event occured: ' + e.target.nodeName); + * }); + * } + * }); + */ + 'onEvent', + + /** + * Fires when a mouseup event is intercepted inside the editor. + * + * @event onMouseUp + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onMouseUp event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onMouseUp.add(function(ed, e) { + * console.debug('Mouse up event: ' + e.target.nodeName); + * }); + * } + * }); + */ + 'onMouseUp', + + /** + * Fires when a mousedown event is intercepted inside the editor. + * + * @event onMouseDown + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onMouseDown event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onMouseDown.add(function(ed, e) { + * console.debug('Mouse down event: ' + e.target.nodeName); + * }); + * } + * }); + */ + 'onMouseDown', + + /** + * Fires when a dblclick event is intercepted inside the editor. + * + * @event onDblClick + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onDblClick event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onDblClick.add(function(ed, e) { + * console.debug('Double click event: ' + e.target.nodeName); + * }); + * } + * }); + */ + 'onDblClick', + + /** + * Fires when a keydown event is intercepted inside the editor. + * + * @event onKeyDown + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onKeyDown event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onKeyDown.add(function(ed, e) { + * console.debug('Key down event: ' + e.keyCode); + * }); + * } + * }); + */ + 'onKeyDown', + + /** + * Fires when a keydown event is intercepted inside the editor. + * + * @event onKeyUp + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onKeyUp event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onKeyUp.add(function(ed, e) { + * console.debug('Key up event: ' + e.keyCode); + * }); + * } + * }); + */ + 'onKeyUp', + + /** + * Fires when a keypress event is intercepted inside the editor. + * + * @event onKeyPress + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onKeyPress event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onKeyPress.add(function(ed, e) { + * console.debug('Key press event: ' + e.keyCode); + * }); + * } + * }); + */ + 'onKeyPress', + + /** + * Fires when a contextmenu event is intercepted inside the editor. + * + * @event onContextMenu + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onContextMenu event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onContextMenu.add(function(ed, e) { + * console.debug('Context menu event:' + e.target); + * }); + * } + * }); + */ + 'onContextMenu', + + /** + * Fires when a form submit event is intercepted. + * + * @event onSubmit + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onSubmit event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onSubmit.add(function(ed, e) { + * console.debug('Form submit:' + e.target); + * }); + * } + * }); + */ + 'onSubmit', + + /** + * Fires when a form reset event is intercepted. + * + * @event onReset + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onReset event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onReset.add(function(ed, e) { + * console.debug('Form reset:' + e.target); + * }); + * } + * }); + */ + 'onReset', + + /** + * Fires when a paste event is intercepted inside the editor. + * + * @event onPaste + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onPaste event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onPaste.add(function(ed, e) { + * console.debug('Pasted plain text'); + * }); + * } + * }); + */ + 'onPaste', + + /** + * Fires when the Serializer does a preProcess on the contents. + * + * @event onPreProcess + * @param {tinymce.Editor} sender Editor instance. + * @param {Object} obj PreProcess object. + * @option {Node} node DOM node for the item being serialized. + * @option {String} format The specified output format normally "html". + * @option {Boolean} get Is true if the process is on a getContent operation. + * @option {Boolean} set Is true if the process is on a setContent operation. + * @option {Boolean} cleanup Is true if the process is on a cleanup operation. + * @example + * // Adds an observer to the onPreProcess event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onPreProcess.add(function(ed, o) { + * // Add a class to each paragraph in the editor + * ed.dom.addClass(ed.dom.select('p', o.node), 'myclass'); + * }); + * } + * }); + */ + 'onPreProcess', + + /** + * Fires when the Serializer does a postProcess on the contents. + * + * @event onPostProcess + * @param {tinymce.Editor} sender Editor instance. + * @param {Object} obj PreProcess object. + * @example + * // Adds an observer to the onPostProcess event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onPostProcess.add(function(ed, o) { + * // Remove all paragraphs and replace with BR + * o.content = o.content.replace(/]+>|

    /g, ''); + * o.content = o.content.replace(/<\/p>/g, '
    '); + * }); + * } + * }); + */ + 'onPostProcess', + + /** + * Fires before new contents is added to the editor. Using for example setContent. + * + * @event onBeforeSetContent + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onBeforeSetContent event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onBeforeSetContent.add(function(ed, o) { + * // Replaces all a characters with b characters + * o.content = o.content.replace(/a/g, 'b'); + * }); + * } + * }); + */ + 'onBeforeSetContent', + + /** + * Fires before contents is extracted from the editor using for example getContent. + * + * @event onBeforeGetContent + * @param {tinymce.Editor} sender Editor instance. + * @param {Event} evt W3C DOM Event instance. + * @example + * // Adds an observer to the onBeforeGetContent event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onBeforeGetContent.add(function(ed, o) { + * console.debug('Before get content.'); + * }); + * } + * }); + */ + 'onBeforeGetContent', + + /** + * Fires after the contents has been added to the editor using for example onSetContent. + * + * @event onSetContent + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onSetContent event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onSetContent.add(function(ed, o) { + * // Replaces all a characters with b characters + * o.content = o.content.replace(/a/g, 'b'); + * }); + * } + * }); + */ + 'onSetContent', + + /** + * Fires after the contents has been extracted from the editor using for example getContent. + * + * @event onGetContent + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onGetContent event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onGetContent.add(function(ed, o) { + * // Replace all a characters with b + * o.content = o.content.replace(/a/g, 'b'); + * }); + * } + * }); + */ + 'onGetContent', + + /** + * Fires when the editor gets loaded with contents for example when the load method is executed. + * + * @event onLoadContent + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onLoadContent event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onLoadContent.add(function(ed, o) { + * // Output the element name + * console.debug(o.element.nodeName); + * }); + * } + * }); + */ + 'onLoadContent', + + /** + * Fires when the editor contents gets saved for example when the save method is executed. + * + * @event onSaveContent + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onSaveContent event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onSaveContent.add(function(ed, o) { + * // Output the element name + * console.debug(o.element.nodeName); + * }); + * } + * }); + */ + 'onSaveContent', + + /** + * Fires when the user changes node location using the mouse or keyboard. + * + * @event onNodeChange + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onNodeChange event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onNodeChange.add(function(ed, cm, e) { + * // Activates the link button when the caret is placed in a anchor element + * if (e.nodeName == 'A') + * cm.setActive('link', true); + * }); + * } + * }); + */ + 'onNodeChange', + + /** + * Fires when a new undo level is added to the editor. + * + * @event onChange + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onChange event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onChange.add(function(ed, l) { + * console.debug('Editor contents was modified. Contents: ' + l.content); + * }); + * } + * }); + */ + 'onChange', + + /** + * Fires before a command gets executed for example "Bold". + * + * @event onBeforeExecCommand + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onBeforeExecCommand event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) { + * console.debug('Command is to be executed: ' + cmd); + * }); + * } + * }); + */ + 'onBeforeExecCommand', + + /** + * Fires after a command is executed for example "Bold". + * + * @event onExecCommand + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onExecCommand event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onExecCommand.add(function(ed, cmd, ui, val) { + * console.debug('Command was executed: ' + cmd); + * }); + * } + * }); + */ + 'onExecCommand', + + /** + * Fires when the contents is undo:ed. + * + * @event onUndo + * @param {tinymce.Editor} sender Editor instance. + * @param {Object} level Undo level object. + * @ example + * // Adds an observer to the onUndo event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onUndo.add(function(ed, level) { + * console.debug('Undo was performed: ' + level.content); + * }); + * } + * }); + */ + 'onUndo', + + /** + * Fires when the contents is redo:ed. + * + * @event onRedo + * @param {tinymce.Editor} sender Editor instance. + * @param {Object} level Undo level object. + * @example + * // Adds an observer to the onRedo event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onRedo.add(function(ed, level) { + * console.debug('Redo was performed: ' +level.content); + * }); + * } + * }); + */ + 'onRedo', + + /** + * Fires when visual aids is enabled/disabled. + * + * @event onVisualAid + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onVisualAid event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onVisualAid.add(function(ed, e, s) { + * console.debug('onVisualAid event: ' + ed.id + ", State: " + s); + * }); + * } + * }); + */ + 'onVisualAid', + + /** + * Fires when the progress throbber is shown above the editor. + * + * @event onSetProgressState + * @param {tinymce.Editor} sender Editor instance. + * @example + * // Adds an observer to the onSetProgressState event using tinyMCE.init + * tinyMCE.init({ + * ... + * setup : function(ed) { + * ed.onSetProgressState.add(function(ed, b) { + * if (b) + * console.debug('SHOW!'); + * else + * console.debug('HIDE!'); + * }); + * } + * }); + */ + 'onSetProgressState' + ], function(e) { + t[e] = new Dispatcher(t); + }); + + /** + * Name/value collection with editor settings. + * + * @property settings + * @type Object + * @example + * // Get the value of the theme setting + * tinyMCE.activeEditor.windowManager.alert("You are using the " + tinyMCE.activeEditor.settings.theme + " theme"); + */ + t.settings = s = extend({ + id : id, + language : 'en', + docs_language : 'en', + theme : 'simple', + skin : 'default', + delta_width : 0, + delta_height : 0, + popup_css : '', + plugins : '', + document_base_url : tinymce.documentBaseURL, + add_form_submit_trigger : 1, + submit_patch : 1, + add_unload_trigger : 1, + convert_urls : 1, + relative_urls : 1, + remove_script_host : 1, + table_inline_editing : 0, + object_resizing : 1, + cleanup : 1, + accessibility_focus : 1, + custom_shortcuts : 1, + custom_undo_redo_keyboard_shortcuts : 1, + custom_undo_redo_restore_selection : 1, + custom_undo_redo : 1, + doctype : tinymce.isIE6 ? '' : '', // Use old doctype on IE 6 to avoid horizontal scroll + visual_table_class : 'mceItemTable', + visual : 1, + font_size_style_values : 'xx-small,x-small,small,medium,large,x-large,xx-large', + apply_source_formatting : 1, + directionality : 'ltr', + forced_root_block : 'p', + hidden_input : 1, + padd_empty_editor : 1, + render_ui : 1, + init_theme : 1, + force_p_newlines : 1, + indentation : '30px', + keep_styles : 1, + fix_table_elements : 1, + inline_styles : 1, + convert_fonts_to_spans : true, + indent : 'simple', + indent_before : 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr', + indent_after : 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr', + validate : true, + entity_encoding : 'named', + url_converter : t.convertURL, + url_converter_scope : t, + ie7_compat : true + }, s); + + /** + * URI object to document configured for the TinyMCE instance. + * + * @property documentBaseURI + * @type tinymce.util.URI + * @example + * // Get relative URL from the location of document_base_url + * tinyMCE.activeEditor.documentBaseURI.toRelative('/somedir/somefile.htm'); + * + * // Get absolute URL from the location of document_base_url + * tinyMCE.activeEditor.documentBaseURI.toAbsolute('somefile.htm'); + */ + t.documentBaseURI = new tinymce.util.URI(s.document_base_url || tinymce.documentBaseURL, { + base_uri : tinyMCE.baseURI + }); + + /** + * URI object to current document that holds the TinyMCE editor instance. + * + * @property baseURI + * @type tinymce.util.URI + * @example + * // Get relative URL from the location of the API + * tinyMCE.activeEditor.baseURI.toRelative('/somedir/somefile.htm'); + * + * // Get absolute URL from the location of the API + * tinyMCE.activeEditor.baseURI.toAbsolute('somefile.htm'); + */ + t.baseURI = tinymce.baseURI; + + /** + * Array with CSS files to load into the iframe. + * + * @property contentCSS + * @type Array + */ + t.contentCSS = []; + + // Call setup + t.execCallback('setup', t); + }, + + /** + * Renderes the editor/adds it to the page. + * + * @method render + */ + render : function(nst) { + var t = this, s = t.settings, id = t.id, sl = tinymce.ScriptLoader; + + // Page is not loaded yet, wait for it + if (!Event.domLoaded) { + Event.add(document, 'init', function() { + t.render(); + }); + return; + } + + tinyMCE.settings = s; + + // Element not found, then skip initialization + if (!t.getElement()) + return; + + // Is a iPad/iPhone and not on iOS5, then skip initialization. We need to sniff + // here since the browser says it has contentEditable support but there is no visible + // caret We will remove this check ones Apple implements full contentEditable support + if (tinymce.isIDevice && !tinymce.isIOS5) + return; + + // Add hidden input for non input elements inside form elements + if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) && s.hidden_input && DOM.getParent(id, 'form')) + DOM.insertAfter(DOM.create('input', {type : 'hidden', name : id}), id); + + /** + * Window manager reference, use this to open new windows and dialogs. + * + * @property windowManager + * @type tinymce.WindowManager + * @example + * // Shows an alert message + * tinyMCE.activeEditor.windowManager.alert('Hello world!'); + * + * // Opens a new dialog with the file.htm file and the size 320x240 + * // It also adds a custom parameter this can be retrieved by using tinyMCEPopup.getWindowArg inside the dialog. + * tinyMCE.activeEditor.windowManager.open({ + * url : 'file.htm', + * width : 320, + * height : 240 + * }, { + * custom_param : 1 + * }); + */ + if (tinymce.WindowManager) + t.windowManager = new tinymce.WindowManager(t); + + if (s.encoding == 'xml') { + t.onGetContent.add(function(ed, o) { + if (o.save) + o.content = DOM.encode(o.content); + }); + } + + if (s.add_form_submit_trigger) { + t.onSubmit.addToTop(function() { + if (t.initialized) { + t.save(); + t.isNotDirty = 1; + } + }); + } + + if (s.add_unload_trigger) { + t._beforeUnload = tinyMCE.onBeforeUnload.add(function() { + if (t.initialized && !t.destroyed && !t.isHidden()) + t.save({format : 'raw', no_events : true}); + }); + } + + tinymce.addUnload(t.destroy, t); + + if (s.submit_patch) { + t.onBeforeRenderUI.add(function() { + var n = t.getElement().form; + + if (!n) + return; + + // Already patched + if (n._mceOldSubmit) + return; + + // Check page uses id="submit" or name="submit" for it's submit button + if (!n.submit.nodeType && !n.submit.length) { + t.formElement = n; + n._mceOldSubmit = n.submit; + n.submit = function() { + // Save all instances + tinymce.triggerSave(); + t.isNotDirty = 1; + + return t.formElement._mceOldSubmit(t.formElement); + }; + } + + n = null; + }); + } + + // Load scripts + function loadScripts() { + if (s.language && s.language_load !== false) + sl.add(tinymce.baseURL + '/langs/' + s.language + '.js'); + + if (s.theme && s.theme.charAt(0) != '-' && !ThemeManager.urls[s.theme]) + ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js'); + + each(explode(s.plugins), function(p) { + if (p &&!PluginManager.urls[p]) { + if (p.charAt(0) == '-') { + p = p.substr(1, p.length); + var dependencies = PluginManager.dependencies(p); + each(dependencies, function(dep) { + var defaultSettings = {prefix:'plugins/', resource: dep, suffix:'/editor_plugin' + tinymce.suffix + '.js'}; + var dep = PluginManager.createUrl(defaultSettings, dep); + PluginManager.load(dep.resource, dep); + + }); + } else { + // Skip safari plugin, since it is removed as of 3.3b1 + if (p == 'safari') { + return; + } + PluginManager.load(p, {prefix:'plugins/', resource: p, suffix:'/editor_plugin' + tinymce.suffix + '.js'}); + } + } + }); + + // Init when que is loaded + sl.loadQueue(function() { + if (!t.removed) + t.init(); + }); + }; + + loadScripts(); + }, + + /** + * Initializes the editor this will be called automatically when + * all plugins/themes and language packs are loaded by the rendered method. + * This method will setup the iframe and create the theme and plugin instances. + * + * @method init + */ + init : function() { + var n, t = this, s = t.settings, w, h, e = t.getElement(), o, ti, u, bi, bc, re, i, initializedPlugins = []; + + tinymce.add(t); + + s.aria_label = s.aria_label || DOM.getAttrib(e, 'aria-label', t.getLang('aria.rich_text_area')); + + /** + * Reference to the theme instance that was used to generate the UI. + * + * @property theme + * @type tinymce.Theme + * @example + * // Executes a method on the theme directly + * tinyMCE.activeEditor.theme.someMethod(); + */ + if (s.theme) { + s.theme = s.theme.replace(/-/, ''); + o = ThemeManager.get(s.theme); + t.theme = new o(); + + if (t.theme.init && s.init_theme) + t.theme.init(t, ThemeManager.urls[s.theme] || tinymce.documentBaseURL.replace(/\/$/, '')); + } + function initPlugin(p) { + var c = PluginManager.get(p), u = PluginManager.urls[p] || tinymce.documentBaseURL.replace(/\/$/, ''), po; + if (c && tinymce.inArray(initializedPlugins,p) === -1) { + each(PluginManager.dependencies(p), function(dep){ + initPlugin(dep); + }); + po = new c(t, u); + + t.plugins[p] = po; + + if (po.init) { + po.init(t, u); + initializedPlugins.push(p); + } + } + } + + // Create all plugins + each(explode(s.plugins.replace(/\-/g, '')), initPlugin); + + // Setup popup CSS path(s) + if (s.popup_css !== false) { + if (s.popup_css) + s.popup_css = t.documentBaseURI.toAbsolute(s.popup_css); + else + s.popup_css = t.baseURI.toAbsolute("themes/" + s.theme + "/skins/" + s.skin + "/dialog.css"); + } + + if (s.popup_css_add) + s.popup_css += ',' + t.documentBaseURI.toAbsolute(s.popup_css_add); + + /** + * Control manager instance for the editor. Will enables you to create new UI elements and change their states etc. + * + * @property controlManager + * @type tinymce.ControlManager + * @example + * // Disables the bold button + * tinyMCE.activeEditor.controlManager.setDisabled('bold', true); + */ + t.controlManager = new tinymce.ControlManager(t); + + if (s.custom_undo_redo) { + t.onBeforeExecCommand.add(function(ed, cmd, ui, val, a) { + if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo)) + t.undoManager.beforeChange(); + }); + + t.onExecCommand.add(function(ed, cmd, ui, val, a) { + if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo)) + t.undoManager.add(); + }); + } + + t.onExecCommand.add(function(ed, c) { + // Don't refresh the select lists until caret move + if (!/^(FontName|FontSize)$/.test(c)) + t.nodeChanged(); + }); + + // Remove ghost selections on images and tables in Gecko + if (isGecko) { + function repaint(a, o) { + if (!o || !o.initial) + t.execCommand('mceRepaint'); + }; + + t.onUndo.add(repaint); + t.onRedo.add(repaint); + t.onSetContent.add(repaint); + } + + // Enables users to override the control factory + t.onBeforeRenderUI.dispatch(t, t.controlManager); + + // Measure box + if (s.render_ui) { + w = s.width || e.style.width || e.offsetWidth; + h = s.height || e.style.height || e.offsetHeight; + t.orgDisplay = e.style.display; + re = /^[0-9\.]+(|px)$/i; + + if (re.test('' + w)) + w = Math.max(parseInt(w) + (o.deltaWidth || 0), 100); + + if (re.test('' + h)) + h = Math.max(parseInt(h) + (o.deltaHeight || 0), 100); + + // Render UI + o = t.theme.renderUI({ + targetNode : e, + width : w, + height : h, + deltaWidth : s.delta_width, + deltaHeight : s.delta_height + }); + + t.editorContainer = o.editorContainer; + } + + // #ifdef contentEditable + + // Content editable mode ends here + if (s.content_editable) { + e = n = o = null; // Fix IE leak + return t.setupContentEditable(); + } + + // #endif + + // User specified a document.domain value + if (document.domain && location.hostname != document.domain) + tinymce.relaxedDomain = document.domain; + + // Resize editor + DOM.setStyles(o.sizeContainer || o.editorContainer, { + width : w, + height : h + }); + + // Load specified content CSS last + if (s.content_css) { + tinymce.each(explode(s.content_css), function(u) { + t.contentCSS.push(t.documentBaseURI.toAbsolute(u)); + }); + } + + h = (o.iframeHeight || h) + (typeof(h) == 'number' ? (o.deltaHeight || 0) : ''); + if (h < 100) + h = 100; + + t.iframeHTML = s.doctype + ''; + + // We only need to override paths if we have to + // IE has a bug where it remove site absolute urls to relative ones if this is specified + if (s.document_base_url != tinymce.documentBaseURL) + t.iframeHTML += ''; + + // IE8 doesn't support carets behind images setting ie7_compat would force IE8+ to run in IE7 compat mode. + if (s.ie7_compat) + t.iframeHTML += ''; + else + t.iframeHTML += ''; + + t.iframeHTML += ''; + + // Firefox 2 doesn't load stylesheets correctly this way + if (!isGecko || !/Firefox\/2/.test(navigator.userAgent)) { + for (i = 0; i < t.contentCSS.length; i++) + t.iframeHTML += ''; + + t.contentCSS = []; + } + + bi = s.body_id || 'tinymce'; + if (bi.indexOf('=') != -1) { + bi = t.getParam('body_id', '', 'hash'); + bi = bi[t.id] || bi; + } + + bc = s.body_class || ''; + if (bc.indexOf('=') != -1) { + bc = t.getParam('body_class', '', 'hash'); + bc = bc[t.id] || ''; + } + + t.iframeHTML += ''; + + // Domain relaxing enabled, then set document domain + if (tinymce.relaxedDomain && (isIE || (tinymce.isOpera && parseFloat(opera.version()) < 11))) { + // We need to write the contents here in IE since multiple writes messes up refresh button and back button + u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + t.id + '");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'; + } + + // Create iframe + // TODO: ACC add the appropriate description on this. + n = DOM.add(o.iframeContainer, 'iframe', { + id : t.id + "_ifr", + src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7 + frameBorder : '0', + allowTransparency : "true", + title : s.aria_label, + style : { + width : '100%', + height : h + } + }); + + t.contentAreaContainer = o.iframeContainer; + DOM.get(o.editorContainer).style.display = t.orgDisplay; + DOM.get(t.id).style.display = 'none'; + DOM.setAttrib(t.id, 'aria-hidden', true); + + if (!tinymce.relaxedDomain || !u) + t.setupIframe(); + + e = n = o = null; // Cleanup + }, + + /** + * This method get called by the init method ones the iframe is loaded. + * It will fill the iframe with contents, setups DOM and selection objects for the iframe. + * This method should not be called directly. + * + * @method setupIframe + */ + setupIframe : function(filled) { + var t = this, s = t.settings, e = DOM.get(t.id), d = t.getDoc(), h, b; + + // Setup iframe body + if ((!isIE || !tinymce.relaxedDomain) && !filled) { + // We need to wait for the load event on Gecko + if (isGecko && !s.readonly) { + t.getWin().addEventListener("DOMContentLoaded", function() { + window.setTimeout(function() { + var b = t.getBody(), undef; + + // Editable element needs to have some contents or backspace/delete won't work properly for some odd reason on FF 3.6 or older + b.innerHTML = '
    '; + + // Check if Gecko supports contentEditable mode FF2 doesn't + if (b.contentEditable !== undef) { + // Setting the contentEditable off/on seems to force caret mode in the editor and enabled auto focus + b.contentEditable = false; + b.contentEditable = true; + + // Caret doesn't get rendered when you mousedown on the HTML element on FF 3.x + t.onMouseDown.add(function(ed, e) { + if (e.target.nodeName === "HTML") { + // Setting the contentEditable off/on seems to force caret mode in the editor and enabled auto focus + b.contentEditable = false; + b.contentEditable = true; + + d.designMode = 'on'; // Render the caret + + // Remove design mode again after a while so it has some time to execute + window.setTimeout(function() { + d.designMode = 'off'; + t.getBody().focus(); + }, 1); + } + }); + } else + d.designMode = 'on'; + + // Call setup frame once the contentEditable/designMode has been initialized + // since the caret won't be rendered some times otherwise. + t.setupIframe(true); + }, 1); + }, false); + } + + d.open(); + d.write(t.iframeHTML); + d.close(); + + if (tinymce.relaxedDomain) + d.domain = tinymce.relaxedDomain; + + // Wait for iframe onload event on Gecko + if (isGecko && !s.readonly) + return; + } + + // It will not steal focus while setting contentEditable + b = t.getBody(); + b.disabled = true; + + if (!isGecko && !s.readonly) + b.contentEditable = true; + + b.disabled = false; + + /** + * Schema instance, enables you to validate elements and it's children. + * + * @property schema + * @type tinymce.html.Schema + */ + t.schema = new tinymce.html.Schema(s); + + /** + * DOM instance for the editor. + * + * @property dom + * @type tinymce.dom.DOMUtils + * @example + * // Adds a class to all paragraphs within the editor + * tinyMCE.activeEditor.dom.addClass(tinyMCE.activeEditor.dom.select('p'), 'someclass'); + */ + t.dom = new tinymce.dom.DOMUtils(t.getDoc(), { + keep_values : true, + url_converter : t.convertURL, + url_converter_scope : t, + hex_colors : s.force_hex_style_colors, + class_filter : s.class_filter, + update_styles : 1, + fix_ie_paragraphs : 1, + schema : t.schema + }); + + /** + * HTML parser will be used when contents is inserted into the editor. + * + * @property parser + * @type tinymce.html.DomParser + */ + t.parser = new tinymce.html.DomParser(s, t.schema); + + // Force anchor names closed, unless the setting "allow_html_in_named_anchor" is explicitly included. + if (!t.settings.allow_html_in_named_anchor) { + t.parser.addAttributeFilter('name', function(nodes, name) { + var i = nodes.length, sibling, prevSibling, parent, node; + + while (i--) { + node = nodes[i]; + if (node.name === 'a' && node.firstChild) { + parent = node.parent; + + // Move children after current node + sibling = node.lastChild; + do { + prevSibling = sibling.prev; + parent.insert(sibling, node); + sibling = prevSibling; + } while (sibling); + } + } + }); + } + + // Convert src and href into data-mce-src, data-mce-href and data-mce-style + t.parser.addAttributeFilter('src,href,style', function(nodes, name) { + var i = nodes.length, node, dom = t.dom, value, internalName; + + while (i--) { + node = nodes[i]; + value = node.attr(name); + internalName = 'data-mce-' + name; + + // Add internal attribute if we need to we don't on a refresh of the document + if (!node.attributes.map[internalName]) { + if (name === "style") + node.attr(internalName, dom.serializeStyle(dom.parseStyle(value), node.name)); + else + node.attr(internalName, t.convertURL(value, name, node.name)); + } + } + }); + + // Keep scripts from executing + t.parser.addNodeFilter('script', function(nodes, name) { + var i = nodes.length; + + while (i--) + nodes[i].attr('type', 'mce-text/javascript'); + }); + + t.parser.addNodeFilter('#cdata', function(nodes, name) { + var i = nodes.length, node; + + while (i--) { + node = nodes[i]; + node.type = 8; + node.name = '#comment'; + node.value = '[CDATA[' + node.value + ']]'; + } + }); + + t.parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', function(nodes, name) { + var i = nodes.length, node, nonEmptyElements = t.schema.getNonEmptyElements(); + + while (i--) { + node = nodes[i]; + + if (node.isEmpty(nonEmptyElements)) + node.empty().append(new tinymce.html.Node('br', 1)).shortEnded = true; + } + }); + + /** + * DOM serializer for the editor. Will be used when contents is extracted from the editor. + * + * @property serializer + * @type tinymce.dom.Serializer + * @example + * // Serializes the first paragraph in the editor into a string + * tinyMCE.activeEditor.serializer.serialize(tinyMCE.activeEditor.dom.select('p')[0]); + */ + t.serializer = new tinymce.dom.Serializer(s, t.dom, t.schema); + + /** + * Selection instance for the editor. + * + * @property selection + * @type tinymce.dom.Selection + * @example + * // Sets some contents to the current selection in the editor + * tinyMCE.activeEditor.selection.setContent('Some contents'); + * + * // Gets the current selection + * alert(tinyMCE.activeEditor.selection.getContent()); + * + * // Selects the first paragraph found + * tinyMCE.activeEditor.selection.select(tinyMCE.activeEditor.dom.select('p')[0]); + */ + t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer); + + /** + * Formatter instance. + * + * @property formatter + * @type tinymce.Formatter + */ + t.formatter = new tinymce.Formatter(this); + + // Register default formats + t.formatter.register({ + alignleft : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'}}, + {selector : 'img,table', collapsed : false, styles : {'float' : 'left'}} + ], + + aligncenter : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'}}, + {selector : 'img', collapsed : false, styles : {display : 'block', marginLeft : 'auto', marginRight : 'auto'}}, + {selector : 'table', collapsed : false, styles : {marginLeft : 'auto', marginRight : 'auto'}} + ], + + alignright : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}}, + {selector : 'img,table', collapsed : false, styles : {'float' : 'right'}} + ], + + alignfull : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'justify'}} + ], + + bold : [ + {inline : 'strong', remove : 'all'}, + {inline : 'span', styles : {fontWeight : 'bold'}}, + {inline : 'b', remove : 'all'} + ], + + italic : [ + {inline : 'em', remove : 'all'}, + {inline : 'span', styles : {fontStyle : 'italic'}}, + {inline : 'i', remove : 'all'} + ], + + underline : [ + {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}, + {inline : 'u', remove : 'all'} + ], + + strikethrough : [ + {inline : 'span', styles : {textDecoration : 'line-through'}, exact : true}, + {inline : 'strike', remove : 'all'} + ], + + forecolor : {inline : 'span', styles : {color : '%value'}, wrap_links : false}, + hilitecolor : {inline : 'span', styles : {backgroundColor : '%value'}, wrap_links : false}, + fontname : {inline : 'span', styles : {fontFamily : '%value'}}, + fontsize : {inline : 'span', styles : {fontSize : '%value'}}, + fontsize_class : {inline : 'span', attributes : {'class' : '%value'}}, + blockquote : {block : 'blockquote', wrapper : 1, remove : 'all'}, + subscript : {inline : 'sub'}, + superscript : {inline : 'sup'}, + + removeformat : [ + {selector : 'b,strong,em,i,font,u,strike', remove : 'all', split : true, expand : false, block_expand : true, deep : true}, + {selector : 'span', attributes : ['style', 'class'], remove : 'empty', split : true, expand : false, deep : true}, + {selector : '*', attributes : ['style', 'class'], split : false, expand : false, deep : true} + ] + }); + + // Register default block formats + each('p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp'.split(/\s/), function(name) { + t.formatter.register(name, {block : name, remove : 'all'}); + }); + + // Register user defined formats + t.formatter.register(t.settings.formats); + + /** + * Undo manager instance, responsible for handling undo levels. + * + * @property undoManager + * @type tinymce.UndoManager + * @example + * // Undoes the last modification to the editor + * tinyMCE.activeEditor.undoManager.undo(); + */ + t.undoManager = new tinymce.UndoManager(t); + + // Pass through + t.undoManager.onAdd.add(function(um, l) { + if (um.hasUndo()) + return t.onChange.dispatch(t, l, um); + }); + + t.undoManager.onUndo.add(function(um, l) { + return t.onUndo.dispatch(t, l, um); + }); + + t.undoManager.onRedo.add(function(um, l) { + return t.onRedo.dispatch(t, l, um); + }); + + t.forceBlocks = new tinymce.ForceBlocks(t, { + forced_root_block : s.forced_root_block + }); + + t.editorCommands = new tinymce.EditorCommands(t); + + // Pass through + t.serializer.onPreProcess.add(function(se, o) { + return t.onPreProcess.dispatch(t, o, se); + }); + + t.serializer.onPostProcess.add(function(se, o) { + return t.onPostProcess.dispatch(t, o, se); + }); + + t.onPreInit.dispatch(t); + + if (!s.gecko_spellcheck) + t.getBody().spellcheck = 0; + + if (!s.readonly) + t._addEvents(); + + t.controlManager.onPostRender.dispatch(t, t.controlManager); + t.onPostRender.dispatch(t); + + t.quirks = new tinymce.util.Quirks(this); + + if (s.directionality) + t.getBody().dir = s.directionality; + + if (s.nowrap) + t.getBody().style.whiteSpace = "nowrap"; + + if (s.handle_node_change_callback) { + t.onNodeChange.add(function(ed, cm, n) { + t.execCallback('handle_node_change_callback', t.id, n, -1, -1, true, t.selection.isCollapsed()); + }); + } + + if (s.save_callback) { + t.onSaveContent.add(function(ed, o) { + var h = t.execCallback('save_callback', t.id, o.content, t.getBody()); + + if (h) + o.content = h; + }); + } + + if (s.onchange_callback) { + t.onChange.add(function(ed, l) { + t.execCallback('onchange_callback', t, l); + }); + } + + if (s.protect) { + t.onBeforeSetContent.add(function(ed, o) { + if (s.protect) { + each(s.protect, function(pattern) { + o.content = o.content.replace(pattern, function(str) { + return ''; + }); + }); + } + }); + } + + if (s.convert_newlines_to_brs) { + t.onBeforeSetContent.add(function(ed, o) { + if (o.initial) + o.content = o.content.replace(/\r?\n/g, '
    '); + }); + } + + if (s.preformatted) { + t.onPostProcess.add(function(ed, o) { + o.content = o.content.replace(/^\s*/, ''); + o.content = o.content.replace(/<\/pre>\s*$/, ''); + + if (o.set) + o.content = '

    ' + o.content + '
    '; + }); + } + + if (s.verify_css_classes) { + t.serializer.attribValueFilter = function(n, v) { + var s, cl; + + if (n == 'class') { + // Build regexp for classes + if (!t.classesRE) { + cl = t.dom.getClasses(); + + if (cl.length > 0) { + s = ''; + + each (cl, function(o) { + s += (s ? '|' : '') + o['class']; + }); + + t.classesRE = new RegExp('(' + s + ')', 'gi'); + } + } + + return !t.classesRE || /(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v) || t.classesRE.test(v) ? v : ''; + } + + return v; + }; + } + + if (s.cleanup_callback) { + t.onBeforeSetContent.add(function(ed, o) { + o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); + }); + + t.onPreProcess.add(function(ed, o) { + if (o.set) + t.execCallback('cleanup_callback', 'insert_to_editor_dom', o.node, o); + + if (o.get) + t.execCallback('cleanup_callback', 'get_from_editor_dom', o.node, o); + }); + + t.onPostProcess.add(function(ed, o) { + if (o.set) + o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); + + if (o.get) + o.content = t.execCallback('cleanup_callback', 'get_from_editor', o.content, o); + }); + } + + if (s.save_callback) { + t.onGetContent.add(function(ed, o) { + if (o.save) + o.content = t.execCallback('save_callback', t.id, o.content, t.getBody()); + }); + } + + if (s.handle_event_callback) { + t.onEvent.add(function(ed, e, o) { + if (t.execCallback('handle_event_callback', e, ed, o) === false) + Event.cancel(e); + }); + } + + // Add visual aids when new contents is added + t.onSetContent.add(function() { + t.addVisual(t.getBody()); + }); + + // Remove empty contents + if (s.padd_empty_editor) { + t.onPostProcess.add(function(ed, o) { + o.content = o.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
    [\r\n]*)$/, ''); + }); + } + + if (isGecko) { + // Fix gecko link bug, when a link is placed at the end of block elements there is + // no way to move the caret behind the link. This fix adds a bogus br element after the link + function fixLinks(ed, o) { + each(ed.dom.select('a'), function(n) { + var pn = n.parentNode; + + if (ed.dom.isBlock(pn) && pn.lastChild === n) + ed.dom.add(pn, 'br', {'data-mce-bogus' : 1}); + }); + }; + + t.onExecCommand.add(function(ed, cmd) { + if (cmd === 'CreateLink') + fixLinks(ed); + }); + + t.onSetContent.add(t.selection.onSetContent.add(fixLinks)); + } + + t.load({initial : true, format : 'html'}); + t.startContent = t.getContent({format : 'raw'}); + t.undoManager.add(); + t.initialized = true; + + t.onInit.dispatch(t); + t.execCallback('setupcontent_callback', t.id, t.getBody(), t.getDoc()); + t.execCallback('init_instance_callback', t); + t.focus(true); + t.nodeChanged({initial : 1}); + + // Load specified content CSS last + each(t.contentCSS, function(u) { + t.dom.loadCSS(u); + }); + + // Handle auto focus + if (s.auto_focus) { + setTimeout(function () { + var ed = tinymce.get(s.auto_focus); + + ed.selection.select(ed.getBody(), 1); + ed.selection.collapse(1); + ed.getBody().focus(); + ed.getWin().focus(); + }, 100); + } + + e = null; + }, + + // #ifdef contentEditable + + /** + * Sets up the contentEditable mode. + * + * @method setupContentEditable + */ + setupContentEditable : function() { + var t = this, s = t.settings, e = t.getElement(); + + t.contentDocument = s.content_document || document; + t.contentWindow = s.content_window || window; + t.bodyElement = e; + + // Prevent leak in IE + s.content_document = s.content_window = null; + + DOM.hide(e); + e.contentEditable = t.getParam('content_editable_state', true); + DOM.show(e); + + if (!s.gecko_spellcheck) + t.getDoc().body.spellcheck = 0; + + // Setup objects + t.dom = new tinymce.dom.DOMUtils(t.getDoc(), { + keep_values : true, + url_converter : t.convertURL, + url_converter_scope : t, + hex_colors : s.force_hex_style_colors, + class_filter : s.class_filter, + root_element : t.id, + fix_ie_paragraphs : 1, + update_styles : 1 + }); + + t.serializer = new tinymce.dom.Serializer(s, t.dom, schema); + + t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer); + t.forceBlocks = new tinymce.ForceBlocks(t, { + forced_root_block : s.forced_root_block + }); + + t.editorCommands = new tinymce.EditorCommands(t); + + // Pass through + t.serializer.onPreProcess.add(function(se, o) { + return t.onPreProcess.dispatch(t, o, se); + }); + + t.serializer.onPostProcess.add(function(se, o) { + return t.onPostProcess.dispatch(t, o, se); + }); + + t.onPreInit.dispatch(t); + t._addEvents(); + + t.controlManager.onPostRender.dispatch(t, t.controlManager); + t.onPostRender.dispatch(t); + + t.onSetContent.add(function() { + t.addVisual(t.getBody()); + }); + + //t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')}); + t.startContent = t.getContent({format : 'raw'}); + t.undoManager.add({initial : true}); + t.initialized = true; + + t.onInit.dispatch(t); + t.focus(true); + t.nodeChanged({initial : 1}); + + // Load specified content CSS last + if (s.content_css) { + each(explode(s.content_css), function(u) { + t.dom.loadCSS(t.documentBaseURI.toAbsolute(u)); + }); + } + + if (isIE) { + // Store away selection + t.dom.bind(t.getElement(), 'beforedeactivate', function() { + t.lastSelectionBookmark = t.selection.getBookmark(1); + }); + + t.onBeforeExecCommand.add(function(ed, cmd, ui, val, o) { + if (!DOM.getParent(ed.selection.getStart(), function(n) {return n == ed.getBody();})) + o.terminate = 1; + + if (!DOM.getParent(ed.selection.getEnd(), function(n) {return n == ed.getBody();})) + o.terminate = 1; + }); + } + + e = null; // Cleanup + }, + + // #endif + + /** + * Focuses/activates the editor. This will set this editor as the activeEditor in the tinymce collection + * it will also place DOM focus inside the editor. + * + * @method focus + * @param {Boolean} sf Skip DOM focus. Just set is as the active editor. + */ + focus : function(sf) { + var oed, t = this, selection = t.selection, ce = t.settings.content_editable, ieRng, controlElm, doc = t.getDoc(); + + if (!sf) { + // Get selected control element + ieRng = selection.getRng(); + if (ieRng.item) { + controlElm = ieRng.item(0); + } + + selection.normalize(); + + // Is not content editable + if (!ce) + t.getWin().focus(); + + // Focus the body as well since it's contentEditable + if (tinymce.isGecko) { + t.getBody().focus(); + } + + // Restore selected control element + // This is needed when for example an image is selected within a + // layer a call to focus will then remove the control selection + if (controlElm && controlElm.ownerDocument == doc) { + ieRng = doc.body.createControlRange(); + ieRng.addElement(controlElm); + ieRng.select(); + } + + // #ifdef contentEditable + + // Content editable mode ends here + if (ce) { + if (tinymce.isWebKit) + t.getWin().focus(); + else { + if (tinymce.isIE) + t.getElement().setActive(); + else + t.getElement().focus(); + } + } + + // #endif + } + + if (tinymce.activeEditor != t) { + if ((oed = tinymce.activeEditor) != null) + oed.onDeactivate.dispatch(oed, t); + + t.onActivate.dispatch(t, oed); + } + + tinymce._setActive(t); + }, + + /** + * Executes a legacy callback. This method is useful to call old 2.x option callbacks. + * There new event model is a better way to add callback so this method might be removed in the future. + * + * @method execCallback + * @param {String} n Name of the callback to execute. + * @return {Object} Return value passed from callback function. + */ + execCallback : function(n) { + var t = this, f = t.settings[n], s; + + if (!f) + return; + + // Look through lookup + if (t.callbackLookup && (s = t.callbackLookup[n])) { + f = s.func; + s = s.scope; + } + + if (is(f, 'string')) { + s = f.replace(/\.\w+$/, ''); + s = s ? tinymce.resolve(s) : 0; + f = tinymce.resolve(f); + t.callbackLookup = t.callbackLookup || {}; + t.callbackLookup[n] = {func : f, scope : s}; + } + + return f.apply(s || t, Array.prototype.slice.call(arguments, 1)); + }, + + /** + * Translates the specified string by replacing variables with language pack items it will also check if there is + * a key mathcin the input. + * + * @method translate + * @param {String} s String to translate by the language pack data. + * @return {String} Translated string. + */ + translate : function(s) { + var c = this.settings.language || 'en', i18n = tinymce.i18n; + + if (!s) + return ''; + + return i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) { + return i18n[c + '.' + b] || '{#' + b + '}'; + }); + }, + + /** + * Returns a language pack item by name/key. + * + * @method getLang + * @param {String} n Name/key to get from the language pack. + * @param {String} dv Optional default value to retrive. + */ + getLang : function(n, dv) { + return tinymce.i18n[(this.settings.language || 'en') + '.' + n] || (is(dv) ? dv : '{#' + n + '}'); + }, + + /** + * Returns a configuration parameter by name. + * + * @method getParam + * @param {String} n Configruation parameter to retrive. + * @param {String} dv Optional default value to return. + * @param {String} ty Optional type parameter. + * @return {String} Configuration parameter value or default value. + * @example + * // Returns a specific config value from the currently active editor + * var someval = tinyMCE.activeEditor.getParam('myvalue'); + * + * // Returns a specific config value from a specific editor instance by id + * var someval2 = tinyMCE.get('my_editor').getParam('myvalue'); + */ + getParam : function(n, dv, ty) { + var tr = tinymce.trim, v = is(this.settings[n]) ? this.settings[n] : dv, o; + + if (ty === 'hash') { + o = {}; + + if (is(v, 'string')) { + each(v.indexOf('=') > 0 ? v.split(/[;,](?![^=;,]*(?:[;,]|$))/) : v.split(','), function(v) { + v = v.split('='); + + if (v.length > 1) + o[tr(v[0])] = tr(v[1]); + else + o[tr(v[0])] = tr(v); + }); + } else + o = v; + + return o; + } + + return v; + }, + + /** + * Distpaches out a onNodeChange event to all observers. This method should be called when you + * need to update the UI states or element path etc. + * + * @method nodeChanged + * @param {Object} o Optional object to pass along for the node changed event. + */ + nodeChanged : function(o) { + var t = this, s = t.selection, n = s.getStart() || t.getBody(); + + // Fix for bug #1896577 it seems that this can not be fired while the editor is loading + if (t.initialized) { + o = o || {}; + n = isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n; // Fix for IE initial state + + // Get parents and add them to object + o.parents = []; + t.dom.getParent(n, function(node) { + if (node.nodeName == 'BODY') + return true; + + o.parents.push(node); + }); + + t.onNodeChange.dispatch( + t, + o ? o.controlManager || t.controlManager : t.controlManager, + n, + s.isCollapsed(), + o + ); + } + }, + + /** + * Adds a button that later gets created by the ControlManager. This is a shorter and easier method + * of adding buttons without the need to deal with the ControlManager directly. But it's also less + * powerfull if you need more control use the ControlManagers factory methods instead. + * + * @method addButton + * @param {String} n Button name to add. + * @param {Object} s Settings object with title, cmd etc. + * @example + * // Adds a custom button to the editor and when a user clicks the button it will open + * // an alert box with the selected contents as plain text. + * tinyMCE.init({ + * ... + * + * theme_advanced_buttons1 : 'example,..' + * + * setup : function(ed) { + * // Register example button + * ed.addButton('example', { + * title : 'example.desc', + * image : '../jscripts/tiny_mce/plugins/example/img/example.gif', + * onclick : function() { + * ed.windowManager.alert('Hello world!! Selection: ' + ed.selection.getContent({format : 'text'})); + * } + * }); + * } + * }); + */ + addButton : function(n, s) { + var t = this; + + t.buttons = t.buttons || {}; + t.buttons[n] = s; + }, + + /** + * Adds a custom command to the editor, you can also override existing commands with this method. + * The command that you add can be executed with execCommand. + * + * @method addCommand + * @param {String} name Command name to add/override. + * @param {addCommandCallback} callback Function to execute when the command occurs. + * @param {Object} scope Optional scope to execute the function in. + * @example + * // Adds a custom command that later can be executed using execCommand + * tinyMCE.init({ + * ... + * + * setup : function(ed) { + * // Register example command + * ed.addCommand('mycommand', function(ui, v) { + * ed.windowManager.alert('Hello world!! Selection: ' + ed.selection.getContent({format : 'text'})); + * }); + * } + * }); + */ + addCommand : function(name, callback, scope) { + /** + * Callback function that gets called when a command is executed. + * + * @callback addCommandCallback + * @param {Boolean} ui Display UI state true/false. + * @param {Object} value Optional value for command. + * @return {Boolean} True/false state if the command was handled or not. + */ + this.execCommands[name] = {func : callback, scope : scope || this}; + }, + + /** + * Adds a custom query state command to the editor, you can also override existing commands with this method. + * The command that you add can be executed with queryCommandState function. + * + * @method addQueryStateHandler + * @param {String} name Command name to add/override. + * @param {addQueryStateHandlerCallback} callback Function to execute when the command state retrival occurs. + * @param {Object} scope Optional scope to execute the function in. + */ + addQueryStateHandler : function(name, callback, scope) { + /** + * Callback function that gets called when a queryCommandState is executed. + * + * @callback addQueryStateHandlerCallback + * @return {Boolean} True/false state if the command is enabled or not like is it bold. + */ + this.queryStateCommands[name] = {func : callback, scope : scope || this}; + }, + + /** + * Adds a custom query value command to the editor, you can also override existing commands with this method. + * The command that you add can be executed with queryCommandValue function. + * + * @method addQueryValueHandler + * @param {String} name Command name to add/override. + * @param {addQueryValueHandlerCallback} callback Function to execute when the command value retrival occurs. + * @param {Object} scope Optional scope to execute the function in. + */ + addQueryValueHandler : function(name, callback, scope) { + /** + * Callback function that gets called when a queryCommandValue is executed. + * + * @callback addQueryValueHandlerCallback + * @return {Object} Value of the command or undefined. + */ + this.queryValueCommands[name] = {func : callback, scope : scope || this}; + }, + + /** + * Adds a keyboard shortcut for some command or function. + * + * @method addShortcut + * @param {String} pa Shortcut pattern. Like for example: ctrl+alt+o. + * @param {String} desc Text description for the command. + * @param {String/Function} cmd_func Command name string or function to execute when the key is pressed. + * @param {Object} sc Optional scope to execute the function in. + * @return {Boolean} true/false state if the shortcut was added or not. + */ + addShortcut : function(pa, desc, cmd_func, sc) { + var t = this, c; + + if (!t.settings.custom_shortcuts) + return false; + + t.shortcuts = t.shortcuts || {}; + + if (is(cmd_func, 'string')) { + c = cmd_func; + + cmd_func = function() { + t.execCommand(c, false, null); + }; + } + + if (is(cmd_func, 'object')) { + c = cmd_func; + + cmd_func = function() { + t.execCommand(c[0], c[1], c[2]); + }; + } + + each(explode(pa), function(pa) { + var o = { + func : cmd_func, + scope : sc || this, + desc : desc, + alt : false, + ctrl : false, + shift : false + }; + + each(explode(pa, '+'), function(v) { + switch (v) { + case 'alt': + case 'ctrl': + case 'shift': + o[v] = true; + break; + + default: + o.charCode = v.charCodeAt(0); + o.keyCode = v.toUpperCase().charCodeAt(0); + } + }); + + t.shortcuts[(o.ctrl ? 'ctrl' : '') + ',' + (o.alt ? 'alt' : '') + ',' + (o.shift ? 'shift' : '') + ',' + o.keyCode] = o; + }); + + return true; + }, + + /** + * Executes a command on the current instance. These commands can be TinyMCE internal commands prefixed with "mce" or + * they can be build in browser commands such as "Bold". A compleate list of browser commands is available on MSDN or Mozilla.org. + * This function will dispatch the execCommand function on each plugin, theme or the execcommand_callback option if none of these + * return true it will handle the command as a internal browser command. + * + * @method execCommand + * @param {String} cmd Command name to execute, for example mceLink or Bold. + * @param {Boolean} ui True/false state if a UI (dialog) should be presented or not. + * @param {mixed} val Optional command value, this can be anything. + * @param {Object} a Optional arguments object. + * @return {Boolean} True/false if the command was executed or not. + */ + execCommand : function(cmd, ui, val, a) { + var t = this, s = 0, o, st; + + if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus)) + t.focus(); + + o = {}; + t.onBeforeExecCommand.dispatch(t, cmd, ui, val, o); + if (o.terminate) + return false; + + // Command callback + if (t.execCallback('execcommand_callback', t.id, t.selection.getNode(), cmd, ui, val)) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + return true; + } + + // Registred commands + if (o = t.execCommands[cmd]) { + st = o.func.call(o.scope, ui, val); + + // Fall through on true + if (st !== true) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + return st; + } + } + + // Plugin commands + each(t.plugins, function(p) { + if (p.execCommand && p.execCommand(cmd, ui, val)) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + s = 1; + return false; + } + }); + + if (s) + return true; + + // Theme commands + if (t.theme && t.theme.execCommand && t.theme.execCommand(cmd, ui, val)) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + return true; + } + + // Editor commands + if (t.editorCommands.execCommand(cmd, ui, val)) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + return true; + } + + // Browser commands + t.getDoc().execCommand(cmd, ui, val); + t.onExecCommand.dispatch(t, cmd, ui, val, a); + }, + + /** + * Returns a command specific state, for example if bold is enabled or not. + * + * @method queryCommandState + * @param {string} cmd Command to query state from. + * @return {Boolean} Command specific state, for example if bold is enabled or not. + */ + queryCommandState : function(cmd) { + var t = this, o, s; + + // Is hidden then return undefined + if (t._isHidden()) + return; + + // Registred commands + if (o = t.queryStateCommands[cmd]) { + s = o.func.call(o.scope); + + // Fall though on true + if (s !== true) + return s; + } + + // Registred commands + o = t.editorCommands.queryCommandState(cmd); + if (o !== -1) + return o; + + // Browser commands + try { + return this.getDoc().queryCommandState(cmd); + } catch (ex) { + // Fails sometimes see bug: 1896577 + } + }, + + /** + * Returns a command specific value, for example the current font size. + * + * @method queryCommandValue + * @param {string} c Command to query value from. + * @return {Object} Command specific value, for example the current font size. + */ + queryCommandValue : function(c) { + var t = this, o, s; + + // Is hidden then return undefined + if (t._isHidden()) + return; + + // Registred commands + if (o = t.queryValueCommands[c]) { + s = o.func.call(o.scope); + + // Fall though on true + if (s !== true) + return s; + } + + // Registred commands + o = t.editorCommands.queryCommandValue(c); + if (is(o)) + return o; + + // Browser commands + try { + return this.getDoc().queryCommandValue(c); + } catch (ex) { + // Fails sometimes see bug: 1896577 + } + }, + + /** + * Shows the editor and hides any textarea/div that the editor is supposed to replace. + * + * @method show + */ + show : function() { + var t = this; + + DOM.show(t.getContainer()); + DOM.hide(t.id); + t.load(); + }, + + /** + * Hides the editor and shows any textarea/div that the editor is supposed to replace. + * + * @method hide + */ + hide : function() { + var t = this, d = t.getDoc(); + + // Fixed bug where IE has a blinking cursor left from the editor + if (isIE && d) + d.execCommand('SelectAll'); + + // We must save before we hide so Safari doesn't crash + t.save(); + DOM.hide(t.getContainer()); + DOM.setStyle(t.id, 'display', t.orgDisplay); + }, + + /** + * Returns true/false if the editor is hidden or not. + * + * @method isHidden + * @return {Boolean} True/false if the editor is hidden or not. + */ + isHidden : function() { + return !DOM.isHidden(this.id); + }, + + /** + * Sets the progress state, this will display a throbber/progess for the editor. + * This is ideal for asycronous operations like an AJAX save call. + * + * @method setProgressState + * @param {Boolean} b Boolean state if the progress should be shown or hidden. + * @param {Number} ti Optional time to wait before the progress gets shown. + * @param {Object} o Optional object to pass to the progress observers. + * @return {Boolean} Same as the input state. + * @example + * // Show progress for the active editor + * tinyMCE.activeEditor.setProgressState(true); + * + * // Hide progress for the active editor + * tinyMCE.activeEditor.setProgressState(false); + * + * // Show progress after 3 seconds + * tinyMCE.activeEditor.setProgressState(true, 3000); + */ + setProgressState : function(b, ti, o) { + this.onSetProgressState.dispatch(this, b, ti, o); + + return b; + }, + + /** + * Loads contents from the textarea or div element that got converted into an editor instance. + * This method will move the contents from that textarea or div into the editor by using setContent + * so all events etc that method has will get dispatched as well. + * + * @method load + * @param {Object} o Optional content object, this gets passed around through the whole load process. + * @return {String} HTML string that got set into the editor. + */ + load : function(o) { + var t = this, e = t.getElement(), h; + + if (e) { + o = o || {}; + o.load = true; + + // Double encode existing entities in the value + h = t.setContent(is(e.value) ? e.value : e.innerHTML, o); + o.element = e; + + if (!o.no_events) + t.onLoadContent.dispatch(t, o); + + o.element = e = null; + + return h; + } + }, + + /** + * Saves the contents from a editor out to the textarea or div element that got converted into an editor instance. + * This method will move the HTML contents from the editor into that textarea or div by getContent + * so all events etc that method has will get dispatched as well. + * + * @method save + * @param {Object} o Optional content object, this gets passed around through the whole save process. + * @return {String} HTML string that got set into the textarea/div. + */ + save : function(o) { + var t = this, e = t.getElement(), h, f; + + if (!e || !t.initialized) + return; + + o = o || {}; + o.save = true; + + // Add undo level will trigger onchange event + if (!o.no_events) { + t.undoManager.typing = false; + t.undoManager.add(); + } + + o.element = e; + h = o.content = t.getContent(o); + + if (!o.no_events) + t.onSaveContent.dispatch(t, o); + + h = o.content; + + if (!/TEXTAREA|INPUT/i.test(e.nodeName)) { + e.innerHTML = h; + + // Update hidden form element + if (f = DOM.getParent(t.id, 'form')) { + each(f.elements, function(e) { + if (e.name == t.id) { + e.value = h; + return false; + } + }); + } + } else + e.value = h; + + o.element = e = null; + + return h; + }, + + /** + * Sets the specified content to the editor instance, this will cleanup the content before it gets set using + * the different cleanup rules options. + * + * @method setContent + * @param {String} content Content to set to editor, normally HTML contents but can be other formats as well. + * @param {Object} args Optional content object, this gets passed around through the whole set process. + * @return {String} HTML string that got set into the editor. + * @example + * // Sets the HTML contents of the activeEditor editor + * tinyMCE.activeEditor.setContent('some html'); + * + * // Sets the raw contents of the activeEditor editor + * tinyMCE.activeEditor.setContent('some html', {format : 'raw'}); + * + * // Sets the content of a specific editor (my_editor in this example) + * tinyMCE.get('my_editor').setContent(data); + * + * // Sets the bbcode contents of the activeEditor editor if the bbcode plugin was added + * tinyMCE.activeEditor.setContent('[b]some[/b] html', {format : 'bbcode'}); + */ + setContent : function(content, args) { + var self = this, rootNode, body = self.getBody(), forcedRootBlockName; + + // Setup args object + args = args || {}; + args.format = args.format || 'html'; + args.set = true; + args.content = content; + + // Do preprocessing + if (!args.no_events) + self.onBeforeSetContent.dispatch(self, args); + + content = args.content; + + // Padd empty content in Gecko and Safari. Commands will otherwise fail on the content + // It will also be impossible to place the caret in the editor unless there is a BR element present + if (!tinymce.isIE && (content.length === 0 || /^\s+$/.test(content))) { + forcedRootBlockName = self.settings.forced_root_block; + if (forcedRootBlockName) + content = '<' + forcedRootBlockName + '>
    '; + else + content = '
    '; + + body.innerHTML = content; + self.selection.select(body, true); + self.selection.collapse(true); + return; + } + + // Parse and serialize the html + if (args.format !== 'raw') { + content = new tinymce.html.Serializer({}, self.schema).serialize( + self.parser.parse(content) + ); + } + + // Set the new cleaned contents to the editor + args.content = tinymce.trim(content); + self.dom.setHTML(body, args.content); + + // Do post processing + if (!args.no_events) + self.onSetContent.dispatch(self, args); + + self.selection.normalize(); + + return args.content; + }, + + /** + * Gets the content from the editor instance, this will cleanup the content before it gets returned using + * the different cleanup rules options. + * + * @method getContent + * @param {Object} args Optional content object, this gets passed around through the whole get process. + * @return {String} Cleaned content string, normally HTML contents. + * @example + * // Get the HTML contents of the currently active editor + * console.debug(tinyMCE.activeEditor.getContent()); + * + * // Get the raw contents of the currently active editor + * tinyMCE.activeEditor.getContent({format : 'raw'}); + * + * // Get content of a specific editor: + * tinyMCE.get('content id').getContent() + */ + getContent : function(args) { + var self = this, content; + + // Setup args object + args = args || {}; + args.format = args.format || 'html'; + args.get = true; + + // Do preprocessing + if (!args.no_events) + self.onBeforeGetContent.dispatch(self, args); + + // Get raw contents or by default the cleaned contents + if (args.format == 'raw') + content = self.getBody().innerHTML; + else + content = self.serializer.serialize(self.getBody(), args); + + args.content = tinymce.trim(content); + + // Do post processing + if (!args.no_events) + self.onGetContent.dispatch(self, args); + + return args.content; + }, + + /** + * Returns true/false if the editor is dirty or not. It will get dirty if the user has made modifications to the contents. + * + * @method isDirty + * @return {Boolean} True/false if the editor is dirty or not. It will get dirty if the user has made modifications to the contents. + * @example + * if (tinyMCE.activeEditor.isDirty()) + * alert("You must save your contents."); + */ + isDirty : function() { + var self = this; + + return tinymce.trim(self.startContent) != tinymce.trim(self.getContent({format : 'raw', no_events : 1})) && !self.isNotDirty; + }, + + /** + * Returns the editors container element. The container element wrappes in + * all the elements added to the page for the editor. Such as UI, iframe etc. + * + * @method getContainer + * @return {Element} HTML DOM element for the editor container. + */ + getContainer : function() { + var t = this; + + if (!t.container) + t.container = DOM.get(t.editorContainer || t.id + '_parent'); + + return t.container; + }, + + /** + * Returns the editors content area container element. The this element is the one who + * holds the iframe or the editable element. + * + * @method getContentAreaContainer + * @return {Element} HTML DOM element for the editor area container. + */ + getContentAreaContainer : function() { + return this.contentAreaContainer; + }, + + /** + * Returns the target element/textarea that got replaced with a TinyMCE editor instance. + * + * @method getElement + * @return {Element} HTML DOM element for the replaced element. + */ + getElement : function() { + return DOM.get(this.settings.content_element || this.id); + }, + + /** + * Returns the iframes window object. + * + * @method getWin + * @return {Window} Iframe DOM window object. + */ + getWin : function() { + var t = this, e; + + if (!t.contentWindow) { + e = DOM.get(t.id + "_ifr"); + + if (e) + t.contentWindow = e.contentWindow; + } + + return t.contentWindow; + }, + + /** + * Returns the iframes document object. + * + * @method getDoc + * @return {Document} Iframe DOM document object. + */ + getDoc : function() { + var t = this, w; + + if (!t.contentDocument) { + w = t.getWin(); + + if (w) + t.contentDocument = w.document; + } + + return t.contentDocument; + }, + + /** + * Returns the iframes body element. + * + * @method getBody + * @return {Element} Iframe body element. + */ + getBody : function() { + return this.bodyElement || this.getDoc().body; + }, + + /** + * URL converter function this gets executed each time a user adds an img, a or + * any other element that has a URL in it. This will be called both by the DOM and HTML + * manipulation functions. + * + * @method convertURL + * @param {string} u URL to convert. + * @param {string} n Attribute name src, href etc. + * @param {string/HTMLElement} Tag name or HTML DOM element depending on HTML or DOM insert. + * @return {string} Converted URL string. + */ + convertURL : function(u, n, e) { + var t = this, s = t.settings; + + // Use callback instead + if (s.urlconverter_callback) + return t.execCallback('urlconverter_callback', u, e, true, n); + + // Don't convert link href since thats the CSS files that gets loaded into the editor also skip local file URLs + if (!s.convert_urls || (e && e.nodeName == 'LINK') || u.indexOf('file:') === 0) + return u; + + // Convert to relative + if (s.relative_urls) + return t.documentBaseURI.toRelative(u); + + // Convert to absolute + u = t.documentBaseURI.toAbsolute(u, s.remove_script_host); + + return u; + }, + + /** + * Adds visual aid for tables, anchors etc so they can be more easily edited inside the editor. + * + * @method addVisual + * @param {Element} e Optional root element to loop though to find tables etc that needs the visual aid. + */ + addVisual : function(e) { + var t = this, s = t.settings; + + e = e || t.getBody(); + + if (!is(t.hasVisual)) + t.hasVisual = s.visual; + + each(t.dom.select('table,a', e), function(e) { + var v; + + switch (e.nodeName) { + case 'TABLE': + v = t.dom.getAttrib(e, 'border'); + + if (!v || v == '0') { + if (t.hasVisual) + t.dom.addClass(e, s.visual_table_class); + else + t.dom.removeClass(e, s.visual_table_class); + } + + return; + + case 'A': + v = t.dom.getAttrib(e, 'name'); + + if (v) { + if (t.hasVisual) + t.dom.addClass(e, 'mceItemAnchor'); + else + t.dom.removeClass(e, 'mceItemAnchor'); + } + + return; + } + }); + + t.onVisualAid.dispatch(t, e, t.hasVisual); + }, + + /** + * Removes the editor from the dom and tinymce collection. + * + * @method remove + */ + remove : function() { + var t = this, e = t.getContainer(); + + t.removed = 1; // Cancels post remove event execution + t.hide(); + + t.execCallback('remove_instance_callback', t); + t.onRemove.dispatch(t); + + // Clear all execCommand listeners this is required to avoid errors if the editor was removed inside another command + t.onExecCommand.listeners = []; + + tinymce.remove(t); + DOM.remove(e); + }, + + /** + * Destroys the editor instance by removing all events, element references or other resources + * that could leak memory. This method will be called automatically when the page is unloaded + * but you can also call it directly if you know what you are doing. + * + * @method destroy + * @param {Boolean} s Optional state if the destroy is an automatic destroy or user called one. + */ + destroy : function(s) { + var t = this; + + // One time is enough + if (t.destroyed) + return; + + if (!s) { + tinymce.removeUnload(t.destroy); + tinyMCE.onBeforeUnload.remove(t._beforeUnload); + + // Manual destroy + if (t.theme && t.theme.destroy) + t.theme.destroy(); + + // Destroy controls, selection and dom + t.controlManager.destroy(); + t.selection.destroy(); + t.dom.destroy(); + + // Remove all events + + // Don't clear the window or document if content editable + // is enabled since other instances might still be present + if (!t.settings.content_editable) { + Event.clear(t.getWin()); + Event.clear(t.getDoc()); + } + + Event.clear(t.getBody()); + Event.clear(t.formElement); + } + + if (t.formElement) { + t.formElement.submit = t.formElement._mceOldSubmit; + t.formElement._mceOldSubmit = null; + } + + t.contentAreaContainer = t.formElement = t.container = t.settings.content_element = t.bodyElement = t.contentDocument = t.contentWindow = null; + + if (t.selection) + t.selection = t.selection.win = t.selection.dom = t.selection.dom.doc = null; + + t.destroyed = 1; + }, + + // Internal functions + + _addEvents : function() { + // 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset + var t = this, i, s = t.settings, dom = t.dom, lo = { + mouseup : 'onMouseUp', + mousedown : 'onMouseDown', + click : 'onClick', + keyup : 'onKeyUp', + keydown : 'onKeyDown', + keypress : 'onKeyPress', + submit : 'onSubmit', + reset : 'onReset', + contextmenu : 'onContextMenu', + dblclick : 'onDblClick', + paste : 'onPaste' // Doesn't work in all browsers yet + }; + + function eventHandler(e, o) { + var ty = e.type; + + // Don't fire events when it's removed + if (t.removed) + return; + + // Generic event handler + if (t.onEvent.dispatch(t, e, o) !== false) { + // Specific event handler + t[lo[e.fakeType || e.type]].dispatch(t, e, o); + } + }; + + // Add DOM events + each(lo, function(v, k) { + switch (k) { + case 'contextmenu': + dom.bind(t.getDoc(), k, eventHandler); + break; + + case 'paste': + dom.bind(t.getBody(), k, function(e) { + eventHandler(e); + }); + break; + + case 'submit': + case 'reset': + dom.bind(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler); + break; + + default: + dom.bind(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler); + } + }); + + dom.bind(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) { + t.focus(true); + }); + + // #ifdef contentEditable + + if (s.content_editable && tinymce.isOpera) { + // Opera doesn't support focus event for contentEditable elements so we need to fake it + function doFocus(e) { + t.focus(true); + }; + + dom.bind(t.getBody(), 'click', doFocus); + dom.bind(t.getBody(), 'keydown', doFocus); + } + + // #endif + + // Fixes bug where a specified document_base_uri could result in broken images + // This will also fix drag drop of images in Gecko + if (tinymce.isGecko) { + dom.bind(t.getDoc(), 'DOMNodeInserted', function(e) { + var v; + + e = e.target; + + if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('data-mce-src'))) + e.src = t.documentBaseURI.toAbsolute(v); + }); + } + + // Set various midas options in Gecko + if (isGecko) { + function setOpts() { + var t = this, d = t.getDoc(), s = t.settings; + + if (isGecko && !s.readonly) { + if (t._isHidden()) { + try { + if (!s.content_editable) { + d.body.contentEditable = false; + d.body.contentEditable = true; + } + } catch (ex) { + // Fails if it's hidden + } + } + + try { + // Try new Gecko method + d.execCommand("styleWithCSS", 0, false); + } catch (ex) { + // Use old method + if (!t._isHidden()) + try {d.execCommand("useCSS", 0, true);} catch (ex) {} + } + + if (!s.table_inline_editing) + try {d.execCommand('enableInlineTableEditing', false, false);} catch (ex) {} + + if (!s.object_resizing) + try {d.execCommand('enableObjectResizing', false, false);} catch (ex) {} + } + }; + + t.onBeforeExecCommand.add(setOpts); + t.onMouseDown.add(setOpts); + } + + t.onClick.add(function(ed, e) { + e = e.target; + + // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250 + // WebKit can't even do simple things like selecting an image + // Needs tobe the setBaseAndExtend or it will fail to select floated images + if (tinymce.isWebKit && e.nodeName == 'IMG') + t.selection.getSel().setBaseAndExtent(e, 0, e, 1); + + if (e.nodeName == 'A' && dom.hasClass(e, 'mceItemAnchor')) + t.selection.select(e); + + t.nodeChanged(); + }); + + // Add node change handlers + t.onMouseUp.add(t.nodeChanged); + //t.onClick.add(t.nodeChanged); + t.onKeyUp.add(function(ed, e) { + var c = e.keyCode; + + if ((c >= 33 && c <= 36) || (c >= 37 && c <= 40) || c == 13 || c == 45 || c == 46 || c == 8 || (tinymce.isMac && (c == 91 || c == 93)) || e.ctrlKey) + t.nodeChanged(); + }); + + + // Add block quote deletion handler + t.onKeyDown.add(function(ed, e) { + // Was the BACKSPACE key pressed? + if (e.keyCode != 8) + return; + + var n = ed.selection.getRng().startContainer; + var offset = ed.selection.getRng().startOffset; + + while (n && n.nodeType && n.nodeType != 1 && n.parentNode) + n = n.parentNode; + + // Is the cursor at the beginning of a blockquote? + if (n && n.parentNode && n.parentNode.tagName === 'BLOCKQUOTE' && n.parentNode.firstChild == n && offset == 0) { + // Remove the blockquote + ed.formatter.toggle('blockquote', null, n.parentNode); + + // Move the caret to the beginning of n + var rng = ed.selection.getRng(); + rng.setStart(n, 0); + rng.setEnd(n, 0); + ed.selection.setRng(rng); + ed.selection.collapse(false); + } + }); + + + + // Add reset handler + t.onReset.add(function() { + t.setContent(t.startContent, {format : 'raw'}); + }); + + // Add shortcuts + if (s.custom_shortcuts) { + if (s.custom_undo_redo_keyboard_shortcuts) { + t.addShortcut('ctrl+z', t.getLang('undo_desc'), 'Undo'); + t.addShortcut('ctrl+y', t.getLang('redo_desc'), 'Redo'); + } + + // Add default shortcuts for gecko + t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold'); + t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic'); + t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline'); + + // BlockFormat shortcuts keys + for (i=1; i<=6; i++) + t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, 'h' + i]); + + t.addShortcut('ctrl+7', '', ['FormatBlock', false, 'p']); + t.addShortcut('ctrl+8', '', ['FormatBlock', false, 'div']); + t.addShortcut('ctrl+9', '', ['FormatBlock', false, 'address']); + + function find(e) { + var v = null; + + if (!e.altKey && !e.ctrlKey && !e.metaKey) + return v; + + each(t.shortcuts, function(o) { + if (tinymce.isMac && o.ctrl != e.metaKey) + return; + else if (!tinymce.isMac && o.ctrl != e.ctrlKey) + return; + + if (o.alt != e.altKey) + return; + + if (o.shift != e.shiftKey) + return; + + if (e.keyCode == o.keyCode || (e.charCode && e.charCode == o.charCode)) { + v = o; + return false; + } + }); + + return v; + }; + + t.onKeyUp.add(function(ed, e) { + var o = find(e); + + if (o) + return Event.cancel(e); + }); + + t.onKeyPress.add(function(ed, e) { + var o = find(e); + + if (o) + return Event.cancel(e); + }); + + t.onKeyDown.add(function(ed, e) { + var o = find(e); + + if (o) { + o.func.call(o.scope); + return Event.cancel(e); + } + }); + } + + if (tinymce.isIE) { + // Fix so resize will only update the width and height attributes not the styles of an image + // It will also block mceItemNoResize items + dom.bind(t.getDoc(), 'controlselect', function(e) { + var re = t.resizeInfo, cb; + + e = e.target; + + // Don't do this action for non image elements + if (e.nodeName !== 'IMG') + return; + + if (re) + dom.unbind(re.node, re.ev, re.cb); + + if (!dom.hasClass(e, 'mceItemNoResize')) { + ev = 'resizeend'; + cb = dom.bind(e, ev, function(e) { + var v; + + e = e.target; + + if (v = dom.getStyle(e, 'width')) { + dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, '')); + dom.setStyle(e, 'width', ''); + } + + if (v = dom.getStyle(e, 'height')) { + dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, '')); + dom.setStyle(e, 'height', ''); + } + }); + } else { + ev = 'resizestart'; + cb = dom.bind(e, 'resizestart', Event.cancel, Event); + } + + re = t.resizeInfo = { + node : e, + ev : ev, + cb : cb + }; + }); + } + + if (tinymce.isOpera) { + t.onClick.add(function(ed, e) { + Event.prevent(e); + }); + } + + // Add custom undo/redo handlers + if (s.custom_undo_redo) { + function addUndo() { + t.undoManager.typing = false; + t.undoManager.add(); + }; + + dom.bind(t.getDoc(), 'focusout', function(e) { + if (!t.removed && t.undoManager.typing) + addUndo(); + }); + + // Add undo level when contents is drag/dropped within the editor + t.dom.bind(t.dom.getRoot(), 'dragend', function(e) { + addUndo(); + }); + + t.onKeyUp.add(function(ed, e) { + var keyCode = e.keyCode; + + if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 13 || keyCode == 45 || e.ctrlKey) + addUndo(); + }); + + t.onKeyDown.add(function(ed, e) { + var keyCode = e.keyCode, sel; + + if (keyCode == 8) { + sel = t.getDoc().selection; + + // Fix IE control + backspace browser bug + if (sel && sel.createRange && sel.createRange().item) { + t.undoManager.beforeChange(); + ed.dom.remove(sel.createRange().item(0)); + addUndo(); + + return Event.cancel(e); + } + } + + // Is caracter positon keys left,right,up,down,home,end,pgdown,pgup,enter + if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 13 || keyCode == 45) { + // Add position before enter key is pressed, used by IE since it still uses the default browser behavior + // Todo: Remove this once we normalize enter behavior on IE + if (tinymce.isIE && keyCode == 13) + t.undoManager.beforeChange(); + + if (t.undoManager.typing) + addUndo(); + + return; + } + + // If key isn't shift,ctrl,alt,capslock,metakey + if ((keyCode < 16 || keyCode > 20) && keyCode != 224 && keyCode != 91 && !t.undoManager.typing) { + t.undoManager.beforeChange(); + t.undoManager.typing = true; + t.undoManager.add(); + } + }); + + t.onMouseDown.add(function() { + if (t.undoManager.typing) + addUndo(); + }); + } + + // Fire a nodeChanged when the selection is changed on WebKit this fixes selection issues on iOS5 + // It only fires the nodeChange event every 50ms since it would other wise update the UI when you type and it hogs the CPU + if (tinymce.isWebKit) { + dom.bind(t.getDoc(), 'selectionchange', function() { + if (t.selectionTimer) { + window.clearTimeout(t.selectionTimer); + t.selectionTimer = 0; + } + + t.selectionTimer = window.setTimeout(function() { + t.nodeChanged(); + }, 50); + }); + } + + // Bug fix for FireFox keeping styles from end of selection instead of start. + if (tinymce.isGecko) { + function getAttributeApplyFunction() { + var template = t.dom.getAttribs(t.selection.getStart().cloneNode(false)); + + return function() { + var target = t.selection.getStart(); + + if (target !== t.getBody()) { + t.dom.removeAllAttribs(target); + + each(template, function(attr) { + target.setAttributeNode(attr.cloneNode(true)); + }); + } + }; + } + + function isSelectionAcrossElements() { + var s = t.selection; + + return !s.isCollapsed() && s.getStart() != s.getEnd(); + } + + t.onKeyPress.add(function(ed, e) { + var applyAttributes; + + if ((e.keyCode == 8 || e.keyCode == 46) && isSelectionAcrossElements()) { + applyAttributes = getAttributeApplyFunction(); + t.getDoc().execCommand('delete', false, null); + applyAttributes(); + + return Event.cancel(e); + } + }); + + t.dom.bind(t.getDoc(), 'cut', function(e) { + var applyAttributes; + + if (isSelectionAcrossElements()) { + applyAttributes = getAttributeApplyFunction(); + t.onKeyUp.addToTop(Event.cancel, Event); + + setTimeout(function() { + applyAttributes(); + t.onKeyUp.remove(Event.cancel, Event); + }, 0); + } + }); + } + }, + + _isHidden : function() { + var s; + + if (!isGecko) + return 0; + + // Weird, wheres that cursor selection? + s = this.selection.getSel(); + return (!s || !s.rangeCount || s.rangeCount == 0); + } + }); +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/EditorCommands.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/EditorCommands.js index fb977ff7d3..f901d3e777 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/EditorCommands.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/EditorCommands.js @@ -186,6 +186,7 @@ }); toggleFormat('align' + align); + execCommand('mceRepaint'); }, // Override list commands to fix WebKit bug @@ -211,7 +212,7 @@ }, // Override commands to use the text formatter engine - 'Bold,Italic,Underline,Strikethrough' : function(command) { + 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript' : function(command) { toggleFormat(command); }, @@ -284,7 +285,133 @@ }, mceInsertContent : function(command, ui, value) { - selection.setContent(value); + var parser, serializer, parentNode, rootNode, fragment, args, + marker, nodeRect, viewPortRect, rng, node, node2, bookmarkHtml, viewportBodyElement; + + // Setup parser and serializer + parser = editor.parser; + serializer = new tinymce.html.Serializer({}, editor.schema); + bookmarkHtml = '\uFEFF'; + + // Run beforeSetContent handlers on the HTML to be inserted + args = {content: value, format: 'html'}; + selection.onBeforeSetContent.dispatch(selection, args); + value = args.content; + + // Add caret at end of contents if it's missing + if (value.indexOf('{$caret}') == -1) + value += '{$caret}'; + + // Replace the caret marker with a span bookmark element + value = value.replace(/\{\$caret\}/, bookmarkHtml); + + // Insert node maker where we will insert the new HTML and get it's parent + if (!selection.isCollapsed()) + editor.getDoc().execCommand('Delete', false, null); + + parentNode = selection.getNode(); + + // Parse the fragment within the context of the parent node + args = {context : parentNode.nodeName.toLowerCase()}; + fragment = parser.parse(value, args); + + // Move the caret to a more suitable location + node = fragment.lastChild; + if (node.attr('id') == 'mce_marker') { + marker = node; + + for (node = node.prev; node; node = node.walk(true)) { + if (node.type == 3 || !dom.isBlock(node.name)) { + node.parent.insert(marker, node, node.name === 'br'); + break; + } + } + } + + // If parser says valid we can insert the contents into that parent + if (!args.invalid) { + value = serializer.serialize(fragment); + + // Check if parent is empty or only has one BR element then set the innerHTML of that parent + node = parentNode.firstChild; + node2 = parentNode.lastChild; + if (!node || (node === node2 && node.nodeName === 'BR')) + dom.setHTML(parentNode, value); + else + selection.setContent(value); + } else { + // If the fragment was invalid within that context then we need + // to parse and process the parent it's inserted into + + // Insert bookmark node and get the parent + selection.setContent(bookmarkHtml); + parentNode = editor.selection.getNode(); + rootNode = editor.getBody(); + + // Opera will return the document node when selection is in root + if (parentNode.nodeType == 9) + parentNode = node = rootNode; + else + node = parentNode; + + // Find the ancestor just before the root element + while (node !== rootNode) { + parentNode = node; + node = node.parentNode; + } + + // Get the outer/inner HTML depending on if we are in the root and parser and serialize that + value = parentNode == rootNode ? rootNode.innerHTML : dom.getOuterHTML(parentNode); + value = serializer.serialize( + parser.parse( + // Need to replace by using a function since $ in the contents would otherwise be a problem + value.replace(//i, function() { + return serializer.serialize(fragment); + }) + ) + ); + + // Set the inner/outer HTML depending on if we are in the root or not + if (parentNode == rootNode) + dom.setHTML(rootNode, value); + else + dom.setOuterHTML(parentNode, value); + } + + marker = dom.get('mce_marker'); + + // Scroll range into view scrollIntoView on element can't be used since it will scroll the main view port as well + nodeRect = dom.getRect(marker); + viewPortRect = dom.getViewPort(editor.getWin()); + + // Check if node is out side the viewport if it is then scroll to it + if ((nodeRect.y + nodeRect.h > viewPortRect.y + viewPortRect.h || nodeRect.y < viewPortRect.y) || + (nodeRect.x > viewPortRect.x + viewPortRect.w || nodeRect.x < viewPortRect.x)) { + viewportBodyElement = tinymce.isIE ? editor.getDoc().documentElement : editor.getBody(); + viewportBodyElement.scrollLeft = nodeRect.x; + viewportBodyElement.scrollTop = nodeRect.y - viewPortRect.h + 25; + } + + // Move selection before marker and remove it + rng = dom.createRng(); + + // If previous sibling is a text node set the selection to the end of that node + node = marker.previousSibling; + if (node && node.nodeType == 3) { + rng.setStart(node, node.nodeValue.length); + } else { + // If the previous sibling isn't a text node or doesn't exist set the selection before the marker node + rng.setStartBefore(marker); + rng.setEndBefore(marker); + } + + // Remove the marker node and set the new range + dom.remove(marker); + selection.setRng(rng); + + // Dispatch after event and add any visual elements needed + selection.onSetContent.dispatch(selection, args); + editor.addVisual(); }, mceInsertRawHTML : function(command, ui, value) { @@ -339,7 +466,7 @@ }, InsertHorizontalRule : function() { - selection.setContent('
    '); + editor.execCommand('mceInsertContent', false, '
    '); }, mceToggleVisualAid : function() { @@ -348,18 +475,41 @@ }, mceReplaceContent : function(command, ui, value) { - selection.setContent(value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'}))); + editor.execCommand('mceInsertContent', false, value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'}))); }, mceInsertLink : function(command, ui, value) { - var link = dom.getParent(selection.getNode(), 'a'); + var link = dom.getParent(selection.getNode(), 'a'), img, style, cls; if (tinymce.is(value, 'string')) value = {href : value}; + // Spaces are never valid in URLs and it's a very common mistake for people to make so we fix it here. + value.href = value.href.replace(' ', '%20'); + if (!link) { + // WebKit can't create links on floated images for some odd reason + // So, just remove styles and restore it later + if (tinymce.isWebKit) { + img = dom.getParent(selection.getNode(), 'img'); + + if (img) { + style = img.style.cssText; + cls = img.className; + img.style.cssText = null; + img.className = null; + } + } + execNativeCommand('CreateLink', FALSE, 'javascript:mctmp(0);'); - each(dom.select('a[href=javascript:mctmp(0);]'), function(link) { + + // Restore styles + if (style) + img.style.cssText = style; + if (cls) + img.className = cls; + + each(dom.select("a[href='javascript:mctmp(0);']"), function(link) { dom.setAttribs(link, value); }); } else { @@ -387,7 +537,7 @@ return isFormatMatch('align' + command.substring(7)); }, - 'Bold,Italic,Underline,Strikethrough' : function(command) { + 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript' : function(command) { return isFormatMatch(command); }, @@ -443,4 +593,4 @@ }); } }; -})(tinymce); \ No newline at end of file +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/EditorManager.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/EditorManager.js index 0b57455b16..f70abb18f0 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/EditorManager.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/EditorManager.js @@ -51,6 +51,11 @@ * @event onAddEditor * @param {tinymce} sender TinyMCE root class/namespace. * @param {tinymce.Editor} editor Editor instance. + * @example + * tinyMCE.execCommand("mceAddControl", false, "some_textarea"); + * tinyMCE.onAddEditor.add(function(mgr,ed) { + * console.debug('A new editor is available' + ed.id); + * }); */ tinymce.onAddEditor = new Dispatcher(tinymce); @@ -69,6 +74,9 @@ * * @property editors * @type Object + * @example + * for (edId in tinyMCE.editors) + * tinyMCE.editors[edId].save(); */ editors : [], @@ -85,6 +93,9 @@ * * @property activeEditor * @type tinymce.Editor + * @example + * tinyMCE.activeEditor.selection.getContent(); + * tinymce.EditorManager.activeEditor.selection.getContent(); */ activeEditor : null, @@ -93,6 +104,16 @@ * * @method init * @param {Object} s Settings object to be passed to each editor instance. + * @example + * // Initializes a editor using the longer method + * tinymce.EditorManager.init({ + * some_settings : 'some value' + * }); + * + * // Initializes a editor instance using the shorter version + * tinyMCE.init({ + * some_settings : 'some value' + * }); */ init : function(s) { var t = this, pl, sl = tinymce.ScriptLoader, e, el = [], ed; @@ -214,6 +235,16 @@ * @method get * @param {String/Number} id Editor instance id or index to return. * @return {tinymce.Editor} Editor instance to return. + * @example + * // Adds an onclick event to an editor by id (shorter version) + * tinyMCE.get('mytextbox').onClick.add(function(ed, e) { + * ed.windowManager.alert('Hello world!'); + * }); + * + * // Adds an onclick event to an editor by id (longer version) + * tinymce.EditorManager.get('mytextbox').onClick.add(function(ed, e) { + * ed.windowManager.alert('Hello world!'); + * }); */ get : function(id) { if (id === undefined) @@ -401,6 +432,9 @@ * Calls the save method on all editor instances in the collection. This can be useful when a form is to be submitted. * * @method triggerSave + * @example + * // Saves all contents + * tinyMCE.triggerSave(); */ triggerSave : function() { each(this.editors, function(e) { @@ -450,4 +484,20 @@ * @member * @property tinyMCE * @type tinymce + * @example + * // To initialize editor instances + * tinyMCE.init({ + * ... + * }); + */ + +/** + * Alternative name for tinymce added for compatibility. + * + * @member tinymce + * @property EditorManager + * @type tinymce + * @example + * // To initialize editor instances + * tinymce.EditorManager.get('editor'); */ diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ForceBlocks.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ForceBlocks.js index 5a6c5a6208..def93831dd 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ForceBlocks.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ForceBlocks.js @@ -51,24 +51,15 @@ return rng2.cloneContents().textContent.length == 0; }; - function isEmpty(n) { - n = n.innerHTML; - - n = n.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi, '-'); // Keep these convert them to - chars - n = n.replace(/<[^>]+>/g, ''); // Remove all tags - - return n.replace(/[ \u00a0\t\r\n]+/g, '') == ''; - }; - function splitList(selection, dom, li) { var listBlock, block; - if (isEmpty(li)) { + if (dom.isEmpty(li)) { listBlock = dom.getParent(li, 'ul,ol'); if (!dom.getParent(listBlock.parentNode, 'ul,ol')) { dom.split(listBlock, li); - block = dom.create('p', 0, '
    '); + block = dom.create('p', 0, '
    '); dom.replace(block, li); selection.select(block, 1); } @@ -92,45 +83,94 @@ s.element = elm.toUpperCase(); ed.onPreInit.add(t.setup, t); + }, - t.reOpera = new RegExp('(\\u00a0| | )<\/' + elm + '>', 'gi'); - t.rePadd = new RegExp(']+)><\\\/p>|]+)\\\/>|]+)>\\s+<\\\/p>|

    <\\\/p>||

    \\s+<\\\/p>'.replace(/p/g, elm), 'gi'); - t.reNbsp2BR1 = new RegExp(']+)>[\\s\\u00a0]+<\\\/p>|

    [\\s\\u00a0]+<\\\/p>'.replace(/p/g, elm), 'gi'); - t.reNbsp2BR2 = new RegExp('<%p()([^>]+)>( | )<\\\/%p>|<%p>( | )<\\\/%p>'.replace(/%p/g, elm), 'gi'); - t.reBR2Nbsp = new RegExp(']+)>\\s*
    \\s*<\\\/p>|

    \\s*
    \\s*<\\\/p>'.replace(/p/g, elm), 'gi'); + setup : function() { + var t = this, ed = t.editor, s = ed.settings, dom = ed.dom, selection = ed.selection, blockElements = ed.schema.getBlockElements(); - function padd(ed, o) { - if (isOpera) - o.content = o.content.replace(t.reOpera, ''); + // Force root blocks + if (s.forced_root_block) { + function addRootBlocks() { + var node = selection.getStart(), rootNode = ed.getBody(), rng, startContainer, startOffset, endContainer, endOffset, rootBlockNode, tempNode, offset = -0xFFFFFF; - o.content = tinymce._replace(t.rePadd, '<' + elm + '$1$2$3$4$5$6>\u00a0', o.content); + if (!node || node.nodeType !== 1) + return; - if (!isIE && !isOpera && o.set) { - // Use   instead of BR in padded paragraphs - o.content = o.content.replace(t.reNbsp2BR1, '<' + elm + '$1$2>
    '); - o.content = o.content.replace(t.reNbsp2BR2, '<' + elm + '$1$2>
    '); - } else - o.content = tinymce._replace(t.reBR2Nbsp, '<' + elm + '$1$2>\u00a0', o.content); - }; + // Check if node is wrapped in block + while (node != rootNode) { + if (blockElements[node.nodeName]) + return; - ed.onBeforeSetContent.add(padd); - ed.onPostProcess.add(padd); + node = node.parentNode; + } - if (s.forced_root_block) { - ed.onInit.add(t.forceRoots, t); - ed.onSetContent.add(t.forceRoots, t); - ed.onBeforeGetContent.add(t.forceRoots, t); - } - }, + // Get current selection + rng = selection.getRng(); + if (rng.setStart) { + startContainer = rng.startContainer; + startOffset = rng.startOffset; + endContainer = rng.endContainer; + endOffset = rng.endOffset; + } else { + // Force control range into text range + if (rng.item) { + rng = ed.getDoc().body.createTextRange(); + rng.moveToElementText(rng.item(0)); + } - setup : function() { - var t = this, ed = t.editor, s = ed.settings, dom = ed.dom, selection = ed.selection; + tmpRng = rng.duplicate(); + tmpRng.collapse(true); + startOffset = tmpRng.move('character', offset) * -1; - // Force root blocks when typing and when getting output - if (s.forced_root_block) { - ed.onBeforeExecCommand.add(t.forceRoots, t); - ed.onKeyUp.add(t.forceRoots, t); - ed.onPreProcess.add(t.forceRoots, t); + if (!tmpRng.collapsed) { + tmpRng = rng.duplicate(); + tmpRng.collapse(false); + endOffset = (tmpRng.move('character', offset) * -1) - startOffset; + } + } + + // Wrap non block elements and text nodes + for (node = rootNode.firstChild; node; node) { + if (node.nodeType === 3 || (node.nodeType == 1 && !blockElements[node.nodeName])) { + if (!rootBlockNode) { + rootBlockNode = dom.create(s.forced_root_block); + node.parentNode.insertBefore(rootBlockNode, node); + } + + tempNode = node; + node = node.nextSibling; + rootBlockNode.appendChild(tempNode); + } else { + rootBlockNode = null; + node = node.nextSibling; + } + } + + if (rng.setStart) { + rng.setStart(startContainer, startOffset); + rng.setEnd(endContainer, endOffset); + selection.setRng(rng); + } else { + try { + rng = ed.getDoc().body.createTextRange(); + rng.moveToElementText(rootNode); + rng.collapse(true); + rng.moveStart('character', startOffset); + + if (endOffset > 0) + rng.moveEnd('character', endOffset); + + rng.select(); + } catch (ex) { + // Ignore + } + } + + ed.nodeChanged(); + }; + + ed.onKeyUp.add(addRootBlocks); + ed.onClick.add(addRootBlocks); } if (s.force_br_newlines) { @@ -193,6 +233,7 @@ parent.innerHTML = '\uFEFF'; selection.select(parent, 1); + selection.collapse(true); ed.getDoc().execCommand('Delete', false, null); t._previousFormats = 0; } @@ -247,21 +288,6 @@ }); } - // Padd empty inline elements within block elements - // For example:

    becomes

     

    - ed.onPreProcess.add(function(ed, o) { - each(dom.select('p,h1,h2,h3,h4,h5,h6,div', o.node), function(p) { - if (isEmpty(p)) { - each(dom.select('span,em,strong,b,i', o.node), function(n) { - if (!n.hasChildNodes()) { - n.appendChild(ed.getDoc().createTextNode('\u00a0')); - return FALSE; // Break the loop one padding is enough - } - }); - } - }); - }); - // IE specific fixes if (isIE) { // Replaces IE:s auto generated paragraphs with the specified element name @@ -291,155 +317,6 @@ } }, - find : function(n, t, s) { - var ed = this.editor, w = ed.getDoc().createTreeWalker(n, 4, null, FALSE), c = -1; - - while (n = w.nextNode()) { - c++; - - // Index by node - if (t == 0 && n == s) - return c; - - // Node by index - if (t == 1 && c == s) - return n; - } - - return -1; - }, - - forceRoots : function(ed, e) { - var t = this, ed = t.editor, b = ed.getBody(), d = ed.getDoc(), se = ed.selection, s = se.getSel(), r = se.getRng(), si = -2, ei, so, eo, tr, c = -0xFFFFFF; - var nx, bl, bp, sp, le, nl = b.childNodes, i, n, eid; - - // Fix for bug #1863847 - //if (e && e.keyCode == 13) - // return TRUE; - - // Wrap non blocks into blocks - for (i = nl.length - 1; i >= 0; i--) { - nx = nl[i]; - - // Ignore internal elements - if (nx.nodeType === 1 && nx.getAttribute('_mce_type')) { - bl = null; - continue; - } - - // Is text or non block element - if (nx.nodeType === 3 || (!t.dom.isBlock(nx) && nx.nodeType !== 8 && !/^(script|mce:script|style|mce:style)$/i.test(nx.nodeName))) { - if (!bl) { - // Create new block but ignore whitespace - if (nx.nodeType != 3 || /[^\s]/g.test(nx.nodeValue)) { - // Store selection - if (si == -2 && r) { - if (!isIE || r.setStart) { - // If selection is element then mark it - if (r.startContainer.nodeType == 1 && (n = r.startContainer.childNodes[r.startOffset]) && n.nodeType == 1) { - // Save the id of the selected element - eid = n.getAttribute("id"); - n.setAttribute("id", "__mce"); - } else { - // If element is inside body, might not be the case in contentEdiable mode - if (ed.dom.getParent(r.startContainer, function(e) {return e === b;})) { - so = r.startOffset; - eo = r.endOffset; - si = t.find(b, 0, r.startContainer); - ei = t.find(b, 0, r.endContainer); - } - } - } else { - // Force control range into text range - if (r.item) { - tr = d.body.createTextRange(); - tr.moveToElementText(r.item(0)); - r = tr; - } - - tr = d.body.createTextRange(); - tr.moveToElementText(b); - tr.collapse(1); - bp = tr.move('character', c) * -1; - - tr = r.duplicate(); - tr.collapse(1); - sp = tr.move('character', c) * -1; - - tr = r.duplicate(); - tr.collapse(0); - le = (tr.move('character', c) * -1) - sp; - - si = sp - bp; - ei = le; - } - } - - // Uses replaceChild instead of cloneNode since it removes selected attribute from option elements on IE - // See: http://support.microsoft.com/kb/829907 - bl = ed.dom.create(ed.settings.forced_root_block); - nx.parentNode.replaceChild(bl, nx); - bl.appendChild(nx); - } - } else { - if (bl.hasChildNodes()) - bl.insertBefore(nx, bl.firstChild); - else - bl.appendChild(nx); - } - } else - bl = null; // Time to create new block - } - - // Restore selection - if (si != -2) { - if (!isIE || r.setStart) { - bl = b.getElementsByTagName(ed.settings.element)[0]; - r = d.createRange(); - - // Select last location or generated block - if (si != -1) - r.setStart(t.find(b, 1, si), so); - else - r.setStart(bl, 0); - - // Select last location or generated block - if (ei != -1) - r.setEnd(t.find(b, 1, ei), eo); - else - r.setEnd(bl, 0); - - if (s) { - s.removeAllRanges(); - s.addRange(r); - } - } else { - try { - r = s.createRange(); - r.moveToElementText(b); - r.collapse(1); - r.moveStart('character', si); - r.moveEnd('character', ei); - r.select(); - } catch (ex) { - // Ignore - } - } - } else if ((!isIE || r.setStart) && (n = ed.dom.get('__mce'))) { - // Restore the id of the selected element - if (eid) - n.setAttribute('id', eid); - else - n.removeAttribute('id'); - - // Move caret before selected element - r = d.createRange(); - r.setStartBefore(n); - r.setEndBefore(n); - se.setRng(r); - } - }, - getParentBlock : function(n) { var d = this.dom; @@ -450,6 +327,8 @@ var t = this, ed = t.editor, dom = ed.dom, d = ed.getDoc(), se = ed.settings, s = ed.selection.getSel(), r = s.getRangeAt(0), b = d.body; var rb, ra, dir, sn, so, en, eo, sb, eb, bn, bef, aft, sc, ec, n, vp = dom.getViewPort(ed.getWin()), y, ch, car; + ed.undoManager.beforeChange(); + // If root blocks are forced then use Operas default behavior since it's really good // Removed due to bug: #1853816 // if (se.forced_root_block && isOpera) @@ -625,10 +504,6 @@ if (aft.firstChild && aft.firstChild.nodeName == bn) aft.innerHTML = aft.firstChild.innerHTML; - // Padd empty blocks - if (isEmpty(bef)) - bef.innerHTML = '
    '; - function appendStyles(e, en) { var nl = [], nn, n, i; @@ -653,14 +528,18 @@ nn = nn.appendChild(nl[i]); // Padd most inner style element - nl[0].innerHTML = isOpera ? ' ' : '
    '; // Extra space for Opera so that the caret can move there + nl[0].innerHTML = isOpera ? '\u00a0' : '
    '; // Extra space for Opera so that the caret can move there return nl[0]; // Move caret to most inner element } else - e.innerHTML = isOpera ? ' ' : '
    '; // Extra space for Opera so that the caret can move there + e.innerHTML = isOpera ? '\u00a0' : '
    '; // Extra space for Opera so that the caret can move there }; + + // Padd empty blocks + if (dom.isEmpty(bef)) + appendStyles(bef, sn); // Fill empty afterblook with current style - if (isEmpty(aft)) + if (dom.isEmpty(aft)) car = appendStyles(aft, en); // Opera needs this one backwards for older versions @@ -676,27 +555,26 @@ aft.normalize(); bef.normalize(); - function first(n) { - return d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, FALSE).nextNode() || n; - }; - // Move cursor and scroll into view - r = d.createRange(); - r.selectNodeContents(isGecko ? first(car || aft) : car || aft); - r.collapse(1); - s.removeAllRanges(); - s.addRange(r); + ed.selection.select(aft, true); + ed.selection.collapse(true); // scrollIntoView seems to scroll the parent window in most browsers now including FF 3.0b4 so it's time to stop using it and do it our selfs y = ed.dom.getPos(aft).y; - ch = aft.clientHeight; + //ch = aft.clientHeight; // Is element within viewport - if (y < vp.y || y + ch > vp.y + vp.h) { + if (y < vp.y || y + 25 > vp.y + vp.h) { ed.getWin().scrollTo(0, y < vp.y ? y : y - vp.h + 25); // Needs to be hardcoded to roughly one line of text if a huge text block is broken into two blocks - //console.debug('SCROLL!', 'vp.y: ' + vp.y, 'y' + y, 'vp.h' + vp.h, 'clientHeight' + aft.clientHeight, 'yyy: ' + (y < vp.y ? y : y - vp.h + aft.clientHeight)); + + /*console.debug( + 'Element: y=' + y + ', h=' + ch + ', ' + + 'Viewport: y=' + vp.y + ", h=" + vp.h + ', bottom=' + (vp.y + vp.h) + );*/ } + ed.undoManager.add(); + return FALSE; }, diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/Formatter.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/Formatter.js index bbb655456b..f158b83f72 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/Formatter.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/Formatter.js @@ -1,1574 +1,1806 @@ -/** - * Formatter.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function(tinymce) { - /** - * Text formatter engine class. This class is used to apply formats like bold, italic, font size - * etc to the current selection or specific nodes. This engine was build to replace the browsers - * default formatting logic for execCommand due to it's inconsistant and buggy behavior. - * - * @class tinymce.Formatter - * @example - * tinymce.activeEditor.formatter.register('mycustomformat', { - * inline : 'span', - * styles : {color : '#ff0000'} - * }); - * - * tinymce.activeEditor.formatter.apply('mycustomformat'); - */ - - /** - * Constructs a new formatter instance. - * - * @constructor Formatter - * @param {tinymce.Editor} ed Editor instance to construct the formatter engine to. - */ - tinymce.Formatter = function(ed) { - var formats = {}, - each = tinymce.each, - dom = ed.dom, - selection = ed.selection, - TreeWalker = tinymce.dom.TreeWalker, - rangeUtils = new tinymce.dom.RangeUtils(dom), - isValid = ed.schema.isValid, - isBlock = dom.isBlock, - forcedRootBlock = ed.settings.forced_root_block, - nodeIndex = dom.nodeIndex, - INVISIBLE_CHAR = '\uFEFF', - MCE_ATTR_RE = /^(src|href|style)$/, - FALSE = false, - TRUE = true, - undefined, - pendingFormats = {apply : [], remove : []}; - - function isArray(obj) { - return obj instanceof Array; - }; - - function getParents(node, selector) { - return dom.getParents(node, selector, dom.getRoot()); - }; - - function isCaretNode(node) { - return node.nodeType === 1 && (node.face === 'mceinline' || node.style.fontFamily === 'mceinline'); - }; - - // Public functions - - /** - * Returns the format by name or all formats if no name is specified. - * - * @method get - * @param {String} name Optional name to retrive by. - * @return {Array/Object} Array/Object with all registred formats or a specific format. - */ - function get(name) { - return name ? formats[name] : formats; - }; - - /** - * Registers a specific format by name. - * - * @method register - * @param {Object/String} name Name of the format for example "bold". - * @param {Object/Array} format Optional format object or array of format variants can only be omitted if the first arg is an object. - */ - function register(name, format) { - if (name) { - if (typeof(name) !== 'string') { - each(name, function(format, name) { - register(name, format); - }); - } else { - // Force format into array and add it to internal collection - format = format.length ? format : [format]; - - each(format, function(format) { - // Set deep to false by default on selector formats this to avoid removing - // alignment on images inside paragraphs when alignment is changed on paragraphs - if (format.deep === undefined) - format.deep = !format.selector; - - // Default to true - if (format.split === undefined) - format.split = !format.selector || format.inline; - - // Default to true - if (format.remove === undefined && format.selector && !format.inline) - format.remove = 'none'; - - // Mark format as a mixed format inline + block level - if (format.selector && format.inline) { - format.mixed = true; - format.block_expand = true; - } - - // Split classes if needed - if (typeof(format.classes) === 'string') - format.classes = format.classes.split(/\s+/); - }); - - formats[name] = format; - } - } - }; - - /** - * Applies the specified format to the current selection or specified node. - * - * @method apply - * @param {String} name Name of format to apply. - * @param {Object} vars Optional list of variables to replace within format before applying it. - * @param {Node} node Optional node to apply the format to defaults to current selection. - */ - function apply(name, vars, node) { - var formatList = get(name), format = formatList[0], bookmark, rng, i; - - /** - * Moves the start to the first suitable text node. - */ - function moveStart(rng) { - var container = rng.startContainer, - offset = rng.startOffset, - walker, node; - - // Move startContainer/startOffset in to a suitable node - if (container.nodeType == 1 || container.nodeValue === "") { - container = container.nodeType == 1 ? container.childNodes[offset] : container; - - // Might fail if the offset is behind the last element in it's container - if (container) { - walker = new TreeWalker(container, container.parentNode); - for (node = walker.current(); node; node = walker.next()) { - if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { - rng.setStart(node, 0); - break; - } - } - } - } - - return rng; - }; - - function setElementFormat(elm, fmt) { - fmt = fmt || format; - - if (elm) { - each(fmt.styles, function(value, name) { - dom.setStyle(elm, name, replaceVars(value, vars)); - }); - - each(fmt.attributes, function(value, name) { - dom.setAttrib(elm, name, replaceVars(value, vars)); - }); - - each(fmt.classes, function(value) { - value = replaceVars(value, vars); - - if (!dom.hasClass(elm, value)) - dom.addClass(elm, value); - }); - } - }; - - function applyRngStyle(rng) { - var newWrappers = [], wrapName, wrapElm; - - // Setup wrapper element - wrapName = format.inline || format.block; - wrapElm = dom.create(wrapName); - setElementFormat(wrapElm); - - rangeUtils.walk(rng, function(nodes) { - var currentWrapElm; - - /** - * Process a list of nodes wrap them. - */ - function process(node) { - var nodeName = node.nodeName.toLowerCase(), parentName = node.parentNode.nodeName.toLowerCase(), found; - - // Stop wrapping on br elements - if (isEq(nodeName, 'br')) { - currentWrapElm = 0; - - // Remove any br elements when we wrap things - if (format.block) - dom.remove(node); - - return; - } - - // If node is wrapper type - if (format.wrapper && matchNode(node, name, vars)) { - currentWrapElm = 0; - return; - } - - // Can we rename the block - if (format.block && !format.wrapper && isTextBlock(nodeName)) { - node = dom.rename(node, wrapName); - setElementFormat(node); - newWrappers.push(node); - currentWrapElm = 0; - return; - } - - // Handle selector patterns - if (format.selector) { - // Look for matching formats - each(formatList, function(format) { - if (dom.is(node, format.selector) && !isCaretNode(node)) { - setElementFormat(node, format); - found = true; - } - }); - - // Continue processing if a selector match wasn't found and a inline element is defined - if (!format.inline || found) { - currentWrapElm = 0; - return; - } - } - - // Is it valid to wrap this item - if ((format.wrap_links !== false || nodeName != 'a') && isValid(wrapName, nodeName) && isValid(parentName, wrapName)) { - // Start wrapping - if (!currentWrapElm) { - // Wrap the node - currentWrapElm = wrapElm.cloneNode(FALSE); - node.parentNode.insertBefore(currentWrapElm, node); - newWrappers.push(currentWrapElm); - } - - currentWrapElm.appendChild(node); - } else { - // Start a new wrapper for possible children - currentWrapElm = 0; - - each(tinymce.grep(node.childNodes), process); - - // End the last wrapper - currentWrapElm = 0; - } - }; - - // Process siblings from range - each(nodes, process); - }); - - // Cleanup - each(newWrappers, function(node) { - var childCount; - - function getChildCount(node) { - var count = 0; - - each(node.childNodes, function(node) { - if (!isWhiteSpaceNode(node) && !isBookmarkNode(node)) - count++; - }); - - return count; - }; - - function mergeStyles(node) { - var child, clone; - - each(node.childNodes, function(node) { - if (node.nodeType == 1 && !isBookmarkNode(node) && !isCaretNode(node)) { - child = node; - return FALSE; // break loop - } - }); - - // If child was found and of the same type as the current node - if (child && matchName(child, format)) { - clone = child.cloneNode(FALSE); - setElementFormat(clone); - - dom.replace(clone, node, TRUE); - dom.remove(child, 1); - } - - return clone || node; - }; - - childCount = getChildCount(node); - - // Remove empty nodes - if (childCount === 0) { - dom.remove(node, 1); - return; - } - - if (format.inline || format.wrapper) { - // Merges the current node with it's children of similar type to reduce the number of elements - if (!format.exact && childCount === 1) - node = mergeStyles(node); - - // Remove/merge children - each(formatList, function(format) { - // Merge all children of similar type will move styles from child to parent - // this: text - // will become: text - each(dom.select(format.inline, node), function(child) { - removeFormat(format, vars, child, format.exact ? child : null); - }); - }); - - // Remove child if direct parent is of same type - if (matchNode(node.parentNode, name, vars)) { - dom.remove(node, 1); - node = 0; - return TRUE; - } - - // Look for parent with similar style format - if (format.merge_with_parents) { - dom.getParent(node.parentNode, function(parent) { - if (matchNode(parent, name, vars)) { - dom.remove(node, 1); - node = 0; - return TRUE; - } - }); - } - - // Merge next and previous siblings if they are similar texttext becomes texttext - if (node) { - node = mergeSiblings(getNonWhiteSpaceSibling(node), node); - node = mergeSiblings(node, getNonWhiteSpaceSibling(node, TRUE)); - } - } - }); - }; - - if (format) { - if (node) { - rng = dom.createRng(); - - rng.setStartBefore(node); - rng.setEndAfter(node); - - applyRngStyle(expandRng(rng, formatList)); - } else { - if (!selection.isCollapsed() || !format.inline) { - // Apply formatting to selection - bookmark = selection.getBookmark(); - applyRngStyle(expandRng(selection.getRng(TRUE), formatList)); - - selection.moveToBookmark(bookmark); - selection.setRng(moveStart(selection.getRng(TRUE))); - ed.nodeChanged(); - } else - performCaretAction('apply', name, vars); - } - } - }; - - /** - * Removes the specified format from the current selection or specified node. - * - * @method remove - * @param {String} name Name of format to remove. - * @param {Object} vars Optional list of variables to replace within format before removing it. - * @param {Node} node Optional node to remove the format from defaults to current selection. - */ - function remove(name, vars, node) { - var formatList = get(name), format = formatList[0], bookmark, i, rng; - - /** - * Moves the start to the first suitable text node. - */ - function moveStart(rng) { - var container = rng.startContainer, - offset = rng.startOffset, - walker, node, nodes, tmpNode; - - // Convert text node into index if possible - if (container.nodeType == 3 && offset >= container.nodeValue.length - 1) { - container = container.parentNode; - offset = nodeIndex(container) + 1; - } - - // Move startContainer/startOffset in to a suitable node - if (container.nodeType == 1) { - nodes = container.childNodes; - container = nodes[Math.min(offset, nodes.length - 1)]; - walker = new TreeWalker(container); - - // If offset is at end of the parent node walk to the next one - if (offset > nodes.length - 1) - walker.next(); - - for (node = walker.current(); node; node = walker.next()) { - if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { - // IE has a "neat" feature where it moves the start node into the closest element - // we can avoid this by inserting an element before it and then remove it after we set the selection - tmpNode = dom.create('a', null, INVISIBLE_CHAR); - node.parentNode.insertBefore(tmpNode, node); - - // Set selection and remove tmpNode - rng.setStart(node, 0); - selection.setRng(rng); - dom.remove(tmpNode); - - return; - } - } - } - }; - - // Merges the styles for each node - function process(node) { - var children, i, l; - - // Grab the children first since the nodelist might be changed - children = tinymce.grep(node.childNodes); - - // Process current node - for (i = 0, l = formatList.length; i < l; i++) { - if (removeFormat(formatList[i], vars, node, node)) - break; - } - - // Process the children - if (format.deep) { - for (i = 0, l = children.length; i < l; i++) - process(children[i]); - } - }; - - function findFormatRoot(container) { - var formatRoot; - - // Find format root - each(getParents(container.parentNode).reverse(), function(parent) { - var format; - - // Find format root element - if (!formatRoot && parent.id != '_start' && parent.id != '_end') { - // Is the node matching the format we are looking for - format = matchNode(parent, name, vars); - if (format && format.split !== false) - formatRoot = parent; - } - }); - - return formatRoot; - }; - - function wrapAndSplit(format_root, container, target, split) { - var parent, clone, lastClone, firstClone, i, formatRootParent; - - // Format root found then clone formats and split it - if (format_root) { - formatRootParent = format_root.parentNode; - - for (parent = container.parentNode; parent && parent != formatRootParent; parent = parent.parentNode) { - clone = parent.cloneNode(FALSE); - - for (i = 0; i < formatList.length; i++) { - if (removeFormat(formatList[i], vars, clone, clone)) { - clone = 0; - break; - } - } - - // Build wrapper node - if (clone) { - if (lastClone) - clone.appendChild(lastClone); - - if (!firstClone) - firstClone = clone; - - lastClone = clone; - } - } - - // Never split block elements if the format is mixed - if (split && (!format.mixed || !isBlock(format_root))) - container = dom.split(format_root, container); - - // Wrap container in cloned formats - if (lastClone) { - target.parentNode.insertBefore(lastClone, target); - firstClone.appendChild(target); - } - } - - return container; - }; - - function splitToFormatRoot(container) { - return wrapAndSplit(findFormatRoot(container), container, container, true); - }; - - function unwrap(start) { - var node = dom.get(start ? '_start' : '_end'), - out = node[start ? 'firstChild' : 'lastChild']; - - // If the end is placed within the start the result will be removed - // So this checks if the out node is a bookmark node if it is it - // checks for another more suitable node - if (isBookmarkNode(out)) - out = out[start ? 'firstChild' : 'lastChild']; - - dom.remove(node, true); - - return out; - }; - - function removeRngStyle(rng) { - var startContainer, endContainer; - - rng = expandRng(rng, formatList, TRUE); - - if (format.split) { - startContainer = getContainer(rng, TRUE); - endContainer = getContainer(rng); - - if (startContainer != endContainer) { - // Wrap start/end nodes in span element since these might be cloned/moved - startContainer = wrap(startContainer, 'span', {id : '_start', _mce_type : 'bookmark'}); - endContainer = wrap(endContainer, 'span', {id : '_end', _mce_type : 'bookmark'}); - - // Split start/end - splitToFormatRoot(startContainer); - splitToFormatRoot(endContainer); - - // Unwrap start/end to get real elements again - startContainer = unwrap(TRUE); - endContainer = unwrap(); - } else - startContainer = endContainer = splitToFormatRoot(startContainer); - - // Update range positions since they might have changed after the split operations - rng.startContainer = startContainer.parentNode; - rng.startOffset = nodeIndex(startContainer); - rng.endContainer = endContainer.parentNode; - rng.endOffset = nodeIndex(endContainer) + 1; - } - - // Remove items between start/end - rangeUtils.walk(rng, function(nodes) { - each(nodes, function(node) { - process(node); - }); - }); - }; - - // Handle node - if (node) { - rng = dom.createRng(); - rng.setStartBefore(node); - rng.setEndAfter(node); - removeRngStyle(rng); - return; - } - - if (!selection.isCollapsed() || !format.inline) { - bookmark = selection.getBookmark(); - removeRngStyle(selection.getRng(TRUE)); - selection.moveToBookmark(bookmark); - - // Check if start element still has formatting then we are at: "text|text" and need to move the start into the next text node - if (match(name, vars, selection.getStart())) { - moveStart(selection.getRng(true)); - } - - ed.nodeChanged(); - } else - performCaretAction('remove', name, vars); - }; - - /** - * Toggles the specified format on/off. - * - * @method toggle - * @param {String} name Name of format to apply/remove. - * @param {Object} vars Optional list of variables to replace within format before applying/removing it. - * @param {Node} node Optional node to apply the format to or remove from. Defaults to current selection. - */ - function toggle(name, vars, node) { - if (match(name, vars, node)) - remove(name, vars, node); - else - apply(name, vars, node); - }; - - /** - * Return true/false if the specified node has the specified format. - * - * @method matchNode - * @param {Node} node Node to check the format on. - * @param {String} name Format name to check. - * @param {Object} vars Optional list of variables to replace before checking it. - * @param {Boolean} similar Match format that has similar properties. - * @return {Object} Returns the format object it matches or undefined if it doesn't match. - */ - function matchNode(node, name, vars, similar) { - var formatList = get(name), format, i, classes; - - function matchItems(node, format, item_name) { - var key, value, items = format[item_name], i; - - // Check all items - if (items) { - // Non indexed object - if (items.length === undefined) { - for (key in items) { - if (items.hasOwnProperty(key)) { - if (item_name === 'attributes') - value = dom.getAttrib(node, key); - else - value = getStyle(node, key); - - if (similar && !value && !format.exact) - return; - - if ((!similar || format.exact) && !isEq(value, replaceVars(items[key], vars))) - return; - } - } - } else { - // Only one match needed for indexed arrays - for (i = 0; i < items.length; i++) { - if (item_name === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(node, items[i])) - return format; - } - } - } - - return format; - }; - - if (formatList && node) { - // Check each format in list - for (i = 0; i < formatList.length; i++) { - format = formatList[i]; - - // Name name, attributes, styles and classes - if (matchName(node, format) && matchItems(node, format, 'attributes') && matchItems(node, format, 'styles')) { - // Match classes - if (classes = format.classes) { - for (i = 0; i < classes.length; i++) { - if (!dom.hasClass(node, classes[i])) - return; - } - } - - return format; - } - } - } - }; - - /** - * Matches the current selection or specified node against the specified format name. - * - * @method match - * @param {String} name Name of format to match. - * @param {Object} vars Optional list of variables to replace before checking it. - * @param {Node} node Optional node to check. - * @return {boolean} true/false if the specified selection/node matches the format. - */ - function match(name, vars, node) { - var startNode, i; - - function matchParents(node) { - // Find first node with similar format settings - node = dom.getParent(node, function(node) { - return !!matchNode(node, name, vars, true); - }); - - // Do an exact check on the similar format element - return matchNode(node, name, vars); - }; - - // Check specified node - if (node) - return matchParents(node); - - // Check pending formats - if (selection.isCollapsed()) { - for (i = pendingFormats.apply.length - 1; i >= 0; i--) { - if (pendingFormats.apply[i].name == name) - return true; - } - - for (i = pendingFormats.remove.length - 1; i >= 0; i--) { - if (pendingFormats.remove[i].name == name) - return false; - } - - return matchParents(selection.getNode()); - } - - // Check selected node - node = selection.getNode(); - if (matchParents(node)) - return TRUE; - - // Check start node if it's different - startNode = selection.getStart(); - if (startNode != node) { - if (matchParents(startNode)) - return TRUE; - } - - return FALSE; - }; - - /** - * Matches the current selection against the array of formats and returns a new array with matching formats. - * - * @method matchAll - * @param {Array} names Name of format to match. - * @param {Object} vars Optional list of variables to replace before checking it. - * @return {Array} Array with matched formats. - */ - function matchAll(names, vars) { - var startElement, matchedFormatNames = [], checkedMap = {}, i, ni, name; - - // If the selection is collapsed then check pending formats - if (selection.isCollapsed()) { - for (ni = 0; ni < names.length; ni++) { - // If the name is to be removed, then stop it from being added - for (i = pendingFormats.remove.length - 1; i >= 0; i--) { - name = names[ni]; - - if (pendingFormats.remove[i].name == name) { - checkedMap[name] = true; - break; - } - } - } - - // If the format is to be applied - for (i = pendingFormats.apply.length - 1; i >= 0; i--) { - for (ni = 0; ni < names.length; ni++) { - name = names[ni]; - - if (!checkedMap[name] && pendingFormats.apply[i].name == name) { - checkedMap[name] = true; - matchedFormatNames.push(name); - } - } - } - } - - // Check start of selection for formats - startElement = selection.getStart(); - dom.getParent(startElement, function(node) { - var i, name; - - for (i = 0; i < names.length; i++) { - name = names[i]; - - if (!checkedMap[name] && matchNode(node, name, vars)) { - checkedMap[name] = true; - matchedFormatNames.push(name); - } - } - }); - - return matchedFormatNames; - }; - - /** - * Returns true/false if the specified format can be applied to the current selection or not. It will currently only check the state for selector formats, it returns true on all other format types. - * - * @method canApply - * @param {String} name Name of format to check. - * @return {boolean} true/false if the specified format can be applied to the current selection/node. - */ - function canApply(name) { - var formatList = get(name), startNode, parents, i, x, selector; - - if (formatList) { - startNode = selection.getStart(); - parents = getParents(startNode); - - for (x = formatList.length - 1; x >= 0; x--) { - selector = formatList[x].selector; - - // Format is not selector based, then always return TRUE - if (!selector) - return TRUE; - - for (i = parents.length - 1; i >= 0; i--) { - if (dom.is(parents[i], selector)) - return TRUE; - } - } - } - - return FALSE; - }; - - // Expose to public - tinymce.extend(this, { - get : get, - register : register, - apply : apply, - remove : remove, - toggle : toggle, - match : match, - matchAll : matchAll, - matchNode : matchNode, - canApply : canApply - }); - - // Private functions - - /** - * Checks if the specified nodes name matches the format inline/block or selector. - * - * @private - * @param {Node} node Node to match against the specified format. - * @param {Object} format Format object o match with. - * @return {boolean} true/false if the format matches. - */ - function matchName(node, format) { - // Check for inline match - if (isEq(node, format.inline)) - return TRUE; - - // Check for block match - if (isEq(node, format.block)) - return TRUE; - - // Check for selector match - if (format.selector) - return dom.is(node, format.selector); - }; - - /** - * Compares two string/nodes regardless of their case. - * - * @private - * @param {String/Node} Node or string to compare. - * @param {String/Node} Node or string to compare. - * @return {boolean} True/false if they match. - */ - function isEq(str1, str2) { - str1 = str1 || ''; - str2 = str2 || ''; - - str1 = '' + (str1.nodeName || str1); - str2 = '' + (str2.nodeName || str2); - - return str1.toLowerCase() == str2.toLowerCase(); - }; - - /** - * Returns the style by name on the specified node. This method modifies the style - * contents to make it more easy to match. This will resolve a few browser issues. - * - * @private - * @param {Node} node to get style from. - * @param {String} name Style name to get. - * @return {String} Style item value. - */ - function getStyle(node, name) { - var styleVal = dom.getStyle(node, name); - - // Force the format to hex - if (name == 'color' || name == 'backgroundColor') - styleVal = dom.toHex(styleVal); - - // Opera will return bold as 700 - if (name == 'fontWeight' && styleVal == 700) - styleVal = 'bold'; - - return '' + styleVal; - }; - - /** - * Replaces variables in the value. The variable format is %var. - * - * @private - * @param {String} value Value to replace variables in. - * @param {Object} vars Name/value array with variables to replace. - * @return {String} New value with replaced variables. - */ - function replaceVars(value, vars) { - if (typeof(value) != "string") - value = value(vars); - else if (vars) { - value = value.replace(/%(\w+)/g, function(str, name) { - return vars[name] || str; - }); - } - - return value; - }; - - function isWhiteSpaceNode(node) { - return node && node.nodeType === 3 && /^([\s\r\n]+|)$/.test(node.nodeValue); - }; - - function wrap(node, name, attrs) { - var wrapper = dom.create(name, attrs); - - node.parentNode.insertBefore(wrapper, node); - wrapper.appendChild(node); - - return wrapper; - }; - - /** - * Expands the specified range like object to depending on format. - * - * For example on block formats it will move the start/end position - * to the beginning of the current block. - * - * @private - * @param {Object} rng Range like object. - * @param {Array} formats Array with formats to expand by. - * @return {Object} Expanded range like object. - */ - function expandRng(rng, format, remove) { - var startContainer = rng.startContainer, - startOffset = rng.startOffset, - endContainer = rng.endContainer, - endOffset = rng.endOffset, sibling, lastIdx; - - // This function walks up the tree if there is no siblings before/after the node - function findParentContainer(container, child_name, sibling_name, root) { - var parent, child; - - root = root || dom.getRoot(); - - for (;;) { - // Check if we can move up are we at root level or body level - parent = container.parentNode; - - // Stop expanding on block elements or root depending on format - if (parent == root || (!format[0].block_expand && isBlock(parent))) - return container; - - for (sibling = parent[child_name]; sibling && sibling != container; sibling = sibling[sibling_name]) { - if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) - return container; - - if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling)) - return container; - } - - container = container.parentNode; - } - - return container; - }; - - // If index based start position then resolve it - if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) { - lastIdx = startContainer.childNodes.length - 1; - startContainer = startContainer.childNodes[startOffset > lastIdx ? lastIdx : startOffset]; - - if (startContainer.nodeType == 3) - startOffset = 0; - } - - // If index based end position then resolve it - if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) { - lastIdx = endContainer.childNodes.length - 1; - endContainer = endContainer.childNodes[endOffset > lastIdx ? lastIdx : endOffset - 1]; - - if (endContainer.nodeType == 3) - endOffset = endContainer.nodeValue.length; - } - - // Exclude bookmark nodes if possible - if (isBookmarkNode(startContainer.parentNode)) - startContainer = startContainer.parentNode; - - if (isBookmarkNode(startContainer)) - startContainer = startContainer.nextSibling || startContainer; - - if (isBookmarkNode(endContainer.parentNode)) - endContainer = endContainer.parentNode; - - if (isBookmarkNode(endContainer)) - endContainer = endContainer.previousSibling || endContainer; - - // Move start/end point up the tree if the leaves are sharp and if we are in different containers - // Example * becomes !: !

    *texttext*

    ! - // This will reduce the number of wrapper elements that needs to be created - // Move start point up the tree - if (format[0].inline || format[0].block_expand) { - startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); - endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); - } - - // Expand start/end container to matching selector - if (format[0].selector && format[0].expand !== FALSE && !format[0].inline) { - function findSelectorEndPoint(container, sibling_name) { - var parents, i, y; - - if (container.nodeType == 3 && container.nodeValue.length == 0 && container[sibling_name]) - container = container[sibling_name]; - - parents = getParents(container); - for (i = 0; i < parents.length; i++) { - for (y = 0; y < format.length; y++) { - if (dom.is(parents[i], format[y].selector)) - return parents[i]; - } - } - - return container; - }; - - // Find new startContainer/endContainer if there is better one - startContainer = findSelectorEndPoint(startContainer, 'previousSibling'); - endContainer = findSelectorEndPoint(endContainer, 'nextSibling'); - } - - // Expand start/end container to matching block element or text node - if (format[0].block || format[0].selector) { - function findBlockEndPoint(container, sibling_name, sibling_name2) { - var node; - - // Expand to block of similar type - if (!format[0].wrapper) - node = dom.getParent(container, format[0].block); - - // Expand to first wrappable block element or any block element - if (!node) - node = dom.getParent(container.nodeType == 3 ? container.parentNode : container, isBlock); - - // Exclude inner lists from wrapping - if (node && format[0].wrapper) - node = getParents(node, 'ul,ol').reverse()[0] || node; - - // Didn't find a block element look for first/last wrappable element - if (!node) { - node = container; - - while (node[sibling_name] && !isBlock(node[sibling_name])) { - node = node[sibling_name]; - - // Break on BR but include it will be removed later on - // we can't remove it now since we need to check if it can be wrapped - if (isEq(node, 'br')) - break; - } - } - - return node || container; - }; - - // Find new startContainer/endContainer if there is better one - startContainer = findBlockEndPoint(startContainer, 'previousSibling'); - endContainer = findBlockEndPoint(endContainer, 'nextSibling'); - - // Non block element then try to expand up the leaf - if (format[0].block) { - if (!isBlock(startContainer)) - startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); - - if (!isBlock(endContainer)) - endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); - } - } - - // Setup index for startContainer - if (startContainer.nodeType == 1) { - startOffset = nodeIndex(startContainer); - startContainer = startContainer.parentNode; - } - - // Setup index for endContainer - if (endContainer.nodeType == 1) { - endOffset = nodeIndex(endContainer) + 1; - endContainer = endContainer.parentNode; - } - - // Return new range like object - return { - startContainer : startContainer, - startOffset : startOffset, - endContainer : endContainer, - endOffset : endOffset - }; - } - - /** - * Removes the specified format for the specified node. It will also remove the node if it doesn't have - * any attributes if the format specifies it to do so. - * - * @private - * @param {Object} format Format object with items to remove from node. - * @param {Object} vars Name/value object with variables to apply to format. - * @param {Node} node Node to remove the format styles on. - * @param {Node} compare_node Optional compare node, if specified the styles will be compared to that node. - * @return {Boolean} True/false if the node was removed or not. - */ - function removeFormat(format, vars, node, compare_node) { - var i, attrs, stylesModified; - - // Check if node matches format - if (!matchName(node, format)) - return FALSE; - - // Should we compare with format attribs and styles - if (format.remove != 'all') { - // Remove styles - each(format.styles, function(value, name) { - value = replaceVars(value, vars); - - // Indexed array - if (typeof(name) === 'number') { - name = value; - compare_node = 0; - } - - if (!compare_node || isEq(getStyle(compare_node, name), value)) - dom.setStyle(node, name, ''); - - stylesModified = 1; - }); - - // Remove style attribute if it's empty - if (stylesModified && dom.getAttrib(node, 'style') == '') { - node.removeAttribute('style'); - node.removeAttribute('_mce_style'); - } - - // Remove attributes - each(format.attributes, function(value, name) { - var valueOut; - - value = replaceVars(value, vars); - - // Indexed array - if (typeof(name) === 'number') { - name = value; - compare_node = 0; - } - - if (!compare_node || isEq(dom.getAttrib(compare_node, name), value)) { - // Keep internal classes - if (name == 'class') { - value = dom.getAttrib(node, name); - if (value) { - // Build new class value where everything is removed except the internal prefixed classes - valueOut = ''; - each(value.split(/\s+/), function(cls) { - if (/mce\w+/.test(cls)) - valueOut += (valueOut ? ' ' : '') + cls; - }); - - // We got some internal classes left - if (valueOut) { - dom.setAttrib(node, name, valueOut); - return; - } - } - } - - // IE6 has a bug where the attribute doesn't get removed correctly - if (name == "class") - node.removeAttribute('className'); - - // Remove mce prefixed attributes - if (MCE_ATTR_RE.test(name)) - node.removeAttribute('_mce_' + name); - - node.removeAttribute(name); - } - }); - - // Remove classes - each(format.classes, function(value) { - value = replaceVars(value, vars); - - if (!compare_node || dom.hasClass(compare_node, value)) - dom.removeClass(node, value); - }); - - // Check for non internal attributes - attrs = dom.getAttribs(node); - for (i = 0; i < attrs.length; i++) { - if (attrs[i].nodeName.indexOf('_') !== 0) - return FALSE; - } - } - - // Remove the inline child if it's empty for example or - if (format.remove != 'none') { - removeNode(node, format); - return TRUE; - } - }; - - /** - * Removes the node and wrap it's children in paragraphs before doing so or - * appends BR elements to the beginning/end of the block element if forcedRootBlocks is disabled. - * - * If the div in the node below gets removed: - * text
    text
    text - * - * Output becomes: - * text

    text
    text - * - * So when the div is removed the result is: - * text
    text
    text - * - * @private - * @param {Node} node Node to remove + apply BR/P elements to. - * @param {Object} format Format rule. - * @return {Node} Input node. - */ - function removeNode(node, format) { - var parentNode = node.parentNode, rootBlockElm; - - if (format.block) { - if (!forcedRootBlock) { - function find(node, next, inc) { - node = getNonWhiteSpaceSibling(node, next, inc); - - return !node || (node.nodeName == 'BR' || isBlock(node)); - }; - - // Append BR elements if needed before we remove the block - if (isBlock(node) && !isBlock(parentNode)) { - if (!find(node, FALSE) && !find(node.firstChild, TRUE, 1)) - node.insertBefore(dom.create('br'), node.firstChild); - - if (!find(node, TRUE) && !find(node.lastChild, FALSE, 1)) - node.appendChild(dom.create('br')); - } - } else { - // Wrap the block in a forcedRootBlock if we are at the root of document - if (parentNode == dom.getRoot()) { - if (!format.list_block || !isEq(node, format.list_block)) { - each(tinymce.grep(node.childNodes), function(node) { - if (isValid(forcedRootBlock, node.nodeName.toLowerCase())) { - if (!rootBlockElm) - rootBlockElm = wrap(node, forcedRootBlock); - else - rootBlockElm.appendChild(node); - } else - rootBlockElm = 0; - }); - } - } - } - } - - // Never remove nodes that isn't the specified inline element if a selector is specified too - if (format.selector && format.inline && !isEq(format.inline, node)) - return; - - dom.remove(node, 1); - }; - - /** - * Returns the next/previous non whitespace node. - * - * @private - * @param {Node} node Node to start at. - * @param {boolean} next (Optional) Include next or previous node defaults to previous. - * @param {boolean} inc (Optional) Include the current node in checking. Defaults to false. - * @return {Node} Next or previous node or undefined if it wasn't found. - */ - function getNonWhiteSpaceSibling(node, next, inc) { - if (node) { - next = next ? 'nextSibling' : 'previousSibling'; - - for (node = inc ? node : node[next]; node; node = node[next]) { - if (node.nodeType == 1 || !isWhiteSpaceNode(node)) - return node; - } - } - }; - - /** - * Checks if the specified node is a bookmark node or not. - * - * @param {Node} node Node to check if it's a bookmark node or not. - * @return {Boolean} true/false if the node is a bookmark node. - */ - function isBookmarkNode(node) { - return node && node.nodeType == 1 && node.getAttribute('_mce_type') == 'bookmark'; - }; - - /** - * Merges the next/previous sibling element if they match. - * - * @private - * @param {Node} prev Previous node to compare/merge. - * @param {Node} next Next node to compare/merge. - * @return {Node} Next node if we didn't merge and prev node if we did. - */ - function mergeSiblings(prev, next) { - var marker, sibling, tmpSibling; - - /** - * Compares two nodes and checks if it's attributes and styles matches. - * This doesn't compare classes as items since their order is significant. - * - * @private - * @param {Node} node1 First node to compare with. - * @param {Node} node2 Second node to compare with. - * @return {boolean} True/false if the nodes are the same or not. - */ - function compareElements(node1, node2) { - // Not the same name - if (node1.nodeName != node2.nodeName) - return FALSE; - - /** - * Returns all the nodes attributes excluding internal ones, styles and classes. - * - * @private - * @param {Node} node Node to get attributes from. - * @return {Object} Name/value object with attributes and attribute values. - */ - function getAttribs(node) { - var attribs = {}; - - each(dom.getAttribs(node), function(attr) { - var name = attr.nodeName.toLowerCase(); - - // Don't compare internal attributes or style - if (name.indexOf('_') !== 0 && name !== 'style') - attribs[name] = dom.getAttrib(node, name); - }); - - return attribs; - }; - - /** - * Compares two objects checks if it's key + value exists in the other one. - * - * @private - * @param {Object} obj1 First object to compare. - * @param {Object} obj2 Second object to compare. - * @return {boolean} True/false if the objects matches or not. - */ - function compareObjects(obj1, obj2) { - var value, name; - - for (name in obj1) { - // Obj1 has item obj2 doesn't have - if (obj1.hasOwnProperty(name)) { - value = obj2[name]; - - // Obj2 doesn't have obj1 item - if (value === undefined) - return FALSE; - - // Obj2 item has a different value - if (obj1[name] != value) - return FALSE; - - // Delete similar value - delete obj2[name]; - } - } - - // Check if obj 2 has something obj 1 doesn't have - for (name in obj2) { - // Obj2 has item obj1 doesn't have - if (obj2.hasOwnProperty(name)) - return FALSE; - } - - return TRUE; - }; - - // Attribs are not the same - if (!compareObjects(getAttribs(node1), getAttribs(node2))) - return FALSE; - - // Styles are not the same - if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) - return FALSE; - - return TRUE; - }; - - // Check if next/prev exists and that they are elements - if (prev && next) { - function findElementSibling(node, sibling_name) { - for (sibling = node; sibling; sibling = sibling[sibling_name]) { - if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling)) - return node; - - if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) - return sibling; - } - - return node; - }; - - // If previous sibling is empty then jump over it - prev = findElementSibling(prev, 'previousSibling'); - next = findElementSibling(next, 'nextSibling'); - - // Compare next and previous nodes - if (compareElements(prev, next)) { - // Append nodes between - for (sibling = prev.nextSibling; sibling && sibling != next;) { - tmpSibling = sibling; - sibling = sibling.nextSibling; - prev.appendChild(tmpSibling); - } - - // Remove next node - dom.remove(next); - - // Move children into prev node - each(tinymce.grep(next.childNodes), function(node) { - prev.appendChild(node); - }); - - return prev; - } - } - - return next; - }; - - /** - * Returns true/false if the specified node is a text block or not. - * - * @private - * @param {Node} node Node to check. - * @return {boolean} True/false if the node is a text block. - */ - function isTextBlock(name) { - return /^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(name); - }; - - function getContainer(rng, start) { - var container, offset, lastIdx; - - container = rng[start ? 'startContainer' : 'endContainer']; - offset = rng[start ? 'startOffset' : 'endOffset']; - - if (container.nodeType == 1) { - lastIdx = container.childNodes.length - 1; - - if (!start && offset) - offset--; - - container = container.childNodes[offset > lastIdx ? lastIdx : offset]; - } - - return container; - }; - - function performCaretAction(type, name, vars) { - var i, currentPendingFormats = pendingFormats[type], - otherPendingFormats = pendingFormats[type == 'apply' ? 'remove' : 'apply']; - - function hasPending() { - return pendingFormats.apply.length || pendingFormats.remove.length; - }; - - function resetPending() { - pendingFormats.apply = []; - pendingFormats.remove = []; - }; - - function perform(caret_node) { - // Apply pending formats - each(pendingFormats.apply.reverse(), function(item) { - apply(item.name, item.vars, caret_node); - }); - - // Remove pending formats - each(pendingFormats.remove.reverse(), function(item) { - remove(item.name, item.vars, caret_node); - }); - - dom.remove(caret_node, 1); - resetPending(); - }; - - // Check if it already exists then ignore it - for (i = currentPendingFormats.length - 1; i >= 0; i--) { - if (currentPendingFormats[i].name == name) - return; - } - - currentPendingFormats.push({name : name, vars : vars}); - - // Check if it's in the other type, then remove it - for (i = otherPendingFormats.length - 1; i >= 0; i--) { - if (otherPendingFormats[i].name == name) - otherPendingFormats.splice(i, 1); - } - - // Pending apply or remove formats - if (hasPending()) { - ed.getDoc().execCommand('FontName', false, 'mceinline'); - pendingFormats.lastRng = selection.getRng(); - - // IE will convert the current word - each(dom.select('font,span'), function(node) { - var bookmark; - - if (isCaretNode(node)) { - bookmark = selection.getBookmark(); - perform(node); - selection.moveToBookmark(bookmark); - ed.nodeChanged(); - } - }); - - // Only register listeners once if we need to - if (!pendingFormats.isListening && hasPending()) { - pendingFormats.isListening = true; - - each('onKeyDown,onKeyUp,onKeyPress,onMouseUp'.split(','), function(event) { - ed[event].addToTop(function(ed, e) { - // Do we have pending formats and is the selection moved has moved - if (hasPending() && !tinymce.dom.RangeUtils.compareRanges(pendingFormats.lastRng, selection.getRng())) { - each(dom.select('font,span'), function(node) { - var textNode, rng; - - // Look for marker - if (isCaretNode(node)) { - textNode = node.firstChild; - - if (textNode) { - perform(node); - - rng = dom.createRng(); - rng.setStart(textNode, textNode.nodeValue.length); - rng.setEnd(textNode, textNode.nodeValue.length); - selection.setRng(rng); - ed.nodeChanged(); - } else - dom.remove(node); - } - }); - - // Always unbind and clear pending styles on keyup - if (e.type == 'keyup' || e.type == 'mouseup') - resetPending(); - } - }); - }); - } - } - }; - }; -})(tinymce); +/** + * Formatter.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + /** + * Text formatter engine class. This class is used to apply formats like bold, italic, font size + * etc to the current selection or specific nodes. This engine was build to replace the browsers + * default formatting logic for execCommand due to it's inconsistant and buggy behavior. + * + * @class tinymce.Formatter + * @example + * tinymce.activeEditor.formatter.register('mycustomformat', { + * inline : 'span', + * styles : {color : '#ff0000'} + * }); + * + * tinymce.activeEditor.formatter.apply('mycustomformat'); + */ + + /** + * Constructs a new formatter instance. + * + * @constructor Formatter + * @param {tinymce.Editor} ed Editor instance to construct the formatter engine to. + */ + tinymce.Formatter = function(ed) { + var formats = {}, + each = tinymce.each, + dom = ed.dom, + selection = ed.selection, + TreeWalker = tinymce.dom.TreeWalker, + rangeUtils = new tinymce.dom.RangeUtils(dom), + isValid = ed.schema.isValidChild, + isBlock = dom.isBlock, + forcedRootBlock = ed.settings.forced_root_block, + nodeIndex = dom.nodeIndex, + INVISIBLE_CHAR = '\uFEFF', + MCE_ATTR_RE = /^(src|href|style)$/, + FALSE = false, + TRUE = true, + undefined, + pendingFormats = {apply : [], remove : []}; + + function isArray(obj) { + return obj instanceof Array; + }; + + function getParents(node, selector) { + return dom.getParents(node, selector, dom.getRoot()); + }; + + function isCaretNode(node) { + return node.nodeType === 1 && (node.face === 'mceinline' || node.style.fontFamily === 'mceinline'); + }; + + // Public functions + + /** + * Returns the format by name or all formats if no name is specified. + * + * @method get + * @param {String} name Optional name to retrive by. + * @return {Array/Object} Array/Object with all registred formats or a specific format. + */ + function get(name) { + return name ? formats[name] : formats; + }; + + /** + * Registers a specific format by name. + * + * @method register + * @param {Object/String} name Name of the format for example "bold". + * @param {Object/Array} format Optional format object or array of format variants can only be omitted if the first arg is an object. + */ + function register(name, format) { + if (name) { + if (typeof(name) !== 'string') { + each(name, function(format, name) { + register(name, format); + }); + } else { + // Force format into array and add it to internal collection + format = format.length ? format : [format]; + + each(format, function(format) { + // Set deep to false by default on selector formats this to avoid removing + // alignment on images inside paragraphs when alignment is changed on paragraphs + if (format.deep === undefined) + format.deep = !format.selector; + + // Default to true + if (format.split === undefined) + format.split = !format.selector || format.inline; + + // Default to true + if (format.remove === undefined && format.selector && !format.inline) + format.remove = 'none'; + + // Mark format as a mixed format inline + block level + if (format.selector && format.inline) { + format.mixed = true; + format.block_expand = true; + } + + // Split classes if needed + if (typeof(format.classes) === 'string') + format.classes = format.classes.split(/\s+/); + }); + + formats[name] = format; + } + } + }; + + var getTextDecoration = function(node) { + var decoration; + + ed.dom.getParent(node, function(n) { + decoration = ed.dom.getStyle(n, 'text-decoration'); + return decoration && decoration !== 'none'; + }); + + return decoration; + }; + + var processUnderlineAndColor = function(node) { + var textDecoration; + if (node.nodeType === 1 && node.parentNode && node.parentNode.nodeType === 1) { + textDecoration = getTextDecoration(node.parentNode); + if (ed.dom.getStyle(node, 'color') && textDecoration) { + ed.dom.setStyle(node, 'text-decoration', textDecoration); + } else if (ed.dom.getStyle(node, 'textdecoration') === textDecoration) { + ed.dom.setStyle(node, 'text-decoration', null); + } + } + }; + + /** + * Applies the specified format to the current selection or specified node. + * + * @method apply + * @param {String} name Name of format to apply. + * @param {Object} vars Optional list of variables to replace within format before applying it. + * @param {Node} node Optional node to apply the format to defaults to current selection. + */ + function apply(name, vars, node) { + var formatList = get(name), format = formatList[0], bookmark, rng, i, isCollapsed = selection.isCollapsed(); + + /** + * Moves the start to the first suitable text node. + */ + function moveStart(rng) { + var container = rng.startContainer, + offset = rng.startOffset, + walker, node; + + // Move startContainer/startOffset in to a suitable node + if (container.nodeType == 1 || container.nodeValue === "") { + container = container.nodeType == 1 ? container.childNodes[offset] : container; + + // Might fail if the offset is behind the last element in it's container + if (container) { + walker = new TreeWalker(container, container.parentNode); + for (node = walker.current(); node; node = walker.next()) { + if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { + rng.setStart(node, 0); + break; + } + } + } + } + + return rng; + }; + + function setElementFormat(elm, fmt) { + fmt = fmt || format; + + if (elm) { + each(fmt.styles, function(value, name) { + dom.setStyle(elm, name, replaceVars(value, vars)); + }); + + each(fmt.attributes, function(value, name) { + dom.setAttrib(elm, name, replaceVars(value, vars)); + }); + + each(fmt.classes, function(value) { + value = replaceVars(value, vars); + + if (!dom.hasClass(elm, value)) + dom.addClass(elm, value); + }); + } + }; + function adjustSelectionToVisibleSelection() { + + function findSelectionEnd(start, end) { + var walker = new TreeWalker(end); + for (node = walker.current(); node; node = walker.prev()) { + if (node.childNodes.length > 1 || node == start) { + return node; + } + } + } + + // Adjust selection so that a end container with a end offset of zero is not included in the selection + // as this isn't visible to the user. + var rng = ed.selection.getRng(); + var start = rng.startContainer; + var end = rng.endContainer; + if (start != end && rng.endOffset == 0) { + var newEnd = findSelectionEnd(start, end); + var endOffset = newEnd.nodeType == 3 ? newEnd.length : newEnd.childNodes.length; + rng.setEnd(newEnd, endOffset); + } + return rng; + } + + function applyStyleToList(node, bookmark, wrapElm, newWrappers, process){ + var nodes =[], listIndex =-1, list, startIndex = -1, endIndex = -1, currentWrapElm; + + // find the index of the first child list. + each(node.childNodes, function(n, index) { + if (n.nodeName==="UL"||n.nodeName==="OL") {listIndex = index; list=n; return false; } + }); + + // get the index of the bookmarks + each(node.childNodes, function(n, index) { + if (n.nodeName==="SPAN" &&dom.getAttrib(n, "data-mce-type")=="bookmark" && n.id==bookmark.id+"_start") {startIndex=index} + if (n.nodeName==="SPAN" &&dom.getAttrib(n, "data-mce-type")=="bookmark" && n.id==bookmark.id+"_end") {endIndex=index} + }); + + // if the selection spans across an embedded list, or there isn't an embedded list - handle processing normally + if (listIndex<=0 || (startIndexlistIndex)) { + each(tinymce.grep(node.childNodes), process); + return 0; + } else { + currentWrapElm = wrapElm.cloneNode(FALSE); + + // create a list of the nodes on the same side of the list as the selection + each(tinymce.grep(node.childNodes), function(n, index) { + if ((startIndexlistIndex && index >listIndex)) { + nodes.push(n); + n.parentNode.removeChild(n); + } + }); + + // insert the wrapping element either before or after the list. + if (startIndexlistIndex) { + node.insertBefore(currentWrapElm, list.nextSibling); + } + + // add the new nodes to the list. + newWrappers.push(currentWrapElm); + each(nodes, function(node){currentWrapElm.appendChild(node)}); + return currentWrapElm; + } + }; + + function applyRngStyle(rng, bookmark) { + var newWrappers = [], wrapName, wrapElm; + + // Setup wrapper element + wrapName = format.inline || format.block; + wrapElm = dom.create(wrapName); + setElementFormat(wrapElm); + + rangeUtils.walk(rng, function(nodes) { + var currentWrapElm; + + /** + * Process a list of nodes wrap them. + */ + function process(node) { + var nodeName = node.nodeName.toLowerCase(), parentName = node.parentNode.nodeName.toLowerCase(), found; + + // Stop wrapping on br elements + if (isEq(nodeName, 'br')) { + currentWrapElm = 0; + + // Remove any br elements when we wrap things + if (format.block) + dom.remove(node); + + return; + } + + // If node is wrapper type + if (format.wrapper && matchNode(node, name, vars)) { + currentWrapElm = 0; + return; + } + + // Can we rename the block + if (format.block && !format.wrapper && isTextBlock(nodeName)) { + node = dom.rename(node, wrapName); + setElementFormat(node); + newWrappers.push(node); + currentWrapElm = 0; + return; + } + + // Handle selector patterns + if (format.selector) { + // Look for matching formats + each(formatList, function(format) { + // Check collapsed state if it exists + if ('collapsed' in format && format.collapsed !== isCollapsed) { + return; + } + + if (dom.is(node, format.selector) && !isCaretNode(node)) { + setElementFormat(node, format); + found = true; + } + }); + + // Continue processing if a selector match wasn't found and a inline element is defined + if (!format.inline || found) { + currentWrapElm = 0; + return; + } + } + + // Is it valid to wrap this item + if (isValid(wrapName, nodeName) && isValid(parentName, wrapName) && + !(node.nodeType === 3 && node.nodeValue.length === 1 && node.nodeValue.charCodeAt(0) === 65279)) { + // Start wrapping + if (!currentWrapElm) { + // Wrap the node + currentWrapElm = wrapElm.cloneNode(FALSE); + node.parentNode.insertBefore(currentWrapElm, node); + newWrappers.push(currentWrapElm); + } + + currentWrapElm.appendChild(node); + } else if (nodeName == 'li' && bookmark) { + // Start wrapping - if we are in a list node and have a bookmark, then we will always begin by wrapping in a new element. + currentWrapElm = applyStyleToList(node, bookmark, wrapElm, newWrappers, process); + } else { + // Start a new wrapper for possible children + currentWrapElm = 0; + + each(tinymce.grep(node.childNodes), process); + + // End the last wrapper + currentWrapElm = 0; + } + }; + + // Process siblings from range + each(nodes, process); + }); + + // Wrap links inside as well, for example color inside a link when the wrapper is around the link + if (format.wrap_links === false) { + each(newWrappers, function(node) { + function process(node) { + var i, currentWrapElm, children; + + if (node.nodeName === 'A') { + currentWrapElm = wrapElm.cloneNode(FALSE); + newWrappers.push(currentWrapElm); + + children = tinymce.grep(node.childNodes); + for (i = 0; i < children.length; i++) + currentWrapElm.appendChild(children[i]); + + node.appendChild(currentWrapElm); + } + + each(tinymce.grep(node.childNodes), process); + }; + + process(node); + }); + } + + // Cleanup + each(newWrappers, function(node) { + var childCount; + + function getChildCount(node) { + var count = 0; + + each(node.childNodes, function(node) { + if (!isWhiteSpaceNode(node) && !isBookmarkNode(node)) + count++; + }); + + return count; + }; + + function mergeStyles(node) { + var child, clone; + + each(node.childNodes, function(node) { + if (node.nodeType == 1 && !isBookmarkNode(node) && !isCaretNode(node)) { + child = node; + return FALSE; // break loop + } + }); + + // If child was found and of the same type as the current node + if (child && matchName(child, format)) { + clone = child.cloneNode(FALSE); + setElementFormat(clone); + + dom.replace(clone, node, TRUE); + dom.remove(child, 1); + } + + return clone || node; + }; + + childCount = getChildCount(node); + + // Remove empty nodes but only if there is multiple wrappers and they are not block + // elements so never remove single

    since that would remove the currrent empty block element where the caret is at + if ((newWrappers.length > 1 || !isBlock(node)) && childCount === 0) { + dom.remove(node, 1); + return; + } + + if (format.inline || format.wrapper) { + // Merges the current node with it's children of similar type to reduce the number of elements + if (!format.exact && childCount === 1) + node = mergeStyles(node); + + // Remove/merge children + each(formatList, function(format) { + // Merge all children of similar type will move styles from child to parent + // this: text + // will become: text + each(dom.select(format.inline, node), function(child) { + var parent; + + // When wrap_links is set to false we don't want + // to remove the format on children within links + if (format.wrap_links === false) { + parent = child.parentNode; + + do { + if (parent.nodeName === 'A') + return; + } while (parent = parent.parentNode); + } + + removeFormat(format, vars, child, format.exact ? child : null); + }); + }); + + // Remove child if direct parent is of same type + if (matchNode(node.parentNode, name, vars)) { + dom.remove(node, 1); + node = 0; + return TRUE; + } + + // Look for parent with similar style format + if (format.merge_with_parents) { + dom.getParent(node.parentNode, function(parent) { + if (matchNode(parent, name, vars)) { + dom.remove(node, 1); + node = 0; + return TRUE; + } + }); + } + + // Merge next and previous siblings if they are similar texttext becomes texttext + if (node) { + node = mergeSiblings(getNonWhiteSpaceSibling(node), node); + node = mergeSiblings(node, getNonWhiteSpaceSibling(node, TRUE)); + } + } + }); + }; + + if (format) { + if (node) { + rng = dom.createRng(); + + rng.setStartBefore(node); + rng.setEndAfter(node); + + applyRngStyle(expandRng(rng, formatList)); + } else { + if (!isCollapsed || !format.inline || dom.select('td.mceSelected,th.mceSelected').length) { + // Obtain selection node before selection is unselected by applyRngStyle() + var curSelNode = ed.selection.getNode(); + + // Apply formatting to selection + ed.selection.setRng(adjustSelectionToVisibleSelection()); + bookmark = selection.getBookmark(); + applyRngStyle(expandRng(selection.getRng(TRUE), formatList), bookmark); + + // Colored nodes should be underlined so that the color of the underline matches the text color. + if (format.styles && (format.styles.color || format.styles.textDecoration)) { + tinymce.walk(curSelNode, processUnderlineAndColor, 'childNodes'); + processUnderlineAndColor(curSelNode); + } + + selection.moveToBookmark(bookmark); + selection.setRng(moveStart(selection.getRng(TRUE))); + ed.nodeChanged(); + } else + performCaretAction('apply', name, vars); + } + } + }; + + /** + * Removes the specified format from the current selection or specified node. + * + * @method remove + * @param {String} name Name of format to remove. + * @param {Object} vars Optional list of variables to replace within format before removing it. + * @param {Node} node Optional node to remove the format from defaults to current selection. + */ + function remove(name, vars, node) { + var formatList = get(name), format = formatList[0], bookmark, i, rng; + /** + * Moves the start to the first suitable text node. + */ + function moveStart(rng) { + var container = rng.startContainer, + offset = rng.startOffset, + walker, node, nodes, tmpNode; + + // Convert text node into index if possible + if (container.nodeType == 3 && offset >= container.nodeValue.length - 1) { + container = container.parentNode; + offset = nodeIndex(container) + 1; + } + + // Move startContainer/startOffset in to a suitable node + if (container.nodeType == 1) { + nodes = container.childNodes; + container = nodes[Math.min(offset, nodes.length - 1)]; + walker = new TreeWalker(container); + + // If offset is at end of the parent node walk to the next one + if (offset > nodes.length - 1) + walker.next(); + + for (node = walker.current(); node; node = walker.next()) { + if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { + // IE has a "neat" feature where it moves the start node into the closest element + // we can avoid this by inserting an element before it and then remove it after we set the selection + tmpNode = dom.create('a', null, INVISIBLE_CHAR); + node.parentNode.insertBefore(tmpNode, node); + + // Set selection and remove tmpNode + rng.setStart(node, 0); + selection.setRng(rng); + dom.remove(tmpNode); + + return; + } + } + } + }; + + // Merges the styles for each node + function process(node) { + var children, i, l; + + // Grab the children first since the nodelist might be changed + children = tinymce.grep(node.childNodes); + + // Process current node + for (i = 0, l = formatList.length; i < l; i++) { + if (removeFormat(formatList[i], vars, node, node)) + break; + } + + // Process the children + if (format.deep) { + for (i = 0, l = children.length; i < l; i++) + process(children[i]); + } + }; + + function findFormatRoot(container) { + var formatRoot; + + // Find format root + each(getParents(container.parentNode).reverse(), function(parent) { + var format; + + // Find format root element + if (!formatRoot && parent.id != '_start' && parent.id != '_end') { + // Is the node matching the format we are looking for + format = matchNode(parent, name, vars); + if (format && format.split !== false) + formatRoot = parent; + } + }); + + return formatRoot; + }; + + function wrapAndSplit(format_root, container, target, split) { + var parent, clone, lastClone, firstClone, i, formatRootParent; + + // Format root found then clone formats and split it + if (format_root) { + formatRootParent = format_root.parentNode; + + for (parent = container.parentNode; parent && parent != formatRootParent; parent = parent.parentNode) { + clone = parent.cloneNode(FALSE); + + for (i = 0; i < formatList.length; i++) { + if (removeFormat(formatList[i], vars, clone, clone)) { + clone = 0; + break; + } + } + + // Build wrapper node + if (clone) { + if (lastClone) + clone.appendChild(lastClone); + + if (!firstClone) + firstClone = clone; + + lastClone = clone; + } + } + + // Never split block elements if the format is mixed + if (split && (!format.mixed || !isBlock(format_root))) + container = dom.split(format_root, container); + + // Wrap container in cloned formats + if (lastClone) { + target.parentNode.insertBefore(lastClone, target); + firstClone.appendChild(target); + } + } + + return container; + }; + + function splitToFormatRoot(container) { + return wrapAndSplit(findFormatRoot(container), container, container, true); + }; + + function unwrap(start) { + var node = dom.get(start ? '_start' : '_end'), + out = node[start ? 'firstChild' : 'lastChild']; + + // If the end is placed within the start the result will be removed + // So this checks if the out node is a bookmark node if it is it + // checks for another more suitable node + if (isBookmarkNode(out)) + out = out[start ? 'firstChild' : 'lastChild']; + + dom.remove(node, true); + + return out; + }; + + function removeRngStyle(rng) { + var startContainer, endContainer; + + rng = expandRng(rng, formatList, TRUE); + + if (format.split) { + startContainer = getContainer(rng, TRUE); + endContainer = getContainer(rng); + + if (startContainer != endContainer) { + // Wrap start/end nodes in span element since these might be cloned/moved + startContainer = wrap(startContainer, 'span', {id : '_start', 'data-mce-type' : 'bookmark'}); + endContainer = wrap(endContainer, 'span', {id : '_end', 'data-mce-type' : 'bookmark'}); + + // Split start/end + splitToFormatRoot(startContainer); + splitToFormatRoot(endContainer); + + // Unwrap start/end to get real elements again + startContainer = unwrap(TRUE); + endContainer = unwrap(); + } else + startContainer = endContainer = splitToFormatRoot(startContainer); + + // Update range positions since they might have changed after the split operations + rng.startContainer = startContainer.parentNode; + rng.startOffset = nodeIndex(startContainer); + rng.endContainer = endContainer.parentNode; + rng.endOffset = nodeIndex(endContainer) + 1; + } + + // Remove items between start/end + rangeUtils.walk(rng, function(nodes) { + each(nodes, function(node) { + process(node); + + // Remove parent span if it only contains text-decoration: underline, yet a parent node is also underlined. + if (node.nodeType === 1 && ed.dom.getStyle(node, 'text-decoration') === 'underline' && node.parentNode && getTextDecoration(node.parentNode) === 'underline') { + removeFormat({'deep': false, 'exact': true, 'inline': 'span', 'styles': {'textDecoration' : 'underline'}}, null, node); + } + }); + }); + }; + + // Handle node + if (node) { + rng = dom.createRng(); + rng.setStartBefore(node); + rng.setEndAfter(node); + removeRngStyle(rng); + return; + } + + if (!selection.isCollapsed() || !format.inline || dom.select('td.mceSelected,th.mceSelected').length) { + bookmark = selection.getBookmark(); + removeRngStyle(selection.getRng(TRUE)); + selection.moveToBookmark(bookmark); + + // Check if start element still has formatting then we are at: "text|text" and need to move the start into the next text node + if (match(name, vars, selection.getStart())) { + moveStart(selection.getRng(true)); + } + + ed.nodeChanged(); + } else + performCaretAction('remove', name, vars); + }; + + /** + * Toggles the specified format on/off. + * + * @method toggle + * @param {String} name Name of format to apply/remove. + * @param {Object} vars Optional list of variables to replace within format before applying/removing it. + * @param {Node} node Optional node to apply the format to or remove from. Defaults to current selection. + */ + function toggle(name, vars, node) { + var fmt = get(name); + + if (match(name, vars, node) && (!('toggle' in fmt[0]) || fmt[0]['toggle'])) + remove(name, vars, node); + else + apply(name, vars, node); + }; + + /** + * Return true/false if the specified node has the specified format. + * + * @method matchNode + * @param {Node} node Node to check the format on. + * @param {String} name Format name to check. + * @param {Object} vars Optional list of variables to replace before checking it. + * @param {Boolean} similar Match format that has similar properties. + * @return {Object} Returns the format object it matches or undefined if it doesn't match. + */ + function matchNode(node, name, vars, similar) { + var formatList = get(name), format, i, classes; + + function matchItems(node, format, item_name) { + var key, value, items = format[item_name], i; + + // Check all items + if (items) { + // Non indexed object + if (items.length === undefined) { + for (key in items) { + if (items.hasOwnProperty(key)) { + if (item_name === 'attributes') + value = dom.getAttrib(node, key); + else + value = getStyle(node, key); + + if (similar && !value && !format.exact) + return; + + if ((!similar || format.exact) && !isEq(value, replaceVars(items[key], vars))) + return; + } + } + } else { + // Only one match needed for indexed arrays + for (i = 0; i < items.length; i++) { + if (item_name === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(node, items[i])) + return format; + } + } + } + + return format; + }; + + if (formatList && node) { + // Check each format in list + for (i = 0; i < formatList.length; i++) { + format = formatList[i]; + + // Name name, attributes, styles and classes + if (matchName(node, format) && matchItems(node, format, 'attributes') && matchItems(node, format, 'styles')) { + // Match classes + if (classes = format.classes) { + for (i = 0; i < classes.length; i++) { + if (!dom.hasClass(node, classes[i])) + return; + } + } + + return format; + } + } + } + }; + + /** + * Matches the current selection or specified node against the specified format name. + * + * @method match + * @param {String} name Name of format to match. + * @param {Object} vars Optional list of variables to replace before checking it. + * @param {Node} node Optional node to check. + * @return {boolean} true/false if the specified selection/node matches the format. + */ + function match(name, vars, node) { + var startNode, i; + + function matchParents(node) { + // Find first node with similar format settings + node = dom.getParent(node, function(node) { + return !!matchNode(node, name, vars, true); + }); + + // Do an exact check on the similar format element + return matchNode(node, name, vars); + }; + + // Check specified node + if (node) + return matchParents(node); + + // Check pending formats + if (selection.isCollapsed()) { + for (i = pendingFormats.apply.length - 1; i >= 0; i--) { + if (pendingFormats.apply[i].name == name) + return true; + } + + for (i = pendingFormats.remove.length - 1; i >= 0; i--) { + if (pendingFormats.remove[i].name == name) + return false; + } + + return matchParents(selection.getNode()); + } + + // Check selected node + node = selection.getNode(); + if (matchParents(node)) + return TRUE; + + // Check start node if it's different + startNode = selection.getStart(); + if (startNode != node) { + if (matchParents(startNode)) + return TRUE; + } + + return FALSE; + }; + + /** + * Matches the current selection against the array of formats and returns a new array with matching formats. + * + * @method matchAll + * @param {Array} names Name of format to match. + * @param {Object} vars Optional list of variables to replace before checking it. + * @return {Array} Array with matched formats. + */ + function matchAll(names, vars) { + var startElement, matchedFormatNames = [], checkedMap = {}, i, ni, name; + + // If the selection is collapsed then check pending formats + if (selection.isCollapsed()) { + for (ni = 0; ni < names.length; ni++) { + // If the name is to be removed, then stop it from being added + for (i = pendingFormats.remove.length - 1; i >= 0; i--) { + name = names[ni]; + + if (pendingFormats.remove[i].name == name) { + checkedMap[name] = true; + break; + } + } + } + + // If the format is to be applied + for (i = pendingFormats.apply.length - 1; i >= 0; i--) { + for (ni = 0; ni < names.length; ni++) { + name = names[ni]; + + if (!checkedMap[name] && pendingFormats.apply[i].name == name) { + checkedMap[name] = true; + matchedFormatNames.push(name); + } + } + } + } + + // Check start of selection for formats + startElement = selection.getStart(); + dom.getParent(startElement, function(node) { + var i, name; + + for (i = 0; i < names.length; i++) { + name = names[i]; + + if (!checkedMap[name] && matchNode(node, name, vars)) { + checkedMap[name] = true; + matchedFormatNames.push(name); + } + } + }); + + return matchedFormatNames; + }; + + /** + * Returns true/false if the specified format can be applied to the current selection or not. It will currently only check the state for selector formats, it returns true on all other format types. + * + * @method canApply + * @param {String} name Name of format to check. + * @return {boolean} true/false if the specified format can be applied to the current selection/node. + */ + function canApply(name) { + var formatList = get(name), startNode, parents, i, x, selector; + + if (formatList) { + startNode = selection.getStart(); + parents = getParents(startNode); + + for (x = formatList.length - 1; x >= 0; x--) { + selector = formatList[x].selector; + + // Format is not selector based, then always return TRUE + if (!selector) + return TRUE; + + for (i = parents.length - 1; i >= 0; i--) { + if (dom.is(parents[i], selector)) + return TRUE; + } + } + } + + return FALSE; + }; + + // Expose to public + tinymce.extend(this, { + get : get, + register : register, + apply : apply, + remove : remove, + toggle : toggle, + match : match, + matchAll : matchAll, + matchNode : matchNode, + canApply : canApply + }); + + // Private functions + + /** + * Checks if the specified nodes name matches the format inline/block or selector. + * + * @private + * @param {Node} node Node to match against the specified format. + * @param {Object} format Format object o match with. + * @return {boolean} true/false if the format matches. + */ + function matchName(node, format) { + // Check for inline match + if (isEq(node, format.inline)) + return TRUE; + + // Check for block match + if (isEq(node, format.block)) + return TRUE; + + // Check for selector match + if (format.selector) + return dom.is(node, format.selector); + }; + + /** + * Compares two string/nodes regardless of their case. + * + * @private + * @param {String/Node} Node or string to compare. + * @param {String/Node} Node or string to compare. + * @return {boolean} True/false if they match. + */ + function isEq(str1, str2) { + str1 = str1 || ''; + str2 = str2 || ''; + + str1 = '' + (str1.nodeName || str1); + str2 = '' + (str2.nodeName || str2); + + return str1.toLowerCase() == str2.toLowerCase(); + }; + + /** + * Returns the style by name on the specified node. This method modifies the style + * contents to make it more easy to match. This will resolve a few browser issues. + * + * @private + * @param {Node} node to get style from. + * @param {String} name Style name to get. + * @return {String} Style item value. + */ + function getStyle(node, name) { + var styleVal = dom.getStyle(node, name); + + // Force the format to hex + if (name == 'color' || name == 'backgroundColor') + styleVal = dom.toHex(styleVal); + + // Opera will return bold as 700 + if (name == 'fontWeight' && styleVal == 700) + styleVal = 'bold'; + + return '' + styleVal; + }; + + /** + * Replaces variables in the value. The variable format is %var. + * + * @private + * @param {String} value Value to replace variables in. + * @param {Object} vars Name/value array with variables to replace. + * @return {String} New value with replaced variables. + */ + function replaceVars(value, vars) { + if (typeof(value) != "string") + value = value(vars); + else if (vars) { + value = value.replace(/%(\w+)/g, function(str, name) { + return vars[name] || str; + }); + } + + return value; + }; + + function isWhiteSpaceNode(node) { + return node && node.nodeType === 3 && /^([\s\r\n]+|)$/.test(node.nodeValue); + }; + + function wrap(node, name, attrs) { + var wrapper = dom.create(name, attrs); + + node.parentNode.insertBefore(wrapper, node); + wrapper.appendChild(node); + + return wrapper; + }; + + /** + * Expands the specified range like object to depending on format. + * + * For example on block formats it will move the start/end position + * to the beginning of the current block. + * + * @private + * @param {Object} rng Range like object. + * @param {Array} formats Array with formats to expand by. + * @return {Object} Expanded range like object. + */ + function expandRng(rng, format, remove) { + var startContainer = rng.startContainer, + startOffset = rng.startOffset, + endContainer = rng.endContainer, + endOffset = rng.endOffset, sibling, lastIdx, leaf; + + // This function walks up the tree if there is no siblings before/after the node + function findParentContainer(container, child_name, sibling_name, root) { + var parent, child; + + root = root || dom.getRoot(); + + for (;;) { + // Check if we can move up are we at root level or body level + parent = container.parentNode; + + // Stop expanding on block elements or root depending on format + if (parent == root || (!format[0].block_expand && isBlock(parent))) + return container; + + for (sibling = parent[child_name]; sibling && sibling != container; sibling = sibling[sibling_name]) { + if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) + return container; + + if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling)) + return container; + } + + container = container.parentNode; + } + + return container; + }; + + // This function walks down the tree to find the leaf at the selection. + // The offset is also returned as if node initially a leaf, the offset may be in the middle of the text node. + function findLeaf(node, offset) { + if (offset === undefined) + offset = node.nodeType === 3 ? node.length : node.childNodes.length; + while (node && node.hasChildNodes()) { + node = node.childNodes[offset]; + if (node) + offset = node.nodeType === 3 ? node.length : node.childNodes.length; + } + return { node: node, offset: offset }; + } + + // If index based start position then resolve it + if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) { + lastIdx = startContainer.childNodes.length - 1; + startContainer = startContainer.childNodes[startOffset > lastIdx ? lastIdx : startOffset]; + + if (startContainer.nodeType == 3) + startOffset = 0; + } + + // If index based end position then resolve it + if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) { + lastIdx = endContainer.childNodes.length - 1; + endContainer = endContainer.childNodes[endOffset > lastIdx ? lastIdx : endOffset - 1]; + + if (endContainer.nodeType == 3) + endOffset = endContainer.nodeValue.length; + } + + // Exclude bookmark nodes if possible + if (isBookmarkNode(startContainer.parentNode)) + startContainer = startContainer.parentNode; + + if (isBookmarkNode(startContainer)) + startContainer = startContainer.nextSibling || startContainer; + + if (isBookmarkNode(endContainer.parentNode)) { + endOffset = dom.nodeIndex(endContainer); + endContainer = endContainer.parentNode; + } + + if (isBookmarkNode(endContainer) && endContainer.previousSibling) { + endContainer = endContainer.previousSibling; + endOffset = endContainer.length; + } + + if (format[0].inline) { + // Avoid applying formatting to a trailing space. + leaf = findLeaf(endContainer, endOffset); + if (leaf.node) { + while (leaf.node && leaf.offset === 0 && leaf.node.previousSibling) + leaf = findLeaf(leaf.node.previousSibling); + + if (leaf.node && leaf.offset > 0 && leaf.node.nodeType === 3 && + leaf.node.nodeValue.charAt(leaf.offset - 1) === ' ') { + + if (leaf.offset > 1) { + endContainer = leaf.node; + endContainer.splitText(leaf.offset - 1); + } else if (leaf.node.previousSibling) { + endContainer = leaf.node.previousSibling; + } + } + } + } + + // Move start/end point up the tree if the leaves are sharp and if we are in different containers + // Example * becomes !: !

    *texttext*

    ! + // This will reduce the number of wrapper elements that needs to be created + // Move start point up the tree + if (format[0].inline || format[0].block_expand) { + startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); + endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); + } + + // Expand start/end container to matching selector + if (format[0].selector && format[0].expand !== FALSE && !format[0].inline) { + function findSelectorEndPoint(container, sibling_name) { + var parents, i, y, curFormat; + + if (container.nodeType == 3 && container.nodeValue.length == 0 && container[sibling_name]) + container = container[sibling_name]; + + parents = getParents(container); + for (i = 0; i < parents.length; i++) { + for (y = 0; y < format.length; y++) { + curFormat = format[y]; + + // If collapsed state is set then skip formats that doesn't match that + if ("collapsed" in curFormat && curFormat.collapsed !== rng.collapsed) + continue; + + if (dom.is(parents[i], curFormat.selector)) + return parents[i]; + } + } + + return container; + }; + + // Find new startContainer/endContainer if there is better one + startContainer = findSelectorEndPoint(startContainer, 'previousSibling'); + endContainer = findSelectorEndPoint(endContainer, 'nextSibling'); + } + + // Expand start/end container to matching block element or text node + if (format[0].block || format[0].selector) { + function findBlockEndPoint(container, sibling_name, sibling_name2) { + var node; + + // Expand to block of similar type + if (!format[0].wrapper) + node = dom.getParent(container, format[0].block); + + // Expand to first wrappable block element or any block element + if (!node) + node = dom.getParent(container.nodeType == 3 ? container.parentNode : container, isBlock); + + // Exclude inner lists from wrapping + if (node && format[0].wrapper) + node = getParents(node, 'ul,ol').reverse()[0] || node; + + // Didn't find a block element look for first/last wrappable element + if (!node) { + node = container; + + while (node[sibling_name] && !isBlock(node[sibling_name])) { + node = node[sibling_name]; + + // Break on BR but include it will be removed later on + // we can't remove it now since we need to check if it can be wrapped + if (isEq(node, 'br')) + break; + } + } + + return node || container; + }; + + // Find new startContainer/endContainer if there is better one + startContainer = findBlockEndPoint(startContainer, 'previousSibling'); + endContainer = findBlockEndPoint(endContainer, 'nextSibling'); + + // Non block element then try to expand up the leaf + if (format[0].block) { + if (!isBlock(startContainer)) + startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); + + if (!isBlock(endContainer)) + endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); + } + } + + // Setup index for startContainer + if (startContainer.nodeType == 1) { + startOffset = nodeIndex(startContainer); + startContainer = startContainer.parentNode; + } + + // Setup index for endContainer + if (endContainer.nodeType == 1) { + endOffset = nodeIndex(endContainer) + 1; + endContainer = endContainer.parentNode; + } + + // Return new range like object + return { + startContainer : startContainer, + startOffset : startOffset, + endContainer : endContainer, + endOffset : endOffset + }; + } + + /** + * Removes the specified format for the specified node. It will also remove the node if it doesn't have + * any attributes if the format specifies it to do so. + * + * @private + * @param {Object} format Format object with items to remove from node. + * @param {Object} vars Name/value object with variables to apply to format. + * @param {Node} node Node to remove the format styles on. + * @param {Node} compare_node Optional compare node, if specified the styles will be compared to that node. + * @return {Boolean} True/false if the node was removed or not. + */ + function removeFormat(format, vars, node, compare_node) { + var i, attrs, stylesModified; + + // Check if node matches format + if (!matchName(node, format)) + return FALSE; + + // Should we compare with format attribs and styles + if (format.remove != 'all') { + // Remove styles + each(format.styles, function(value, name) { + value = replaceVars(value, vars); + + // Indexed array + if (typeof(name) === 'number') { + name = value; + compare_node = 0; + } + + if (!compare_node || isEq(getStyle(compare_node, name), value)) + dom.setStyle(node, name, ''); + + stylesModified = 1; + }); + + // Remove style attribute if it's empty + if (stylesModified && dom.getAttrib(node, 'style') == '') { + node.removeAttribute('style'); + node.removeAttribute('data-mce-style'); + } + + // Remove attributes + each(format.attributes, function(value, name) { + var valueOut; + + value = replaceVars(value, vars); + + // Indexed array + if (typeof(name) === 'number') { + name = value; + compare_node = 0; + } + + if (!compare_node || isEq(dom.getAttrib(compare_node, name), value)) { + // Keep internal classes + if (name == 'class') { + value = dom.getAttrib(node, name); + if (value) { + // Build new class value where everything is removed except the internal prefixed classes + valueOut = ''; + each(value.split(/\s+/), function(cls) { + if (/mce\w+/.test(cls)) + valueOut += (valueOut ? ' ' : '') + cls; + }); + + // We got some internal classes left + if (valueOut) { + dom.setAttrib(node, name, valueOut); + return; + } + } + } + + // IE6 has a bug where the attribute doesn't get removed correctly + if (name == "class") + node.removeAttribute('className'); + + // Remove mce prefixed attributes + if (MCE_ATTR_RE.test(name)) + node.removeAttribute('data-mce-' + name); + + node.removeAttribute(name); + } + }); + + // Remove classes + each(format.classes, function(value) { + value = replaceVars(value, vars); + + if (!compare_node || dom.hasClass(compare_node, value)) + dom.removeClass(node, value); + }); + + // Check for non internal attributes + attrs = dom.getAttribs(node); + for (i = 0; i < attrs.length; i++) { + if (attrs[i].nodeName.indexOf('_') !== 0) + return FALSE; + } + } + + // Remove the inline child if it's empty for example or + if (format.remove != 'none') { + removeNode(node, format); + return TRUE; + } + }; + + /** + * Removes the node and wrap it's children in paragraphs before doing so or + * appends BR elements to the beginning/end of the block element if forcedRootBlocks is disabled. + * + * If the div in the node below gets removed: + * text
    text
    text + * + * Output becomes: + * text

    text
    text + * + * So when the div is removed the result is: + * text
    text
    text + * + * @private + * @param {Node} node Node to remove + apply BR/P elements to. + * @param {Object} format Format rule. + * @return {Node} Input node. + */ + function removeNode(node, format) { + var parentNode = node.parentNode, rootBlockElm; + + if (format.block) { + if (!forcedRootBlock) { + function find(node, next, inc) { + node = getNonWhiteSpaceSibling(node, next, inc); + + return !node || (node.nodeName == 'BR' || isBlock(node)); + }; + + // Append BR elements if needed before we remove the block + if (isBlock(node) && !isBlock(parentNode)) { + if (!find(node, FALSE) && !find(node.firstChild, TRUE, 1)) + node.insertBefore(dom.create('br'), node.firstChild); + + if (!find(node, TRUE) && !find(node.lastChild, FALSE, 1)) + node.appendChild(dom.create('br')); + } + } else { + // Wrap the block in a forcedRootBlock if we are at the root of document + if (parentNode == dom.getRoot()) { + if (!format.list_block || !isEq(node, format.list_block)) { + each(tinymce.grep(node.childNodes), function(node) { + if (isValid(forcedRootBlock, node.nodeName.toLowerCase())) { + if (!rootBlockElm) + rootBlockElm = wrap(node, forcedRootBlock); + else + rootBlockElm.appendChild(node); + } else + rootBlockElm = 0; + }); + } + } + } + } + + // Never remove nodes that isn't the specified inline element if a selector is specified too + if (format.selector && format.inline && !isEq(format.inline, node)) + return; + + dom.remove(node, 1); + }; + + /** + * Returns the next/previous non whitespace node. + * + * @private + * @param {Node} node Node to start at. + * @param {boolean} next (Optional) Include next or previous node defaults to previous. + * @param {boolean} inc (Optional) Include the current node in checking. Defaults to false. + * @return {Node} Next or previous node or undefined if it wasn't found. + */ + function getNonWhiteSpaceSibling(node, next, inc) { + if (node) { + next = next ? 'nextSibling' : 'previousSibling'; + + for (node = inc ? node : node[next]; node; node = node[next]) { + if (node.nodeType == 1 || !isWhiteSpaceNode(node)) + return node; + } + } + }; + + /** + * Checks if the specified node is a bookmark node or not. + * + * @param {Node} node Node to check if it's a bookmark node or not. + * @return {Boolean} true/false if the node is a bookmark node. + */ + function isBookmarkNode(node) { + return node && node.nodeType == 1 && node.getAttribute('data-mce-type') == 'bookmark'; + }; + + /** + * Merges the next/previous sibling element if they match. + * + * @private + * @param {Node} prev Previous node to compare/merge. + * @param {Node} next Next node to compare/merge. + * @return {Node} Next node if we didn't merge and prev node if we did. + */ + function mergeSiblings(prev, next) { + var marker, sibling, tmpSibling; + + /** + * Compares two nodes and checks if it's attributes and styles matches. + * This doesn't compare classes as items since their order is significant. + * + * @private + * @param {Node} node1 First node to compare with. + * @param {Node} node2 Second node to compare with. + * @return {boolean} True/false if the nodes are the same or not. + */ + function compareElements(node1, node2) { + // Not the same name + if (node1.nodeName != node2.nodeName) + return FALSE; + + /** + * Returns all the nodes attributes excluding internal ones, styles and classes. + * + * @private + * @param {Node} node Node to get attributes from. + * @return {Object} Name/value object with attributes and attribute values. + */ + function getAttribs(node) { + var attribs = {}; + + each(dom.getAttribs(node), function(attr) { + var name = attr.nodeName.toLowerCase(); + + // Don't compare internal attributes or style + if (name.indexOf('_') !== 0 && name !== 'style') + attribs[name] = dom.getAttrib(node, name); + }); + + return attribs; + }; + + /** + * Compares two objects checks if it's key + value exists in the other one. + * + * @private + * @param {Object} obj1 First object to compare. + * @param {Object} obj2 Second object to compare. + * @return {boolean} True/false if the objects matches or not. + */ + function compareObjects(obj1, obj2) { + var value, name; + + for (name in obj1) { + // Obj1 has item obj2 doesn't have + if (obj1.hasOwnProperty(name)) { + value = obj2[name]; + + // Obj2 doesn't have obj1 item + if (value === undefined) + return FALSE; + + // Obj2 item has a different value + if (obj1[name] != value) + return FALSE; + + // Delete similar value + delete obj2[name]; + } + } + + // Check if obj 2 has something obj 1 doesn't have + for (name in obj2) { + // Obj2 has item obj1 doesn't have + if (obj2.hasOwnProperty(name)) + return FALSE; + } + + return TRUE; + }; + + // Attribs are not the same + if (!compareObjects(getAttribs(node1), getAttribs(node2))) + return FALSE; + + // Styles are not the same + if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) + return FALSE; + + return TRUE; + }; + + // Check if next/prev exists and that they are elements + if (prev && next) { + function findElementSibling(node, sibling_name) { + for (sibling = node; sibling; sibling = sibling[sibling_name]) { + if (sibling.nodeType == 3 && sibling.nodeValue.length !== 0) + return node; + + if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) + return sibling; + } + + return node; + }; + + // If previous sibling is empty then jump over it + prev = findElementSibling(prev, 'previousSibling'); + next = findElementSibling(next, 'nextSibling'); + + // Compare next and previous nodes + if (compareElements(prev, next)) { + // Append nodes between + for (sibling = prev.nextSibling; sibling && sibling != next;) { + tmpSibling = sibling; + sibling = sibling.nextSibling; + prev.appendChild(tmpSibling); + } + + // Remove next node + dom.remove(next); + + // Move children into prev node + each(tinymce.grep(next.childNodes), function(node) { + prev.appendChild(node); + }); + + return prev; + } + } + + return next; + }; + + /** + * Returns true/false if the specified node is a text block or not. + * + * @private + * @param {Node} node Node to check. + * @return {boolean} True/false if the node is a text block. + */ + function isTextBlock(name) { + return /^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(name); + }; + + function getContainer(rng, start) { + var container, offset, lastIdx; + + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + + if (container.nodeType == 1) { + lastIdx = container.childNodes.length - 1; + + if (!start && offset) + offset--; + + container = container.childNodes[offset > lastIdx ? lastIdx : offset]; + } + + return container; + }; + + function performCaretAction(type, name, vars) { + var i, currentPendingFormats = pendingFormats[type], + otherPendingFormats = pendingFormats[type == 'apply' ? 'remove' : 'apply']; + + function hasPending() { + return pendingFormats.apply.length || pendingFormats.remove.length; + }; + + function resetPending() { + pendingFormats.apply = []; + pendingFormats.remove = []; + }; + + function perform(caret_node) { + // Apply pending formats + each(pendingFormats.apply.reverse(), function(item) { + apply(item.name, item.vars, caret_node); + + // Colored nodes should be underlined so that the color of the underline matches the text color. + if (item.name === 'forecolor' && item.vars.value) + processUnderlineAndColor(caret_node.parentNode); + }); + + // Remove pending formats + each(pendingFormats.remove.reverse(), function(item) { + remove(item.name, item.vars, caret_node); + }); + + dom.remove(caret_node, 1); + resetPending(); + }; + + // Check if it already exists then ignore it + for (i = currentPendingFormats.length - 1; i >= 0; i--) { + if (currentPendingFormats[i].name == name) + return; + } + + currentPendingFormats.push({name : name, vars : vars}); + + // Check if it's in the other type, then remove it + for (i = otherPendingFormats.length - 1; i >= 0; i--) { + if (otherPendingFormats[i].name == name) + otherPendingFormats.splice(i, 1); + } + + // Pending apply or remove formats + if (hasPending()) { + ed.getDoc().execCommand('FontName', false, 'mceinline'); + pendingFormats.lastRng = selection.getRng(); + + // IE will convert the current word + each(dom.select('font,span'), function(node) { + var bookmark; + + if (isCaretNode(node)) { + bookmark = selection.getBookmark(); + perform(node); + selection.moveToBookmark(bookmark); + ed.nodeChanged(); + } + }); + + // Only register listeners once if we need to + if (!pendingFormats.isListening && hasPending()) { + pendingFormats.isListening = true; + function performPendingFormat(node, textNode) { + var rng = dom.createRng(); + perform(node); + + rng.setStart(textNode, textNode.nodeValue.length); + rng.setEnd(textNode, textNode.nodeValue.length); + selection.setRng(rng); + ed.nodeChanged(); + } + var enterKeyPressed = false; + + each('onKeyDown,onKeyUp,onKeyPress,onMouseUp'.split(','), function(event) { + ed[event].addToTop(function(ed, e) { + if (e.keyCode==13 && !e.shiftKey) { + enterKeyPressed = true; + return; + } + // Do we have pending formats and is the selection moved has moved + if (hasPending() && !tinymce.dom.RangeUtils.compareRanges(pendingFormats.lastRng, selection.getRng())) { + var foundCaret = false; + each(dom.select('font,span'), function(node) { + var textNode, rng; + + // Look for marker + if (isCaretNode(node)) { + foundCaret = true; + textNode = node.firstChild; + + // Find the first text node within node + while (textNode && textNode.nodeType != 3) + textNode = textNode.firstChild; + + if (textNode) + performPendingFormat(node, textNode); + else + dom.remove(node); + } + }); + + // no caret - so we are + if (enterKeyPressed && !foundCaret) { + var node = selection.getNode(); + var textNode = node; + + // Find the first text node within node + while (textNode && textNode.nodeType != 3) + textNode = textNode.firstChild; + if (textNode) { + node=textNode.parentNode; + while (!isBlock(node)){ + node=node.parentNode; + } + performPendingFormat(node, textNode); + } + } + + // Always unbind and clear pending styles on keyup + if (e.type == 'keyup' || e.type == 'mouseup') { + resetPending(); + enterKeyPressed=false; + } + } + }); + }); + } + } + }; + }; +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/LegacyInput.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/LegacyInput.js index 80c170d924..fc85072e7e 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/LegacyInput.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/LegacyInput.js @@ -57,6 +57,7 @@ tinymce.onAddEditor.add(function(tinymce, ed) { }; ed.onPreProcess.add(convert); + ed.onSetContent.add(convert); ed.onInit.add(function() { ed.selection.onSetContent.add(convert); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/Popup.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/Popup.js index 36310c08b3..f02b7799b0 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/Popup.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/Popup.js @@ -45,6 +45,21 @@ tinyMCEPopup = { // Setup on init listeners t.listeners = []; + + /** + * Fires when the popup is initialized. + * + * @event onInit + * @param {tinymce.Editor} editor Editor instance. + * @example + * // Alerts the selected contents when the dialog is loaded + * tinyMCEPopup.onInit.add(function(ed) { + * alert(ed.selection.getContent()); + * }); + * + * // Executes the init method on page load in some object using the SomeObject scope + * tinyMCEPopup.onInit.add(SomeObject.init, SomeObject); + */ t.onInit = { add : function(f, s) { t.listeners.push({func : f, scope : s}); @@ -141,7 +156,7 @@ tinyMCEPopup = { t.getWindowArg('mce_height') - vp.h, t.id || window ); - }, 0); + }, 10); }, /** @@ -189,7 +204,7 @@ tinyMCEPopup = { requireLangPack : function() { var t = this, u = t.getWindowArg('plugin_url') || t.getWindowArg('theme_url'); - if (u && t.editor.settings.language && t.features.translate_i18n !== false) { + if (u && t.editor.settings.language && t.features.translate_i18n !== false && t.editor.settings.language_load !== false) { u += '/langs/' + t.editor.settings.language + '_dlg.js'; if (!tinymce.ScriptLoader.isDone(u)) { @@ -324,6 +339,9 @@ tinyMCEPopup = { document.title = ti = nv; } + if (!t.editor.getParam('browser_preferred_colors', false) || !t.isWindow) + t.dom.addClass(document.body, 'forceColors'); + document.body.style.display = ''; // Restore selection in IE when focus is placed on a non textarea or input element of the type text @@ -414,7 +432,7 @@ tinyMCEPopup = { return; try { - // If IE is used, use the trick by Diego Perini + // If IE is used, use the trick by Diego Perini licensed under MIT by request to the author. // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch (ex) { diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/UndoManager.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/UndoManager.js index a52f532815..2d84e68ff8 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/UndoManager.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/UndoManager.js @@ -17,19 +17,58 @@ * @class tinymce.UndoManager */ tinymce.UndoManager = function(editor) { - var self, index = 0, data = []; + var self, index = 0, data = [], beforeBookmark; function getContent() { return tinymce.trim(editor.getContent({format : 'raw', no_events : 1})); }; return self = { - typing : 0, + /** + * State if the user is currently typing or not. This will add a typing operation into one undo + * level instead of one new level for each keystroke. + * + * @field {Boolean} typing + */ + typing : false, + /** + * This event will fire each time a new undo level is added to the undo manager. + * + * @event onAdd + * @param {tinymce.UndoManager} sender UndoManager instance that got the new level. + * @param {Object} level The new level object containing a bookmark and contents. + */ onAdd : new Dispatcher(self), + + /** + * This event will fire when the user make an undo of a change. + * + * @event onUndo + * @param {tinymce.UndoManager} sender UndoManager instance that got the new level. + * @param {Object} level The old level object containing a bookmark and contents. + */ onUndo : new Dispatcher(self), + + /** + * This event will fire when the user make an redo of a change. + * + * @event onRedo + * @param {tinymce.UndoManager} sender UndoManager instance that got the new level. + * @param {Object} level The old level object containing a bookmark and contents. + */ onRedo : new Dispatcher(self), + /** + * Stores away a bookmark to be used when performing an undo action so that the selection is before + * the change has been made. + * + * @method beforeChange + */ + beforeChange : function() { + beforeBookmark = editor.selection.getBookmark(2, true); + }, + /** * Adds a new undo level/snapshot to the undo list. * @@ -45,10 +84,12 @@ // Add undo level if needed lastLevel = data[index]; - if (lastLevel && lastLevel.content == level.content) { - if (index > 0 || data.length == 1) - return null; - } + if (lastLevel && lastLevel.content == level.content) + return null; + + // Set before bookmark on previous level + if (data[index]) + data[index].beforeBookmark = beforeBookmark; // Time to compress if (settings.custom_undo_redo_levels) { @@ -65,13 +106,8 @@ level.bookmark = editor.selection.getBookmark(2, true); // Crop array if needed - if (index < data.length - 1) { - // Treat first level as initial - if (index == 0) - data = []; - else - data.length = index + 1; - } + if (index < data.length - 1) + data.length = index + 1; data.push(level); index = data.length - 1; @@ -93,14 +129,14 @@ if (self.typing) { self.add(); - self.typing = 0; + self.typing = false; } if (index > 0) { level = data[--index]; editor.setContent(level.content, {format : 'raw'}); - editor.selection.moveToBookmark(level.bookmark); + editor.selection.moveToBookmark(level.beforeBookmark); self.onUndo.dispatch(self, level); } @@ -136,7 +172,8 @@ */ clear : function() { data = []; - index = self.typing = 0; + index = 0; + self.typing = false; }, /** @@ -146,7 +183,7 @@ * @return {Boolean} true/false if the undo manager has any undo levels. */ hasUndo : function() { - return index > 0 || self.typing; + return index > 0 || this.typing; }, /** @@ -156,7 +193,7 @@ * @return {Boolean} true/false if the undo manager has any redo levels. */ hasRedo : function() { - return index < data.length - 1; + return index < data.length - 1 && !this.typing; } }; }; diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/WindowManager.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/WindowManager.js index b3c9e99f80..0421b58df4 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/WindowManager.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/WindowManager.js @@ -13,7 +13,29 @@ /** * This class handles the creation of native windows and dialogs. This class can be extended to provide for example inline dialogs. + * * @class tinymce.WindowManager + * @example + * // Opens a new dialog with the file.htm file and the size 320x240 + * // It also adds a custom parameter this can be retrieved by using tinyMCEPopup.getWindowArg inside the dialog. + * tinyMCE.activeEditor.windowManager.open({ + * url : 'file.htm', + * width : 320, + * height : 240 + * }, { + * custom_param : 1 + * }); + * + * // Displays an alert box using the active editors window manager instance + * tinyMCE.activeEditor.windowManager.alert('Hello world!'); + * + * // Displays an confirm box and an alert message will be displayed depending on what you choose in the confirm + * tinyMCE.activeEditor.windowManager.confirm("Do you want to do something", function(s) { + * if (s) + * tinyMCE.activeEditor.windowManager.alert("Ok"); + * else + * tinyMCE.activeEditor.windowManager.alert("Cancel"); + * }); */ tinymce.create('tinymce.WindowManager', { /** @@ -38,7 +60,19 @@ * * @method open * @param {Object} s Optional name/value settings collection contains things like width/height/url etc. + * @option {String} title Window title. + * @option {String} file URL of the file to open in the window. + * @option {Number} width Width in pixels. + * @option {Number} height Height in pixels. + * @option {Boolean} resizable Specifies whether the popup window is resizable or not. + * @option {Boolean} maximizable Specifies whether the popup window has a "maximize" button and can get maximized or not. + * @option {Boolean} inline Specifies whether to display in-line (set to 1 or true for in-line display; requires inlinepopups plugin). + * @option {String/Boolean} popup_css Optional CSS to use in the popup. Set to false to remove the default one. + * @option {Boolean} translate_i18n Specifies whether translation should occur or not of i18 key strings. Default is true. + * @option {String/bool} close_previous Specifies whether a previously opened popup window is to be closed or not (like when calling the file browser window over the advlink popup). + * @option {String/bool} scrollbars Specifies whether the popup window can have scrollbars if required (i.e. content larger than the popup size specified). * @param {Object} p Optional parameters/arguments collection can be used by the dialogs to retrive custom parameters. + * @option {String} plugin_url url to plugin if opening plugin window that calls tinyMCEPopup.requireLangPack() and needs access to the plugin language js files */ open : function(s, p) { var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u; @@ -122,6 +156,9 @@ * @method createInstance * @param {String} cl Class name to create an instance of. * @return {Object} Instance of the specified class. + * @example + * var uri = tinyMCEPopup.editor.windowManager.createInstance('tinymce.util.URI', 'http://www.somesite.com'); + * alert(uri.getURI()); */ createInstance : function(cl, a, b, c, d, e) { var f = tinymce.resolve(cl); @@ -137,6 +174,14 @@ * @param {String} t Title for the new confirm dialog. * @param {function} cb Callback function to be executed after the user has selected ok or cancel. * @param {Object} s Optional scope to execute the callback in. + * @example + * // Displays an confirm box and an alert message will be displayed depending on what you choose in the confirm + * tinyMCE.activeEditor.windowManager.confirm("Do you want to do something", function(s) { + * if (s) + * tinyMCE.activeEditor.windowManager.alert("Ok"); + * else + * tinyMCE.activeEditor.windowManager.alert("Cancel"); + * }); */ confirm : function(t, cb, s, w) { w = w || window; @@ -152,6 +197,9 @@ * @param {String} t Title for the new alert dialog. * @param {function} cb Callback function to be executed after the user has selected ok. * @param {Object} s Optional scope to execute the callback in. + * @example + * // Displays an alert box using the active editors window manager instance + * tinyMCE.activeEditor.windowManager.alert('Hello world!'); */ alert : function(tx, cb, s, w) { var t = this; diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/adapter/jquery/adapter.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/adapter/jquery/adapter.js index 69c621e83e..c8f67058b6 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/adapter/jquery/adapter.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/adapter/jquery/adapter.js @@ -14,8 +14,9 @@ var is = tinymce.is, attrRegExp = /^(href|src|style)$/i, undefined; // jQuery is undefined - if (!$) - return alert("Load jQuery first!"); + if (!$ && window.console) { + return console.log("Load jQuery first!"); + } // Stick jQuery into the tinymce namespace tinymce.$ = $; @@ -25,23 +26,23 @@ patchEditor : function(editor) { var fn = $.fn; - // Adapt the css function to make sure that the _mce_style + // Adapt the css function to make sure that the data-mce-style // attribute gets updated with the new style information function css(name, value) { var self = this; - // Remove _mce_style when set operation occurs + // Remove data-mce-style when set operation occurs if (value) - self.removeAttr('_mce_style'); + self.removeAttr('data-mce-style'); return fn.css.apply(self, arguments); }; - // Apapt the attr function to make sure that it uses the _mce_ prefixed variants + // Apapt the attr function to make sure that it uses the data-mce- prefixed variants function attr(name, value) { var self = this; - // Update/retrive _mce_ attribute variants + // Update/retrive data-mce- attribute variants if (attrRegExp.test(name)) { if (value !== undefined) { // Use TinyMCE behavior when setting the specifc attributes @@ -51,7 +52,7 @@ return self; } else - return self.attr('_mce_' + name); + return self.attr('data-mce-' + name); } // Default behavior @@ -61,7 +62,7 @@ function htmlPatchFunc(func) { // Returns a modified function that processes // the HTML before executing the action this makes sure - // that href/src etc gets moved into the _mce_ variants + // that href/src etc gets moved into the data-mce- variants return function(content) { if (content) content = editor.dom.processHTML(content); @@ -76,7 +77,7 @@ function patch(jq) { // Patch some functions, only patch the object once if (jq.css !== css) { - // Patch css/attr to use the _mce_ prefixed attribute variants + // Patch css/attr to use the data-mce- prefixed attribute variants jq.css = css; jq.attr = attr; @@ -238,7 +239,7 @@ case "style": e.each(function(i, v){ if (s.keep_values) - $(v).attr('_mce_style', v); + $(v).attr('data-mce-style', v); v.style.cssText = v; }); @@ -257,7 +258,7 @@ if (s.url_converter) v = s.url_converter.call(s.url_converter_scope || t, v, n, v); - t.setAttrib(v, '_mce_' + n, v); + t.setAttrib(v, 'data-mce-' + n, v); } }); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/adapter/jquery/jquery.tinymce.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/adapter/jquery/jquery.tinymce.js index 4f2cf78258..ffb565549d 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/adapter/jquery/jquery.tinymce.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/adapter/jquery/jquery.tinymce.js @@ -25,6 +25,8 @@ if (!settings) return tinyMCE.get(self[0].id); + self.css('visibility', 'hidden'); // Hide textarea to avoid flicker + function init() { var editors = [], initCount = 0; @@ -46,13 +48,15 @@ ed = new tinymce.Editor(id, settings); editors.push(ed); - // Add onInit event listener if the oninit setting is defined - // this logic will fire the oninit callback ones each - // matched editor instance is initialized - if (oninit) { - ed.onInit.add(function() { - var scope, func = oninit; + ed.onInit.add(function() { + var scope, func = oninit; + + self.css('visibility', ''); + // Run this if the oninit setting is defined + // this logic will fire the oninit callback ones each + // matched editor instance is initialized + if (oninit) { // Fire the oninit event ones each editor instance is initialized if (++initCount == editors.length) { if (tinymce.is(func, "string")) { @@ -63,8 +67,8 @@ // Call the oninit function with the object func.apply(scope || tinymce, editors); } - }); - } + } + }); }); // Render the editor instances in a separate loop since we diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/DOMUtils.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/DOMUtils.js index 9930ee0dea..fae1f1f56b 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/DOMUtils.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/DOMUtils.js @@ -14,28 +14,21 @@ is = tinymce.is, isWebKit = tinymce.isWebKit, isIE = tinymce.isIE, - blockRe = /^(H[1-6R]|P|DIV|ADDRESS|PRE|FORM|T(ABLE|BODY|HEAD|FOOT|H|R|D)|LI|OL|UL|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|MENU|ISINDEX|SAMP)$/, - boolAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'), - mceAttribs = makeMap('src,href,style,coords,shape'), - encodedChars = {'&' : '&', '"' : '"', '<' : '<', '>' : '>'}, - encodeCharsRe = /[<>&\"]/g, + Entities = tinymce.html.Entities, simpleSelectorRe = /^([a-z0-9],?)+$/i, - tagRegExp = /<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)(\s*\/?)>/g, - attrRegExp = /(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; - - function makeMap(str) { - var map = {}, i; - - str = str.split(','); - for (i = str.length; i >= 0; i--) - map[str[i]] = 1; - - return map; - }; + blockElementsMap = tinymce.html.Schema.blockElementsMap, + whiteSpaceRegExp = /^[ \t\r\n]*$/; /** * Utility class for various DOM manipulation and retrival functions. + * * @class tinymce.dom.DOMUtils + * @example + * // Add a class to an element by id in the page + * tinymce.DOM.addClass('someid', 'someclass'); + * + * // Add a class to an element by id inside the editor + * tinyMCE.activeEditor.dom.addClass('someid', 'someclass'); */ tinymce.create('tinymce.dom.DOMUtils', { doc : null, @@ -66,21 +59,27 @@ * @param {settings} s Optional settings collection. */ DOMUtils : function(d, s) { - var t = this, globalStyle; + var t = this, globalStyle, name; t.doc = d; t.win = window; t.files = {}; t.cssFlicker = false; t.counter = 0; - t.stdMode = d.documentMode >= 8; + t.stdMode = !tinymce.isIE || d.documentMode >= 8; t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat" || t.stdMode; + t.hasOuterHTML = "outerHTML" in d.createElement("a"); t.settings = s = tinymce.extend({ keep_values : false, - hex_colors : 1, - process_html : 1 + hex_colors : 1 }, s); + + t.schema = s.schema; + t.styles = new tinymce.html.Styles({ + url_converter : s.url_converter, + url_converter_scope : s.url_converter_scope + }, s.schema); // Fix IE6SP2 flicker and check it failed for pre SP2 if (tinymce.isIE6) { @@ -91,14 +90,20 @@ } } - // Build styles list - if (s.valid_styles) { - t._styles = {}; - - // Convert styles into a rule list - each(s.valid_styles, function(value, key) { - t._styles[key] = tinymce.explode(value); + if (isIE && s.schema) { + // Add missing HTML 4/5 elements to IE + ('abbr article aside audio canvas ' + + 'details figcaption figure footer ' + + 'header hgroup mark menu meter nav ' + + 'output progress section summary ' + + 'time video').replace(/\w+/g, function(name) { + d.createElement(name); }); + + // Create all custom elements + for (name in s.schema.getCustomElements()) { + d.createElement(name); + } } tinymce.addUnload(t.destroy, t); @@ -280,6 +285,7 @@ /** * Returns the next node that matches selector or function * + * @method getNext * @param {Node} node Node to find siblings from. * @param {String/function} selector Selector CSS expression or function. * @return {Node} Next node item matching the selector or null if it wasn't found. @@ -291,6 +297,7 @@ /** * Returns the previous node that matches selector or function * + * @method getPrev * @param {Node} node Node to find siblings from. * @param {String/function} selector Selector CSS expression or function. * @return {Node} Previous node item matching the selector or null if it wasn't found. @@ -310,6 +317,12 @@ * @param {String} p CSS level 1 pattern to select/find elements by. * @param {Object} s Optional root element/scope element to search in. * @return {Array} Array with all matched elements. + * @example + * // Adds a class to all paragraphs in the currently active editor + * tinyMCE.activeEditor.dom.addClass(tinyMCE.activeEditor.dom.select('p'), 'someclass'); + * + * // Adds a class to all spans that has the test class in the currently active editor + * tinyMCE.activeEditor.dom.addClass(tinyMCE.activeEditor.dom.select('span.test'), 'someclass') */ select : function(pa, s) { var t = this; @@ -362,6 +375,9 @@ * @param {String} h Optional inner HTML contents to add for each element. * @param {Boolean} c Optional internal state to indicate if it should create or add. * @return {Element/Array} Element that got created or array with elements if multiple elements where passed. + * @example + * // Adds a new paragraph to the end of the active editor + * tinyMCE.activeEditor.dom.add(tinyMCE.activeEditor.getBody(), 'p', {title : 'my title'}, 'Some content'); */ add : function(p, n, a, h, c) { var t = this; @@ -391,19 +407,26 @@ * @param {Object} a Optional object name/value collection with element attributes. * @param {String} h Optional HTML string to set as inner HTML of the element. * @return {Element} HTML DOM node element that got created. + * @example + * // Adds an element where the caret/selection is in the active editor + * var el = tinyMCE.activeEditor.dom.create('div', {id : 'test', 'class' : 'myclass'}, 'some content'); + * tinyMCE.activeEditor.selection.setNode(el); */ create : function(n, a, h) { return this.add(this.doc.createElement(n), n, a, h, 1); }, /** - * Create HTML string for element. The elemtn will be closed unless an empty inner HTML string is passed. + * Create HTML string for element. The element will be closed unless an empty inner HTML string is passed. * * @method createHTML * @param {String} n Name of new element. * @param {Object} a Optional object name/value collection with element attributes. * @param {String} h Optional HTML string to set as inner HTML of the element. * @return {String} String with new HTML element like for example: test. + * @example + * // Creates a html chunk and inserts it at the current selection/caret location + * tinyMCE.activeEditor.selection.setContent(tinyMCE.activeEditor.dom.createHTML('a', {href : 'test.html'}, 'some line')); */ createHTML : function(n, a, h) { var o = '', t = this, k; @@ -429,12 +452,16 @@ * @param {String/Element/Array} node ID of element or DOM element object or array containing multiple elements/ids. * @param {Boolean} keep_children Optional state to keep children or not. If set to true all children will be placed at the location of the removed element. * @return {Element/Array} HTML DOM element that got removed or array of elements depending on input. + * @example + * // Removes all paragraphs in the active editor + * tinyMCE.activeEditor.dom.remove(tinyMCE.activeEditor.dom.select('p')); + * + * // Removes a element by id in the document + * tinyMCE.DOM.remove('mydiv'); */ remove : function(node, keep_children) { return this.run(node, function(node) { - var parent, child; - - parent = node.parentNode; + var child, parent = node.parentNode; if (!parent) return null; @@ -461,6 +488,12 @@ * @param {String/Element/Array} n HTML element/Element ID or Array of elements/ids to set CSS style value on. * @param {String} na Name of the style value to set. * @param {String} v Value to set on the style. + * @example + * // Sets a style value on all paragraphs in the currently active editor + * tinyMCE.activeEditor.dom.setStyle(tinyMCE.activeEditor.dom.select('p'), 'background-color', 'red'); + * + * // Sets a style value to an element by id in the current document + * tinyMCE.DOM.setStyle('mydiv', 'background-color', 'red'); */ setStyle : function(n, na, v) { var t = this; @@ -503,7 +536,7 @@ // Force update of the style data if (t.settings.update_styles) - t.setAttrib(e, '_mce_style'); + t.setAttrib(e, 'data-mce-style'); }); }, @@ -520,7 +553,7 @@ n = this.get(n); if (!n) - return false; + return; // Gecko if (this.doc.defaultView && c) { @@ -549,7 +582,7 @@ if (n.currentStyle && c) return n.currentStyle[na]; - return n.style[na]; + return n.style ? n.style[na] : undefined; }, /** @@ -558,6 +591,12 @@ * @method setStyles * @param {Element/String/Array} e DOM element, element id string or array of elements/ids to set styles on. * @param {Object} o Name/Value collection of style items to add to the element(s). + * @example + * // Sets styles on all paragraphs in the currently active editor + * tinyMCE.activeEditor.dom.setStyles(tinyMCE.activeEditor.dom.select('p'), {'background-color' : 'red', 'color' : 'green'}); + * + * // Sets styles to an element by id in the current document + * tinyMCE.DOM.setStyles('mydiv', {'background-color' : 'red', 'color' : 'green'}); */ setStyles : function(e, o) { var t = this, s = t.settings, ol; @@ -575,6 +614,20 @@ t.setAttrib(e, s.cssText); }, + /** + * Removes all attributes from an element or elements. + * + * @param {Element/String/Array} e DOM element, element id string or array of elements/ids to remove attributes from. + */ + removeAllAttribs: function(e) { + return this.run(e, function(e) { + var i, attrs = e.attributes; + for (i = attrs.length - 1; i >= 0; i--) { + e.removeAttributeNode(attrs.item(i)); + } + }); + }, + /** * Sets the specified attributes value of a element or elements. * @@ -582,6 +635,12 @@ * @param {Element/String/Array} e DOM element, element id string or array of elements/ids to set attribute on. * @param {String} n Name of attribute to set. * @param {String} v Value to set on the attribute of this value is falsy like null 0 or '' it will remove the attribute instead. + * @example + * // Sets an attribute to all paragraphs in the active editor + * tinyMCE.activeEditor.dom.setAttrib(tinyMCE.activeEditor.dom.select('p'), 'class', 'myclass'); + * + * // Sets an attribute to a specific element in the current page + * tinyMCE.dom.setAttrib('mydiv', 'class', 'myclass'); */ setAttrib : function(e, n, v) { var t = this; @@ -610,9 +669,9 @@ // No mce_style for elements with these since they might get resized by the user if (s.keep_values) { if (v && !t._isRes(v)) - e.setAttribute('_mce_style', v, 2); + e.setAttribute('data-mce-style', v, 2); else - e.removeAttribute('_mce_style', 2); + e.removeAttribute('data-mce-style', 2); } e.style.cssText = v; @@ -628,13 +687,13 @@ if (s.url_converter) v = s.url_converter.call(s.url_converter_scope || t, v, n, e); - t.setAttrib(e, '_mce_' + n, v, 2); + t.setAttrib(e, 'data-mce-' + n, v, 2); } break; - + case "shape": - e.setAttribute('_mce_style', v); + e.setAttribute('data-mce-style', v); break; } @@ -651,6 +710,12 @@ * @method setAttribs * @param {Element/String/Array} e DOM element, element id string or array of elements/ids to set attributes on. * @param {Object} o Name/Value collection of attribute items to add to the element(s). + * @example + * // Sets some attributes to all paragraphs in the active editor + * tinyMCE.activeEditor.dom.setAttribs(tinyMCE.activeEditor.dom.select('p'), {'class' : 'myclass', title : 'some title'}); + * + * // Sets some attributes to a specific element in the current page + * tinyMCE.DOM.setAttribs('mydiv', {'class' : 'myclass', title : 'some title'}); */ setAttribs : function(e, o) { var t = this; @@ -672,19 +737,19 @@ * @return {String} Attribute value string, default value or null if the attribute wasn't found. */ getAttrib : function(e, n, dv) { - var v, t = this; + var v, t = this, undef; e = t.get(e); if (!e || e.nodeType !== 1) - return false; + return dv === undef ? false : dv; if (!is(dv)) dv = ''; // Try the mce variant for these if (/^(src|href|style|coords|shape)$/.test(n)) { - v = e.getAttribute("_mce_" + n); + v = e.getAttribute("data-mce-" + n); if (v) return v; @@ -717,7 +782,7 @@ v = t.serializeStyle(t.parseStyle(v), e.nodeName); if (t.settings.keep_values && !t._isRes(v)) - e.setAttribute('_mce_style', v); + e.setAttribute('data-mce-style', v); } } @@ -789,7 +854,7 @@ } } - return (v !== undefined && v !== null && v !== '') ? '' + v : dv; + return (v !== undef && v !== null && v !== '') ? '' + v : dv; }, /** @@ -807,14 +872,17 @@ ro = ro || d.body; if (n) { - // Use getBoundingClientRect on IE, Opera has it but it's not perfect - if (isIE && !t.stdMode) { + // Use getBoundingClientRect if it exists since it's faster than looping offset nodes + if (n.getBoundingClientRect) { n = n.getBoundingClientRect(); e = t.boxModel ? d.documentElement : d.body; - x = t.getStyle(t.select('html')[0], 'borderWidth'); // Remove border - x = (x == 'medium' || t.boxModel && !t.isIE6) && 2 || x; - return {x : n.left + e.scrollLeft - x, y : n.top + e.scrollTop - x}; + // Add scroll offsets from documentElement or body since IE with the wrong box model will use d.body and so do WebKit + // Also remove the body/documentelement clientTop/clientLeft on IE 6, 7 since they offset the position + x = n.left + (d.documentElement.scrollLeft || d.body.scrollLeft) - e.clientTop; + y = n.top + (d.documentElement.scrollTop || d.body.scrollTop) - e.clientLeft; + + return {x : x, y : y}; } r = n; @@ -845,102 +913,7 @@ * @return {Object} Object representation of that style like {border : '1px solid red'} */ parseStyle : function(st) { - var t = this, s = t.settings, o = {}; - - if (!st) - return o; - - function compress(p, s, ot) { - var t, r, b, l; - - // Get values and check it it needs compressing - t = o[p + '-top' + s]; - if (!t) - return; - - r = o[p + '-right' + s]; - if (t != r) - return; - - b = o[p + '-bottom' + s]; - if (r != b) - return; - - l = o[p + '-left' + s]; - if (b != l) - return; - - // Compress - o[ot] = l; - delete o[p + '-top' + s]; - delete o[p + '-right' + s]; - delete o[p + '-bottom' + s]; - delete o[p + '-left' + s]; - }; - - function compress2(ta, a, b, c) { - var t; - - t = o[a]; - if (!t) - return; - - t = o[b]; - if (!t) - return; - - t = o[c]; - if (!t) - return; - - // Compress - o[ta] = o[a] + ' ' + o[b] + ' ' + o[c]; - delete o[a]; - delete o[b]; - delete o[c]; - }; - - st = st.replace(/&(#?[a-z0-9]+);/g, '&$1_MCE_SEMI_'); // Protect entities - - each(st.split(';'), function(v) { - var sv, ur = []; - - if (v) { - v = v.replace(/_MCE_SEMI_/g, ';'); // Restore entities - v = v.replace(/url\([^\)]+\)/g, function(v) {ur.push(v);return 'url(' + ur.length + ')';}); - v = v.split(':'); - sv = tinymce.trim(v[1]); - sv = sv.replace(/url\(([^\)]+)\)/g, function(a, b) {return ur[parseInt(b) - 1];}); - - sv = sv.replace(/rgb\([^\)]+\)/g, function(v) { - return t.toHex(v); - }); - - if (s.url_converter) { - sv = sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g, function(x, c) { - return 'url(' + s.url_converter.call(s.url_converter_scope || t, t.decode(c), 'style', null) + ')'; - }); - } - - o[tinymce.trim(v[0]).toLowerCase()] = sv; - } - }); - - compress("border", "", "border"); - compress("border", "-width", "border-width"); - compress("border", "-color", "border-color"); - compress("border", "-style", "border-style"); - compress("padding", "", "padding"); - compress("margin", "", "margin"); - compress2('border', 'border-width', 'border-style', 'border-color'); - - if (isIE) { - // Remove pointless border - if (o.border == 'medium none') - o.border = ''; - } - - return o; + return this.styles.parse(st); }, /** @@ -952,45 +925,7 @@ * @return {String} String representation of the style object for example: border: 1px solid red. */ serializeStyle : function(o, name) { - var t = this, s = ''; - - function add(v, k) { - if (k && v) { - // Remove browser specific styles like -moz- or -webkit- - if (k.indexOf('-') === 0) - return; - - switch (k) { - case 'font-weight': - // Opera will output bold as 700 - if (v == 700) - v = 'bold'; - - break; - - case 'color': - case 'background-color': - v = v.toLowerCase(); - break; - } - - s += (s ? ' ' : '') + k + ': ' + v + ';'; - } - }; - - // Validate style output - if (name && t._styles) { - each(t._styles['*'], function(name) { - add(o[name], name); - }); - - each(t._styles[name.toLowerCase()], function(name) { - add(o[name], name); - }); - } else - each(o, add); - - return s; + return this.styles.serialize(o, name); }, /** @@ -998,6 +933,18 @@ * * @method loadCSS * @param {String} u URL to CSS file to load. + * @example + * // Loads a CSS file dynamically into the current document + * tinymce.DOM.loadCSS('somepath/some.css'); + * + * // Loads a CSS file into the currently active editor instance + * tinyMCE.activeEditor.dom.loadCSS('somepath/some.css'); + * + * // Loads a CSS file into an editor instance by id + * tinyMCE.get('someid').dom.loadCSS('somepath/some.css'); + * + * // Loads multiple CSS files into the current document + * tinymce.DOM.loadCSS('somepath/some.css,somepath/someother.css'); */ loadCSS : function(u) { var t = this, d = t.doc, head; @@ -1021,7 +968,9 @@ // It's ugly but it seems to work fine. if (isIE && d.documentMode && d.recalc) { link.onload = function() { - d.recalc(); + if (d.recalc) + d.recalc(); + link.onload = null; }; } @@ -1037,6 +986,12 @@ * @param {String/Element/Array} Element ID string or DOM element or array with elements or IDs. * @param {String} c Class name to add to each element. * @return {String/Array} String with new class value or array with new class values for all elements. + * @example + * // Adds a class to all paragraphs in the active editor + * tinyMCE.activeEditor.dom.addClass(tinyMCE.activeEditor.dom.select('p'), 'myclass'); + * + * // Adds a class to a specific element in the current page + * tinyMCE.DOM.addClass('mydiv', 'myclass'); */ addClass : function(e, c) { return this.run(e, function(e) { @@ -1061,6 +1016,12 @@ * @param {String/Element/Array} Element ID string or DOM element or array with elements or IDs. * @param {String} c Class name to remove to each element. * @return {String/Array} String with new class value or array with new class values for all elements. + * @example + * // Removes a class from all paragraphs in the active editor + * tinyMCE.activeEditor.dom.removeClass(tinyMCE.activeEditor.dom.select('p'), 'myclass'); + * + * // Removes a class from a specific element in the current page + * tinyMCE.DOM.removeClass('mydiv', 'myclass'); */ removeClass : function(e, c) { var t = this, re; @@ -1122,6 +1083,9 @@ * * @method hide * @param {String/Element/Array} e ID of DOM element or DOM element or array with elements or IDs to hide. + * @example + * // Hides a element by id in the document + * tinymce.DOM.hide('myid'); */ hide : function(e) { return this.setStyle(e, 'display', 'none'); @@ -1159,273 +1123,74 @@ * @method setHTML * @param {Element/String/Array} e DOM element, element id string or array of elements/ids to set HTML inside. * @param {String} h HTML content to set as inner HTML of the element. + * @example + * // Sets the inner HTML of all paragraphs in the active editor + * tinyMCE.activeEditor.dom.setHTML(tinyMCE.activeEditor.dom.select('p'), 'some inner html'); + * + * // Sets the inner HTML of a element by id in the document + * tinyMCE.DOM.setHTML('mydiv', 'some inner html'); */ - setHTML : function(e, h) { - var t = this; - - return this.run(e, function(e) { - var x, i, nl, n, p, x; - - h = t.processHTML(h); + setHTML : function(element, html) { + var self = this; + return self.run(element, function(element) { if (isIE) { - function set() { - // Remove all child nodes - while (e.firstChild) - e.firstChild.removeNode(); - - try { - // IE will remove comments from the beginning - // unless you padd the contents with something - e.innerHTML = '
    ' + h; - e.removeChild(e.firstChild); - } catch (ex) { - // IE sometimes produces an unknown runtime error on innerHTML if it's an block element within a block element for example a div inside a p - // This seems to fix this problem - - // Create new div with HTML contents and a BR infront to keep comments - x = t.create('div'); - x.innerHTML = '
    ' + h; - - // Add all children from div to target - each (x.childNodes, function(n, i) { - // Skip br element - if (i) - e.appendChild(n); - }); - } - }; - - // IE has a serious bug when it comes to paragraphs it can produce an invalid - // DOM tree if contents like this

    • Item 1

    is inserted - // It seems to be that IE doesn't like a root block element placed inside another root block element - if (t.settings.fix_ie_paragraphs) - h = h.replace(/

    <\/p>|]+)><\/p>|/gi, ' 

    '); - - set(); - - if (t.settings.fix_ie_paragraphs) { - // Check for odd paragraphs this is a sign of a broken DOM - nl = e.getElementsByTagName("p"); - for (i = nl.length - 1, x = 0; i >= 0; i--) { - n = nl[i]; - - if (!n.hasChildNodes()) { - if (!n._mce_keep) { - x = 1; // Is broken - break; - } - - n.removeAttribute('_mce_keep'); - } - } - } - - // Time to fix the madness IE left us - if (x) { - // So if we replace the p elements with divs and mark them and then replace them back to paragraphs - // after we use innerHTML we can fix the DOM tree - h = h.replace(/

    ]+)>|

    /ig, '

    '); - h = h.replace(/<\/p>/gi, '
    '); - - // Set the new HTML with DIVs - set(); - - // Replace all DIV elements with the _mce_tmp attibute back to paragraphs - // This is needed since IE has a annoying bug see above for details - // This is a slow process but it has to be done. :( - if (t.settings.fix_ie_paragraphs) { - nl = e.getElementsByTagName("DIV"); - for (i = nl.length - 1; i >= 0; i--) { - n = nl[i]; - - // Is it a temp div - if (n._mce_tmp) { - // Create new paragraph - p = t.doc.createElement('p'); - - // Copy all attributes - n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi, function(a, b) { - var v; - - if (b !== '_mce_tmp') { - v = n.getAttribute(b); - - if (!v && b === 'class') - v = n.className; - - p.setAttribute(b, v); - } - }); - - // Append all children to new paragraph - for (x = 0; x]+)\/>|/gi, '', h); // Force open - - // Store away src and href in _mce_src and mce_href since browsers mess them up - if (s.keep_values) { - // Wrap scripts and styles in comments for serialization purposes - if (/)/g, '\n'); - s = s.replace(/^[\r\n]*|[\r\n]*$/g, ''); - s = s.replace(/^\s*(\/\/\s*|\]\]>|-->|\]\]-->)\s*$/g, ''); - - return s; - }; - - // Wrap the script contents in CDATA and keep them from executing - h = h.replace(/]+|)>([\s\S]*?)<\/script>/gi, function(v, attribs, text) { - // Force type attribute - if (!attribs) - attribs = ' type="text/javascript"'; - - // Convert the src attribute of the scripts - attribs = attribs.replace(/src=\"([^\"]+)\"?/i, function(a, url) { - if (s.url_converter) - url = t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(url), 'src', 'script')); - - return '_mce_src="' + url + '"'; - }); - - // Wrap text contents - if (tinymce.trim(text)) { - codeBlocks.push(trim(text)); - text = ''; - } - - return '' + text + ''; - }); - - // Wrap style elements - h = h.replace(/]+|)>([\s\S]*?)<\/style>/gi, function(v, attribs, text) { - // Wrap text contents - if (text) { - codeBlocks.push(trim(text)); - text = ''; - } - - return '' + text + ''; - }); - - // Wrap noscript elements - h = h.replace(/]+|)>([\s\S]*?)<\/noscript>/g, function(v, attribs, text) { - return ''; - }); - } - - h = tinymce._replace(//g, '', h); - - // This function processes the attributes in the HTML string to force boolean - // attributes to the attr="attr" format and convert style, src and href to _mce_ versions - function processTags(html) { - return html.replace(tagRegExp, function(match, elm_name, attrs, end) { - return '<' + elm_name + attrs.replace(attrRegExp, function(match, name, value, val2, val3) { - var mceValue; - - name = name.toLowerCase(); - value = value || val2 || val3 || ""; - - // Treat boolean attributes - if (boolAttrs[name]) { - // false or 0 is treated as a missing attribute - if (value === 'false' || value === '0') - return; - - return name + '="' + name + '"'; - } - - // Is attribute one that needs special treatment - if (mceAttribs[name] && attrs.indexOf('_mce_' + name) == -1) { - mceValue = t.decode(value); - - // Convert URLs to relative/absolute ones - if (s.url_converter && (name == "src" || name == "href")) - mceValue = s.url_converter.call(s.url_converter_scope || t, mceValue, name, elm_name); - - // Process styles lowercases them and compresses them - if (name == 'style') - mceValue = t.serializeStyle(t.parseStyle(mceValue), name); - - return name + '="' + value + '"' + ' _mce_' + name + '="' + t.encode(mceValue) + '"'; - } - - return match; - }) + end + '>'; - }); - }; - - h = processTags(h); - - // Restore script blocks - h = h.replace(/MCE_SCRIPT:([0-9]+)/g, function(val, idx) { - return codeBlocks[idx]; - }); - } - - return h; - }, - /** * Returns the outer HTML of an element. * * @method getOuterHTML - * @param {String/Element} e Element ID or element object to get outer HTML from. + * @param {String/Element} elm Element ID or element object to get outer HTML from. * @return {String} Outer HTML string. + * @example + * tinymce.DOM.getOuterHTML(editorElement); + * tinyMCE.activeEditor.getOuterHTML(tinyMCE.activeEditor.getBody()); */ - getOuterHTML : function(e) { - var d; + getOuterHTML : function(elm) { + var doc, self = this; - e = this.get(e); + elm = self.get(elm); - if (!e) + if (!elm) return null; - if (e.outerHTML !== undefined) - return e.outerHTML; + if (elm.nodeType === 1 && self.hasOuterHTML) + return elm.outerHTML; - d = (e.ownerDocument || this.doc).createElement("body"); - d.appendChild(e.cloneNode(true)); + doc = (elm.ownerDocument || self.doc).createElement("body"); + doc.appendChild(elm.cloneNode(true)); - return d.innerHTML; + return doc.innerHTML; }, /** @@ -1435,6 +1200,12 @@ * @param {Element/String/Array} e DOM element, element id string or array of elements/ids to set outer HTML on. * @param {Object} h HTML code to set as outer value for the element. * @param {Document} d Optional document scope to use in this process defaults to the document of the DOM class. + * @example + * // Sets the outer HTML of all paragraphs in the active editor + * tinyMCE.activeEditor.dom.setOuterHTML(tinyMCE.activeEditor.dom.select('p'), '
    some html
    '); + * + * // Sets the outer HTML of a element by id in the document + * tinyMCE.DOM.setOuterHTML('mydiv', '
    some html
    '); */ setOuterHTML : function(e, h, d) { var t = this; @@ -1485,41 +1256,16 @@ * @param {String} s String to decode entities on. * @return {String} Entity decoded string. */ - decode : function(s) { - var e, n, v; - - // Look for entities to decode - if (/&[\w#]+;/.test(s)) { - // Decode the entities using a div element not super efficient but less code - e = this.doc.createElement("div"); - e.innerHTML = s; - n = e.firstChild; - v = ''; - - if (n) { - do { - v += n.nodeValue; - } while (n = n.nextSibling); - } - - return v || s; - } - - return s; - }, + decode : Entities.decode, /** * Entity encodes a string, encodes the most common entities <>"& into entities. * * @method encode - * @param {String} s String to encode with entities. + * @param {String} text String to encode with entities. * @return {String} Entity encoded string. */ - encode : function(str) { - return ('' + str).replace(encodeCharsRe, function(chr) { - return encodedChars[chr]; - }); - }, + encode : Entities.encodeAllRaw, /** * Inserts a element after the reference element. @@ -1551,16 +1297,17 @@ * Returns true/false if the specified element is a block element or not. * * @method isBlock - * @param {Node} n Element/Node to check. + * @param {Node/String} node Element/Node to check. * @return {Boolean} True/False state if the node is a block element or not. */ - isBlock : function(n) { - if (n.nodeType && n.nodeType !== 1) - return false; + isBlock : function(node) { + var type = node.nodeType; - n = n.nodeName || n; + // If it's a node then check the type and use the nodeName + if (type) + return !!(type === 1 && blockElementsMap[node.nodeName]); - return blockRe.test(n); + return !!blockElementsMap[node]; }, /** @@ -1812,6 +1559,54 @@ return n.attributes; }, + /** + * Returns true/false if the specified node is to be considered empty or not. + * + * @example + * tinymce.DOM.isEmpty(node, {img : true}); + * @method isEmpty + * @param {Object} elements Optional name/value object with elements that are automatically treated as non empty elements. + * @return {Boolean} true/false if the node is empty or not. + */ + isEmpty : function(node, elements) { + var self = this, i, attributes, type, walker, name; + + node = node.firstChild; + if (node) { + walker = new tinymce.dom.TreeWalker(node); + elements = elements || self.schema ? self.schema.getNonEmptyElements() : null; + + do { + type = node.nodeType; + + if (type === 1) { + // Ignore bogus elements + if (node.getAttribute('data-mce-bogus')) + continue; + + // Keep empty elements like + if (elements && elements[node.nodeName.toLowerCase()]) + return false; + + // Keep elements with data-bookmark attributes or name attribute like + attributes = self.getAttribs(node); + i = node.attributes.length; + while (i--) { + name = node.attributes[i].nodeName; + if (name === "name" || name === 'data-mce-bookmark') + return false; + } + } + + // Keep non whitespace text nodes + if ((type === 3 && !whiteSpaceRegExp.test(node.nodeValue))) + return false; + } while (node = walker.next()); + } + + return true; + }, + /** * Destroys all internal references to the DOM to solve IE leak issues. * @@ -1836,6 +1631,9 @@ * * @method createRng * @return {DOMRange} DOM Range object. + * @example + * var rng = tinymce.DOM.createRng(); + * alert(rng.startContainer + "," + rng.startOffset); */ createRng : function() { var d = this.doc; @@ -1862,7 +1660,6 @@ if (nodeType == lastNodeType || !node.nodeValue.length) continue; } - idx++; lastNodeType = nodeType; } @@ -1894,26 +1691,24 @@ // this function will then trim of empty edges and produce: //

    text 1

    CHOP

    text 2

    function trim(node) { - var i, children = node.childNodes; + var i, children = node.childNodes, type = node.nodeType; - if (node.nodeType == 1 && node.getAttribute('_mce_type') == 'bookmark') + if (type == 1 && node.getAttribute('data-mce-type') == 'bookmark') return; for (i = children.length - 1; i >= 0; i--) trim(children[i]); - if (node.nodeType != 9) { + if (type != 9) { // Keep non whitespace text nodes - if (node.nodeType == 3 && node.nodeValue.length > 0) { + if (type == 3 && node.nodeValue.length > 0) { // If parent element isn't a block or there isn't any useful contents for example "

    " if (!t.isBlock(node.parentNode) || tinymce.trim(node.nodeValue).length > 0) return; - } - - if (node.nodeType == 1) { + } else if (type == 1) { // If the only child is a bookmark then move it up children = node.childNodes; - if (children.length == 1 && children[0] && children[0].nodeType == 1 && children[0].getAttribute('_mce_type') == 'bookmark') + if (children.length == 1 && children[0] && children[0].nodeType == 1 && children[0].getAttribute('data-mce-type') == 'bookmark') node.parentNode.insertBefore(children[0], node); // Keep non empty elements or img, hr etc @@ -2065,6 +1860,9 @@ * @property DOM * @member tinymce * @type tinymce.dom.DOMUtils + * @example + * // Example of how to add a class to some element by id + * tinymce.DOM.addClass('someid', 'someclass'); */ tinymce.DOM = new tinymce.dom.DOMUtils(document, {process_html : 0}); })(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Element.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Element.js index 1e6d6753fa..a1a8786254 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Element.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Element.js @@ -15,6 +15,12 @@ * since it's bound to an element. * * @class tinymce.dom.Element + * @example + * // Creates an basic element for an existing element + * var elm = new tinymce.dom.Element('someid'); + * + * elm.setStyle('background-color', 'red'); + * elm.moveTo(10, 10); */ /** diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/EventUtils.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/EventUtils.js index 06746e7c24..50851ddcb8 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/EventUtils.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/EventUtils.js @@ -39,6 +39,11 @@ * @param {function} f Function to execute when the event occurs. * @param {Object} s Optional scope to execute the function in. * @return {function} Function callback handler the same as the one passed in. + * @example + * // Adds a click handler to the current document + * tinymce.dom.Event.add(document, 'click', function(e) { + * console.debug(e.target); + * }); */ add : function(o, n, f, s) { var cb, t = this, el = t.events, r; @@ -129,6 +134,14 @@ * @param {String} n Event handler name like for example: "click" * @param {function} f Function to remove. * @return {bool/Array} Bool state if true if the handler was removed or an array with states if multiple elements where passed in. + * @example + * // Adds a click handler to the current document + * var func = tinymce.dom.Event.add(document, 'click', function(e) { + * console.debug(e.target); + * }); + * + * // Removes the click handler from the document + * tinymce.dom.Event.remove(document, 'click', func); */ remove : function(o, n, f) { var t = this, a = t.events, s = false, r; @@ -164,6 +177,11 @@ * * @method clear * @param {Object} o DOM element or object to remove all events from. + * @example + * // Cancels all mousedown events in the active editor + * tinyMCE.activeEditor.onMouseDown.add(function(ed, e) { + * return tinymce.dom.Event.cancel(e); + * }); */ clear : function(o) { var t = this, a = t.events, i, e; @@ -312,7 +330,7 @@ return; try { - // If IE is used, use the trick by Diego Perini + // If IE is used, use the trick by Diego Perini licensed under MIT by request to the author. // http://javascript.nwbox.com/IEContentLoaded/ doc.documentElement.doScroll("left"); } catch (ex) { @@ -335,7 +353,7 @@ }, _stoppers : { - preventDefault : function() { + preventDefault : function() { this.returnValue = false; }, diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Range.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Range.js index 634459d507..54b847221f 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Range.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Range.js @@ -106,23 +106,24 @@ }; function compareBoundaryPoints(h, r) { - var sc = t[START_CONTAINER], so = t[START_OFFSET], ec = t[END_CONTAINER], eo = t[END_OFFSET]; + var sc = t[START_CONTAINER], so = t[START_OFFSET], ec = t[END_CONTAINER], eo = t[END_OFFSET], + rsc = r.startContainer, rso = r.startOffset, rec = r.endContainer, reo = r.endOffset; // Check START_TO_START if (h === 0) - return _compareBoundaryPoints(sc, so, sc, so); - + return _compareBoundaryPoints(sc, so, rsc, rso); + // Check START_TO_END if (h === 1) - return _compareBoundaryPoints(sc, so, ec, eo); - + return _compareBoundaryPoints(ec, eo, rsc, rso); + // Check END_TO_END if (h === 2) - return _compareBoundaryPoints(ec, eo, ec, eo); - + return _compareBoundaryPoints(ec, eo, rec, reo); + // Check END_TO_START - if (h === 3) - return _compareBoundaryPoints(ec, eo, sc, so); + if (h === 3) + return _compareBoundaryPoints(sc, so, rec, reo); }; function deleteContents() { @@ -214,7 +215,7 @@ function _compareBoundaryPoints(containerA, offsetA, containerB, offsetB) { var c, offsetC, n, cmnRoot, childA, childB; - + // In the first case the boundary-points have the same container. A is before B // if its offset is less than the offset of B, A is equal to B if its offset is // equal to the offset of B, and A is after B if its offset is greater than the @@ -500,7 +501,7 @@ frag.appendChild(n); startIdx = nodeIndex(startAncestor); - ++startIdx; // Because we already traversed it.... + ++startIdx; // Because we already traversed it cnt = t[END_OFFSET] - startIdx; n = startAncestor.nextSibling; diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/RangeUtils.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/RangeUtils.js index 6f96886da8..bbe384cad7 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/RangeUtils.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/RangeUtils.js @@ -93,7 +93,7 @@ // If index based end position then resolve it if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) - endContainer = endContainer.childNodes[Math.min(startOffset == endOffset ? endOffset : endOffset - 1, endContainer.childNodes.length - 1)]; + endContainer = endContainer.childNodes[Math.min(endOffset - 1, endContainer.childNodes.length - 1)]; // Find common ancestor and end points ancestor = dom.findCommonAncestor(startContainer, endContainer); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Schema.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Schema.js deleted file mode 100644 index 4148d7e3c5..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Schema.js +++ /dev/null @@ -1,185 +0,0 @@ -/** - * Schema.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var transitional = {}; - - /** - * Unpacks the specified lookup and string data it will also parse it into an object - * map with sub object for it's children. This will later also include the attributes. - */ - function unpack(lookup, data) { - var key; - - function replace(value) { - return value.replace(/[A-Z]+/g, function(key) { - return replace(lookup[key]); - }); - }; - - // Unpack lookup - for (key in lookup) { - if (lookup.hasOwnProperty(key)) - lookup[key] = replace(lookup[key]); - } - - // Unpack and parse data into object map - replace(data).replace(/#/g, '#text').replace(/(\w+)\[([^\]]+)\]/g, function(str, name, children) { - var i, map = {}; - - children = children.split(/\|/); - - for (i = children.length - 1; i >= 0; i--) - map[children[i]] = 1; - - transitional[name] = map; - }); - }; - - // This is the XHTML 1.0 transitional elements with it's children packed to reduce it's size - // we will later include the attributes here and use it as a default for valid elements but it - // requires us to rewrite the serializer engine - unpack({ - Z : '#|H|K|N|O|P', - Y : '#|X|form|R|Q', - X : 'p|T|div|U|W|isindex|fieldset|table', - W : 'pre|hr|blockquote|address|center|noframes', - U : 'ul|ol|dl|menu|dir', - ZC : '#|p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q', - T : 'h1|h2|h3|h4|h5|h6', - ZB : '#|X|S|Q', - S : 'R|P', - ZA : '#|a|G|J|M|O|P', - R : '#|a|H|K|N|O', - Q : 'noscript|P', - P : 'ins|del|script', - O : 'input|select|textarea|label|button', - N : 'M|L', - M : 'em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym', - L : 'sub|sup', - K : 'J|I', - J : 'tt|i|b|u|s|strike', - I : 'big|small|font|basefont', - H : 'G|F', - G : 'br|span|bdo', - F : 'object|applet|img|map|iframe' - }, 'script[]' + - 'style[]' + - 'object[#|param|X|form|a|H|K|N|O|Q]' + - 'param[]' + - 'p[S]' + - 'a[Z]' + - 'br[]' + - 'span[S]' + - 'bdo[S]' + - 'applet[#|param|X|form|a|H|K|N|O|Q]' + - 'h1[S]' + - 'img[]' + - 'map[X|form|Q|area]' + - 'h2[S]' + - 'iframe[#|X|form|a|H|K|N|O|Q]' + - 'h3[S]' + - 'tt[S]' + - 'i[S]' + - 'b[S]' + - 'u[S]' + - 's[S]' + - 'strike[S]' + - 'big[S]' + - 'small[S]' + - 'font[S]' + - 'basefont[]' + - 'em[S]' + - 'strong[S]' + - 'dfn[S]' + - 'code[S]' + - 'q[S]' + - 'samp[S]' + - 'kbd[S]' + - 'var[S]' + - 'cite[S]' + - 'abbr[S]' + - 'acronym[S]' + - 'sub[S]' + - 'sup[S]' + - 'input[]' + - 'select[optgroup|option]' + - 'optgroup[option]' + - 'option[]' + - 'textarea[]' + - 'label[S]' + - 'button[#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]' + - 'h4[S]' + - 'ins[#|X|form|a|H|K|N|O|Q]' + - 'h5[S]' + - 'del[#|X|form|a|H|K|N|O|Q]' + - 'h6[S]' + - 'div[#|X|form|a|H|K|N|O|Q]' + - 'ul[li]' + - 'li[#|X|form|a|H|K|N|O|Q]' + - 'ol[li]' + - 'dl[dt|dd]' + - 'dt[S]' + - 'dd[#|X|form|a|H|K|N|O|Q]' + - 'menu[li]' + - 'dir[li]' + - 'pre[ZA]' + - 'hr[]' + - 'blockquote[#|X|form|a|H|K|N|O|Q]' + - 'address[S|p]' + - 'center[#|X|form|a|H|K|N|O|Q]' + - 'noframes[#|X|form|a|H|K|N|O|Q]' + - 'isindex[]' + - 'fieldset[#|legend|X|form|a|H|K|N|O|Q]' + - 'legend[S]' + - 'table[caption|col|colgroup|thead|tfoot|tbody|tr]' + - 'caption[S]' + - 'col[]' + - 'colgroup[col]' + - 'thead[tr]' + - 'tr[th|td]' + - 'th[#|X|form|a|H|K|N|O|Q]' + - 'form[#|X|a|H|K|N|O|Q]' + - 'noscript[#|X|form|a|H|K|N|O|Q]' + - 'td[#|X|form|a|H|K|N|O|Q]' + - 'tfoot[tr]' + - 'tbody[tr]' + - 'area[]' + - 'base[]' + - 'body[#|X|form|a|H|K|N|O|Q]' - ); - - /** - * Schema validator class. - * - * @class tinymce.dom.Schema - * @example - * if (tinymce.activeEditor.schema.isValid('p', 'span')) - * alert('span is valid child of p.'); - */ - tinymce.dom.Schema = function() { - var t = this, elements = transitional; - - /** - * Returns true/false if the specified element and optionally it's child is valid or not - * according to the XHTML transitional DTD. - * - * @method isValid - * @param {String} name Element name to check for. - * @param {String} child_name Element child name to check for. - * @return {boolean} true/false if the element is valid or not. - */ - t.isValid = function(name, child_name) { - var element = elements[name]; - - return !!(element && (!child_name || element[child_name])); - }; - }; -})(); \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/ScriptLoader.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/ScriptLoader.js index a2a8921e4d..b79bab1375 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/ScriptLoader.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/ScriptLoader.js @@ -9,6 +9,30 @@ */ (function(tinymce) { + /** + * This class handles asynchronous/synchronous loading of JavaScript files it will execute callbacks when various items gets loaded. This class is useful to load external JavaScript files. + * + * @class tinymce.dom.ScriptLoader + * @example + * // Load a script from a specific URL using the global script loader + * tinymce.ScriptLoader.load('somescript.js'); + * + * // Load a script using a unique instance of the script loader + * var scriptLoader = new tinymce.dom.ScriptLoader(); + * + * scriptLoader.load('somescript.js'); + * + * // Load multiple scripts + * var scriptLoader = new tinymce.dom.ScriptLoader(); + * + * scriptLoader.add('somescript1.js'); + * scriptLoader.add('somescript2.js'); + * scriptLoader.add('somescript3.js'); + * + * scriptLoader.loadQueue(function() { + * alert('All scripts are now loaded.'); + * }); + */ tinymce.dom.ScriptLoader = function(settings) { var QUEUED = 0, LOADING = 1, @@ -40,6 +64,17 @@ callback(); }; + + function error() { + // Report the error so it's easier for people to spot loading errors + if (typeof(console) !== "undefined" && console.log) + console.log("Failed to load: " + url); + + // We can't mark it as done if there is a load error since + // A) We don't want to produce 404 errors on the server and + // B) the onerror event won't fire on all browsers. + // done(); + }; id = dom.uniqueId(); @@ -49,7 +84,7 @@ // If script is from same domain and we // use IE 6 then use XHR since it's more reliable - if (uri.host == loc.hostname && uri.port == loc.port && (uri.protocol + ':') == loc.protocol) { + if (uri.host == loc.hostname && uri.port == loc.port && (uri.protocol + ':') == loc.protocol && uri.protocol.toLowerCase() != 'file') { tinymce.util.XHR.send({ url : tinymce._addVer(uri.getURI()), success : function(content) { @@ -64,7 +99,9 @@ dom.remove(script); done(); - } + }, + + error : error }); return; @@ -83,15 +120,21 @@ if (!tinymce.isIE) elm.onload = done; - elm.onreadystatechange = function() { - var state = elm.readyState; + // Add onerror event will get fired on some browsers but not all of them + elm.onerror = error; - // Loaded state is passed on IE 6 however there - // are known issues with this method but we can't use - // XHR in a cross domain loading - if (state == 'complete' || state == 'loaded') - done(); - }; + // Opera 9.60 doesn't seem to fire the onreadystate event at correctly + if (!tinymce.isOpera) { + elm.onreadystatechange = function() { + var state = elm.readyState; + + // Loaded state is passed on IE 6 however there + // are known issues with this method but we can't use + // XHR in a cross domain loading + if (state == 'complete' || state == 'loaded') + done(); + }; + } // Most browsers support this feature so we report errors // for those at least to help users track their missing plugins etc diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Selection.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Selection.js index 235a45e3d1..acbe0b7daa 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Selection.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Selection.js @@ -1,863 +1,1090 @@ -/** - * Selection.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function(tinymce) { - function trimNl(s) { - return s.replace(/[\n\r]+/g, ''); - }; - - // Shorten names - var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each; - - /** - * This class handles text and control selection it's an crossbrowser utility class. - * Consult the TinyMCE Wiki API for more details and examples on how to use this class. - * @class tinymce.dom.Selection - */ - tinymce.create('tinymce.dom.Selection', { - /** - * Constructs a new selection instance. - * - * @constructor - * @method Selection - * @param {tinymce.dom.DOMUtils} dom DOMUtils object reference. - * @param {Window} win Window to bind the selection object to. - * @param {tinymce.dom.Serializer} serializer DOM serialization class to use for getContent. - */ - Selection : function(dom, win, serializer) { - var t = this; - - t.dom = dom; - t.win = win; - t.serializer = serializer; - - // Add events - each([ - 'onBeforeSetContent', - 'onBeforeGetContent', - 'onSetContent', - 'onGetContent' - ], function(e) { - t[e] = new tinymce.util.Dispatcher(t); - }); - - // No W3C Range support - if (!t.win.getSelection) - t.tridentSel = new tinymce.dom.TridentSelection(t); - - if (tinymce.isIE && dom.boxModel) - this._fixIESelection(); - - // Prevent leaks - tinymce.addUnload(t.destroy, t); - }, - - /** - * Returns the selected contents using the DOM serializer passed in to this class. - * - * @method getContent - * @param {Object} s Optional settings class with for example output format text or html. - * @return {String} Selected contents in for example HTML format. - */ - getContent : function(s) { - var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n; - - s = s || {}; - wb = wa = ''; - s.get = true; - s.format = s.format || 'html'; - t.onBeforeGetContent.dispatch(t, s); - - if (s.format == 'text') - return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : '')); - - if (r.cloneContents) { - n = r.cloneContents(); - - if (n) - e.appendChild(n); - } else if (is(r.item) || is(r.htmlText)) - e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText; - else - e.innerHTML = r.toString(); - - // Keep whitespace before and after - if (/^\s/.test(e.innerHTML)) - wb = ' '; - - if (/\s+$/.test(e.innerHTML)) - wa = ' '; - - s.getInner = true; - - s.content = t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa; - t.onGetContent.dispatch(t, s); - - return s.content; - }, - - /** - * Sets the current selection to the specified content. If any contents is selected it will be replaced - * with the contents passed in to this function. If there is no selection the contents will be inserted - * where the caret is placed in the editor/page. - * - * @method setContent - * @param {String} h HTML contents to set could also be other formats depending on settings. - * @param {Object} s Optional settings object with for example data format. - */ - setContent : function(h, s) { - var t = this, r = t.getRng(), c, d = t.win.document; - - s = s || {format : 'html'}; - s.set = true; - h = s.content = t.dom.processHTML(h); - - // Dispatch before set content event - t.onBeforeSetContent.dispatch(t, s); - h = s.content; - - if (r.insertNode) { - // Make caret marker since insertNode places the caret in the beginning of text after insert - h += '_'; - - // Delete and insert new node - - if (r.startContainer == d && r.endContainer == d) { - // WebKit will fail if the body is empty since the range is then invalid and it can't insert contents - d.body.innerHTML = h; - } else { - r.deleteContents(); - if (d.body.childNodes.length == 0) { - d.body.innerHTML = h; - } else { - // createContextualFragment doesn't exists in IE 9 DOMRanges - if (r.createContextualFragment) { - r.insertNode(r.createContextualFragment(h)); - } else { - // Fake createContextualFragment call in IE 9 - var frag = d.createDocumentFragment(), temp = d.createElement('div'); - - frag.appendChild(temp); - temp.outerHTML = h; - - r.insertNode(frag); - } - } - } - - // Move to caret marker - c = t.dom.get('__caret'); - // Make sure we wrap it compleatly, Opera fails with a simple select call - r = d.createRange(); - r.setStartBefore(c); - r.setEndBefore(c); - t.setRng(r); - - // Remove the caret position - t.dom.remove('__caret'); - } else { - if (r.item) { - // Delete content and get caret text selection - d.execCommand('Delete', false, null); - r = t.getRng(); - } - - r.pasteHTML(h); - } - - // Dispatch set content event - t.onSetContent.dispatch(t, s); - }, - - /** - * Returns the start element of a selection range. If the start is in a text - * node the parent element will be returned. - * - * @method getStart - * @return {Element} Start element of selection range. - */ - getStart : function() { - var rng = this.getRng(), startElement, parentElement, checkRng, node; - - if (rng.duplicate || rng.item) { - // Control selection, return first item - if (rng.item) - return rng.item(0); - - // Get start element - checkRng = rng.duplicate(); - checkRng.collapse(1); - startElement = checkRng.parentElement(); - - // Check if range parent is inside the start element, then return the inner parent element - // This will fix issues when a single element is selected, IE would otherwise return the wrong start element - parentElement = node = rng.parentElement(); - while (node = node.parentNode) { - if (node == startElement) { - startElement = parentElement; - break; - } - } - - // If start element is body element try to move to the first child if it exists - if (startElement && startElement.nodeName == 'BODY') - return startElement.firstChild || startElement; - - return startElement; - } else { - startElement = rng.startContainer; - - if (startElement.nodeType == 1 && startElement.hasChildNodes()) - startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)]; - - if (startElement && startElement.nodeType == 3) - return startElement.parentNode; - - return startElement; - } - }, - - /** - * Returns the end element of a selection range. If the end is in a text - * node the parent element will be returned. - * - * @method getEnd - * @return {Element} End element of selection range. - */ - getEnd : function() { - var t = this, r = t.getRng(), e, eo; - - if (r.duplicate || r.item) { - if (r.item) - return r.item(0); - - r = r.duplicate(); - r.collapse(0); - e = r.parentElement(); - - if (e && e.nodeName == 'BODY') - return e.lastChild || e; - - return e; - } else { - e = r.endContainer; - eo = r.endOffset; - - if (e.nodeType == 1 && e.hasChildNodes()) - e = e.childNodes[eo > 0 ? eo - 1 : eo]; - - if (e && e.nodeType == 3) - return e.parentNode; - - return e; - } - }, - - /** - * Returns a bookmark location for the current selection. This bookmark object - * can then be used to restore the selection after some content modification to the document. - * - * @method getBookmark - * @param {Number} type Optional state if the bookmark should be simple or not. Default is complex. - * @param {Boolean} normalized Optional state that enables you to get a position that it would be after normalization. - * @return {Object} Bookmark object, use moveToBookmark with this object to restore the selection. - */ - getBookmark : function(type, normalized) { - var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles; - - function findIndex(name, element) { - var index = 0; - - each(dom.select(name), function(node, i) { - if (node == element) - index = i; - }); - - return index; - }; - - if (type == 2) { - function getLocation() { - var rng = t.getRng(true), root = dom.getRoot(), bookmark = {}; - - function getPoint(rng, start) { - var container = rng[start ? 'startContainer' : 'endContainer'], - offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0; - - if (container.nodeType == 3) { - if (normalized) { - for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling) - offset += node.nodeValue.length; - } - - point.push(offset); - } else { - childNodes = container.childNodes; - - if (offset >= childNodes.length && childNodes.length) { - after = 1; - offset = Math.max(0, childNodes.length - 1); - } - - point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after); - } - - for (; container && container != root; container = container.parentNode) - point.push(t.dom.nodeIndex(container, normalized)); - - return point; - }; - - bookmark.start = getPoint(rng, true); - - if (!t.isCollapsed()) - bookmark.end = getPoint(rng); - - return bookmark; - }; - - return getLocation(); - } - - // Handle simple range - if (type) - return {rng : t.getRng()}; - - rng = t.getRng(); - id = dom.uniqueId(); - collapsed = tinyMCE.activeEditor.selection.isCollapsed(); - styles = 'overflow:hidden;line-height:0px'; - - // Explorer method - if (rng.duplicate || rng.item) { - // Text selection - if (!rng.item) { - rng2 = rng.duplicate(); - - // Insert start marker - rng.collapse(); - rng.pasteHTML('' + chr + ''); - - // Insert end marker - if (!collapsed) { - rng2.collapse(false); - rng2.pasteHTML('' + chr + ''); - } - } else { - // Control selection - element = rng.item(0); - name = element.nodeName; - - return {name : name, index : findIndex(name, element)}; - } - } else { - element = t.getNode(); - name = element.nodeName; - if (name == 'IMG') - return {name : name, index : findIndex(name, element)}; - - // W3C method - rng2 = rng.cloneRange(); - - // Insert end marker - if (!collapsed) { - rng2.collapse(false); - rng2.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_end', style : styles}, chr)); - } - - rng.collapse(true); - rng.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_start', style : styles}, chr)); - } - - t.moveToBookmark({id : id, keep : 1}); - - return {id : id}; - }, - - /** - * Restores the selection to the specified bookmark. - * - * @method moveToBookmark - * @param {Object} bookmark Bookmark to restore selection from. - * @return {Boolean} true/false if it was successful or not. - */ - moveToBookmark : function(bookmark) { - var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset; - - // Clear selection cache - if (t.tridentSel) - t.tridentSel.destroy(); - - if (bookmark) { - if (bookmark.start) { - rng = dom.createRng(); - root = dom.getRoot(); - - function setEndPoint(start) { - var point = bookmark[start ? 'start' : 'end'], i, node, offset, children; - - if (point) { - // Find container node - for (node = root, i = point.length - 1; i >= 1; i--) { - children = node.childNodes; - - if (children.length) - node = children[point[i]]; - } - - // Set offset within container node - if (start) - rng.setStart(node, point[0]); - else - rng.setEnd(node, point[0]); - } - }; - - setEndPoint(true); - setEndPoint(); - - t.setRng(rng); - } else if (bookmark.id) { - function restoreEndPoint(suffix) { - var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep; - - if (marker) { - node = marker.parentNode; - - if (suffix == 'start') { - if (!keep) { - idx = dom.nodeIndex(marker); - } else { - node = marker.firstChild; - idx = 1; - } - - startContainer = endContainer = node; - startOffset = endOffset = idx; - } else { - if (!keep) { - idx = dom.nodeIndex(marker); - } else { - node = marker.firstChild; - idx = 1; - } - - endContainer = node; - endOffset = idx; - } - - if (!keep) { - prev = marker.previousSibling; - next = marker.nextSibling; - - // Remove all marker text nodes - each(tinymce.grep(marker.childNodes), function(node) { - if (node.nodeType == 3) - node.nodeValue = node.nodeValue.replace(/\uFEFF/g, ''); - }); - - // Remove marker but keep children if for example contents where inserted into the marker - // Also remove duplicated instances of the marker for example by a split operation or by WebKit auto split on paste feature - while (marker = dom.get(bookmark.id + '_' + suffix)) - dom.remove(marker, 1); - - // If siblings are text nodes then merge them unless it's Opera since it some how removes the node - // and we are sniffing since adding a lot of detection code for a browser with 3% of the market isn't worth the effort. Sorry, Opera but it's just a fact - if (prev && next && prev.nodeType == next.nodeType && prev.nodeType == 3 && !tinymce.isOpera) { - idx = prev.nodeValue.length; - prev.appendData(next.nodeValue); - dom.remove(next); - - if (suffix == 'start') { - startContainer = endContainer = prev; - startOffset = endOffset = idx; - } else { - endContainer = prev; - endOffset = idx; - } - } - } - } - }; - - function addBogus(node) { - // Adds a bogus BR element for empty block elements - // on non IE browsers just to have a place to put the caret - if (!isIE && dom.isBlock(node) && !node.innerHTML) - node.innerHTML = '
    '; - - return node; - }; - - // Restore start/end points - restoreEndPoint('start'); - restoreEndPoint('end'); - - if (startContainer) { - rng = dom.createRng(); - rng.setStart(addBogus(startContainer), startOffset); - rng.setEnd(addBogus(endContainer), endOffset); - t.setRng(rng); - } - } else if (bookmark.name) { - t.select(dom.select(bookmark.name)[bookmark.index]); - } else if (bookmark.rng) - t.setRng(bookmark.rng); - } - }, - - /** - * Selects the specified element. This will place the start and end of the selection range around the element. - * - * @method select - * @param {Element} node HMTL DOM element to select. - * @param {Boolean} content Optional bool state if the contents should be selected or not on non IE browser. - * @return {Element} Selected element the same element as the one that got passed in. - */ - select : function(node, content) { - var t = this, dom = t.dom, rng = dom.createRng(), idx; - - idx = dom.nodeIndex(node); - rng.setStart(node.parentNode, idx); - rng.setEnd(node.parentNode, idx + 1); - - // Find first/last text node or BR element - if (content) { - function setPoint(node, start) { - var walker = new tinymce.dom.TreeWalker(node, node); - - do { - // Text node - if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { - if (start) - rng.setStart(node, 0); - else - rng.setEnd(node, node.nodeValue.length); - - return; - } - - // BR element - if (node.nodeName == 'BR') { - if (start) - rng.setStartBefore(node); - else - rng.setEndBefore(node); - - return; - } - } while (node = (start ? walker.next() : walker.prev())); - }; - - setPoint(node, 1); - setPoint(node); - } - - t.setRng(rng); - - return node; - }, - - /** - * Returns true/false if the selection range is collapsed or not. Collapsed means if it's a caret or a larger selection. - * - * @method isCollapsed - * @return {Boolean} true/false state if the selection range is collapsed or not. Collapsed means if it's a caret or a larger selection. - */ - isCollapsed : function() { - var t = this, r = t.getRng(), s = t.getSel(); - - if (!r || r.item) - return false; - - if (r.compareEndPoints) - return r.compareEndPoints('StartToEnd', r) === 0; - - return !s || r.collapsed; - }, - - /** - * Collapse the selection to start or end of range. - * - * @method collapse - * @param {Boolean} b Optional boolean state if to collapse to end or not. Defaults to start. - */ - collapse : function(b) { - var t = this, r = t.getRng(), n; - - // Control range on IE - if (r.item) { - n = r.item(0); - r = this.win.document.body.createTextRange(); - r.moveToElementText(n); - } - - r.collapse(!!b); - t.setRng(r); - }, - - /** - * Returns the browsers internal selection object. - * - * @method getSel - * @return {Selection} Internal browser selection object. - */ - getSel : function() { - var t = this, w = this.win; - - return w.getSelection ? w.getSelection() : w.document.selection; - }, - - /** - * Returns the browsers internal range object. - * - * @method getRng - * @param {Boolean} w3c Forces a compatible W3C range on IE. - * @return {Range} Internal browser range object. - */ - getRng : function(w3c) { - var t = this, s, r, elm, doc = t.win.document; - - // Found tridentSel object then we need to use that one - if (w3c && t.tridentSel) - return t.tridentSel.getRangeAt(0); - - try { - if (s = t.getSel()) - r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : doc.createRange()); - } catch (ex) { - // IE throws unspecified error here if TinyMCE is placed in a frame/iframe - } - - // We have W3C ranges and it's IE then fake control selection since IE9 doesn't handle that correctly yet - if (tinymce.isIE && r.setStart && doc.selection.createRange().item) { - elm = doc.selection.createRange().item(0); - r = doc.createRange(); - r.setStartBefore(elm); - r.setEndAfter(elm); - } - - // No range found then create an empty one - // This can occur when the editor is placed in a hidden container element on Gecko - // Or on IE when there was an exception - if (!r) - r = doc.createRange ? doc.createRange() : doc.body.createTextRange(); - - if (t.selectedRange && t.explicitRange) { - if (r.compareBoundaryPoints(r.START_TO_START, t.selectedRange) === 0 && r.compareBoundaryPoints(r.END_TO_END, t.selectedRange) === 0) { - // Safari, Opera and Chrome only ever select text which causes the range to change. - // This lets us use the originally set range if the selection hasn't been changed by the user. - r = t.explicitRange; - } else { - t.selectedRange = null; - t.explicitRange = null; - } - } - return r; - }, - - /** - * Changes the selection to the specified DOM range. - * - * @method setRng - * @param {Range} r Range to select. - */ - setRng : function(r) { - var s, t = this; - - if (!t.tridentSel) { - s = t.getSel(); - - if (s) { - t.explicitRange = r; - s.removeAllRanges(); - s.addRange(r); - t.selectedRange = s.getRangeAt(0); - } - } else { - // Is W3C Range - if (r.cloneRange) { - t.tridentSel.addRange(r); - return; - } - - // Is IE specific range - try { - r.select(); - } catch (ex) { - // Needed for some odd IE bug #1843306 - } - } - }, - - /** - * Sets the current selection to the specified DOM element. - * - * @method setNode - * @param {Element} n Element to set as the contents of the selection. - * @return {Element} Returns the element that got passed in. - */ - setNode : function(n) { - var t = this; - - t.setContent(t.dom.getOuterHTML(n)); - - return n; - }, - - /** - * Returns the currently selected element or the common ancestor element for both start and end of the selection. - * - * @method getNode - * @return {Element} Currently selected element or common ancestor element. - */ - getNode : function() { - var t = this, rng = t.getRng(), sel = t.getSel(), elm; - - if (rng.setStart) { - // Range maybe lost after the editor is made visible again - if (!rng) - return t.dom.getRoot(); - - elm = rng.commonAncestorContainer; - - // Handle selection a image or other control like element such as anchors - if (!rng.collapsed) { - if (rng.startContainer == rng.endContainer) { - if (rng.startOffset - rng.endOffset < 2) { - if (rng.startContainer.hasChildNodes()) - elm = rng.startContainer.childNodes[rng.startOffset]; - } - } - - // If the anchor node is a element instead of a text node then return this element - if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) - return sel.anchorNode.childNodes[sel.anchorOffset]; - } - - if (elm && elm.nodeType == 3) - return elm.parentNode; - - return elm; - } - - return rng.item ? rng.item(0) : rng.parentElement(); - }, - - getSelectedBlocks : function(st, en) { - var t = this, dom = t.dom, sb, eb, n, bl = []; - - sb = dom.getParent(st || t.getStart(), dom.isBlock); - eb = dom.getParent(en || t.getEnd(), dom.isBlock); - - if (sb) - bl.push(sb); - - if (sb && eb && sb != eb) { - n = sb; - - while ((n = n.nextSibling) && n != eb) { - if (dom.isBlock(n)) - bl.push(n); - } - } - - if (eb && sb != eb) - bl.push(eb); - - return bl; - }, - - destroy : function(s) { - var t = this; - - t.win = null; - - if (t.tridentSel) - t.tridentSel.destroy(); - - // Manual destroy then remove unload handler - if (!s) - tinymce.removeUnload(t.destroy); - }, - - // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode - _fixIESelection : function() { - var dom = this.dom, doc = dom.doc, body = doc.body, started, startRng; - - // Make HTML element unselectable since we are going to handle selection by hand - doc.documentElement.unselectable = true; - - // Return range from point or null if it failed - function rngFromPoint(x, y) { - var rng = body.createTextRange(); - - try { - rng.moveToPoint(x, y); - } catch (ex) { - // IE sometimes throws and exception, so lets just ignore it - rng = null; - } - - return rng; - }; - - // Fires while the selection is changing - function selectionChange(e) { - var pointRng; - - // Check if the button is down or not - if (e.button) { - // Create range from mouse position - pointRng = rngFromPoint(e.x, e.y); - - if (pointRng) { - // Check if pointRange is before/after selection then change the endPoint - if (pointRng.compareEndPoints('StartToStart', startRng) > 0) - pointRng.setEndPoint('StartToStart', startRng); - else - pointRng.setEndPoint('EndToEnd', startRng); - - pointRng.select(); - } - } else - endSelection(); - } - - // Removes listeners - function endSelection() { - dom.unbind(doc, 'mouseup', endSelection); - dom.unbind(doc, 'mousemove', selectionChange); - started = 0; - }; - - // Detect when user selects outside BODY - dom.bind(doc, 'mousedown', function(e) { - if (e.target.nodeName === 'HTML') { - if (started) - endSelection(); - - started = 1; - - // Setup start position - startRng = rngFromPoint(e.x, e.y); - if (startRng) { - // Listen for selection change events - dom.bind(doc, 'mouseup', endSelection); - dom.bind(doc, 'mousemove', selectionChange); - - dom.win.focus(); - startRng.select(); - } - } - }); - } - }); -})(tinymce); +/** + * Selection.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + function trimNl(s) { + return s.replace(/[\n\r]+/g, ''); + }; + + // Shorten names + var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each; + + /** + * This class handles text and control selection it's an crossbrowser utility class. + * Consult the TinyMCE Wiki API for more details and examples on how to use this class. + * + * @class tinymce.dom.Selection + * @example + * // Getting the currently selected node for the active editor + * alert(tinymce.activeEditor.selection.getNode().nodeName); + */ + tinymce.create('tinymce.dom.Selection', { + /** + * Constructs a new selection instance. + * + * @constructor + * @method Selection + * @param {tinymce.dom.DOMUtils} dom DOMUtils object reference. + * @param {Window} win Window to bind the selection object to. + * @param {tinymce.dom.Serializer} serializer DOM serialization class to use for getContent. + */ + Selection : function(dom, win, serializer) { + var t = this; + + t.dom = dom; + t.win = win; + t.serializer = serializer; + + // Add events + each([ + /** + * This event gets executed before contents is extracted from the selection. + * + * @event onBeforeSetContent + * @param {tinymce.dom.Selection} selection Selection object that fired the event. + * @param {Object} args Contains things like the contents that will be returned. + */ + 'onBeforeSetContent', + + /** + * This event gets executed before contents is inserted into selection. + * + * @event onBeforeGetContent + * @param {tinymce.dom.Selection} selection Selection object that fired the event. + * @param {Object} args Contains things like the contents that will be inserted. + */ + 'onBeforeGetContent', + + /** + * This event gets executed when contents is inserted into selection. + * + * @event onSetContent + * @param {tinymce.dom.Selection} selection Selection object that fired the event. + * @param {Object} args Contains things like the contents that will be inserted. + */ + 'onSetContent', + + /** + * This event gets executed when contents is extracted from the selection. + * + * @event onGetContent + * @param {tinymce.dom.Selection} selection Selection object that fired the event. + * @param {Object} args Contains things like the contents that will be returned. + */ + 'onGetContent' + ], function(e) { + t[e] = new tinymce.util.Dispatcher(t); + }); + + // No W3C Range support + if (!t.win.getSelection) + t.tridentSel = new tinymce.dom.TridentSelection(t); + + if (tinymce.isIE && dom.boxModel) + this._fixIESelection(); + + // Prevent leaks + tinymce.addUnload(t.destroy, t); + }, + + /** + * Move the selection cursor range to the specified node and offset. + * @param node Node to put the cursor in. + * @param offset Offset from the start of the node to put the cursor at. + */ + setCursorLocation: function(node, offset) { + var t = this; var r = t.dom.createRng(); + r.setStart(node, offset); + r.setEnd(node, offset); + t.setRng(r); + t.collapse(false); + }, + /** + * Returns the selected contents using the DOM serializer passed in to this class. + * + * @method getContent + * @param {Object} s Optional settings class with for example output format text or html. + * @return {String} Selected contents in for example HTML format. + * @example + * // Alerts the currently selected contents + * alert(tinyMCE.activeEditor.selection.getContent()); + * + * // Alerts the currently selected contents as plain text + * alert(tinyMCE.activeEditor.selection.getContent({format : 'text'})); + */ + getContent : function(s) { + var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n; + + s = s || {}; + wb = wa = ''; + s.get = true; + s.format = s.format || 'html'; + s.forced_root_block = ''; + t.onBeforeGetContent.dispatch(t, s); + + if (s.format == 'text') + return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : '')); + + if (r.cloneContents) { + n = r.cloneContents(); + + if (n) + e.appendChild(n); + } else if (is(r.item) || is(r.htmlText)) + e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText; + else + e.innerHTML = r.toString(); + + // Keep whitespace before and after + if (/^\s/.test(e.innerHTML)) + wb = ' '; + + if (/\s+$/.test(e.innerHTML)) + wa = ' '; + + s.getInner = true; + + s.content = t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa; + t.onGetContent.dispatch(t, s); + + return s.content; + }, + + /** + * Sets the current selection to the specified content. If any contents is selected it will be replaced + * with the contents passed in to this function. If there is no selection the contents will be inserted + * where the caret is placed in the editor/page. + * + * @method setContent + * @param {String} content HTML contents to set could also be other formats depending on settings. + * @param {Object} args Optional settings object with for example data format. + * @example + * // Inserts some HTML contents at the current selection + * tinyMCE.activeEditor.selection.setContent('Some contents'); + */ + setContent : function(content, args) { + var self = this, rng = self.getRng(), caretNode, doc = self.win.document, frag, temp; + + args = args || {format : 'html'}; + args.set = true; + content = args.content = content; + + // Dispatch before set content event + if (!args.no_events) + self.onBeforeSetContent.dispatch(self, args); + + content = args.content; + + if (rng.insertNode) { + // Make caret marker since insertNode places the caret in the beginning of text after insert + content += '_'; + + // Delete and insert new node + if (rng.startContainer == doc && rng.endContainer == doc) { + // WebKit will fail if the body is empty since the range is then invalid and it can't insert contents + doc.body.innerHTML = content; + } else { + rng.deleteContents(); + + if (doc.body.childNodes.length == 0) { + doc.body.innerHTML = content; + } else { + // createContextualFragment doesn't exists in IE 9 DOMRanges + if (rng.createContextualFragment) { + rng.insertNode(rng.createContextualFragment(content)); + } else { + // Fake createContextualFragment call in IE 9 + frag = doc.createDocumentFragment(); + temp = doc.createElement('div'); + + frag.appendChild(temp); + temp.outerHTML = content; + + rng.insertNode(frag); + } + } + } + + // Move to caret marker + caretNode = self.dom.get('__caret'); + + // Make sure we wrap it compleatly, Opera fails with a simple select call + rng = doc.createRange(); + rng.setStartBefore(caretNode); + rng.setEndBefore(caretNode); + self.setRng(rng); + + // Remove the caret position + self.dom.remove('__caret'); + + try { + self.setRng(rng); + } catch (ex) { + // Might fail on Opera for some odd reason + } + } else { + if (rng.item) { + // Delete content and get caret text selection + doc.execCommand('Delete', false, null); + rng = self.getRng(); + } + + rng.pasteHTML(content); + } + + // Dispatch set content event + if (!args.no_events) + self.onSetContent.dispatch(self, args); + }, + + /** + * Returns the start element of a selection range. If the start is in a text + * node the parent element will be returned. + * + * @method getStart + * @return {Element} Start element of selection range. + */ + getStart : function() { + var rng = this.getRng(), startElement, parentElement, checkRng, node; + + if (rng.duplicate || rng.item) { + // Control selection, return first item + if (rng.item) + return rng.item(0); + + // Get start element + checkRng = rng.duplicate(); + checkRng.collapse(1); + startElement = checkRng.parentElement(); + + // Check if range parent is inside the start element, then return the inner parent element + // This will fix issues when a single element is selected, IE would otherwise return the wrong start element + parentElement = node = rng.parentElement(); + while (node = node.parentNode) { + if (node == startElement) { + startElement = parentElement; + break; + } + } + + return startElement; + } else { + startElement = rng.startContainer; + + if (startElement.nodeType == 1 && startElement.hasChildNodes()) + startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)]; + + if (startElement && startElement.nodeType == 3) + return startElement.parentNode; + + return startElement; + } + }, + + /** + * Returns the end element of a selection range. If the end is in a text + * node the parent element will be returned. + * + * @method getEnd + * @return {Element} End element of selection range. + */ + getEnd : function() { + var t = this, r = t.getRng(), e, eo; + + if (r.duplicate || r.item) { + if (r.item) + return r.item(0); + + r = r.duplicate(); + r.collapse(0); + e = r.parentElement(); + + if (e && e.nodeName == 'BODY') + return e.lastChild || e; + + return e; + } else { + e = r.endContainer; + eo = r.endOffset; + + if (e.nodeType == 1 && e.hasChildNodes()) + e = e.childNodes[eo > 0 ? eo - 1 : eo]; + + if (e && e.nodeType == 3) + return e.parentNode; + + return e; + } + }, + + /** + * Returns a bookmark location for the current selection. This bookmark object + * can then be used to restore the selection after some content modification to the document. + * + * @method getBookmark + * @param {Number} type Optional state if the bookmark should be simple or not. Default is complex. + * @param {Boolean} normalized Optional state that enables you to get a position that it would be after normalization. + * @return {Object} Bookmark object, use moveToBookmark with this object to restore the selection. + * @example + * // Stores a bookmark of the current selection + * var bm = tinyMCE.activeEditor.selection.getBookmark(); + * + * tinyMCE.activeEditor.setContent(tinyMCE.activeEditor.getContent() + 'Some new content'); + * + * // Restore the selection bookmark + * tinyMCE.activeEditor.selection.moveToBookmark(bm); + */ + getBookmark : function(type, normalized) { + var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles; + + function findIndex(name, element) { + var index = 0; + + each(dom.select(name), function(node, i) { + if (node == element) + index = i; + }); + + return index; + }; + + if (type == 2) { + function getLocation() { + var rng = t.getRng(true), root = dom.getRoot(), bookmark = {}; + + function getPoint(rng, start) { + var container = rng[start ? 'startContainer' : 'endContainer'], + offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0; + + if (container.nodeType == 3) { + if (normalized) { + for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling) + offset += node.nodeValue.length; + } + + point.push(offset); + } else { + childNodes = container.childNodes; + + if (offset >= childNodes.length && childNodes.length) { + after = 1; + offset = Math.max(0, childNodes.length - 1); + } + + point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after); + } + + for (; container && container != root; container = container.parentNode) + point.push(t.dom.nodeIndex(container, normalized)); + + return point; + }; + + bookmark.start = getPoint(rng, true); + + if (!t.isCollapsed()) + bookmark.end = getPoint(rng); + + return bookmark; + }; + + if (t.tridentSel) + return t.tridentSel.getBookmark(type); + + return getLocation(); + } + + // Handle simple range + if (type) + return {rng : t.getRng()}; + + rng = t.getRng(); + id = dom.uniqueId(); + collapsed = tinyMCE.activeEditor.selection.isCollapsed(); + styles = 'overflow:hidden;line-height:0px'; + + // Explorer method + if (rng.duplicate || rng.item) { + // Text selection + if (!rng.item) { + rng2 = rng.duplicate(); + + try { + // Insert start marker + rng.collapse(); + rng.pasteHTML('' + chr + ''); + + // Insert end marker + if (!collapsed) { + rng2.collapse(false); + + // Detect the empty space after block elements in IE and move the end back one character

    ] becomes

    ]

    + rng.moveToElementText(rng2.parentElement()); + if (rng.compareEndPoints('StartToEnd', rng2) == 0) + rng2.move('character', -1); + + rng2.pasteHTML('' + chr + ''); + } + } catch (ex) { + // IE might throw unspecified error so lets ignore it + return null; + } + } else { + // Control selection + element = rng.item(0); + name = element.nodeName; + + return {name : name, index : findIndex(name, element)}; + } + } else { + element = t.getNode(); + name = element.nodeName; + if (name == 'IMG') + return {name : name, index : findIndex(name, element)}; + + // W3C method + rng2 = rng.cloneRange(); + + // Insert end marker + if (!collapsed) { + rng2.collapse(false); + rng2.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_end', style : styles}, chr)); + } + + rng.collapse(true); + rng.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_start', style : styles}, chr)); + } + + t.moveToBookmark({id : id, keep : 1}); + + return {id : id}; + }, + + /** + * Restores the selection to the specified bookmark. + * + * @method moveToBookmark + * @param {Object} bookmark Bookmark to restore selection from. + * @return {Boolean} true/false if it was successful or not. + * @example + * // Stores a bookmark of the current selection + * var bm = tinyMCE.activeEditor.selection.getBookmark(); + * + * tinyMCE.activeEditor.setContent(tinyMCE.activeEditor.getContent() + 'Some new content'); + * + * // Restore the selection bookmark + * tinyMCE.activeEditor.selection.moveToBookmark(bm); + */ + moveToBookmark : function(bookmark) { + var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset; + + if (bookmark) { + if (bookmark.start) { + rng = dom.createRng(); + root = dom.getRoot(); + + function setEndPoint(start) { + var point = bookmark[start ? 'start' : 'end'], i, node, offset, children; + + if (point) { + offset = point[0]; + + // Find container node + for (node = root, i = point.length - 1; i >= 1; i--) { + children = node.childNodes; + + if (point[i] > children.length - 1) + return; + + node = children[point[i]]; + } + + // Move text offset to best suitable location + if (node.nodeType === 3) + offset = Math.min(point[0], node.nodeValue.length); + + // Move element offset to best suitable location + if (node.nodeType === 1) + offset = Math.min(point[0], node.childNodes.length); + + // Set offset within container node + if (start) + rng.setStart(node, offset); + else + rng.setEnd(node, offset); + } + + return true; + }; + + if (t.tridentSel) + return t.tridentSel.moveToBookmark(bookmark); + + if (setEndPoint(true) && setEndPoint()) { + t.setRng(rng); + } + } else if (bookmark.id) { + function restoreEndPoint(suffix) { + var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep; + + if (marker) { + node = marker.parentNode; + + if (suffix == 'start') { + if (!keep) { + idx = dom.nodeIndex(marker); + } else { + node = marker.firstChild; + idx = 1; + } + + startContainer = endContainer = node; + startOffset = endOffset = idx; + } else { + if (!keep) { + idx = dom.nodeIndex(marker); + } else { + node = marker.firstChild; + idx = 1; + } + + endContainer = node; + endOffset = idx; + } + + if (!keep) { + prev = marker.previousSibling; + next = marker.nextSibling; + + // Remove all marker text nodes + each(tinymce.grep(marker.childNodes), function(node) { + if (node.nodeType == 3) + node.nodeValue = node.nodeValue.replace(/\uFEFF/g, ''); + }); + + // Remove marker but keep children if for example contents where inserted into the marker + // Also remove duplicated instances of the marker for example by a split operation or by WebKit auto split on paste feature + while (marker = dom.get(bookmark.id + '_' + suffix)) + dom.remove(marker, 1); + + // If siblings are text nodes then merge them unless it's Opera since it some how removes the node + // and we are sniffing since adding a lot of detection code for a browser with 3% of the market isn't worth the effort. Sorry, Opera but it's just a fact + if (prev && next && prev.nodeType == next.nodeType && prev.nodeType == 3 && !tinymce.isOpera) { + idx = prev.nodeValue.length; + prev.appendData(next.nodeValue); + dom.remove(next); + + if (suffix == 'start') { + startContainer = endContainer = prev; + startOffset = endOffset = idx; + } else { + endContainer = prev; + endOffset = idx; + } + } + } + } + }; + + function addBogus(node) { + // Adds a bogus BR element for empty block elements or just a space on IE since it renders BR elements incorrectly + if (dom.isBlock(node) && !node.innerHTML) + node.innerHTML = !isIE ? '
    ' : ' '; + + return node; + }; + + // Restore start/end points + restoreEndPoint('start'); + restoreEndPoint('end'); + + if (startContainer) { + rng = dom.createRng(); + rng.setStart(addBogus(startContainer), startOffset); + rng.setEnd(addBogus(endContainer), endOffset); + t.setRng(rng); + } + } else if (bookmark.name) { + t.select(dom.select(bookmark.name)[bookmark.index]); + } else if (bookmark.rng) + t.setRng(bookmark.rng); + } + }, + + /** + * Selects the specified element. This will place the start and end of the selection range around the element. + * + * @method select + * @param {Element} node HMTL DOM element to select. + * @param {Boolean} content Optional bool state if the contents should be selected or not on non IE browser. + * @return {Element} Selected element the same element as the one that got passed in. + * @example + * // Select the first paragraph in the active editor + * tinyMCE.activeEditor.selection.select(tinyMCE.activeEditor.dom.select('p')[0]); + */ + select : function(node, content) { + var t = this, dom = t.dom, rng = dom.createRng(), idx; + + if (node) { + idx = dom.nodeIndex(node); + rng.setStart(node.parentNode, idx); + rng.setEnd(node.parentNode, idx + 1); + + // Find first/last text node or BR element + if (content) { + function setPoint(node, start) { + var walker = new tinymce.dom.TreeWalker(node, node); + + do { + // Text node + if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { + if (start) + rng.setStart(node, 0); + else + rng.setEnd(node, node.nodeValue.length); + + return; + } + + // BR element + if (node.nodeName == 'BR') { + if (start) + rng.setStartBefore(node); + else + rng.setEndBefore(node); + + return; + } + } while (node = (start ? walker.next() : walker.prev())); + }; + + setPoint(node, 1); + setPoint(node); + } + + t.setRng(rng); + } + + return node; + }, + + /** + * Returns true/false if the selection range is collapsed or not. Collapsed means if it's a caret or a larger selection. + * + * @method isCollapsed + * @return {Boolean} true/false state if the selection range is collapsed or not. Collapsed means if it's a caret or a larger selection. + */ + isCollapsed : function() { + var t = this, r = t.getRng(), s = t.getSel(); + + if (!r || r.item) + return false; + + if (r.compareEndPoints) + return r.compareEndPoints('StartToEnd', r) === 0; + + return !s || r.collapsed; + }, + + /** + * Collapse the selection to start or end of range. + * + * @method collapse + * @param {Boolean} to_start Optional boolean state if to collapse to end or not. Defaults to start. + */ + collapse : function(to_start) { + var self = this, rng = self.getRng(), node; + + // Control range on IE + if (rng.item) { + node = rng.item(0); + rng = self.win.document.body.createTextRange(); + rng.moveToElementText(node); + } + + rng.collapse(!!to_start); + self.setRng(rng); + }, + + /** + * Returns the browsers internal selection object. + * + * @method getSel + * @return {Selection} Internal browser selection object. + */ + getSel : function() { + var t = this, w = this.win; + + return w.getSelection ? w.getSelection() : w.document.selection; + }, + + /** + * Returns the browsers internal range object. + * + * @method getRng + * @param {Boolean} w3c Forces a compatible W3C range on IE. + * @return {Range} Internal browser range object. + * @see http://www.quirksmode.org/dom/range_intro.html + * @see http://www.dotvoid.com/2001/03/using-the-range-object-in-mozilla/ + */ + getRng : function(w3c) { + var t = this, s, r, elm, doc = t.win.document; + + // Found tridentSel object then we need to use that one + if (w3c && t.tridentSel) + return t.tridentSel.getRangeAt(0); + + try { + if (s = t.getSel()) + r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : doc.createRange()); + } catch (ex) { + // IE throws unspecified error here if TinyMCE is placed in a frame/iframe + } + + // We have W3C ranges and it's IE then fake control selection since IE9 doesn't handle that correctly yet + if (tinymce.isIE && r && r.setStart && doc.selection.createRange().item) { + elm = doc.selection.createRange().item(0); + r = doc.createRange(); + r.setStartBefore(elm); + r.setEndAfter(elm); + } + + // No range found then create an empty one + // This can occur when the editor is placed in a hidden container element on Gecko + // Or on IE when there was an exception + if (!r) + r = doc.createRange ? doc.createRange() : doc.body.createTextRange(); + + if (t.selectedRange && t.explicitRange) { + if (r.compareBoundaryPoints(r.START_TO_START, t.selectedRange) === 0 && r.compareBoundaryPoints(r.END_TO_END, t.selectedRange) === 0) { + // Safari, Opera and Chrome only ever select text which causes the range to change. + // This lets us use the originally set range if the selection hasn't been changed by the user. + r = t.explicitRange; + } else { + t.selectedRange = null; + t.explicitRange = null; + } + } + + return r; + }, + + /** + * Changes the selection to the specified DOM range. + * + * @method setRng + * @param {Range} r Range to select. + */ + setRng : function(r) { + var s, t = this; + + if (!t.tridentSel) { + s = t.getSel(); + + if (s) { + t.explicitRange = r; + + try { + s.removeAllRanges(); + } catch (ex) { + // IE9 might throw errors here don't know why + } + + s.addRange(r); + t.selectedRange = s.getRangeAt(0); + } + } else { + // Is W3C Range + if (r.cloneRange) { + t.tridentSel.addRange(r); + return; + } + + // Is IE specific range + try { + r.select(); + } catch (ex) { + // Needed for some odd IE bug #1843306 + } + } + }, + + /** + * Sets the current selection to the specified DOM element. + * + * @method setNode + * @param {Element} n Element to set as the contents of the selection. + * @return {Element} Returns the element that got passed in. + * @example + * // Inserts a DOM node at current selection/caret location + * tinyMCE.activeEditor.selection.setNode(tinyMCE.activeEditor.dom.create('img', {src : 'some.gif', title : 'some title'})); + */ + setNode : function(n) { + var t = this; + + t.setContent(t.dom.getOuterHTML(n)); + + return n; + }, + + /** + * Returns the currently selected element or the common ancestor element for both start and end of the selection. + * + * @method getNode + * @return {Element} Currently selected element or common ancestor element. + * @example + * // Alerts the currently selected elements node name + * alert(tinyMCE.activeEditor.selection.getNode().nodeName); + */ + getNode : function() { + var t = this, rng = t.getRng(), sel = t.getSel(), elm, start = rng.startContainer, end = rng.endContainer; + + // Range maybe lost after the editor is made visible again + if (!rng) + return t.dom.getRoot(); + + if (rng.setStart) { + elm = rng.commonAncestorContainer; + + // Handle selection a image or other control like element such as anchors + if (!rng.collapsed) { + if (rng.startContainer == rng.endContainer) { + if (rng.endOffset - rng.startOffset < 2) { + if (rng.startContainer.hasChildNodes()) + elm = rng.startContainer.childNodes[rng.startOffset]; + } + } + + // If the anchor node is a element instead of a text node then return this element + //if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) + // return sel.anchorNode.childNodes[sel.anchorOffset]; + + // Handle cases where the selection is immediately wrapped around a node and return that node instead of it's parent. + // This happens when you double click an underlined word in FireFox. + if (start.nodeType === 3 && end.nodeType === 3) { + function skipEmptyTextNodes(n, forwards) { + var orig = n; + while (n && n.nodeType === 3 && n.length === 0) { + n = forwards ? n.nextSibling : n.previousSibling; + } + return n || orig; + } + if (start.length === rng.startOffset) { + start = skipEmptyTextNodes(start.nextSibling, true); + } else { + start = start.parentNode; + } + if (rng.endOffset === 0) { + end = skipEmptyTextNodes(end.previousSibling, false); + } else { + end = end.parentNode; + } + + if (start && start === end) + return start; + } + } + + if (elm && elm.nodeType == 3) + return elm.parentNode; + + return elm; + } + + return rng.item ? rng.item(0) : rng.parentElement(); + }, + + getSelectedBlocks : function(st, en) { + var t = this, dom = t.dom, sb, eb, n, bl = []; + + sb = dom.getParent(st || t.getStart(), dom.isBlock); + eb = dom.getParent(en || t.getEnd(), dom.isBlock); + + if (sb) + bl.push(sb); + + if (sb && eb && sb != eb) { + n = sb; + + while ((n = n.nextSibling) && n != eb) { + if (dom.isBlock(n)) + bl.push(n); + } + } + + if (eb && sb != eb) + bl.push(eb); + + return bl; + }, + + normalize : function() { + var self = this, rng, normalized; + + // Normalize only on non IE browsers for now + if (tinymce.isIE) + return; + + function normalizeEndPoint(start) { + var container, offset, walker, dom = self.dom, body = dom.getRoot(), node; + + container = rng[(start ? 'start' : 'end') + 'Container']; + offset = rng[(start ? 'start' : 'end') + 'Offset']; + + // If the container is a document move it to the body element + if (container.nodeType === 9) { + container = container.body; + offset = 0; + } + + // If the container is body try move it into the closest text node or position + // TODO: Add more logic here to handle element selection cases + if (container === body) { + // Resolve the index + if (container.hasChildNodes()) { + container = container.childNodes[Math.min(!start && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1)]; + offset = 0; + + // Walk the DOM to find a text node to place the caret at or a BR + node = container; + walker = new tinymce.dom.TreeWalker(container, body); + do { + // Found a text node use that position + if (node.nodeType === 3) { + offset = start ? 0 : node.nodeValue.length - 1; + container = node; + break; + } + + // Found a BR element that we can place the caret before + if (node.nodeName === 'BR') { + offset = dom.nodeIndex(node); + container = node.parentNode; + break; + } + } while (node = (start ? walker.next() : walker.prev())); + + normalized = true; + } + } + + // Set endpoint if it was normalized + if (normalized) + rng['set' + (start ? 'Start' : 'End')](container, offset); + }; + + rng = self.getRng(); + + // Normalize the end points + normalizeEndPoint(true); + + if (rng.collapsed) + normalizeEndPoint(); + + // Set the selection if it was normalized + if (normalized) { + //console.log(self.dom.dumpRng(rng)); + self.setRng(rng); + } + }, + + destroy : function(s) { + var t = this; + + t.win = null; + + // Manual destroy then remove unload handler + if (!s) + tinymce.removeUnload(t.destroy); + }, + + // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode + _fixIESelection : function() { + var dom = this.dom, doc = dom.doc, body = doc.body, started, startRng, htmlElm; + + // Make HTML element unselectable since we are going to handle selection by hand + doc.documentElement.unselectable = true; + + // Return range from point or null if it failed + function rngFromPoint(x, y) { + var rng = body.createTextRange(); + + try { + rng.moveToPoint(x, y); + } catch (ex) { + // IE sometimes throws and exception, so lets just ignore it + rng = null; + } + + return rng; + }; + + // Fires while the selection is changing + function selectionChange(e) { + var pointRng; + + // Check if the button is down or not + if (e.button) { + // Create range from mouse position + pointRng = rngFromPoint(e.x, e.y); + + if (pointRng) { + // Check if pointRange is before/after selection then change the endPoint + if (pointRng.compareEndPoints('StartToStart', startRng) > 0) + pointRng.setEndPoint('StartToStart', startRng); + else + pointRng.setEndPoint('EndToEnd', startRng); + + pointRng.select(); + } + } else + endSelection(); + } + + // Removes listeners + function endSelection() { + var rng = doc.selection.createRange(); + + // If the range is collapsed then use the last start range + if (startRng && !rng.item && rng.compareEndPoints('StartToEnd', rng) === 0) + startRng.select(); + + dom.unbind(doc, 'mouseup', endSelection); + dom.unbind(doc, 'mousemove', selectionChange); + startRng = started = 0; + }; + + // Detect when user selects outside BODY + dom.bind(doc, ['mousedown', 'contextmenu'], function(e) { + if (e.target.nodeName === 'HTML') { + if (started) + endSelection(); + + // Detect vertical scrollbar, since IE will fire a mousedown on the scrollbar and have target set as HTML + htmlElm = doc.documentElement; + if (htmlElm.scrollHeight > htmlElm.clientHeight) + return; + + started = 1; + // Setup start position + startRng = rngFromPoint(e.x, e.y); + if (startRng) { + // Listen for selection change events + dom.bind(doc, 'mouseup', endSelection); + dom.bind(doc, 'mousemove', selectionChange); + + dom.win.focus(); + startRng.select(); + } + } + }); + } + }); +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Serializer.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Serializer.js index 6a8692be41..9f4b7cc831 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Serializer.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/Serializer.js @@ -9,939 +9,371 @@ */ (function(tinymce) { - // Shorten names - var extend = tinymce.extend, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher, isIE = tinymce.isIE, isGecko = tinymce.isGecko; - - function wildcardToRE(s) { - return s.replace(/([?+*])/g, '.$1'); - }; - /** - * This class is used to serialize DOM trees into a string. - * Consult the TinyMCE Wiki API for more details and examples on how to use this class. + * This class is used to serialize DOM trees into a string. Consult the TinyMCE Wiki API for more details and examples on how to use this class. + * * @class tinymce.dom.Serializer */ - tinymce.create('tinymce.dom.Serializer', { - /** - * Constucts a new DOM serializer class. - * - * @constructor - * @method Serializer - * @param {Object} s Optional name/Value collection of settings for the serializer. - */ - Serializer : function(s) { - var t = this; - - t.key = 0; - t.onPreProcess = new Dispatcher(t); - t.onPostProcess = new Dispatcher(t); - - try { - t.writer = new tinymce.dom.XMLWriter(); - } catch (ex) { - // IE might throw exception if ActiveX is disabled so we then switch to the slightly slower StringWriter - t.writer = new tinymce.dom.StringWriter(); - } - - // IE9 broke the XML attributes order so it can't be used anymore - if (tinymce.isIE && document.documentMode > 8) { - t.writer = new tinymce.dom.StringWriter(); - } - - // Default settings - t.settings = s = extend({ - dom : tinymce.DOM, - valid_nodes : 0, - node_filter : 0, - attr_filter : 0, - invalid_attrs : /^(_mce_|_moz_|sizset|sizcache)/, - closed : /^(br|hr|input|meta|img|link|param|area)$/, - entity_encoding : 'named', - entities : '160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro', - valid_elements : '*[*]', - extended_valid_elements : 0, - invalid_elements : 0, - fix_table_elements : 1, - fix_list_elements : true, - fix_content_duplication : true, - convert_fonts_to_spans : false, - font_size_classes : 0, - apply_source_formatting : 0, - indent_mode : 'simple', - indent_char : '\t', - indent_levels : 1, - remove_linebreaks : 1, - remove_redundant_brs : 1, - element_format : 'xhtml' - }, s); - - t.dom = s.dom; - t.schema = s.schema; - - // Use raw entities if no entities are defined - if (s.entity_encoding == 'named' && !s.entities) - s.entity_encoding = 'raw'; - - if (s.remove_redundant_brs) { - t.onPostProcess.add(function(se, o) { - // Remove single BR at end of block elements since they get rendered - o.content = o.content.replace(/(
    \s*)+<\/(p|h[1-6]|div|li)>/gi, function(a, b, c) { - // Check if it's a single element - if (/^
    \s*<\//.test(a)) - return ''; - - return a; - }); - }); - } - - // Remove XHTML element endings i.e. produce crap :) XHTML is better - if (s.element_format == 'html') { - t.onPostProcess.add(function(se, o) { - o.content = o.content.replace(/<([^>]+) \/>/g, '<$1>'); - }); - } - - if (s.fix_list_elements) { - t.onPreProcess.add(function(se, o) { - var nl, x, a = ['ol', 'ul'], i, n, p, r = /^(OL|UL)$/, np; - - function prevNode(e, n) { - var a = n.split(','), i; - - while ((e = e.previousSibling) != null) { - for (i=0; i]+>|

    /g, ''); + * o.content = o.content.replace(/<\/p>/g, '
    '); + * }); */ - addRules : function(s) { - var t = this, dr; - - if (!s) - return; - - t._setup(); + onPostProcess = new tinymce.util.Dispatcher(self); - each(s.split(','), function(s) { - var p = s.split(/\[|\]/), tn = p[0].split('/'), ra, at, wat, va = []; + htmlParser = new tinymce.html.DomParser(settings, schema); - // Extend with default rules - if (dr) - at = tinymce.extend([], dr.attribs); + // Convert move data-mce-src, data-mce-href and data-mce-style into nodes or process them if needed + htmlParser.addAttributeFilter('src,href,style', function(nodes, name) { + var i = nodes.length, node, value, internalName = 'data-mce-' + name, urlConverter = settings.url_converter, urlConverterScope = settings.url_converter_scope, undef; - // Parse attributes - if (p.length > 1) { - each(p[1].split('|'), function(s) { - var ar = {}, i; + while (i--) { + node = nodes[i]; - at = at || []; + value = node.attributes.map[internalName]; + if (value !== undef) { + // Set external name to internal value and remove internal + node.attr(name, value.length > 0 ? value : null); + node.attr(internalName, null); + } else { + // No internal attribute found then convert the value we have in the DOM + value = node.attributes.map[name]; - // Parse attribute rule - s = s.replace(/::/g, '~'); - s = /^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(s); - s[2] = s[2].replace(/~/g, ':'); + if (name === "style") + value = dom.serializeStyle(dom.parseStyle(value), node.name); + else if (urlConverter) + value = urlConverter.call(urlConverterScope, value, name, node.name); - // Add required attributes - if (s[1] == '!') { - ra = ra || []; - ra.push(s[2]); - } - - // Remove inherited attributes - if (s[1] == '-') { - for (i = 0; i 0 ? value : null); } - - // Handle element names - each(tn, function(s, i) { - var pr = s.charAt(0), x = 1, ru = {}; - - // Extend with default rule data - if (dr) { - if (dr.noEmpty) - ru.noEmpty = dr.noEmpty; - - if (dr.fullEnd) - ru.fullEnd = dr.fullEnd; - - if (dr.padd) - ru.padd = dr.padd; - } - - // Handle prefixes - switch (pr) { - case '-': - ru.noEmpty = true; - break; - - case '+': - ru.fullEnd = true; - break; - - case '#': - ru.padd = true; - break; - - default: - x = 0; - } - - tn[i] = s = s.substring(x); - t.validElements[s] = 1; - - // Add element name or element regex - if (/[*.?]/.test(tn[0])) { - ru.nameRE = new RegExp('^' + wildcardToRE(tn[0]) + '$'); - t.wildRules = t.wildRules || {}; - t.wildRules.push(ru); - } else { - ru.name = tn[0]; - - // Store away default rule - if (tn[0] == '@') - dr = ru; - - t.rules[s] = ru; - } - - ru.attribs = at; - - if (ra) - ru.requiredAttribs = ra; - - if (wat) { - // Build valid attributes regexp - s = ''; - each(va, function(v) { - if (s) - s += '|'; - - s += '(' + wildcardToRE(v) + ')'; - }); - ru.validAttribsRE = new RegExp('^' + s.toLowerCase() + '$'); - ru.wildAttribs = wat; - } - }); - }); - - // Build valid elements regexp - s = ''; - each(t.validElements, function(v, k) { - if (s) - s += '|'; - - if (k != '@') - s += k; - }); - t.validElementsRE = new RegExp('^(' + wildcardToRE(s.toLowerCase()) + ')$'); - - //console.debug(t.validElementsRE.toString()); - //console.dir(t.rules); - //console.dir(t.wildRules); - }, - - /** - * Finds a rule object by name. - * - * @method findRule - * @param {String} n Name to look for in rules collection. - * @return {Object} Rule object found or null if it wasn't found. - */ - findRule : function(n) { - var t = this, rl = t.rules, i, r; - - t._setup(); - - // Exact match - r = rl[n]; - if (r) - return r; - - // Try wildcards - rl = t.wildRules; - for (i = 0; i < rl.length; i++) { - if (rl[i].nameRE.test(n)) - return rl[i]; - } - - return null; - }, - - /** - * Finds an attribute rule object by name. - * - * @method findAttribRule - * @param {Object} ru Rule object to search though. - * @param {String} n Name of the rule to retrive. - * @return {Object} Rule object of the specified attribute. - */ - findAttribRule : function(ru, n) { - var i, wa = ru.wildAttribs; - - for (i = 0; i < wa.length; i++) { - if (wa[i].nameRE.test(n)) - return wa[i]; } + }); - return null; - }, + // Remove internal classes mceItem<..> + htmlParser.addAttributeFilter('class', function(nodes, name) { + var i = nodes.length, node, value; - /** - * Serializes the specified node into a HTML string. - * - * @method serialize - * @param {Element} n Element/Node to serialize. - * @param {Object} o Object to add serialized contents to, this object will also be passed to the event listeners. - * @return {String} Serialized HTML contents. - */ - serialize : function(n, o) { - var h, t = this, doc, oldDoc, impl, selected; - - t._setup(); - o = o || {}; - o.format = o.format || 'html'; - t.processObj = o; - - // IE looses the selected attribute on option elements so we need to store it - // See: http://support.microsoft.com/kb/829907 - if (isIE) { - selected = []; - each(n.getElementsByTagName('option'), function(n) { - var v = t.dom.getAttrib(n, 'selected'); - - selected.push(v ? v : null); - }); + while (i--) { + node = nodes[i]; + value = node.attr('class').replace(/\s*mce(Item\w+|Selected)\s*/g, ''); + node.attr('class', value.length > 0 ? value : null); } + }); - n = n.cloneNode(true); - - // IE looses the selected attribute on option elements so we need to restore it - if (isIE) { - each(n.getElementsByTagName('option'), function(n, i) { - t.dom.setAttrib(n, 'selected', selected[i]); - }); - } - - // Nodes needs to be attached to something in WebKit/Opera - // Older builds of Opera crashes if you attach the node to an document created dynamically - // and since we can't feature detect a crash we need to sniff the acutal build number - // This fix will make DOM ranges and make Sizzle happy! - impl = n.ownerDocument.implementation; - if (impl.createHTMLDocument) { - // Create an empty HTML document - doc = impl.createHTMLDocument(""); - - // Add the element or it's children if it's a body element to the new document - each(n.nodeName == 'BODY' ? n.childNodes : [n], function(node) { - doc.body.appendChild(doc.importNode(node, true)); - }); - - // Grab first child or body element for serialization - if (n.nodeName != 'BODY') - n = doc.body.firstChild; - else - n = doc.body; - - // set the new document in DOMUtils so createElement etc works - oldDoc = t.dom.doc; - t.dom.doc = doc; - } + // Remove bookmark elements + htmlParser.addAttributeFilter('data-mce-type', function(nodes, name, args) { + var i = nodes.length, node; - t.key = '' + (parseInt(t.key) + 1); + while (i--) { + node = nodes[i]; - // Pre process - if (!o.no_events) { - o.node = n; - t.onPreProcess.dispatch(t, o); + if (node.attributes.map['data-mce-type'] === 'bookmark' && !args.cleanup) + node.remove(); } + }); - // Serialize HTML DOM into a string - t.writer.reset(); - t._info = o; - t._serializeNode(n, o.getInner); + // Force script into CDATA sections and remove the mce- prefix also add comments around styles + htmlParser.addNodeFilter('script,style', function(nodes, name) { + var i = nodes.length, node, value; - // Post process - o.content = t.writer.getContent(); - - // Restore the old document if it was changed - if (oldDoc) - t.dom.doc = oldDoc; - - if (!o.no_events) - t.onPostProcess.dispatch(t, o); - - t._postProcess(o); - o.node = null; - - return tinymce.trim(o.content); - }, + function trim(value) { + return value.replace(/()/g, '\n') + .replace(/^[\r\n]*|[\r\n]*$/g, '') + .replace(/^\s*(\/\/\s*|\]\]>|-->|\]\]-->)\s*$/g, ''); + }; - // Internal functions + while (i--) { + node = nodes[i]; + value = node.firstChild ? node.firstChild.value : ''; - /** - * Indents the specified content object. - * - * @param {Object} o Content object to indent. - */ - _postProcess : function(o) { - var t = this, s = t.settings, h = o.content, sc = [], p; - - if (o.format == 'html') { - // Protect some elements - p = t._protect({ - content : h, - patterns : [ - {pattern : /(]*>)(.*?)(<\/script>)/g}, - {pattern : /(]*>)(.*?)(<\/noscript>)/g}, - {pattern : /(]*>)(.*?)(<\/style>)/g}, - {pattern : /(]*>)(.*?)(<\/pre>)/g, encode : 1}, - {pattern : /()/g} - ] - }); - - h = p.content; - - // Entity encode - if (s.entity_encoding !== 'raw') - h = t._encode(h); - - // Use BR instead of   padded P elements inside editor and use

     

    outside editor -/* if (o.set) - h = h.replace(/

    \s+( | |\u00a0|
    )\s+<\/p>/g, '


    '); - else - h = h.replace(/

    \s+( | |\u00a0|
    )\s+<\/p>/g, '

    $1

    ');*/ - - // Since Gecko and Safari keeps whitespace in the DOM we need to - // remove it inorder to match other browsers. But I think Gecko and Safari is right. - // This process is only done when getting contents out from the editor. - if (!o.set) { - // We need to replace paragraph whitespace with an nbsp before indentation to keep the \u00a0 char - h = tinymce._replace(/

    \s+<\/p>|]+)>\s+<\/p>/g, s.entity_encoding == 'numeric' ? ' 

    ' : ' 

    ', h); - - if (s.remove_linebreaks) { - h = h.replace(/\r?\n|\r/g, ' '); - h = tinymce._replace(/(<[^>]+>)\s+/g, '$1 ', h); - h = tinymce._replace(/\s+(<\/[^>]+>)/g, ' $1', h); - h = tinymce._replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g, '<$1 $2>', h); // Trim block start - h = tinymce._replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g, '<$1>', h); // Trim block start - h = tinymce._replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g, '', h); // Trim block end - } + if (name === "script") { + // Remove mce- prefix from script elements + node.attr('type', (node.attr('type') || 'text/javascript').replace(/^mce\-/, '')); - // Simple indentation - if (s.apply_source_formatting && s.indent_mode == 'simple') { - // Add line breaks before and after block elements - h = tinymce._replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g, '\n<$1$2$3>\n', h); - h = tinymce._replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g, '\n<$1$2>', h); - h = tinymce._replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g, '\n', h); - h = h.replace(/\n\n/g, '\n'); - } + if (value.length > 0) + node.firstChild.value = '// '; + } else { + if (value.length > 0) + node.firstChild.value = ''; } - - h = t._unprotect(h, p); - - // Restore CDATA sections - h = tinymce._replace(//g, '', h); - - // Restore the \u00a0 character if raw mode is enabled - if (s.entity_encoding == 'raw') - h = tinymce._replace(/

     <\/p>|]+)> <\/p>/g, '\u00a0

    ', h); - - // Restore noscript elements - h = h.replace(/]+|)>([\s\S]*?)<\/noscript>/g, function(v, attribs, text) { - return '' + t.dom.decode(text.replace(//g, '')) + ''; - }); } - - o.content = h; - }, - - _serializeNode : function(n, inner) { - var t = this, s = t.settings, w = t.writer, hc, el, cn, i, l, a, at, no, v, nn, ru, ar, iv, closed, keep, type, scopeName; - - if (!s.node_filter || s.node_filter(n)) { - switch (n.nodeType) { - case 1: // Element - if (n.hasAttribute ? n.hasAttribute('_mce_bogus') : n.getAttribute('_mce_bogus')) - return; - - iv = keep = false; - hc = n.hasChildNodes(); - nn = n.getAttribute('_mce_name') || n.nodeName.toLowerCase(); - - // Get internal type - type = n.getAttribute('_mce_type'); - if (type) { - if (!t._info.cleanup) { - iv = true; - return; - } else - keep = 1; - } - - // Add correct prefix on IE - if (isIE) { - scopeName = n.scopeName; - if (scopeName && scopeName !== 'HTML' && scopeName !== 'html') - nn = scopeName + ':' + nn; - } - - // Remove mce prefix on IE needed for the abbr element - if (nn.indexOf('mce:') === 0) - nn = nn.substring(4); - - // Check if valid - if (!keep) { - if (!t.validElementsRE || !t.validElementsRE.test(nn) || (t.invalidElementsRE && t.invalidElementsRE.test(nn)) || inner) { - iv = true; - break; - } - } - - if (isIE) { - // Fix IE content duplication (DOM can have multiple copies of the same node) - if (s.fix_content_duplication) { - if (n._mce_serialized == t.key) - return; - - n._mce_serialized = t.key; - } - - // IE sometimes adds a / infront of the node name - if (nn.charAt(0) == '/') - nn = nn.substring(1); - } else if (isGecko) { - // Ignore br elements - if (n.nodeName === 'BR' && n.getAttribute('type') == '_moz') - return; - } - - // Check if valid child - if (s.validate_children) { - if (t.elementName && !t.schema.isValid(t.elementName, nn)) { - iv = true; - break; - } - - t.elementName = nn; - } - - ru = t.findRule(nn); - - // No valid rule for this element could be found then skip it - if (!ru) { - iv = true; - break; - } - - nn = ru.name || nn; - closed = s.closed.test(nn); - - // Skip empty nodes or empty node name in IE - if ((!hc && ru.noEmpty) || (isIE && !nn)) { - iv = true; - break; - } - - // Check required - if (ru.requiredAttribs) { - a = ru.requiredAttribs; - - for (i = a.length - 1; i >= 0; i--) { - if (this.dom.getAttrib(n, a[i]) !== '') - break; - } - - // None of the required was there - if (i == -1) { - iv = true; - break; - } - } - - w.writeStartElement(nn); - - // Add ordered attributes - if (ru.attribs) { - for (i=0, at = ru.attribs, l = at.length; i-1; i--) { - no = at[i]; - - if (no.specified) { - a = no.nodeName.toLowerCase(); - - if (s.invalid_attrs.test(a) || !ru.validAttribsRE.test(a)) - continue; - - ar = t.findAttribRule(ru, a); - v = t._getAttrib(n, ar, a); - - if (v !== null) - w.writeAttribute(a, v); - } - } - } - - // Keep type attribute - if (type && keep) - w.writeAttribute('_mce_type', type); - - // Write text from script - if (nn === 'script' && tinymce.trim(n.innerHTML)) { - w.writeText('// '); // Padd it with a comment so it will parse on older browsers - w.writeCDATA(n.innerHTML.replace(/|<\[CDATA\[|\]\]>/g, '')); // Remove comments and cdata stuctures - hc = false; - break; - } - - // Padd empty nodes with a   - if (ru.padd) { - // If it has only one bogus child, padd it anyway workaround for
    bug - if (hc && (cn = n.firstChild) && cn.nodeType === 1 && n.childNodes.length === 1) { - if (cn.hasAttribute ? cn.hasAttribute('_mce_bogus') : cn.getAttribute('_mce_bogus')) - w.writeText('\u00a0'); - } else if (!hc) - w.writeText('\u00a0'); // No children then padd it - } - - break; - - case 3: // Text - // Check if valid child - if (s.validate_children && t.elementName && !t.schema.isValid(t.elementName, '#text')) - return; - - return w.writeText(n.nodeValue); - - case 4: // CDATA - return w.writeCDATA(n.nodeValue); - - case 8: // Comment - return w.writeComment(n.nodeValue); - } - } else if (n.nodeType == 1) - hc = n.hasChildNodes(); - - if (hc && !closed) { - cn = n.firstChild; - - while (cn) { - t._serializeNode(cn); - t.elementName = nn; - cn = cn.nextSibling; + }); + + // Convert comments to cdata and handle protected comments + htmlParser.addNodeFilter('#comment', function(nodes, name) { + var i = nodes.length, node; + + while (i--) { + node = nodes[i]; + + if (node.value.indexOf('[CDATA[') === 0) { + node.name = '#cdata'; + node.type = 4; + node.value = node.value.replace(/^\[CDATA\[|\]\]$/g, ''); + } else if (node.value.indexOf('mce:protected ') === 0) { + node.name = "#text"; + node.type = 3; + node.raw = true; + node.value = unescape(node.value).substr(14); } } - - // Write element end - if (!iv) { - if (!closed) - w.writeFullEndElement(); - else - w.writeEndElement(); - } - }, - - _protect : function(o) { - var t = this; - - o.items = o.items || []; - - function enc(s) { - return s.replace(/[\r\n\\]/g, function(c) { - if (c === '\n') - return '\\n'; - else if (c === '\\') - return '\\\\'; - - return '\\r'; - }); - }; - - function dec(s) { - return s.replace(/\\[\\rn]/g, function(c) { - if (c === '\\n') - return '\n'; - else if (c === '\\\\') - return '\\'; - - return '\r'; - }); - }; - - each(o.patterns, function(p) { - o.content = dec(enc(o.content).replace(p.pattern, function(x, a, b, c) { - b = dec(b); - - if (p.encode) - b = t._encode(b); - - o.items.push(b); - return a + '' + c; - })); - }); - - return o; - }, - - _unprotect : function(h, o) { - h = h.replace(/\'); - this.count++; - }, - - /** - * String writer specific function. Enables you to write raw contents to the string. - * - * @method writeRaw - * @param {String} v String with raw contents to write. - */ - writeRaw : function(v) { - this.str += v; - }, - - /** - * String writer specific method. This encodes the raw entities of a string. - * - * @method encode - * @param {String} s String to encode. - * @return {String} String with entity encoding of the raw elements like <>&". - */ - encode : function(s, attr) { - return s.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(v) { - return encodedChars[v]; - }); - }, - - /** - * Returns a string representation of the elements/nodes written. - * - * @method getContent - * @return {String} String representation of the written elements/nodes. - */ - getContent : function() { - return this.str; - }, - - _writeAttributesEnd : function(s) { - if (!this.inAttr) - return; - - this.inAttr = false; - - if (s && this.elementCount == this.count) { - this.writeRaw(' />'); - return false; - } - - this.writeRaw('>'); - - return true; - } - }); -})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/TreeWalker.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/TreeWalker.js index c7fc06047c..3436aae367 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/TreeWalker.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/TreeWalker.js @@ -59,6 +59,6 @@ tinymce.dom.TreeWalker = function(start_node, root_node) { * @return {Node} Current node where the walker is after moving to the previous node. */ this.prev = function(shallow) { - return (node = findSibling(node, 'lastChild', 'lastSibling', shallow)); + return (node = findSibling(node, 'lastChild', 'previousSibling', shallow)); }; }; diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/TridentSelection.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/TridentSelection.js index 3fdf4d9d4f..08e32d3e98 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/TridentSelection.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/TridentSelection.js @@ -10,119 +10,357 @@ (function() { function Selection(selection) { - var t = this, invisibleChar = '\uFEFF', range, lastIERng, dom = selection.dom, TRUE = true, FALSE = false; + var self = this, dom = selection.dom, TRUE = true, FALSE = false; + + function getPosition(rng, start) { + var checkRng, startIndex = 0, endIndex, inside, + children, child, offset, index, position = -1, parent; + + // Setup test range, collapse it and get the parent + checkRng = rng.duplicate(); + checkRng.collapse(start); + parent = checkRng.parentElement(); + + // Check if the selection is within the right document + if (parent.ownerDocument !== selection.dom.doc) + return; + + // IE will report non editable elements as it's parent so look for an editable one + while (parent.contentEditable === "false") { + parent = parent.parentNode; + } + + // If parent doesn't have any children then return that we are inside the element + if (!parent.hasChildNodes()) { + return {node : parent, inside : 1}; + } + + // Setup node list and endIndex + children = parent.children; + endIndex = children.length - 1; + + // Perform a binary search for the position + while (startIndex <= endIndex) { + index = Math.floor((startIndex + endIndex) / 2); + + // Move selection to node and compare the ranges + child = children[index]; + checkRng.moveToElementText(child); + position = checkRng.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', rng); + + // Before/after or an exact match + if (position > 0) { + endIndex = index - 1; + } else if (position < 0) { + startIndex = index + 1; + } else { + return {node : child}; + } + } + + // Check if child position is before or we didn't find a position + if (position < 0) { + // No element child was found use the parent element and the offset inside that + if (!child) { + checkRng.moveToElementText(parent); + checkRng.collapse(true); + child = parent; + inside = true; + } else + checkRng.collapse(false); + + checkRng.setEndPoint(start ? 'EndToStart' : 'EndToEnd', rng); + + // Fix for edge case:

    ..
    ab|c
    + if (checkRng.compareEndPoints(start ? 'StartToStart' : 'StartToEnd', rng) > 0) { + checkRng = rng.duplicate(); + checkRng.collapse(start); + + offset = -1; + while (parent == checkRng.parentElement()) { + if (checkRng.move('character', -1) == 0) + break; + + offset++; + } + } + + offset = offset || checkRng.text.replace('\r\n', ' ').length; + } else { + // Child position is after the selection endpoint + checkRng.collapse(true); + checkRng.setEndPoint(start ? 'StartToStart' : 'StartToEnd', rng); + + // Get the length of the text to find where the endpoint is relative to it's container + offset = checkRng.text.replace('\r\n', ' ').length; + } + + return {node : child, position : position, offset : offset, inside : inside}; + }; // Returns a W3C DOM compatible range object by using the IE Range API function getRange() { - var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed; + var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed, tmpRange, element2, bookmark, fail; // If selection is outside the current document just return an empty range element = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); if (element.ownerDocument != dom.doc) return domRange; - // Handle control selection or text selection of a image - if (ieRange.item || !element.hasChildNodes()) { + collapsed = selection.isCollapsed(); + + // Handle control selection + if (ieRange.item) { domRange.setStart(element.parentNode, dom.nodeIndex(element)); domRange.setEnd(domRange.startContainer, domRange.startOffset + 1); return domRange; } - collapsed = selection.isCollapsed(); - function findEndPoint(start) { - var marker, container, offset, nodes, startIndex = 0, endIndex, index, parent, checkRng, position; - - // Setup temp range and collapse it - checkRng = ieRange.duplicate(); - checkRng.collapse(start); + var endPoint = getPosition(ieRange, start), container, offset, textNodeOffset = 0, sibling, undef, nodeValue; - // Create marker and insert it at the end of the endpoints parent - marker = dom.create('a'); - parent = checkRng.parentElement(); + container = endPoint.node; + offset = endPoint.offset; - // If parent doesn't have any children then set the container to that parent and the index to 0 - if (!parent.hasChildNodes()) { - domRange[start ? 'setStart' : 'setEnd'](parent, 0); + if (endPoint.inside && !container.hasChildNodes()) { + domRange[start ? 'setStart' : 'setEnd'](container, 0); return; } - parent.appendChild(marker); - checkRng.moveToElementText(marker); - position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng); - if (position > 0) { - // The position is after the end of the parent element. - // This is the case where IE puts the caret to the left edge of a table. - domRange[start ? 'setStartAfter' : 'setEndAfter'](parent); - dom.remove(marker); + if (offset === undef) { + domRange[start ? 'setStartBefore' : 'setEndAfter'](container); return; } - // Setup node list and endIndex - nodes = tinymce.grep(parent.childNodes); - endIndex = nodes.length - 1; - // Perform a binary search for the position - while (startIndex <= endIndex) { - index = Math.floor((startIndex + endIndex) / 2); - - // Insert marker and check it's position relative to the selection - parent.insertBefore(marker, nodes[index]); - checkRng.moveToElementText(marker); - position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng); - if (position > 0) { - // Marker is to the right - startIndex = index + 1; - } else if (position < 0) { - // Marker is to the left - endIndex = index - 1; - } else { - // Maker is where we are - found = true; - break; + if (endPoint.position < 0) { + sibling = endPoint.inside ? container.firstChild : container.nextSibling; + + if (!sibling) { + domRange[start ? 'setStartAfter' : 'setEndAfter'](container); + return; } - } - // Setup container - container = position > 0 || index == 0 ? marker.nextSibling : marker.previousSibling; + if (!offset) { + if (sibling.nodeType == 3) + domRange[start ? 'setStart' : 'setEnd'](sibling, 0); + else + domRange[start ? 'setStartBefore' : 'setEndBefore'](sibling); - // Handle element selection - if (container.nodeType == 1) { - dom.remove(marker); + return; + } - // Find offset and container - offset = dom.nodeIndex(container); - container = container.parentNode; + // Find the text node and offset + while (sibling) { + nodeValue = sibling.nodeValue; + textNodeOffset += nodeValue.length; + + // We are at or passed the position we where looking for + if (textNodeOffset >= offset) { + container = sibling; + textNodeOffset -= offset; + textNodeOffset = nodeValue.length - textNodeOffset; + break; + } - // Move the offset if we are setting the end or the position is after an element - if (!start || index > 0) - offset++; + sibling = sibling.nextSibling; + } } else { - // Calculate offset within text node - if (position > 0 || index == 0) { - checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange); - offset = checkRng.text.length; - } else { - checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange); - offset = container.nodeValue.length - checkRng.text.length; + // Find the text node and offset + sibling = container.previousSibling; + + if (!sibling) + return domRange[start ? 'setStartBefore' : 'setEndBefore'](container); + + // If there isn't any text to loop then use the first position + if (!offset) { + if (container.nodeType == 3) + domRange[start ? 'setStart' : 'setEnd'](sibling, container.nodeValue.length); + else + domRange[start ? 'setStartAfter' : 'setEndAfter'](sibling); + + return; } - dom.remove(marker); + while (sibling) { + textNodeOffset += sibling.nodeValue.length; + + // We are at or passed the position we where looking for + if (textNodeOffset >= offset) { + container = sibling; + textNodeOffset -= offset; + break; + } + + sibling = sibling.previousSibling; + } } - domRange[start ? 'setStart' : 'setEnd'](container, offset); + domRange[start ? 'setStart' : 'setEnd'](container, textNodeOffset); }; - // Find start point - findEndPoint(true); + try { + // Find start point + findEndPoint(true); + + // Find end point if needed + if (!collapsed) + findEndPoint(); + } catch (ex) { + // IE has a nasty bug where text nodes might throw "invalid argument" when you + // access the nodeValue or other properties of text nodes. This seems to happend when + // text nodes are split into two nodes by a delete/backspace call. So lets detect it and try to fix it. + if (ex.number == -2147024809) { + // Get the current selection + bookmark = self.getBookmark(2); + + // Get start element + tmpRange = ieRange.duplicate(); + tmpRange.collapse(true); + element = tmpRange.parentElement(); + + // Get end element + if (!collapsed) { + tmpRange = ieRange.duplicate(); + tmpRange.collapse(false); + element2 = tmpRange.parentElement(); + element2.innerHTML = element2.innerHTML; + } + + // Remove the broken elements + element.innerHTML = element.innerHTML; + + // Restore the selection + self.moveToBookmark(bookmark); + + // Since the range has moved we need to re-get it + ieRange = selection.getRng(); - // Find end point if needed - if (!collapsed) - findEndPoint(); + // Find start point + findEndPoint(true); + + // Find end point if needed + if (!collapsed) + findEndPoint(); + } else + throw ex; // Throw other errors + } return domRange; }; + this.getBookmark = function(type) { + var rng = selection.getRng(), start, end, bookmark = {}; + + function getIndexes(node) { + var node, parent, root, children, i, indexes = []; + + parent = node.parentNode; + root = dom.getRoot().parentNode; + + while (parent != root) { + children = parent.children; + + i = children.length; + while (i--) { + if (node === children[i]) { + indexes.push(i); + break; + } + } + + node = parent; + parent = parent.parentNode; + } + + return indexes; + }; + + function getBookmarkEndPoint(start) { + var position; + + position = getPosition(rng, start); + if (position) { + return { + position : position.position, + offset : position.offset, + indexes : getIndexes(position.node), + inside : position.inside + }; + } + }; + + // Non ubstructive bookmark + if (type === 2) { + // Handle text selection + if (!rng.item) { + bookmark.start = getBookmarkEndPoint(true); + + if (!selection.isCollapsed()) + bookmark.end = getBookmarkEndPoint(); + } else + bookmark.start = {ctrl : true, indexes : getIndexes(rng.item(0))}; + } + + return bookmark; + }; + + this.moveToBookmark = function(bookmark) { + var rng, body = dom.doc.body; + + function resolveIndexes(indexes) { + var node, i, idx, children; + + node = dom.getRoot(); + for (i = indexes.length - 1; i >= 0; i--) { + children = node.children; + idx = indexes[i]; + + if (idx <= children.length - 1) { + node = children[idx]; + } + } + + return node; + }; + + function setBookmarkEndPoint(start) { + var endPoint = bookmark[start ? 'start' : 'end'], moveLeft, moveRng, undef; + + if (endPoint) { + moveLeft = endPoint.position > 0; + + moveRng = body.createTextRange(); + moveRng.moveToElementText(resolveIndexes(endPoint.indexes)); + + offset = endPoint.offset; + if (offset !== undef) { + moveRng.collapse(endPoint.inside || moveLeft); + moveRng.moveStart('character', moveLeft ? -offset : offset); + } else + moveRng.collapse(start); + + rng.setEndPoint(start ? 'StartToStart' : 'EndToStart', moveRng); + + if (start) + rng.collapse(true); + } + }; + + if (bookmark.start) { + if (bookmark.start.ctrl) { + rng = body.createControlRange(); + rng.addElement(resolveIndexes(bookmark.start.indexes)); + rng.select(); + } else { + rng = body.createTextRange(); + setBookmarkEndPoint(true); + setBookmarkEndPoint(); + rng.select(); + } + } + }; + this.addRange = function(rng) { var ieRng, ctrlRng, startContainer, startOffset, endContainer, endOffset, doc = selection.dom.doc, body = doc.body; @@ -134,7 +372,7 @@ offset = start ? startOffset : endOffset; tmpRng = ieRng.duplicate(); - if (container == doc) { + if (container == doc || container == doc.documentElement) { container = body; offset = 0; } @@ -158,7 +396,7 @@ tmpRng.moveToElementText(marker); } else { // Empty node selection for example
    |
    - marker = doc.createTextNode(invisibleChar); + marker = doc.createTextNode('\uFEFF'); container.appendChild(marker); tmpRng.moveToElementText(marker.parentNode); tmpRng.collapse(TRUE); @@ -169,9 +407,6 @@ } } - // Destroy cached range - this.destroy(); - // Setup some shorter versions startContainer = rng.startContainer; startOffset = rng.startOffset; @@ -186,7 +421,6 @@ ctrlRng = body.createControlRange(); ctrlRng.addElement(startContainer.childNodes[startOffset]); ctrlRng.select(); - ctrlRng.scrollIntoView(); return; } catch (ex) { // Ignore @@ -200,36 +434,10 @@ // Select the new range and scroll it into view ieRng.select(); - ieRng.scrollIntoView(); - }; - - this.getRangeAt = function() { - // Setup new range if the cache is empty - if (!range || !tinymce.dom.RangeUtils.compareRanges(lastIERng, selection.getRng())) { - range = getRange(); - - // Store away text range for next call - lastIERng = selection.getRng(); - } - - // IE will say that the range is equal then produce an invalid argument exception - // if you perform specific operations in a keyup event. For example Ctrl+Del. - // This hack will invalidate the range cache if the exception occurs - try { - range.startContainer.nextSibling; - } catch (ex) { - range = getRange(); - lastIERng = null; - } - - // Return cached range - return range; }; - this.destroy = function() { - // Destroy cached range and last IE range to avoid memory leaks - lastIERng = range = null; - }; + // Expose range method + this.getRangeAt = getRange; }; // Expose the selection object diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/XMLWriter.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/XMLWriter.js deleted file mode 100644 index 0d0f5d9d87..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/dom/XMLWriter.js +++ /dev/null @@ -1,165 +0,0 @@ -/** - * XMLWriter.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function(tinymce) { - /** - * This class writes nodes into a XML document structure. This structure can then be - * serialized down to a HTML string later on. - * @class tinymce.dom.XMLWriter - */ - tinymce.create('tinymce.dom.XMLWriter', { - node : null, - - /** - * Constructs a new XMLWriter. - * - * @constructor - * @method XMLWriter - * @param {Object} s Optional settings object. - */ - XMLWriter : function(s) { - // Get XML document - function getXML() { - var i = document.implementation; - - if (!i || !i.createDocument) { - // Try IE objects - try {return new ActiveXObject('MSXML2.DOMDocument');} catch (ex) {} - try {return new ActiveXObject('Microsoft.XmlDom');} catch (ex) {} - } else - return i.createDocument('', '', null); - }; - - this.doc = getXML(); - - // Since Opera and WebKit doesn't escape > into > we need to do it our self to normalize the output for all browsers - this.valid = tinymce.isOpera || tinymce.isWebKit; - - this.reset(); - }, - - /** - * Resets the writer so it can be reused the contents of the writer is cleared. - * - * @method reset - */ - reset : function() { - var t = this, d = t.doc; - - if (d.firstChild) - d.removeChild(d.firstChild); - - t.node = d.appendChild(d.createElement("html")); - }, - - /** - * Writes the start of an element like for example: /g, '%MCGT%'); - - this.node.setAttribute(n, v); - }, - - /** - * Write the end of a element. This will add a short end for elements with out children like for example a img element. - * - * @method writeEndElement - */ - writeEndElement : function() { - this.node = this.node.parentNode; - }, - - /** - * Writes the end of a element. This will add a full end to the element even if it didn't have any children. - * - * @method writeFullEndElement - */ - writeFullEndElement : function() { - var t = this, n = t.node; - - n.appendChild(t.doc.createTextNode("")); - t.node = n.parentNode; - }, - - /** - * Writes a text node value. - * - * @method writeText - * @param {String} v Value to append as a text node. - */ - writeText : function(v) { - if (this.valid) - v = v.replace(/>/g, '%MCGT%'); - - this.node.appendChild(this.doc.createTextNode(v)); - }, - - /** - * Writes a CDATA section. - * - * @method writeCDATA - * @param {String} v Value to write in CDATA. - */ - writeCDATA : function(v) { - this.node.appendChild(this.doc.createCDATASection(v)); - }, - - /** - * Writes a comment. - * - * @method writeComment - * @param {String} v Value of the comment. - */ - writeComment : function(v) { - // Fix for bug #2035694 - if (tinymce.isIE) - v = v.replace(/^\-|\-$/g, ' '); - - this.node.appendChild(this.doc.createComment(v.replace(/\-\-/g, ' '))); - }, - - /** - * Returns a string representation of the elements/nodes written. - * - * @method getContent - * @return {String} String representation of the written elements/nodes. - */ - getContent : function() { - var h; - - h = this.doc.xml || new XMLSerializer().serializeToString(this.doc); - h = h.replace(/<\?[^?]+\?>|]*>|<\/html>||]+>/g, ''); - h = h.replace(/ ?\/>/g, ' />'); - - if (this.valid) - h = h.replace(/\%MCGT%/g, '>'); - - return h; - } - }); -})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/firebug/FIREBUG.LICENSE b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/firebug/FIREBUG.LICENSE new file mode 100644 index 0000000000..8b9c44ab72 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/firebug/FIREBUG.LICENSE @@ -0,0 +1,30 @@ +Software License Agreement (BSD License) + +Copyright (c) 2007, Parakey Inc. +All rights reserved. + +Redistribution and use of this software in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* 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. + +* Neither the name of Parakey Inc. nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of Parakey Inc. + +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. \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/DomParser.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/DomParser.js new file mode 100644 index 0000000000..c0add61dca --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/DomParser.js @@ -0,0 +1,575 @@ +/** + * DomParser.js + * + * Copyright 2010, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + var Node = tinymce.html.Node; + + /** + * This class parses HTML code into a DOM like structure of nodes it will remove redundant whitespace and make + * sure that the node tree is valid according to the specified schema. So for example:

    a

    b

    c

    will become

    a

    b

    c

    + * + * @example + * var parser = new tinymce.html.DomParser({validate: true}, schema); + * var rootNode = parser.parse('

    content

    '); + * + * @class tinymce.html.DomParser + * @version 3.4 + */ + + /** + * Constructs a new DomParser instance. + * + * @constructor + * @method DomParser + * @param {Object} settings Name/value collection of settings. comment, cdata, text, start and end are callbacks. + * @param {tinymce.html.Schema} schema HTML Schema class to use when parsing. + */ + tinymce.html.DomParser = function(settings, schema) { + var self = this, nodeFilters = {}, attributeFilters = [], matchedNodes = {}, matchedAttributes = {}; + + settings = settings || {}; + settings.validate = "validate" in settings ? settings.validate : true; + settings.root_name = settings.root_name || 'body'; + self.schema = schema = schema || new tinymce.html.Schema(); + + function fixInvalidChildren(nodes) { + var ni, node, parent, parents, newParent, currentNode, tempNode, childNode, i, + childClone, nonEmptyElements, nonSplitableElements, sibling, nextNode; + + nonSplitableElements = tinymce.makeMap('tr,td,th,tbody,thead,tfoot,table'); + nonEmptyElements = schema.getNonEmptyElements(); + + for (ni = 0; ni < nodes.length; ni++) { + node = nodes[ni]; + + // Already removed + if (!node.parent) + continue; + + // Get list of all parent nodes until we find a valid parent to stick the child into + parents = [node]; + for (parent = node.parent; parent && !schema.isValidChild(parent.name, node.name) && !nonSplitableElements[parent.name]; parent = parent.parent) + parents.push(parent); + + // Found a suitable parent + if (parent && parents.length > 1) { + // Reverse the array since it makes looping easier + parents.reverse(); + + // Clone the related parent and insert that after the moved node + newParent = currentNode = self.filterNode(parents[0].clone()); + + // Start cloning and moving children on the left side of the target node + for (i = 0; i < parents.length - 1; i++) { + if (schema.isValidChild(currentNode.name, parents[i].name)) { + tempNode = self.filterNode(parents[i].clone()); + currentNode.append(tempNode); + } else + tempNode = currentNode; + + for (childNode = parents[i].firstChild; childNode && childNode != parents[i + 1]; ) { + nextNode = childNode.next; + tempNode.append(childNode); + childNode = nextNode; + } + + currentNode = tempNode; + } + + if (!newParent.isEmpty(nonEmptyElements)) { + parent.insert(newParent, parents[0], true); + parent.insert(node, newParent); + } else { + parent.insert(node, parents[0], true); + } + + // Check if the element is empty by looking through it's contents and special treatment for


    + parent = parents[0]; + if (parent.isEmpty(nonEmptyElements) || parent.firstChild === parent.lastChild && parent.firstChild.name === 'br') { + parent.empty().remove(); + } + } else if (node.parent) { + // If it's an LI try to find a UL/OL for it or wrap it + if (node.name === 'li') { + sibling = node.prev; + if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) { + sibling.append(node); + continue; + } + + sibling = node.next; + if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) { + sibling.insert(node, sibling.firstChild, true); + continue; + } + + node.wrap(self.filterNode(new Node('ul', 1))); + continue; + } + + // Try wrapping the element in a DIV + if (schema.isValidChild(node.parent.name, 'div') && schema.isValidChild('div', node.name)) { + node.wrap(self.filterNode(new Node('div', 1))); + } else { + // We failed wrapping it, then remove or unwrap it + if (node.name === 'style' || node.name === 'script') + node.empty().remove(); + else + node.unwrap(); + } + } + } + }; + + /** + * Runs the specified node though the element and attributes filters. + * + * @param {tinymce.html.Node} Node the node to run filters on. + * @return {tinymce.html.Node} The passed in node. + */ + self.filterNode = function(node) { + var i, name, list; + + // Run element filters + if (name in nodeFilters) { + list = matchedNodes[name]; + + if (list) + list.push(node); + else + matchedNodes[name] = [node]; + } + + // Run attribute filters + i = attributeFilters.length; + while (i--) { + name = attributeFilters[i].name; + + if (name in node.attributes.map) { + list = matchedAttributes[name]; + + if (list) + list.push(node); + else + matchedAttributes[name] = [node]; + } + } + + return node; + }; + + /** + * Adds a node filter function to the parser, the parser will collect the specified nodes by name + * and then execute the callback ones it has finished parsing the document. + * + * @example + * parser.addNodeFilter('p,h1', function(nodes, name) { + * for (var i = 0; i < nodes.length; i++) { + * console.log(nodes[i].name); + * } + * }); + * @method addNodeFilter + * @method {String} name Comma separated list of nodes to collect. + * @param {function} callback Callback function to execute once it has collected nodes. + */ + self.addNodeFilter = function(name, callback) { + tinymce.each(tinymce.explode(name), function(name) { + var list = nodeFilters[name]; + + if (!list) + nodeFilters[name] = list = []; + + list.push(callback); + }); + }; + + /** + * Adds a attribute filter function to the parser, the parser will collect nodes that has the specified attributes + * and then execute the callback ones it has finished parsing the document. + * + * @example + * parser.addAttributeFilter('src,href', function(nodes, name) { + * for (var i = 0; i < nodes.length; i++) { + * console.log(nodes[i].name); + * } + * }); + * @method addAttributeFilter + * @method {String} name Comma separated list of nodes to collect. + * @param {function} callback Callback function to execute once it has collected nodes. + */ + self.addAttributeFilter = function(name, callback) { + tinymce.each(tinymce.explode(name), function(name) { + var i; + + for (i = 0; i < attributeFilters.length; i++) { + if (attributeFilters[i].name === name) { + attributeFilters[i].callbacks.push(callback); + return; + } + } + + attributeFilters.push({name: name, callbacks: [callback]}); + }); + }; + + /** + * Parses the specified HTML string into a DOM like node tree and returns the result. + * + * @example + * var rootNode = new DomParser({...}).parse('text'); + * @method parse + * @param {String} html Html string to sax parse. + * @param {Object} args Optional args object that gets passed to all filter functions. + * @return {tinymce.html.Node} Root node containing the tree. + */ + self.parse = function(html, args) { + var parser, rootNode, node, nodes, i, l, fi, fl, list, name, validate, + blockElements, startWhiteSpaceRegExp, invalidChildren = [], + endWhiteSpaceRegExp, allWhiteSpaceRegExp, whiteSpaceElements, children, nonEmptyElements, rootBlockName; + + args = args || {}; + matchedNodes = {}; + matchedAttributes = {}; + blockElements = tinymce.extend(tinymce.makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements()); + nonEmptyElements = schema.getNonEmptyElements(); + children = schema.children; + validate = settings.validate; + rootBlockName = "forced_root_block" in args ? args.forced_root_block : settings.forced_root_block; + + whiteSpaceElements = schema.getWhiteSpaceElements(); + startWhiteSpaceRegExp = /^[ \t\r\n]+/; + endWhiteSpaceRegExp = /[ \t\r\n]+$/; + allWhiteSpaceRegExp = /[ \t\r\n]+/g; + + function addRootBlocks() { + var node = rootNode.firstChild, next, rootBlockNode; + + while (node) { + next = node.next; + + if (node.type == 3 || (node.type == 1 && node.name !== 'p' && !blockElements[node.name] && !node.attr('data-mce-type'))) { + if (!rootBlockNode) { + // Create a new root block element + rootBlockNode = createNode(rootBlockName, 1); + rootNode.insert(rootBlockNode, node); + rootBlockNode.append(node); + } else + rootBlockNode.append(node); + } else { + rootBlockNode = null; + } + + node = next; + }; + }; + + function createNode(name, type) { + var node = new Node(name, type), list; + + if (name in nodeFilters) { + list = matchedNodes[name]; + + if (list) + list.push(node); + else + matchedNodes[name] = [node]; + } + + return node; + }; + + function removeWhitespaceBefore(node) { + var textNode, textVal, sibling; + + for (textNode = node.prev; textNode && textNode.type === 3; ) { + textVal = textNode.value.replace(endWhiteSpaceRegExp, ''); + + if (textVal.length > 0) { + textNode.value = textVal; + textNode = textNode.prev; + } else { + sibling = textNode.prev; + textNode.remove(); + textNode = sibling; + } + } + }; + + parser = new tinymce.html.SaxParser({ + validate : validate, + fix_self_closing : !validate, // Let the DOM parser handle
  • in
  • or

    in

    for better results + + cdata: function(text) { + node.append(createNode('#cdata', 4)).value = text; + }, + + text: function(text, raw) { + var textNode; + + // Trim all redundant whitespace on non white space elements + if (!whiteSpaceElements[node.name]) { + text = text.replace(allWhiteSpaceRegExp, ' '); + + if (node.lastChild && blockElements[node.lastChild.name]) + text = text.replace(startWhiteSpaceRegExp, ''); + } + + // Do we need to create the node + if (text.length !== 0) { + textNode = createNode('#text', 3); + textNode.raw = !!raw; + node.append(textNode).value = text; + } + }, + + comment: function(text) { + node.append(createNode('#comment', 8)).value = text; + }, + + pi: function(name, text) { + node.append(createNode(name, 7)).value = text; + removeWhitespaceBefore(node); + }, + + doctype: function(text) { + var newNode; + + newNode = node.append(createNode('#doctype', 10)); + newNode.value = text; + removeWhitespaceBefore(node); + }, + + start: function(name, attrs, empty) { + var newNode, attrFiltersLen, elementRule, textNode, attrName, text, sibling, parent; + + elementRule = validate ? schema.getElementRule(name) : {}; + if (elementRule) { + newNode = createNode(elementRule.outputName || name, 1); + newNode.attributes = attrs; + newNode.shortEnded = empty; + + node.append(newNode); + + // Check if node is valid child of the parent node is the child is + // unknown we don't collect it since it's probably a custom element + parent = children[node.name]; + if (parent && children[newNode.name] && !parent[newNode.name]) + invalidChildren.push(newNode); + + attrFiltersLen = attributeFilters.length; + while (attrFiltersLen--) { + attrName = attributeFilters[attrFiltersLen].name; + + if (attrName in attrs.map) { + list = matchedAttributes[attrName]; + + if (list) + list.push(newNode); + else + matchedAttributes[attrName] = [newNode]; + } + } + + // Trim whitespace before block + if (blockElements[name]) + removeWhitespaceBefore(newNode); + + // Change current node if the element wasn't empty i.e not
    or + if (!empty) + node = newNode; + } + }, + + end: function(name) { + var textNode, elementRule, text, sibling, tempNode; + + elementRule = validate ? schema.getElementRule(name) : {}; + if (elementRule) { + if (blockElements[name]) { + if (!whiteSpaceElements[node.name]) { + // Trim whitespace at beginning of block + for (textNode = node.firstChild; textNode && textNode.type === 3; ) { + text = textNode.value.replace(startWhiteSpaceRegExp, ''); + + if (text.length > 0) { + textNode.value = text; + textNode = textNode.next; + } else { + sibling = textNode.next; + textNode.remove(); + textNode = sibling; + } + } + + // Trim whitespace at end of block + for (textNode = node.lastChild; textNode && textNode.type === 3; ) { + text = textNode.value.replace(endWhiteSpaceRegExp, ''); + + if (text.length > 0) { + textNode.value = text; + textNode = textNode.prev; + } else { + sibling = textNode.prev; + textNode.remove(); + textNode = sibling; + } + } + } + + // Trim start white space + textNode = node.prev; + if (textNode && textNode.type === 3) { + text = textNode.value.replace(startWhiteSpaceRegExp, ''); + + if (text.length > 0) + textNode.value = text; + else + textNode.remove(); + } + } + + // Handle empty nodes + if (elementRule.removeEmpty || elementRule.paddEmpty) { + if (node.isEmpty(nonEmptyElements)) { + if (elementRule.paddEmpty) + node.empty().append(new Node('#text', '3')).value = '\u00a0'; + else { + // Leave nodes that have a name like + if (!node.attributes.map.name) { + tempNode = node.parent; + node.empty().remove(); + node = tempNode; + return; + } + } + } + } + + node = node.parent; + } + } + }, schema); + + rootNode = node = new Node(args.context || settings.root_name, 11); + + parser.parse(html); + + // Fix invalid children or report invalid children in a contextual parsing + if (validate && invalidChildren.length) { + if (!args.context) + fixInvalidChildren(invalidChildren); + else + args.invalid = true; + } + + // Wrap nodes in the root into block elements if the root is body + if (rootBlockName && rootNode.name == 'body') + addRootBlocks(); + + // Run filters only when the contents is valid + if (!args.invalid) { + // Run node filters + for (name in matchedNodes) { + list = nodeFilters[name]; + nodes = matchedNodes[name]; + + // Remove already removed children + fi = nodes.length; + while (fi--) { + if (!nodes[fi].parent) + nodes.splice(fi, 1); + } + + for (i = 0, l = list.length; i < l; i++) + list[i](nodes, name, args); + } + + // Run attribute filters + for (i = 0, l = attributeFilters.length; i < l; i++) { + list = attributeFilters[i]; + + if (list.name in matchedAttributes) { + nodes = matchedAttributes[list.name]; + + // Remove already removed children + fi = nodes.length; + while (fi--) { + if (!nodes[fi].parent) + nodes.splice(fi, 1); + } + + for (fi = 0, fl = list.callbacks.length; fi < fl; fi++) + list.callbacks[fi](nodes, list.name, args); + } + } + } + + return rootNode; + }; + + // Remove
    at end of block elements Gecko and WebKit injects BR elements to + // make it possible to place the caret inside empty blocks. This logic tries to remove + // these elements and keep br elements that where intended to be there intact + if (settings.remove_trailing_brs) { + self.addNodeFilter('br', function(nodes, name) { + var i, l = nodes.length, node, blockElements = schema.getBlockElements(), + nonEmptyElements = schema.getNonEmptyElements(), parent, prev, prevName; + + // Remove brs from body element as well + blockElements.body = 1; + + // Must loop forwards since it will otherwise remove all brs in

    a


    + for (i = 0; i < l; i++) { + node = nodes[i]; + parent = node.parent; + + if (blockElements[node.parent.name] && node === parent.lastChild) { + // Loop all nodes to the right of the current node and check for other BR elements + // excluding bookmarks since they are invisible + prev = node.prev; + while (prev) { + prevName = prev.name; + + // Ignore bookmarks + if (prevName !== "span" || prev.attr('data-mce-type') !== 'bookmark') { + // Found a non BR element + if (prevName !== "br") + break; + + // Found another br it's a

    structure then don't remove anything + if (prevName === 'br') { + node = null; + break; + } + } + + prev = prev.prev; + } + + if (node) { + node.remove(); + + // Is the parent to be considered empty after we removed the BR + if (parent.isEmpty(nonEmptyElements)) { + elementRule = schema.getElementRule(parent.name); + + // Remove or padd the element depending on schema rule + if (elementRule.removeEmpty) + parent.remove(); + else if (elementRule.paddEmpty) + parent.empty().append(new tinymce.html.Node('#text', 3)).value = '\u00a0'; + } + } + } + } + }); + } + } +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Entities.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Entities.js new file mode 100644 index 0000000000..84c4dd4f97 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Entities.js @@ -0,0 +1,253 @@ +/** + * Entities.js + * + * Copyright 2010, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + var namedEntities, baseEntities, reverseEntities, + attrsCharsRegExp = /[&<>\"\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + textCharsRegExp = /[<>&\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + rawCharsRegExp = /[<>&\"\']/g, + entityRegExp = /&(#x|#)?([\w]+);/g, + asciiMap = { + 128 : "\u20AC", 130 : "\u201A", 131 : "\u0192", 132 : "\u201E", 133 : "\u2026", 134 : "\u2020", + 135 : "\u2021", 136 : "\u02C6", 137 : "\u2030", 138 : "\u0160", 139 : "\u2039", 140 : "\u0152", + 142 : "\u017D", 145 : "\u2018", 146 : "\u2019", 147 : "\u201C", 148 : "\u201D", 149 : "\u2022", + 150 : "\u2013", 151 : "\u2014", 152 : "\u02DC", 153 : "\u2122", 154 : "\u0161", 155 : "\u203A", + 156 : "\u0153", 158 : "\u017E", 159 : "\u0178" + }; + + // Raw entities + baseEntities = { + '\"' : '"', // Needs to be escaped since the YUI compressor would otherwise break the code + "'" : ''', + '<' : '<', + '>' : '>', + '&' : '&' + }; + + // Reverse lookup table for raw entities + reverseEntities = { + '<' : '<', + '>' : '>', + '&' : '&', + '"' : '"', + ''' : "'" + }; + + // Decodes text by using the browser + function nativeDecode(text) { + var elm; + + elm = document.createElement("div"); + elm.innerHTML = text; + + return elm.textContent || elm.innerText || text; + }; + + // Build a two way lookup table for the entities + function buildEntitiesLookup(items, radix) { + var i, chr, entity, lookup = {}; + + if (items) { + items = items.split(','); + radix = radix || 10; + + // Build entities lookup table + for (i = 0; i < items.length; i += 2) { + chr = String.fromCharCode(parseInt(items[i], radix)); + + // Only add non base entities + if (!baseEntities[chr]) { + entity = '&' + items[i + 1] + ';'; + lookup[chr] = entity; + lookup[entity] = chr; + } + } + + return lookup; + } + }; + + // Unpack entities lookup where the numbers are in radix 32 to reduce the size + namedEntities = buildEntitiesLookup( + '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro' + , 32); + + tinymce.html = tinymce.html || {}; + + /** + * Entity encoder class. + * + * @class tinymce.html.SaxParser + * @static + * @version 3.4 + */ + tinymce.html.Entities = { + /** + * Encodes the specified string using raw entities. This means only the required XML base entities will be endoded. + * + * @method encodeRaw + * @param {String} text Text to encode. + * @param {Boolean} attr Optional flag to specify if the text is attribute contents. + * @return {String} Entity encoded text. + */ + encodeRaw : function(text, attr) { + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + return baseEntities[chr] || chr; + }); + }, + + /** + * Encoded the specified text with both the attributes and text entities. This function will produce larger text contents + * since it doesn't know if the context is within a attribute or text node. This was added for compatibility + * and is exposed as the DOMUtils.encode function. + * + * @method encodeAllRaw + * @param {String} text Text to encode. + * @return {String} Entity encoded text. + */ + encodeAllRaw : function(text) { + return ('' + text).replace(rawCharsRegExp, function(chr) { + return baseEntities[chr] || chr; + }); + }, + + /** + * Encodes the specified string using numeric entities. The core entities will be encoded as named ones but all non lower ascii characters + * will be encoded into numeric entities. + * + * @method encodeNumeric + * @param {String} text Text to encode. + * @param {Boolean} attr Optional flag to specify if the text is attribute contents. + * @return {String} Entity encoded text. + */ + encodeNumeric : function(text, attr) { + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + // Multi byte sequence convert it to a single entity + if (chr.length > 1) + return '&#' + (((chr.charCodeAt(0) - 0xD800) * 0x400) + (chr.charCodeAt(1) - 0xDC00) + 0x10000) + ';'; + + return baseEntities[chr] || '&#' + chr.charCodeAt(0) + ';'; + }); + }, + + /** + * Encodes the specified string using named entities. The core entities will be encoded as named ones but all non lower ascii characters + * will be encoded into named entities. + * + * @method encodeNamed + * @param {String} text Text to encode. + * @param {Boolean} attr Optional flag to specify if the text is attribute contents. + * @param {Object} entities Optional parameter with entities to use. + * @return {String} Entity encoded text. + */ + encodeNamed : function(text, attr, entities) { + entities = entities || namedEntities; + + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + return baseEntities[chr] || entities[chr] || chr; + }); + }, + + /** + * Returns an encode function based on the name(s) and it's optional entities. + * + * @method getEncodeFunc + * @param {String} name Comma separated list of encoders for example named,numeric. + * @param {String} entities Optional parameter with entities to use instead of the built in set. + * @return {function} Encode function to be used. + */ + getEncodeFunc : function(name, entities) { + var Entities = tinymce.html.Entities; + + entities = buildEntitiesLookup(entities) || namedEntities; + + function encodeNamedAndNumeric(text, attr) { + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + return baseEntities[chr] || entities[chr] || '&#' + chr.charCodeAt(0) + ';' || chr; + }); + }; + + function encodeCustomNamed(text, attr) { + return Entities.encodeNamed(text, attr, entities); + }; + + // Replace + with , to be compatible with previous TinyMCE versions + name = tinymce.makeMap(name.replace(/\+/g, ',')); + + // Named and numeric encoder + if (name.named && name.numeric) + return encodeNamedAndNumeric; + + // Named encoder + if (name.named) { + // Custom names + if (entities) + return encodeCustomNamed; + + return Entities.encodeNamed; + } + + // Numeric + if (name.numeric) + return Entities.encodeNumeric; + + // Raw encoder + return Entities.encodeRaw; + }, + + /** + * Decodes the specified string, this will replace entities with raw UTF characters. + * + * @param {String} text Text to entity decode. + * @return {String} Entity decoded string. + */ + decode : function(text) { + return text.replace(entityRegExp, function(all, numeric, value) { + if (numeric) { + value = parseInt(value, numeric.length === 2 ? 16 : 10); + + // Support upper UTF + if (value > 0xFFFF) { + value -= 0x10000; + + return String.fromCharCode(0xD800 + (value >> 10), 0xDC00 + (value & 0x3FF)); + } else + return asciiMap[value] || String.fromCharCode(value); + } + + return reverseEntities[all] || namedEntities[all] || nativeDecode(all); + }); + } + }; +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Node.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Node.js new file mode 100644 index 0000000000..774adbc737 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Node.js @@ -0,0 +1,474 @@ +/** + * Node.js + * + * Copyright 2010, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + var whiteSpaceRegExp = /^[ \t\r\n]*$/, typeLookup = { + '#text' : 3, + '#comment' : 8, + '#cdata' : 4, + '#pi' : 7, + '#doctype' : 10, + '#document-fragment' : 11 + }; + + // Walks the tree left/right + function walk(node, root_node, prev) { + var sibling, parent, startName = prev ? 'lastChild' : 'firstChild', siblingName = prev ? 'prev' : 'next'; + + // Walk into nodes if it has a start + if (node[startName]) + return node[startName]; + + // Return the sibling if it has one + if (node !== root_node) { + sibling = node[siblingName]; + + if (sibling) + return sibling; + + // Walk up the parents to look for siblings + for (parent = node.parent; parent && parent !== root_node; parent = parent.parent) { + sibling = parent[siblingName]; + + if (sibling) + return sibling; + } + } + }; + + /** + * This class is a minimalistic implementation of a DOM like node used by the DomParser class. + * + * @example + * var node = new tinymce.html.Node('strong', 1); + * someRoot.append(node); + * + * @class tinymce.html.Node + * @version 3.4 + */ + + /** + * Constructs a new Node instance. + * + * @constructor + * @method Node + * @param {String} name Name of the node type. + * @param {Number} type Numeric type representing the node. + */ + function Node(name, type) { + this.name = name; + this.type = type; + + if (type === 1) { + this.attributes = []; + this.attributes.map = {}; + } + } + + tinymce.extend(Node.prototype, { + /** + * Replaces the current node with the specified one. + * + * @example + * someNode.replace(someNewNode); + * + * @method replace + * @param {tinymce.html.Node} node Node to replace the current node with. + * @return {tinymce.html.Node} The old node that got replaced. + */ + replace : function(node) { + var self = this; + + if (node.parent) + node.remove(); + + self.insert(node, self); + self.remove(); + + return self; + }, + + /** + * Gets/sets or removes an attribute by name. + * + * @example + * someNode.attr("name", "value"); // Sets an attribute + * console.log(someNode.attr("name")); // Gets an attribute + * someNode.attr("name", null); // Removes an attribute + * + * @method attr + * @param {String} name Attribute name to set or get. + * @param {String} value Optional value to set. + * @return {String/tinymce.html.Node} String or undefined on a get operation or the current node on a set operation. + */ + attr : function(name, value) { + var self = this, attrs, i, undef; + + if (typeof name !== "string") { + for (i in name) + self.attr(i, name[i]); + + return self; + } + + if (attrs = self.attributes) { + if (value !== undef) { + // Remove attribute + if (value === null) { + if (name in attrs.map) { + delete attrs.map[name]; + + i = attrs.length; + while (i--) { + if (attrs[i].name === name) { + attrs = attrs.splice(i, 1); + return self; + } + } + } + + return self; + } + + // Set attribute + if (name in attrs.map) { + // Set attribute + i = attrs.length; + while (i--) { + if (attrs[i].name === name) { + attrs[i].value = value; + break; + } + } + } else + attrs.push({name: name, value: value}); + + attrs.map[name] = value; + + return self; + } else { + return attrs.map[name]; + } + } + }, + + /** + * Does a shallow clones the node into a new node. It will also exclude id attributes since + * there should only be one id per document. + * + * @example + * var clonedNode = node.clone(); + * + * @method clone + * @return {tinymce.html.Node} New copy of the original node. + */ + clone : function() { + var self = this, clone = new Node(self.name, self.type), i, l, selfAttrs, selfAttr, cloneAttrs; + + // Clone element attributes + if (selfAttrs = self.attributes) { + cloneAttrs = []; + cloneAttrs.map = {}; + + for (i = 0, l = selfAttrs.length; i < l; i++) { + selfAttr = selfAttrs[i]; + + // Clone everything except id + if (selfAttr.name !== 'id') { + cloneAttrs[cloneAttrs.length] = {name: selfAttr.name, value: selfAttr.value}; + cloneAttrs.map[selfAttr.name] = selfAttr.value; + } + } + + clone.attributes = cloneAttrs; + } + + clone.value = self.value; + clone.shortEnded = self.shortEnded; + + return clone; + }, + + /** + * Wraps the node in in another node. + * + * @example + * node.wrap(wrapperNode); + * + * @method wrap + */ + wrap : function(wrapper) { + var self = this; + + self.parent.insert(wrapper, self); + wrapper.append(self); + + return self; + }, + + /** + * Unwraps the node in other words it removes the node but keeps the children. + * + * @example + * node.unwrap(); + * + * @method unwrap + */ + unwrap : function() { + var self = this, node, next; + + for (node = self.firstChild; node; ) { + next = node.next; + self.insert(node, self, true); + node = next; + } + + self.remove(); + }, + + /** + * Removes the node from it's parent. + * + * @example + * node.remove(); + * + * @method remove + * @return {tinymce.html.Node} Current node that got removed. + */ + remove : function() { + var self = this, parent = self.parent, next = self.next, prev = self.prev; + + if (parent) { + if (parent.firstChild === self) { + parent.firstChild = next; + + if (next) + next.prev = null; + } else { + prev.next = next; + } + + if (parent.lastChild === self) { + parent.lastChild = prev; + + if (prev) + prev.next = null; + } else { + next.prev = prev; + } + + self.parent = self.next = self.prev = null; + } + + return self; + }, + + /** + * Appends a new node as a child of the current node. + * + * @example + * node.append(someNode); + * + * @method append + * @param {tinymce.html.Node} node Node to append as a child of the current one. + * @return {tinymce.html.Node} The node that got appended. + */ + append : function(node) { + var self = this, last; + + if (node.parent) + node.remove(); + + last = self.lastChild; + if (last) { + last.next = node; + node.prev = last; + self.lastChild = node; + } else + self.lastChild = self.firstChild = node; + + node.parent = self; + + return node; + }, + + /** + * Inserts a node at a specific position as a child of the current node. + * + * @example + * parentNode.insert(newChildNode, oldChildNode); + * + * @method insert + * @param {tinymce.html.Node} node Node to insert as a child of the current node. + * @param {tinymce.html.Node} ref_node Reference node to set node before/after. + * @param {Boolean} before Optional state to insert the node before the reference node. + * @return {tinymce.html.Node} The node that got inserted. + */ + insert : function(node, ref_node, before) { + var parent; + + if (node.parent) + node.remove(); + + parent = ref_node.parent || this; + + if (before) { + if (ref_node === parent.firstChild) + parent.firstChild = node; + else + ref_node.prev.next = node; + + node.prev = ref_node.prev; + node.next = ref_node; + ref_node.prev = node; + } else { + if (ref_node === parent.lastChild) + parent.lastChild = node; + else + ref_node.next.prev = node; + + node.next = ref_node.next; + node.prev = ref_node; + ref_node.next = node; + } + + node.parent = parent; + + return node; + }, + + /** + * Get all children by name. + * + * @method getAll + * @param {String} name Name of the child nodes to collect. + * @return {Array} Array with child nodes matchin the specified name. + */ + getAll : function(name) { + var self = this, node, collection = []; + + for (node = self.firstChild; node; node = walk(node, self)) { + if (node.name === name) + collection.push(node); + } + + return collection; + }, + + /** + * Removes all children of the current node. + * + * @method empty + * @return {tinymce.html.Node} The current node that got cleared. + */ + empty : function() { + var self = this, nodes, i, node; + + // Remove all children + if (self.firstChild) { + nodes = []; + + // Collect the children + for (node = self.firstChild; node; node = walk(node, self)) + nodes.push(node); + + // Remove the children + i = nodes.length; + while (i--) { + node = nodes[i]; + node.parent = node.firstChild = node.lastChild = node.next = node.prev = null; + } + } + + self.firstChild = self.lastChild = null; + + return self; + }, + + /** + * Returns true/false if the node is to be considered empty or not. + * + * @example + * node.isEmpty({img : true}); + * @method isEmpty + * @param {Object} elements Name/value object with elements that are automatically treated as non empty elements. + * @return {Boolean} true/false if the node is empty or not. + */ + isEmpty : function(elements) { + var self = this, node = self.firstChild, i, name; + + if (node) { + do { + if (node.type === 1) { + // Ignore bogus elements + if (node.attributes.map['data-mce-bogus']) + continue; + + // Keep empty elements like + if (elements[node.name]) + return false; + + // Keep elements with data attributes or name attribute like
    + i = node.attributes.length; + while (i--) { + name = node.attributes[i].name; + if (name === "name" || name.indexOf('data-') === 0) + return false; + } + } + + // Keep non whitespace text nodes + if ((node.type === 3 && !whiteSpaceRegExp.test(node.value))) + return false; + } while (node = walk(node, self)); + } + + return true; + }, + + /** + * Walks to the next or previous node and returns that node or null if it wasn't found. + * + * @method walk + * @param {Boolean} prev Optional previous node state defaults to false. + * @return {tinymce.html.Node} Node that is next to or previous of the current node. + */ + walk : function(prev) { + return walk(this, null, prev); + } + }); + + tinymce.extend(Node, { + /** + * Creates a node of a specific type. + * + * @static + * @method create + * @param {String} name Name of the node type to create for example "b" or "#text". + * @param {Object} attrs Name/value collection of attributes that will be applied to elements. + */ + create : function(name, attrs) { + var node, attrName; + + // Create node + node = new Node(name, typeLookup[name] || 1); + + // Add attributes if needed + if (attrs) { + for (attrName in attrs) + node.attr(attrName, attrs[attrName]); + } + + return node; + } + }); + + tinymce.html.Node = Node; +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/SaxParser.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/SaxParser.js new file mode 100644 index 0000000000..67ebbd7be5 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/SaxParser.js @@ -0,0 +1,342 @@ +/** + * SaxParser.js + * + * Copyright 2010, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + /** + * This class parses HTML code using pure JavaScript and executes various events for each item it finds. It will + * always execute the events in the right order for tag soup code like

    . It will also remove elements + * and attributes that doesn't fit the schema if the validate setting is enabled. + * + * @example + * var parser = new tinymce.html.SaxParser({ + * validate: true, + * + * comment: function(text) { + * console.log('Comment:', text); + * }, + * + * cdata: function(text) { + * console.log('CDATA:', text); + * }, + * + * text: function(text, raw) { + * console.log('Text:', text, 'Raw:', raw); + * }, + * + * start: function(name, attrs, empty) { + * console.log('Start:', name, attrs, empty); + * }, + * + * end: function(name) { + * console.log('End:', name); + * }, + * + * pi: function(name, text) { + * console.log('PI:', name, text); + * }, + * + * doctype: function(text) { + * console.log('DocType:', text); + * } + * }, schema); + * @class tinymce.html.SaxParser + * @version 3.4 + */ + + /** + * Constructs a new SaxParser instance. + * + * @constructor + * @method SaxParser + * @param {Object} settings Name/value collection of settings. comment, cdata, text, start and end are callbacks. + * @param {tinymce.html.Schema} schema HTML Schema class to use when parsing. + */ + tinymce.html.SaxParser = function(settings, schema) { + var self = this, noop = function() {}; + + settings = settings || {}; + self.schema = schema = schema || new tinymce.html.Schema(); + + if (settings.fix_self_closing !== false) + settings.fix_self_closing = true; + + // Add handler functions from settings and setup default handlers + tinymce.each('comment cdata text start end pi doctype'.split(' '), function(name) { + if (name) + self[name] = settings[name] || noop; + }); + + /** + * Parses the specified HTML string and executes the callbacks for each item it finds. + * + * @example + * new SaxParser({...}).parse('text'); + * @method parse + * @param {String} html Html string to sax parse. + */ + self.parse = function(html) { + var self = this, matches, index = 0, value, endRegExp, stack = [], attrList, i, text, name, isInternalElement, removeInternalElements, + shortEndedElements, fillAttrsMap, isShortEnded, validate, elementRule, isValidElement, attr, attribsValue, + validAttributesMap, validAttributePatterns, attributesRequired, attributesDefault, attributesForced, selfClosing, + tokenRegExp, attrRegExp, specialElements, attrValue, idCount = 0, decode = tinymce.html.Entities.decode, fixSelfClosing; + + function processEndTag(name) { + var pos, i; + + // Find position of parent of the same type + pos = stack.length; + while (pos--) { + if (stack[pos].name === name) + break; + } + + // Found parent + if (pos >= 0) { + // Close all the open elements + for (i = stack.length - 1; i >= pos; i--) { + name = stack[i]; + + if (name.valid) + self.end(name.name); + } + + // Remove the open elements from the stack + stack.length = pos; + } + }; + + // Precompile RegExps and map objects + tokenRegExp = new RegExp('<(?:' + + '(?:!--([\\w\\W]*?)-->)|' + // Comment + '(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|' + // CDATA + '(?:!DOCTYPE([\\w\\W]*?)>)|' + // DOCTYPE + '(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|' + // PI + '(?:\\/([^>]+)>)|' + // End element + '(?:([^\\s\\/<>]+)\\s*((?:[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*)>)' + // Start element + ')', 'g'); + + attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g; + specialElements = { + 'script' : /<\/script[^>]*>/gi, + 'style' : /<\/style[^>]*>/gi, + 'noscript' : /<\/noscript[^>]*>/gi + }; + + // Setup lookup tables for empty elements and boolean attributes + shortEndedElements = schema.getShortEndedElements(); + selfClosing = schema.getSelfClosingElements(); + fillAttrsMap = schema.getBoolAttrs(); + validate = settings.validate; + removeInternalElements = settings.remove_internals; + fixSelfClosing = settings.fix_self_closing; + + while (matches = tokenRegExp.exec(html)) { + // Text + if (index < matches.index) + self.text(decode(html.substr(index, matches.index - index))); + + if (value = matches[6]) { // End element + processEndTag(value.toLowerCase()); + } else if (value = matches[7]) { // Start element + value = value.toLowerCase(); + isShortEnded = value in shortEndedElements; + + // Is self closing tag for example an
  • after an open
  • + if (fixSelfClosing && selfClosing[value] && stack.length > 0 && stack[stack.length - 1].name === value) + processEndTag(value); + + // Validate element + if (!validate || (elementRule = schema.getElementRule(value))) { + isValidElement = true; + + // Grab attributes map and patters when validation is enabled + if (validate) { + validAttributesMap = elementRule.attributes; + validAttributePatterns = elementRule.attributePatterns; + } + + // Parse attributes + if (attribsValue = matches[8]) { + isInternalElement = attribsValue.indexOf('data-mce-type') !== -1; // Check if the element is an internal element + + // If the element has internal attributes then remove it if we are told to do so + if (isInternalElement && removeInternalElements) + isValidElement = false; + + attrList = []; + attrList.map = {}; + + attribsValue.replace(attrRegExp, function(match, name, value, val2, val3) { + var attrRule, i; + + name = name.toLowerCase(); + value = name in fillAttrsMap ? name : decode(value || val2 || val3 || ''); // Handle boolean attribute than value attribute + + // Validate name and value + if (validate && !isInternalElement && name.indexOf('data-') !== 0) { + attrRule = validAttributesMap[name]; + + // Find rule by pattern matching + if (!attrRule && validAttributePatterns) { + i = validAttributePatterns.length; + while (i--) { + attrRule = validAttributePatterns[i]; + if (attrRule.pattern.test(name)) + break; + } + + // No rule matched + if (i === -1) + attrRule = null; + } + + // No attribute rule found + if (!attrRule) + return; + + // Validate value + if (attrRule.validValues && !(value in attrRule.validValues)) + return; + } + + // Add attribute to list and map + attrList.map[name] = value; + attrList.push({ + name: name, + value: value + }); + }); + } else { + attrList = []; + attrList.map = {}; + } + + // Process attributes if validation is enabled + if (validate && !isInternalElement) { + attributesRequired = elementRule.attributesRequired; + attributesDefault = elementRule.attributesDefault; + attributesForced = elementRule.attributesForced; + + // Handle forced attributes + if (attributesForced) { + i = attributesForced.length; + while (i--) { + attr = attributesForced[i]; + name = attr.name; + attrValue = attr.value; + + if (attrValue === '{$uid}') + attrValue = 'mce_' + idCount++; + + attrList.map[name] = attrValue; + attrList.push({name: name, value: attrValue}); + } + } + + // Handle default attributes + if (attributesDefault) { + i = attributesDefault.length; + while (i--) { + attr = attributesDefault[i]; + name = attr.name; + + if (!(name in attrList.map)) { + attrValue = attr.value; + + if (attrValue === '{$uid}') + attrValue = 'mce_' + idCount++; + + attrList.map[name] = attrValue; + attrList.push({name: name, value: attrValue}); + } + } + } + + // Handle required attributes + if (attributesRequired) { + i = attributesRequired.length; + while (i--) { + if (attributesRequired[i] in attrList.map) + break; + } + + // None of the required attributes where found + if (i === -1) + isValidElement = false; + } + + // Invalidate element if it's marked as bogus + if (attrList.map['data-mce-bogus']) + isValidElement = false; + } + + if (isValidElement) + self.start(value, attrList, isShortEnded); + } else + isValidElement = false; + + // Treat script, noscript and style a bit different since they may include code that looks like elements + if (endRegExp = specialElements[value]) { + endRegExp.lastIndex = index = matches.index + matches[0].length; + + if (matches = endRegExp.exec(html)) { + if (isValidElement) + text = html.substr(index, matches.index - index); + + index = matches.index + matches[0].length; + } else { + text = html.substr(index); + index = html.length; + } + + if (isValidElement && text.length > 0) + self.text(text, true); + + if (isValidElement) + self.end(value); + + tokenRegExp.lastIndex = index; + continue; + } + + // Push value on to stack + if (!isShortEnded) { + if (!attribsValue || attribsValue.indexOf('/') != attribsValue.length - 1) + stack.push({name: value, valid: isValidElement}); + else if (isValidElement) + self.end(value); + } + } else if (value = matches[1]) { // Comment + self.comment(value); + } else if (value = matches[2]) { // CDATA + self.cdata(value); + } else if (value = matches[3]) { // DOCTYPE + self.doctype(value); + } else if (value = matches[4]) { // PI + self.pi(value, matches[5]); + } + + index = matches.index + matches[0].length; + } + + // Text + if (index < html.length) + self.text(decode(html.substr(index))); + + // Close any open elements + for (i = stack.length - 1; i >= 0; i--) { + value = stack[i]; + + if (value.valid) + self.end(value.name); + } + }; + } +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Schema.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Schema.js new file mode 100644 index 0000000000..d602a85741 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Schema.js @@ -0,0 +1,661 @@ +/** + * Schema.js + * + * Copyright 2010, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + var transitional = {}, boolAttrMap, blockElementsMap, shortEndedElementsMap, nonEmptyElementsMap, customElementsMap = {}, + whiteSpaceElementsMap, selfClosingElementsMap, makeMap = tinymce.makeMap, each = tinymce.each; + + function split(str, delim) { + return str.split(delim || ','); + }; + + /** + * Unpacks the specified lookup and string data it will also parse it into an object + * map with sub object for it's children. This will later also include the attributes. + */ + function unpack(lookup, data) { + var key, elements = {}; + + function replace(value) { + return value.replace(/[A-Z]+/g, function(key) { + return replace(lookup[key]); + }); + }; + + // Unpack lookup + for (key in lookup) { + if (lookup.hasOwnProperty(key)) + lookup[key] = replace(lookup[key]); + } + + // Unpack and parse data into object map + replace(data).replace(/#/g, '#text').replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g, function(str, name, attributes, children) { + attributes = split(attributes, '|'); + + elements[name] = { + attributes : makeMap(attributes), + attributesOrder : attributes, + children : makeMap(children, '|', {'#comment' : {}}) + } + }); + + return elements; + }; + + // Build a lookup table for block elements both lowercase and uppercase + blockElementsMap = 'h1,h2,h3,h4,h5,h6,hr,p,div,address,pre,form,table,tbody,thead,tfoot,' + + 'th,tr,td,li,ol,ul,caption,blockquote,center,dl,dt,dd,dir,fieldset,' + + 'noscript,menu,isindex,samp,header,footer,article,section,hgroup'; + blockElementsMap = makeMap(blockElementsMap, ',', makeMap(blockElementsMap.toUpperCase())); + + // This is the XHTML 1.0 transitional elements with it's attributes and children packed to reduce it's size + transitional = unpack({ + Z : 'H|K|N|O|P', + Y : 'X|form|R|Q', + ZG : 'E|span|width|align|char|charoff|valign', + X : 'p|T|div|U|W|isindex|fieldset|table', + ZF : 'E|align|char|charoff|valign', + W : 'pre|hr|blockquote|address|center|noframes', + ZE : 'abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height', + ZD : '[E][S]', + U : 'ul|ol|dl|menu|dir', + ZC : 'p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q', + T : 'h1|h2|h3|h4|h5|h6', + ZB : 'X|S|Q', + S : 'R|P', + ZA : 'a|G|J|M|O|P', + R : 'a|H|K|N|O', + Q : 'noscript|P', + P : 'ins|del|script', + O : 'input|select|textarea|label|button', + N : 'M|L', + M : 'em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym', + L : 'sub|sup', + K : 'J|I', + J : 'tt|i|b|u|s|strike', + I : 'big|small|font|basefont', + H : 'G|F', + G : 'br|span|bdo', + F : 'object|applet|img|map|iframe', + E : 'A|B|C', + D : 'accesskey|tabindex|onfocus|onblur', + C : 'onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup', + B : 'lang|xml:lang|dir', + A : 'id|class|style|title' + }, 'script[id|charset|type|language|src|defer|xml:space][]' + + 'style[B|id|type|media|title|xml:space][]' + + 'object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]' + + 'param[id|name|value|valuetype|type][]' + + 'p[E|align][#|S]' + + 'a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]' + + 'br[A|clear][]' + + 'span[E][#|S]' + + 'bdo[A|C|B][#|S]' + + 'applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]' + + 'h1[E|align][#|S]' + + 'img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]' + + 'map[B|C|A|name][X|form|Q|area]' + + 'h2[E|align][#|S]' + + 'iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]' + + 'h3[E|align][#|S]' + + 'tt[E][#|S]' + + 'i[E][#|S]' + + 'b[E][#|S]' + + 'u[E][#|S]' + + 's[E][#|S]' + + 'strike[E][#|S]' + + 'big[E][#|S]' + + 'small[E][#|S]' + + 'font[A|B|size|color|face][#|S]' + + 'basefont[id|size|color|face][]' + + 'em[E][#|S]' + + 'strong[E][#|S]' + + 'dfn[E][#|S]' + + 'code[E][#|S]' + + 'q[E|cite][#|S]' + + 'samp[E][#|S]' + + 'kbd[E][#|S]' + + 'var[E][#|S]' + + 'cite[E][#|S]' + + 'abbr[E][#|S]' + + 'acronym[E][#|S]' + + 'sub[E][#|S]' + + 'sup[E][#|S]' + + 'input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]' + + 'select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]' + + 'optgroup[E|disabled|label][option]' + + 'option[E|selected|disabled|label|value][]' + + 'textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]' + + 'label[E|for|accesskey|onfocus|onblur][#|S]' + + 'button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]' + + 'h4[E|align][#|S]' + + 'ins[E|cite|datetime][#|Y]' + + 'h5[E|align][#|S]' + + 'del[E|cite|datetime][#|Y]' + + 'h6[E|align][#|S]' + + 'div[E|align][#|Y]' + + 'ul[E|type|compact][li]' + + 'li[E|type|value][#|Y]' + + 'ol[E|type|compact|start][li]' + + 'dl[E|compact][dt|dd]' + + 'dt[E][#|S]' + + 'dd[E][#|Y]' + + 'menu[E|compact][li]' + + 'dir[E|compact][li]' + + 'pre[E|width|xml:space][#|ZA]' + + 'hr[E|align|noshade|size|width][]' + + 'blockquote[E|cite][#|Y]' + + 'address[E][#|S|p]' + + 'center[E][#|Y]' + + 'noframes[E][#|Y]' + + 'isindex[A|B|prompt][]' + + 'fieldset[E][#|legend|Y]' + + 'legend[E|accesskey|align][#|S]' + + 'table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]' + + 'caption[E|align][#|S]' + + 'col[ZG][]' + + 'colgroup[ZG][col]' + + 'thead[ZF][tr]' + + 'tr[ZF|bgcolor][th|td]' + + 'th[E|ZE][#|Y]' + + 'form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]' + + 'noscript[E][#|Y]' + + 'td[E|ZE][#|Y]' + + 'tfoot[ZF][tr]' + + 'tbody[ZF][tr]' + + 'area[E|D|shape|coords|href|nohref|alt|target][]' + + 'base[id|href|target][]' + + 'body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]' + ); + + boolAttrMap = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,autoplay,loop,controls'); + shortEndedElementsMap = makeMap('area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source'); + nonEmptyElementsMap = tinymce.extend(makeMap('td,th,iframe,video,audio,object'), shortEndedElementsMap); + whiteSpaceElementsMap = makeMap('pre,script,style,textarea'); + selfClosingElementsMap = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); + + /** + * Schema validator class. + * + * @class tinymce.html.Schema + * @example + * if (tinymce.activeEditor.schema.isValidChild('p', 'span')) + * alert('span is valid child of p.'); + * + * if (tinymce.activeEditor.schema.getElementRule('p')) + * alert('P is a valid element.'); + * + * @class tinymce.html.Schema + * @version 3.4 + */ + + /** + * Constructs a new Schema instance. + * + * @constructor + * @method Schema + * @param {Object} settings Name/value settings object. + */ + tinymce.html.Schema = function(settings) { + var self = this, elements = {}, children = {}, patternElements = [], validStyles; + + settings = settings || {}; + + // Allow all elements and attributes if verify_html is set to false + if (settings.verify_html === false) + settings.valid_elements = '*[*]'; + + // Build styles list + if (settings.valid_styles) { + validStyles = {}; + + // Convert styles into a rule list + each(settings.valid_styles, function(value, key) { + validStyles[key] = tinymce.explode(value); + }); + } + + // Converts a wildcard expression string to a regexp for example *a will become /.*a/. + function patternToRegExp(str) { + return new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$'); + }; + + // Parses the specified valid_elements string and adds to the current rules + // This function is a bit hard to read since it's heavily optimized for speed + function addValidElements(valid_elements) { + var ei, el, ai, al, yl, matches, element, attr, attrData, elementName, attrName, attrType, attributes, attributesOrder, + prefix, outputName, globalAttributes, globalAttributesOrder, transElement, key, childKey, value, + elementRuleRegExp = /^([#+-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/, + attrRuleRegExp = /^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/, + hasPatternsRegExp = /[*?+]/; + + if (valid_elements) { + // Split valid elements into an array with rules + valid_elements = split(valid_elements); + + if (elements['@']) { + globalAttributes = elements['@'].attributes; + globalAttributesOrder = elements['@'].attributesOrder; + } + + // Loop all rules + for (ei = 0, el = valid_elements.length; ei < el; ei++) { + // Parse element rule + matches = elementRuleRegExp.exec(valid_elements[ei]); + if (matches) { + // Setup local names for matches + prefix = matches[1]; + elementName = matches[2]; + outputName = matches[3]; + attrData = matches[4]; + + // Create new attributes and attributesOrder + attributes = {}; + attributesOrder = []; + + // Create the new element + element = { + attributes : attributes, + attributesOrder : attributesOrder + }; + + // Padd empty elements prefix + if (prefix === '#') + element.paddEmpty = true; + + // Remove empty elements prefix + if (prefix === '-') + element.removeEmpty = true; + + // Copy attributes from global rule into current rule + if (globalAttributes) { + for (key in globalAttributes) + attributes[key] = globalAttributes[key]; + + attributesOrder.push.apply(attributesOrder, globalAttributesOrder); + } + + // Attributes defined + if (attrData) { + attrData = split(attrData, '|'); + for (ai = 0, al = attrData.length; ai < al; ai++) { + matches = attrRuleRegExp.exec(attrData[ai]); + if (matches) { + attr = {}; + attrType = matches[1]; + attrName = matches[2].replace(/::/g, ':'); + prefix = matches[3]; + value = matches[4]; + + // Required + if (attrType === '!') { + element.attributesRequired = element.attributesRequired || []; + element.attributesRequired.push(attrName); + attr.required = true; + } + + // Denied from global + if (attrType === '-') { + delete attributes[attrName]; + attributesOrder.splice(tinymce.inArray(attributesOrder, attrName), 1); + continue; + } + + // Default value + if (prefix) { + // Default value + if (prefix === '=') { + element.attributesDefault = element.attributesDefault || []; + element.attributesDefault.push({name: attrName, value: value}); + attr.defaultValue = value; + } + + // Forced value + if (prefix === ':') { + element.attributesForced = element.attributesForced || []; + element.attributesForced.push({name: attrName, value: value}); + attr.forcedValue = value; + } + + // Required values + if (prefix === '<') + attr.validValues = makeMap(value, '?'); + } + + // Check for attribute patterns + if (hasPatternsRegExp.test(attrName)) { + element.attributePatterns = element.attributePatterns || []; + attr.pattern = patternToRegExp(attrName); + element.attributePatterns.push(attr); + } else { + // Add attribute to order list if it doesn't already exist + if (!attributes[attrName]) + attributesOrder.push(attrName); + + attributes[attrName] = attr; + } + } + } + } + + // Global rule, store away these for later usage + if (!globalAttributes && elementName == '@') { + globalAttributes = attributes; + globalAttributesOrder = attributesOrder; + } + + // Handle substitute elements such as b/strong + if (outputName) { + element.outputName = elementName; + elements[outputName] = element; + } + + // Add pattern or exact element + if (hasPatternsRegExp.test(elementName)) { + element.pattern = patternToRegExp(elementName); + patternElements.push(element); + } else + elements[elementName] = element; + } + } + } + }; + + function setValidElements(valid_elements) { + elements = {}; + patternElements = []; + + addValidElements(valid_elements); + + each(transitional, function(element, name) { + children[name] = element.children; + }); + }; + + // Adds custom non HTML elements to the schema + function addCustomElements(custom_elements) { + var customElementRegExp = /^(~)?(.+)$/; + + if (custom_elements) { + each(split(custom_elements), function(rule) { + var matches = customElementRegExp.exec(rule), + inline = matches[1] === '~', + cloneName = inline ? 'span' : 'div', + name = matches[2]; + + children[name] = children[cloneName]; + customElementsMap[name] = cloneName; + + // If it's not marked as inline then add it to valid block elements + if (!inline) + blockElementsMap[name] = {}; + + // Add custom elements at span/div positions + each(children, function(element, child) { + if (element[cloneName]) + element[name] = element[cloneName]; + }); + }); + } + }; + + // Adds valid children to the schema object + function addValidChildren(valid_children) { + var childRuleRegExp = /^([+\-]?)(\w+)\[([^\]]+)\]$/; + + if (valid_children) { + each(split(valid_children), function(rule) { + var matches = childRuleRegExp.exec(rule), parent, prefix; + + if (matches) { + prefix = matches[1]; + + // Add/remove items from default + if (prefix) + parent = children[matches[2]]; + else + parent = children[matches[2]] = {'#comment' : {}}; + + parent = children[matches[2]]; + + each(split(matches[3], '|'), function(child) { + if (prefix === '-') + delete parent[child]; + else + parent[child] = {}; + }); + } + }); + } + }; + + function getElementRule(name) { + var element = elements[name], i; + + // Exact match found + if (element) + return element; + + // No exact match then try the patterns + i = patternElements.length; + while (i--) { + element = patternElements[i]; + + if (element.pattern.test(name)) + return element; + } + }; + + if (!settings.valid_elements) { + // No valid elements defined then clone the elements from the transitional spec + each(transitional, function(element, name) { + elements[name] = { + attributes : element.attributes, + attributesOrder : element.attributesOrder + }; + + children[name] = element.children; + }); + + // Switch these + each(split('strong/b,em/i'), function(item) { + item = split(item, '/'); + elements[item[1]].outputName = item[0]; + }); + + // Add default alt attribute for images + elements.img.attributesDefault = [{name: 'alt', value: ''}]; + + // Remove these if they are empty by default + each(split('ol,ul,sub,sup,blockquote,span,font,a,table,tbody,tr'), function(name) { + elements[name].removeEmpty = true; + }); + + // Padd these by default + each(split('p,h1,h2,h3,h4,h5,h6,th,td,pre,div,address,caption'), function(name) { + elements[name].paddEmpty = true; + }); + } else + setValidElements(settings.valid_elements); + + addCustomElements(settings.custom_elements); + addValidChildren(settings.valid_children); + addValidElements(settings.extended_valid_elements); + + // Todo: Remove this when we fix list handling to be valid + addValidChildren('+ol[ul|ol],+ul[ul|ol]'); + + // If the user didn't allow span only allow internal spans + if (!getElementRule('span')) + addValidElements('span[!data-mce-type|*]'); + + // Delete invalid elements + if (settings.invalid_elements) { + tinymce.each(tinymce.explode(settings.invalid_elements), function(item) { + if (elements[item]) + delete elements[item]; + }); + } + + /** + * Name/value map object with valid parents and children to those parents. + * + * @example + * children = { + * div:{p:{}, h1:{}} + * }; + * @field children + * @type {Object} + */ + self.children = children; + + /** + * Name/value map object with valid styles for each element. + * + * @field styles + * @type {Object} + */ + self.styles = validStyles; + + /** + * Returns a map with boolean attributes. + * + * @method getBoolAttrs + * @return {Object} Name/value lookup map for boolean attributes. + */ + self.getBoolAttrs = function() { + return boolAttrMap; + }; + + /** + * Returns a map with block elements. + * + * @method getBoolAttrs + * @return {Object} Name/value lookup map for block elements. + */ + self.getBlockElements = function() { + return blockElementsMap; + }; + + /** + * Returns a map with short ended elements such as BR or IMG. + * + * @method getShortEndedElements + * @return {Object} Name/value lookup map for short ended elements. + */ + self.getShortEndedElements = function() { + return shortEndedElementsMap; + }; + + /** + * Returns a map with self closing tags such as
  • . + * + * @method getSelfClosingElements + * @return {Object} Name/value lookup map for self closing tags elements. + */ + self.getSelfClosingElements = function() { + return selfClosingElementsMap; + }; + + /** + * Returns a map with elements that should be treated as contents regardless if it has text + * content in them or not such as TD, VIDEO or IMG. + * + * @method getNonEmptyElements + * @return {Object} Name/value lookup map for non empty elements. + */ + self.getNonEmptyElements = function() { + return nonEmptyElementsMap; + }; + + /** + * Returns a map with elements where white space is to be preserved like PRE or SCRIPT. + * + * @method getWhiteSpaceElements + * @return {Object} Name/value lookup map for white space elements. + */ + self.getWhiteSpaceElements = function() { + return whiteSpaceElementsMap; + }; + + /** + * Returns true/false if the specified element and it's child is valid or not + * according to the schema. + * + * @method isValidChild + * @param {String} name Element name to check for. + * @param {String} child Element child to verify. + * @return {Boolean} True/false if the element is a valid child of the specified parent. + */ + self.isValidChild = function(name, child) { + var parent = children[name]; + + return !!(parent && parent[child]); + }; + + /** + * Returns true/false if the specified element is valid or not + * according to the schema. + * + * @method getElementRule + * @param {String} name Element name to check for. + * @return {Object} Element object or undefined if the element isn't valid. + */ + self.getElementRule = getElementRule; + + /** + * Returns an map object of all custom elements. + * + * @method getCustomElements + * @return {Object} Name/value map object of all custom elements. + */ + self.getCustomElements = function() { + return customElementsMap; + }; + + /** + * Parses a valid elements string and adds it to the schema. The valid elements format is for example "element[attr=default|otherattr]". + * Existing rules will be replaced with the ones specified, so this extends the schema. + * + * @method addValidElements + * @param {String} valid_elements String in the valid elements format to be parsed. + */ + self.addValidElements = addValidElements; + + /** + * Parses a valid elements string and sets it to the schema. The valid elements format is for example "element[attr=default|otherattr]". + * Existing rules will be replaced with the ones specified, so this extends the schema. + * + * @method setValidElements + * @param {String} valid_elements String in the valid elements format to be parsed. + */ + self.setValidElements = setValidElements; + + /** + * Adds custom non HTML elements to the schema. + * + * @method addCustomElements + * @param {String} custom_elements Comma separated list of custom elements to add. + */ + self.addCustomElements = addCustomElements; + + /** + * Parses a valid children string and adds them to the schema structure. The valid children format is for example: "element[child1|child2]". + * + * @method addValidChildren + * @param {String} valid_children Valid children elements string to parse + */ + self.addValidChildren = addValidChildren; + }; + + // Expose boolMap and blockElementMap as static properties for usage in DOMUtils + tinymce.html.Schema.boolAttrMap = boolAttrMap; + tinymce.html.Schema.blockElementsMap = blockElementsMap; +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Serializer.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Serializer.js new file mode 100644 index 0000000000..b74e223d94 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Serializer.js @@ -0,0 +1,152 @@ +/** + * Serializer.js + * + * Copyright 2010, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + /** + * This class is used to serialize down the DOM tree into a string using a Writer instance. + * + * + * @example + * new tinymce.html.Serializer().serialize(new tinymce.html.DomParser().parse('

    text

    ')); + * @class tinymce.html.Serializer + * @version 3.4 + */ + + /** + * Constructs a new Serializer instance. + * + * @constructor + * @method Serializer + * @param {Object} settings Name/value settings object. + * @param {tinymce.html.Schema} schema Schema instance to use. + */ + tinymce.html.Serializer = function(settings, schema) { + var self = this, writer = new tinymce.html.Writer(settings); + + settings = settings || {}; + settings.validate = "validate" in settings ? settings.validate : true; + + self.schema = schema = schema || new tinymce.html.Schema(); + self.writer = writer; + + /** + * Serializes the specified node into a string. + * + * @example + * new tinymce.html.Serializer().serialize(new tinymce.html.DomParser().parse('

    text

    ')); + * @method serialize + * @param {tinymce.html.Node} node Node instance to serialize. + * @return {String} String with HTML based on DOM tree. + */ + self.serialize = function(node) { + var handlers, validate; + + validate = settings.validate; + + handlers = { + // #text + 3: function(node, raw) { + writer.text(node.value, node.raw); + }, + + // #comment + 8: function(node) { + writer.comment(node.value); + }, + + // Processing instruction + 7: function(node) { + writer.pi(node.name, node.value); + }, + + // Doctype + 10: function(node) { + writer.doctype(node.value); + }, + + // CDATA + 4: function(node) { + writer.cdata(node.value); + }, + + // Document fragment + 11: function(node) { + if ((node = node.firstChild)) { + do { + walk(node); + } while (node = node.next); + } + } + }; + + writer.reset(); + + function walk(node) { + var handler = handlers[node.type], name, isEmpty, attrs, attrName, attrValue, sortedAttrs, i, l, elementRule; + + if (!handler) { + name = node.name; + isEmpty = node.shortEnded; + attrs = node.attributes; + + // Sort attributes + if (validate && attrs && attrs.length > 1) { + sortedAttrs = []; + sortedAttrs.map = {}; + + elementRule = schema.getElementRule(node.name); + for (i = 0, l = elementRule.attributesOrder.length; i < l; i++) { + attrName = elementRule.attributesOrder[i]; + + if (attrName in attrs.map) { + attrValue = attrs.map[attrName]; + sortedAttrs.map[attrName] = attrValue; + sortedAttrs.push({name: attrName, value: attrValue}); + } + } + + for (i = 0, l = attrs.length; i < l; i++) { + attrName = attrs[i].name; + + if (!(attrName in sortedAttrs.map)) { + attrValue = attrs.map[attrName]; + sortedAttrs.map[attrName] = attrValue; + sortedAttrs.push({name: attrName, value: attrValue}); + } + } + + attrs = sortedAttrs; + } + + writer.start(node.name, attrs, isEmpty); + + if (!isEmpty) { + if ((node = node.firstChild)) { + do { + walk(node); + } while (node = node.next); + } + + writer.end(name); + } + } else + handler(node); + } + + // Serialize element and treat all non elements as fragments + if (node.type == 1 && !settings.inner) + walk(node); + else + handlers[11](node); + + return writer.getContent(); + }; + } +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Styles.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Styles.js new file mode 100644 index 0000000000..1324cfba3e --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Styles.js @@ -0,0 +1,279 @@ +/** + * Styles.js + * + * Copyright 2010, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +/** + * This class is used to parse CSS styles it also compresses styles to reduce the output size. + * + * @example + * var Styles = new tinymce.html.Styles({ + * url_converter: function(url) { + * return url; + * } + * }); + * + * styles = Styles.parse('border: 1px solid red'); + * styles.color = 'red'; + * + * console.log(new tinymce.html.StyleSerializer().serialize(styles)); + * + * @class tinymce.html.Styles + * @version 3.4 + */ +tinymce.html.Styles = function(settings, schema) { + var rgbRegExp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi, + urlOrStrRegExp = /(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi, + styleRegExp = /\s*([^:]+):\s*([^;]+);?/g, + trimRightRegExp = /\s+$/, + urlColorRegExp = /rgb/, + undef, i, encodingLookup = {}, encodingItems; + + settings = settings || {}; + + encodingItems = '\\" \\\' \\; \\: ; : \uFEFF'.split(' '); + for (i = 0; i < encodingItems.length; i++) { + encodingLookup[encodingItems[i]] = '\uFEFF' + i; + encodingLookup['\uFEFF' + i] = encodingItems[i]; + } + + function toHex(match, r, g, b) { + function hex(val) { + val = parseInt(val).toString(16); + + return val.length > 1 ? val : '0' + val; // 0 -> 00 + }; + + return '#' + hex(r) + hex(g) + hex(b); + }; + + return { + /** + * Parses the specified RGB color value and returns a hex version of that color. + * + * @method toHex + * @param {String} color RGB string value like rgb(1,2,3) + * @return {String} Hex version of that RGB value like #FF00FF. + */ + toHex : function(color) { + return color.replace(rgbRegExp, toHex); + }, + + /** + * Parses the specified style value into an object collection. This parser will also + * merge and remove any redundant items that browsers might have added. It will also convert non hex + * colors to hex values. Urls inside the styles will also be converted to absolute/relative based on settings. + * + * @method parse + * @param {String} css Style value to parse for example: border:1px solid red;. + * @return {Object} Object representation of that style like {border : '1px solid red'} + */ + parse : function(css) { + var styles = {}, matches, name, value, isEncoded, urlConverter = settings.url_converter, urlConverterScope = settings.url_converter_scope || this; + + function compress(prefix, suffix) { + var top, right, bottom, left; + + // Get values and check it it needs compressing + top = styles[prefix + '-top' + suffix]; + if (!top) + return; + + right = styles[prefix + '-right' + suffix]; + if (top != right) + return; + + bottom = styles[prefix + '-bottom' + suffix]; + if (right != bottom) + return; + + left = styles[prefix + '-left' + suffix]; + if (bottom != left) + return; + + // Compress + styles[prefix + suffix] = left; + delete styles[prefix + '-top' + suffix]; + delete styles[prefix + '-right' + suffix]; + delete styles[prefix + '-bottom' + suffix]; + delete styles[prefix + '-left' + suffix]; + }; + + /** + * Checks if the specific style can be compressed in other words if all border-width are equal. + */ + function canCompress(key) { + var value = styles[key], i; + + if (!value || value.indexOf(' ') < 0) + return; + + value = value.split(' '); + i = value.length; + while (i--) { + if (value[i] !== value[0]) + return false; + } + + styles[key] = value[0]; + + return true; + }; + + /** + * Compresses multiple styles into one style. + */ + function compress2(target, a, b, c) { + if (!canCompress(a)) + return; + + if (!canCompress(b)) + return; + + if (!canCompress(c)) + return; + + // Compress + styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c]; + delete styles[a]; + delete styles[b]; + delete styles[c]; + }; + + // Encodes the specified string by replacing all \" \' ; : with _ + function encode(str) { + isEncoded = true; + + return encodingLookup[str]; + }; + + // Decodes the specified string by replacing all _ with it's original value \" \' etc + // It will also decode the \" \' if keep_slashes is set to fale or omitted + function decode(str, keep_slashes) { + if (isEncoded) { + str = str.replace(/\uFEFF[0-9]/g, function(str) { + return encodingLookup[str]; + }); + } + + if (!keep_slashes) + str = str.replace(/\\([\'\";:])/g, "$1"); + + return str; + } + + if (css) { + // Encode \" \' % and ; and : inside strings so they don't interfere with the style parsing + css = css.replace(/\\[\"\';:\uFEFF]/g, encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, function(str) { + return str.replace(/[;:]/g, encode); + }); + + // Parse styles + while (matches = styleRegExp.exec(css)) { + name = matches[1].replace(trimRightRegExp, '').toLowerCase(); + value = matches[2].replace(trimRightRegExp, ''); + + if (name && value.length > 0) { + // Opera will produce 700 instead of bold in their style values + if (name === 'font-weight' && value === '700') + value = 'bold'; + else if (name === 'color' || name === 'background-color') // Lowercase colors like RED + value = value.toLowerCase(); + + // Convert RGB colors to HEX + value = value.replace(rgbRegExp, toHex); + + // Convert URLs and force them into url('value') format + value = value.replace(urlOrStrRegExp, function(match, url, url2, url3, str, str2) { + str = str || str2; + + if (str) { + str = decode(str); + + // Force strings into single quote format + return "'" + str.replace(/\'/g, "\\'") + "'"; + } + + url = decode(url || url2 || url3); + + // Convert the URL to relative/absolute depending on config + if (urlConverter) + url = urlConverter.call(urlConverterScope, url, 'style'); + + // Output new URL format + return "url('" + url.replace(/\'/g, "\\'") + "')"; + }); + + styles[name] = isEncoded ? decode(value, true) : value; + } + + styleRegExp.lastIndex = matches.index + matches[0].length; + } + + // Compress the styles to reduce it's size for example IE will expand styles + compress("border", ""); + compress("border", "-width"); + compress("border", "-color"); + compress("border", "-style"); + compress("padding", ""); + compress("margin", ""); + compress2('border', 'border-width', 'border-style', 'border-color'); + + // Remove pointless border, IE produces these + if (styles.border === 'medium none') + delete styles.border; + } + + return styles; + }, + + /** + * Serializes the specified style object into a string. + * + * @method serialize + * @param {Object} styles Object to serialize as string for example: {border : '1px solid red'} + * @param {String} element_name Optional element name, if specified only the styles that matches the schema will be serialized. + * @return {String} String representation of the style object for example: border: 1px solid red. + */ + serialize : function(styles, element_name) { + var css = '', name, value; + + function serializeStyles(name) { + var styleList, i, l, value; + + styleList = schema.styles[name]; + if (styleList) { + for (i = 0, l = styleList.length; i < l; i++) { + name = styleList[i]; + value = styles[name]; + + if (value !== undef && value.length > 0) + css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';'; + } + } + }; + + // Serialize styles according to schema + if (element_name && schema && schema.styles) { + // Serialize global styles and element specific styles + serializeStyles('*'); + serializeStyles(element_name); + } else { + // Output the styles in the order they are inside the object + for (name in styles) { + value = styles[name]; + + if (value !== undef && value.length > 0) + css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';'; + } + } + + return css; + } + }; +}; diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Writer.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Writer.js new file mode 100644 index 0000000000..8010a0b8f3 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/html/Writer.js @@ -0,0 +1,186 @@ +/** + * Writer.js + * + * Copyright 2010, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +/** + * This class is used to write HTML tags out it can be used with the Serializer or the SaxParser. + * + * @class tinymce.html.Writer + * @example + * var writer = new tinymce.html.Writer({indent : true}); + * var parser = new tinymce.html.SaxParser(writer).parse('


    '); + * console.log(writer.getContent()); + * + * @class tinymce.html.Writer + * @version 3.4 + */ + +/** + * Constructs a new Writer instance. + * + * @constructor + * @method Writer + * @param {Object} settings Name/value settings object. + */ +tinymce.html.Writer = function(settings) { + var html = [], indent, indentBefore, indentAfter, encode, htmlOutput; + + settings = settings || {}; + indent = settings.indent; + indentBefore = tinymce.makeMap(settings.indent_before || ''); + indentAfter = tinymce.makeMap(settings.indent_after || ''); + encode = tinymce.html.Entities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities); + htmlOutput = settings.element_format == "html"; + + return { + /** + * Writes the a start element such as

    . + * + * @method start + * @param {String} name Name of the element. + * @param {Array} attrs Optional attribute array or undefined if it hasn't any. + * @param {Boolean} empty Optional empty state if the tag should end like
    . + */ + start: function(name, attrs, empty) { + var i, l, attr, value; + + if (indent && indentBefore[name] && html.length > 0) { + value = html[html.length - 1]; + + if (value.length > 0 && value !== '\n') + html.push('\n'); + } + + html.push('<', name); + + if (attrs) { + for (i = 0, l = attrs.length; i < l; i++) { + attr = attrs[i]; + html.push(' ', attr.name, '="', encode(attr.value, true), '"'); + } + } + + if (!empty || htmlOutput) + html[html.length] = '>'; + else + html[html.length] = ' />'; + + if (empty && indent && indentAfter[name] && html.length > 0) { + value = html[html.length - 1]; + + if (value.length > 0 && value !== '\n') + html.push('\n'); + } + }, + + /** + * Writes the a end element such as

    . + * + * @method end + * @param {String} name Name of the element. + */ + end: function(name) { + var value; + + /*if (indent && indentBefore[name] && html.length > 0) { + value = html[html.length - 1]; + + if (value.length > 0 && value !== '\n') + html.push('\n'); + }*/ + + html.push(''); + + if (indent && indentAfter[name] && html.length > 0) { + value = html[html.length - 1]; + + if (value.length > 0 && value !== '\n') + html.push('\n'); + } + }, + + /** + * Writes a text node. + * + * @method text + * @param {String} text String to write out. + * @param {Boolean} raw Optional raw state if true the contents wont get encoded. + */ + text: function(text, raw) { + if (text.length > 0) + html[html.length] = raw ? text : encode(text); + }, + + /** + * Writes a cdata node such as . + * + * @method cdata + * @param {String} text String to write out inside the cdata. + */ + cdata: function(text) { + html.push(''); + }, + + /** + * Writes a comment node such as . + * + * @method cdata + * @param {String} text String to write out inside the comment. + */ + comment: function(text) { + html.push(''); + }, + + /** + * Writes a PI node such as . + * + * @method pi + * @param {String} name Name of the pi. + * @param {String} text String to write out inside the pi. + */ + pi: function(name, text) { + if (text) + html.push(''); + else + html.push(''); + + if (indent) + html.push('\n'); + }, + + /** + * Writes a doctype node such as . + * + * @method doctype + * @param {String} text String to write out inside the doctype. + */ + doctype: function(text) { + html.push('', indent ? '\n' : ''); + }, + + /** + * Resets the internal buffer if one wants to reuse the writer. + * + * @method reset + */ + reset: function() { + html.length = 0; + }, + + /** + * Returns the contents that got serialized. + * + * @method getContent + * @return {String} HTML contents that got written down. + */ + getContent: function() { + return html.join('').replace(/\n$/, ''); + } + }; +}; diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/tinymce.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/tinymce.js index 3483e445da..f5c6a57dc6 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/tinymce.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/tinymce.js @@ -94,6 +94,33 @@ */ t.isIE6 = t.isIE && /MSIE [56]/.test(ua); + /** + * Constant that is true if the browser is IE 7. + * + * @property isIE7 + * @type Boolean + * @final + */ + t.isIE7 = t.isIE && /MSIE [7]/.test(ua); + + /** + * Constant that is true if the browser is IE 8. + * + * @property isIE8 + * @type Boolean + * @final + */ + t.isIE8 = t.isIE && /MSIE [8]/.test(ua); + + /** + * Constant that is true if the browser is IE 9. + * + * @property isIE9 + * @type Boolean + * @final + */ + t.isIE9 = t.isIE && /MSIE [9]/.test(ua); + /** * Constant that is true if the browser is Gecko. * @@ -129,6 +156,15 @@ * @final */ t.isIDevice = /(iPad|iPhone)/.test(ua); + + /** + * Constant that is true if the current browser is running on iOS 5 or greater. + * + * @property isIOS5 + * @type Boolean + * @final + */ + t.isIOS5 = t.isIDevice && ua.match(/AppleWebKit\/(\d*)/)[1]>=534; // TinyMCE .NET webcontrol might be setting the values for TinyMCE if (win.tinyMCEPreInit) { @@ -213,6 +249,33 @@ return typeof(o) == t; }, + /** + * Makes a name/object map out of an array with names. + * + * @method makeMap + * @param {Array/String} items Items to make map out of. + * @param {String} delim Optional delimiter to split string by. + * @param {Object} map Optional map to add items to. + * @return {Object} Name/value map of items. + */ + makeMap : function(items, delim, map) { + var i; + + items = items || []; + delim = delim || ','; + + if (typeof(items) == "string") + items = items.split(delim); + + map = map || {}; + + i = items.length; + while (i--) + map[items[i]] = {}; + + return map; + }, + /** * Performs an iteration of all items in a collection such as an object or array. This method will execure the * callback function for each item in the collection, if the callback returns false the iteration will terminate. @@ -223,8 +286,14 @@ * @param {function} cb Callback function to execute for each item. * @param {Object} s Optional scope to execute the callback in. * @example - * tinymce.each([1, 2, 3], function(v, i) { - * console.log(i + '=' + v); + * // Iterate an array + * tinymce.each([1,2,3], function(v, i) { + * console.debug("Value: " + v + ", Index: " + i); + * }); + * + * // Iterate an object + * tinymce.each({a : 1, b : 2, c: 3], function(v, k) { + * console.debug("Value: " + v + ", Key: " + k); * }); */ each : function(o, cb, s) { @@ -283,6 +352,9 @@ * @param {Array} a Array of items to loop though. * @param {function} f Function to call for each item. Include/exclude depends on it's return value. * @return {Array} New array with values imported and filtered based in input. + * @example + * // Filter out some items, this will return an array with 4 and 5 + * var items = tinymce.grep([1,2,3,4,5], function(v) {return v > 3;}); */ grep : function(a, f) { var o = []; @@ -302,6 +374,9 @@ * @param {Array} a Array/Object to search for value in. * @param {Object} v Value to check for inside the array. * @return {Number/String} Index of item inside the array inside an object. Or -1 if it wasn't found. + * @example + * // Get index of value in array this will alert 1 since 2 is at that index + * alert(tinymce.inArray([1,2,3], 2)); */ inArray : function(a, v) { var i, l; @@ -323,6 +398,15 @@ * @param {Object} o Object to extend with new items. * @param {Object} e..n Object(s) to extend the specified object with. * @return {Object} o New extended object, same reference as the input object. + * @example + * // Extends obj1 with two new fields + * var obj = tinymce.extend(obj1, { + * somefield1 : 'a', + * somefield2 : 'a' + * }); + * + * // Extends obj with obj2 and obj3 + * tinymce.extend(obj, obj2, obj3); */ extend : function(o, e) { var i, l, a = arguments; @@ -358,9 +442,47 @@ * * @method create * @param {String} s Class name, inheritage and prefix. - * @param {Object} o Collection of methods to add to the class. + * @param {Object} p Collection of methods to add to the class. + * @param {Object} root Optional root object defaults to the global window object. + * @example + * // Creates a basic class + * tinymce.create('tinymce.somepackage.SomeClass', { + * SomeClass : function() { + * // Class constructor + * }, + * + * method : function() { + * // Some method + * } + * }); + * + * // Creates a basic subclass class + * tinymce.create('tinymce.somepackage.SomeSubClass:tinymce.somepackage.SomeClass', { + * SomeSubClass: function() { + * // Class constructor + * this.parent(); // Call parent constructor + * }, + * + * method : function() { + * // Some method + * this.parent(); // Call parent method + * }, + * + * 'static' : { + * staticMethod : function() { + * // Static method + * } + * } + * }); + * + * // Creates a singleton/static class + * tinymce.create('static tinymce.somepackage.SomeSingletonClass', { + * method : function() { + * // Some method + * } + * }); */ - create : function(s, p) { + create : function(s, p, root) { var t = this, sp, ns, cn, scn, c, de = 0; // Parse : : @@ -368,7 +490,7 @@ cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name // Create namespace for new class - ns = t.createNS(s[3].replace(/\.\w+$/, '')); + ns = t.createNS(s[3].replace(/\.\w+$/, ''), root); // Class already exists if (ns[cn]) @@ -476,6 +598,16 @@ * @param {String} n Namespace to create for example a.b.c.d. * @param {Object} o Optional object to add namespace to, defaults to window. * @return {Object} New namespace object the last item in path. + * @example + * // Create some namespace + * tinymce.createNS('tinymce.somepackage.subpackage'); + * + * // Add a singleton + * var tinymce.somepackage.subpackage.SomeSingleton = { + * method : function() { + * // Some method + * } + * }; */ createNS : function(n, o) { var i, v; @@ -502,6 +634,9 @@ * @param {String} n Path to resolve for example a.b.c.d. * @param {Object} o Optional object to search though, defaults to window. * @return {Object} Last object in path or null if it couldn't be resolved. + * @example + * // Resolve a path into an object reference + * var obj = tinymce.resolve('a.b.c.d'); */ resolve : function(n, o) { var i, l; @@ -527,6 +662,12 @@ * @param {function} f Function to execute before the document gets unloaded. * @param {Object} s Optional scope to execute the function in. * @return {function} Returns the specified unload handler function. + * @example + * // Fixes a leak with a DOM element that was palces in the someObject + * tinymce.addUnload(function() { + * // Null DOM element to reduce IE memory leak + * someObject.someElement = null; + * }); */ addUnload : function(f, s) { var t = this; @@ -634,6 +775,9 @@ * @method explode * @param {string} s String to split. * @param {string} d Delimiter to split by. + * @example + * // Split a string into an array with a,b,c + * var arr = tinymce.explode('a, b, c'); */ explode : function(s, d) { return s ? tinymce.map(s.split(d || ','), tinymce.trim) : s; @@ -684,4 +828,42 @@ // Expose tinymce namespace to the global namespace (window) win.tinymce = win.tinyMCE = tinymce; -})(window); \ No newline at end of file + + // Describe the different namespaces + + /** + * Root level namespace this contains classes directly releated to the TinyMCE editor. + * + * @namespace tinymce + */ + + /** + * Contains classes for handling the browsers DOM. + * + * @namespace tinymce.dom + */ + + /** + * Contains html parser and serializer logic. + * + * @namespace tinymce.html + */ + + /** + * Contains the different UI types such as buttons, listboxes etc. + * + * @namespace tinymce.ui + */ + + /** + * Contains various utility classes such as json parser, cookies etc. + * + * @namespace tinymce.util + */ + + /** + * Contains plugin classes. + * + * @namespace tinymce.plugins + */ +})(window); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Button.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Button.js index e7a53054cd..c9115d531a 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Button.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Button.js @@ -26,9 +26,10 @@ * @method Button * @param {String} id Control id for the button. * @param {Object} s Optional name/value settings object. + * @param {Editor} ed Optional the editor instance this button is for. */ - Button : function(id, s) { - this.parent(id, s); + Button : function(id, s, ed) { + this.parent(id, s, ed); this.classPrefix = 'mceButton'; }, @@ -43,13 +44,14 @@ var cp = this.classPrefix, s = this.settings, h, l; l = DOM.encode(s.label || ''); - h = ''; - - if (s.image) - h += '' + l + ''; + h = ''; + if (s.image && !(this.editor &&this.editor.forcedHighContrastMode) ) + h += '' + DOM.encode(s.title) + '' + l; else - h += '' + (l ? '' + l + '' : '') + ''; + h += '' + (l ? '' + l + '' : ''); + h += ''; + h += ''; return h; }, diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ColorSplitButton.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ColorSplitButton.js index 9391dc8862..ae6bfdd6b3 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ColorSplitButton.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ColorSplitButton.js @@ -26,11 +26,12 @@ * @method ColorSplitButton * @param {String} id Control id for the color split button. * @param {Object} s Optional name/value settings object. + * @param {Editor} ed The editor instance this button is for. */ - ColorSplitButton : function(id, s) { + ColorSplitButton : function(id, s, ed) { var t = this; - t.parent(id, s); + t.parent(id, s, ed); /** * Settings object. @@ -123,20 +124,20 @@ hideMenu : function(e) { var t = this; - // Prevent double toogles by canceling the mouse click event to the button - if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id + '_open';})) - return; - - if (!e || !DOM.getParent(e.target, '.mceSplitButtonMenu')) { - DOM.removeClass(t.id, 'mceSplitButtonSelected'); - Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); - Event.remove(t.id + '_menu', 'keydown', t._keyHandler); - DOM.hide(t.id + '_menu'); - } + if (t.isMenuVisible) { + // Prevent double toogles by canceling the mouse click event to the button + if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id + '_open';})) + return; - t.onHideMenu.dispatch(t); + if (!e || !DOM.getParent(e.target, '.mceSplitButtonMenu')) { + DOM.removeClass(t.id, 'mceSplitButtonSelected'); + Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); + Event.remove(t.id + '_menu', 'keydown', t._keyHandler); + DOM.hide(t.id + '_menu'); + } - t.isMenuVisible = 0; + t.isMenuVisible = 0; + } }, /** @@ -145,13 +146,13 @@ * @method renderMenu */ renderMenu : function() { - var t = this, m, i = 0, s = t.settings, n, tb, tr, w; + var t = this, m, i = 0, s = t.settings, n, tb, tr, w, context; - w = DOM.add(s.menu_container, 'div', {id : t.id + '_menu', 'class' : s['menu_class'] + ' ' + s['class'], style : 'position:absolute;left:0;top:-1000px;'}); + w = DOM.add(s.menu_container, 'div', {role: 'listbox', id : t.id + '_menu', 'class' : s['menu_class'] + ' ' + s['class'], style : 'position:absolute;left:0;top:-1000px;'}); m = DOM.add(w, 'div', {'class' : s['class'] + ' mceSplitButtonMenu'}); DOM.add(m, 'span', {'class' : 'mceMenuLine'}); - n = DOM.add(m, 'table', {'class' : 'mceColorSplitMenu'}); + n = DOM.add(m, 'table', {role: 'presentation', 'class' : 'mceColorSplitMenu'}); tb = DOM.add(n, 'tbody'); // Generate color grid @@ -165,20 +166,32 @@ } n = DOM.add(tr, 'td'); - n = DOM.add(n, 'a', { + role : 'option', href : 'javascript:;', style : { backgroundColor : '#' + c }, - _mce_color : '#' + c + 'title': t.editor.getLang('colors.' + c, c), + 'data-mce-color' : '#' + c }); + + if (t.editor.forcedHighContrastMode) { + n = DOM.add(n, 'canvas', { width: 16, height: 16, 'aria-hidden': 'true' }); + if (n.getContext && (context = n.getContext("2d"))) { + context.fillStyle = '#' + c; + context.fillRect(0, 0, 16, 16); + } else { + // No point leaving a canvas element around if it's not supported for drawing on anyway. + DOM.remove(n); + } + } }); if (s.more_colors_func) { n = DOM.add(tb, 'tr'); n = DOM.add(n, 'td', {colspan : s.grid_width, 'class' : 'mceMoreColors'}); - n = DOM.add(n, 'a', {id : t.id + '_more', href : 'javascript:;', onclick : 'return false;', 'class' : 'mceMoreColors'}, s.more_colors_title); + n = DOM.add(n, 'a', {role: 'option', id : t.id + '_more', href : 'javascript:;', onclick : 'return false;', 'class' : 'mceMoreColors'}, s.more_colors_title); Event.add(n, 'click', function(e) { s.more_colors_func.call(s.more_colors_scope || this); @@ -187,13 +200,25 @@ } DOM.addClass(m, 'mceColorSplitMenu'); + + new tinymce.ui.KeyboardNavigation({ + root: t.id + '_menu', + items: DOM.select('a', t.id + '_menu'), + onCancel: function() { + t.hideMenu(); + t.focus(); + } + }); + + // Prevent IE from scrolling and hindering click to occur #4019 + Event.add(t.id + '_menu', 'mousedown', function(e) {return Event.cancel(e);}); Event.add(t.id + '_menu', 'click', function(e) { var c; - e = e.target; + e = DOM.getParent(e.target, 'a', tb); - if (e.nodeName == 'A' && (c = e.getAttribute('_mce_color'))) + if (e && e.nodeName.toLowerCase() == 'a' && (c = e.getAttribute('data-mce-color'))) t.setColor(c); return Event.cancel(e); // Prevent IE auto save warning @@ -209,13 +234,23 @@ * @param {String} c Color code value in hex for example: #FF00FF */ setColor : function(c) { + this.displayColor(c); + this.hideMenu(); + this.settings.onselect(c); + }, + + /** + * Change the currently selected color for the control. + * + * @method displayColor + * @param {String} c Color code value in hex for example: #FF00FF + */ + displayColor : function(c) { var t = this; DOM.setStyle(t.id + '_preview', 'backgroundColor', c); t.value = c; - t.hideMenu(); - t.settings.onselect(c); }, /** diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Container.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Container.js index 1a6a6aa34e..47d5b0e8f7 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Container.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Container.js @@ -24,8 +24,8 @@ tinymce.create('tinymce.ui.Container:tinymce.ui.Control', { * @param {String} id Control id to use for the container. * @param {Object} s Optional name/value settings object. */ - Container : function(id, s) { - this.parent(id, s); + Container : function(id, s, editor) { + this.parent(id, s, editor); /** * Array of controls added to the container. diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Control.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Control.js index d5635ffe92..1564c827bd 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Control.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Control.js @@ -27,7 +27,7 @@ * @param {String} id Control id. * @param {Object} s Optional name/value settings object. */ - Control : function(id, s) { + Control : function(id, s, editor) { this.id = id; this.settings = s = s || {}; this.rendered = false; @@ -36,6 +36,18 @@ this.scope = s.scope || this; this.disabled = 0; this.active = 0; + this.editor = editor; + }, + + setAriaProperty : function(property, value) { + var element = DOM.get(this.id + '_aria') || DOM.get(this.id); + if (element) { + DOM.setAttrib(element, 'aria-' + property, !!value); + } + }, + + focus : function() { + DOM.get(this.id).focus(); }, /** @@ -46,19 +58,8 @@ * @param {Boolean} s Boolean state if the control should be disabled or not. */ setDisabled : function(s) { - var e; - if (s != this.disabled) { - e = DOM.get(this.id); - - // Add accessibility title for unavailable actions - if (e && this.settings.unavailable_prefix) { - if (s) { - this.prevTitle = e.title; - e.title = this.settings.unavailable_prefix + ": " + e.title; - } else - e.title = this.prevTitle; - } + this.setAriaProperty('disabled', s); this.setState('Disabled', s); this.setState('Enabled', !s); @@ -88,6 +89,7 @@ if (s != this.active) { this.setState('Active', s); this.active = s; + this.setAriaProperty('pressed', s); } }, diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/DropMenu.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/DropMenu.js index cc4390c3f7..9573e2cfef 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/DropMenu.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/DropMenu.js @@ -60,12 +60,20 @@ s['class'] = s['class'] || cs['class']; s.vp_offset_x = s.vp_offset_x || cs.vp_offset_x; s.vp_offset_y = s.vp_offset_y || cs.vp_offset_y; + s.keyboard_focus = cs.keyboard_focus; m = new tinymce.ui.DropMenu(s.id || DOM.uniqueId(), s); m.onAddItem.add(t.onAddItem.dispatch, t.onAddItem); return m; }, + + focus : function() { + var t = this; + if (t.keyboardNav) { + t.keyboardNav.focus(); + } + }, /** * Repaints the menu after new items have been added dynamically. @@ -202,13 +210,13 @@ } }); } + + Event.add(co, 'keydown', t._keyHandler, t); t.onShowMenu.dispatch(t); - if (s.keyboard_focus) { - Event.add(co, 'keydown', t._keyHandler, t); - DOM.select('a', 'menu_' + t.id)[0].focus(); // Select first link - t._focusIdx = 0; + if (s.keyboard_focus) { + t._setupKeyboardNav(); } }, @@ -223,6 +231,7 @@ if (!t.isMenuVisible) return; + if (t.keyboardNav) t.keyboardNav.destroy(); Event.remove(co, 'mouseover', t.mouseOverFunc); Event.remove(co, 'click', t.mouseClickFunc); Event.remove(co, 'keydown', t._keyHandler); @@ -292,8 +301,11 @@ destroy : function() { var t = this, co = DOM.get('menu_' + t.id); + if (t.keyboardNav) t.keyboardNav.destroy(); Event.remove(co, 'mouseover', t.mouseOverFunc); + Event.remove(DOM.select('a', co), 'focus', t.mouseOverFunc); Event.remove(co, 'click', t.mouseClickFunc); + Event.remove(co, 'keydown', t._keyHandler); if (t.element) t.element.remove(); @@ -310,15 +322,18 @@ renderNode : function() { var t = this, s = t.settings, n, tb, co, w; - w = DOM.create('div', {id : 'menu_' + t.id, 'class' : s['class'], 'style' : 'position:absolute;left:0;top:0;z-index:200000'}); - co = DOM.add(w, 'div', {id : 'menu_' + t.id + '_co', 'class' : t.classPrefix + (s['class'] ? ' ' + s['class'] : '')}); + w = DOM.create('div', {role: 'listbox', id : 'menu_' + t.id, 'class' : s['class'], 'style' : 'position:absolute;left:0;top:0;z-index:200000;outline:0'}); + if (t.settings.parent) { + DOM.setAttrib(w, 'aria-parent', 'menu_' + t.settings.parent.id); + } + co = DOM.add(w, 'div', {role: 'presentation', id : 'menu_' + t.id + '_co', 'class' : t.classPrefix + (s['class'] ? ' ' + s['class'] : '')}); t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container}); if (s.menu_line) DOM.add(co, 'span', {'class' : t.classPrefix + 'Line'}); // n = DOM.add(co, 'div', {id : 'menu_' + t.id + '_co', 'class' : 'mceMenuContainer'}); - n = DOM.add(co, 'table', {id : 'menu_' + t.id + '_tbl', border : 0, cellPadding : 0, cellSpacing : 0}); + n = DOM.add(co, 'table', {role: 'presentation', id : 'menu_' + t.id + '_tbl', border : 0, cellPadding : 0, cellSpacing : 0}); tb = DOM.add(n, 'tbody'); each(t.items, function(o) { @@ -331,33 +346,36 @@ }, // Internal functions + _setupKeyboardNav : function(){ + var contextMenu, menuItems, t=this; + contextMenu = DOM.select('#menu_' + t.id)[0]; + menuItems = DOM.select('a[role=option]', 'menu_' + t.id); + menuItems.splice(0,0,contextMenu); + t.keyboardNav = new tinymce.ui.KeyboardNavigation({ + root: 'menu_' + t.id, + items: menuItems, + onCancel: function() { + t.hideMenu(); + }, + enableUpDown: true + }); + contextMenu.focus(); + }, - _keyHandler : function(e) { - var t = this, kc = e.keyCode; - - function focus(d) { - var i = t._focusIdx + d, e = DOM.select('a', 'menu_' + t.id)[i]; - - if (e) { - t._focusIdx = i; - e.focus(); - } - }; - - switch (kc) { - case 38: - focus(-1); // Select first link - return; - - case 40: - focus(1); - return; - - case 13: - return; - - case 27: - return this.hideMenu(); + _keyHandler : function(evt) { + var t = this, e; + switch (evt.keyCode) { + case 37: // Left + if (t.settings.parent) { + t.hideMenu(); + t.settings.parent.focus(); + Event.cancel(evt); + } + break; + case 39: // Right + if (t.mouseOverFunc) + t.mouseOverFunc(evt); + break; } }, @@ -375,8 +393,13 @@ } n = ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'Item ' + cp + 'ItemEnabled'}); - n = it = DOM.add(n, 'td'); - n = a = DOM.add(n, 'a', {href : 'javascript:;', onclick : "return false;", onmousedown : 'return false;'}); + n = it = DOM.add(n, s.titleItem ? 'th' : 'td'); + n = a = DOM.add(n, 'a', {id: o.id + '_aria', role: s.titleItem ? 'presentation' : 'option', href : 'javascript:;', onclick : "return false;", onmousedown : 'return false;'}); + + if (s.parent) { + DOM.setAttrib(a, 'aria-haspopup', 'true'); + DOM.setAttrib(a, 'aria-owns', 'menu_' + o.id); + } DOM.addClass(it, s['class']); // n = DOM.add(n, 'span', {'class' : 'item'}); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/KeyboardNavigation.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/KeyboardNavigation.js new file mode 100644 index 0000000000..6bc5fbef3f --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/KeyboardNavigation.js @@ -0,0 +1,183 @@ +/** + * KeyboardNavigation.js + * + * Copyright 2011, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + var Event = tinymce.dom.Event, each = tinymce.each; + + /** + * This class provides basic keyboard navigation using the arrow keys to children of a component. + * For example, this class handles moving between the buttons on the toolbars. + * + * @class tinymce.ui.KeyboardNavigation + */ + tinymce.create('tinymce.ui.KeyboardNavigation', { + /** + * Create a new KeyboardNavigation instance to handle the focus for a specific element. + * + * @constructor + * @method KeyboardNavigation + * @param {Object} settings the settings object to define how keyboard navigation works. + * @param {DOMUtils} dom the DOMUtils instance to use. + * + * @setting {Element/String} root the root element or ID of the root element for the control. + * @setting {Array} items an array containing the items to move focus between. Every object in this array must have an id attribute which maps to the actual DOM element. If the actual elements are passed without an ID then one is automatically assigned. + * @setting {Function} onCancel the callback for when the user presses escape or otherwise indicates cancelling. + * @setting {Function} onAction (optional) the action handler to call when the user activates an item. + * @setting {Boolean} enableLeftRight (optional, default) when true, the up/down arrows move through items. + * @setting {Boolean} enableUpDown (optional) when true, the up/down arrows move through items. + * Note for both up/down and left/right explicitly set both enableLeftRight and enableUpDown to true. + */ + KeyboardNavigation: function(settings, dom) { + var t = this, root = settings.root, items = settings.items, + enableUpDown = settings.enableUpDown, enableLeftRight = settings.enableLeftRight || !settings.enableUpDown, + excludeFromTabOrder = settings.excludeFromTabOrder, + itemFocussed, itemBlurred, rootKeydown, rootFocussed, focussedId; + + dom = dom || tinymce.DOM; + + itemFocussed = function(evt) { + focussedId = evt.target.id; + }; + + itemBlurred = function(evt) { + dom.setAttrib(evt.target.id, 'tabindex', '-1'); + }; + + rootFocussed = function(evt) { + var item = dom.get(focussedId); + dom.setAttrib(item, 'tabindex', '0'); + item.focus(); + }; + + t.focus = function() { + dom.get(focussedId).focus(); + }; + + /** + * Destroys the KeyboardNavigation and unbinds any focus/blur event handles it might have added. + * + * @method destroy + */ + t.destroy = function() { + each(items, function(item) { + dom.unbind(dom.get(item.id), 'focus', itemFocussed); + dom.unbind(dom.get(item.id), 'blur', itemBlurred); + }); + + dom.unbind(dom.get(root), 'focus', rootFocussed); + dom.unbind(dom.get(root), 'keydown', rootKeydown); + + items = dom = root = t.focus = itemFocussed = itemBlurred = rootKeydown = rootFocussed = null; + t.destroy = function() {}; + }; + + t.moveFocus = function(dir, evt) { + var idx = -1, controls = t.controls, newFocus; + + if (!focussedId) + return; + + each(items, function(item, index) { + if (item.id === focussedId) { + idx = index; + return false; + } + }); + + idx += dir; + if (idx < 0) { + idx = items.length - 1; + } else if (idx >= items.length) { + idx = 0; + } + + newFocus = items[idx]; + dom.setAttrib(focussedId, 'tabindex', '-1'); + dom.setAttrib(newFocus.id, 'tabindex', '0'); + dom.get(newFocus.id).focus(); + + if (settings.actOnFocus) { + settings.onAction(newFocus.id); + } + + if (evt) + Event.cancel(evt); + }; + + rootKeydown = function(evt) { + var DOM_VK_LEFT = 37, DOM_VK_RIGHT = 39, DOM_VK_UP = 38, DOM_VK_DOWN = 40, DOM_VK_ESCAPE = 27, DOM_VK_ENTER = 14, DOM_VK_RETURN = 13, DOM_VK_SPACE = 32; + + switch (evt.keyCode) { + case DOM_VK_LEFT: + if (enableLeftRight) t.moveFocus(-1); + break; + + case DOM_VK_RIGHT: + if (enableLeftRight) t.moveFocus(1); + break; + + case DOM_VK_UP: + if (enableUpDown) t.moveFocus(-1); + break; + + case DOM_VK_DOWN: + if (enableUpDown) t.moveFocus(1); + break; + + case DOM_VK_ESCAPE: + if (settings.onCancel) { + settings.onCancel(); + Event.cancel(evt); + } + break; + + case DOM_VK_ENTER: + case DOM_VK_RETURN: + case DOM_VK_SPACE: + if (settings.onAction) { + settings.onAction(focussedId); + Event.cancel(evt); + } + break; + } + }; + + // Set up state and listeners for each item. + each(items, function(item, idx) { + var tabindex; + + if (!item.id) { + item.id = dom.uniqueId('_mce_item_'); + } + + if (excludeFromTabOrder) { + dom.bind(item.id, 'blur', itemBlurred); + tabindex = '-1'; + } else { + tabindex = (idx === 0 ? '0' : '-1'); + } + + dom.setAttrib(item.id, 'tabindex', tabindex); + dom.bind(dom.get(item.id), 'focus', itemFocussed); + }); + + // Setup initial state for root element. + if (items[0]){ + focussedId = items[0].id; + } + + dom.setAttrib(root, 'tabindex', '-1'); + + // Setup listeners for root element. + dom.bind(dom.get(root), 'focus', rootFocussed); + dom.bind(dom.get(root), 'keydown', rootKeydown); + } + }); +})(tinymce); \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ListBox.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ListBox.js index 54bd42ec77..20ef85b0cb 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ListBox.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ListBox.js @@ -17,6 +17,41 @@ * * @class tinymce.ui.ListBox * @extends tinymce.ui.Control + * @example + * // Creates a new plugin class and a custom listbox + * tinymce.create('tinymce.plugins.ExamplePlugin', { + * createControl: function(n, cm) { + * switch (n) { + * case 'mylistbox': + * var mlb = cm.createListBox('mylistbox', { + * title : 'My list box', + * onselect : function(v) { + * tinyMCE.activeEditor.windowManager.alert('Value selected:' + v); + * } + * }); + * + * // Add some values to the list box + * mlb.add('Some item 1', 'val1'); + * mlb.add('some item 2', 'val2'); + * mlb.add('some item 3', 'val3'); + * + * // Return the new listbox instance + * return mlb; + * } + * + * return null; + * } + * }); + * + * // Register plugin with a short name + * tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin); + * + * // Initialize TinyMCE with the new plugin and button + * tinyMCE.init({ + * ... + * plugins : '-example', // - means TinyMCE will not try to load it + * theme_advanced_buttons1 : 'mylistbox' // Add the new example listbox to the toolbar + * }); */ tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control', { /** @@ -26,11 +61,12 @@ * @method ListBox * @param {String} id Control id for the list box. * @param {Object} s Optional name/value settings object. + * @param {Editor} ed Optional the editor instance this button is for. */ - ListBox : function(id, s) { + ListBox : function(id, s, ed) { var t = this; - t.parent(id, s); + t.parent(id, s, ed); /** * Array of ListBox items. @@ -128,12 +164,13 @@ t.selectedIndex = idx; DOM.setHTML(e, DOM.encode(o.title)); DOM.removeClass(e, 'mceTitle'); + DOM.setAttrib(t.id, 'aria-valuenow', o.title); } else { DOM.setHTML(e, DOM.encode(t.settings.title)); DOM.addClass(e, 'mceTitle'); t.selectedValue = t.selectedIndex = null; + DOM.setAttrib(t.id, 'aria-valuenow', t.settings.title); } - e = 0; } }, @@ -179,10 +216,11 @@ renderHTML : function() { var h = '', t = this, s = t.settings, cp = t.classPrefix; - h = ''; - h += ''; - h += ''; - h += '
    ' + DOM.createHTML('a', {id : t.id + '_text', href : 'javascript:;', 'class' : 'mceText', onclick : "return false;", onmousedown : 'return false;'}, DOM.encode(t.settings.title)) + '' + DOM.createHTML('a', {id : t.id + '_open', tabindex : -1, href : 'javascript:;', 'class' : 'mceOpen', onclick : "return false;", onmousedown : 'return false;'}, '') + '
    '; + h = ''; + h += ''; + h += ''; + h += ''; return h; }, @@ -193,7 +231,7 @@ * @method showMenu */ showMenu : function() { - var t = this, p1, p2, e = DOM.get(this.id), m; + var t = this, p2, e = DOM.get(this.id), m; if (t.isDisabled() || t.items.length == 0) return; @@ -206,7 +244,6 @@ t.isMenuRendered = true; } - p1 = DOM.getPos(this.settings.menu_container); p2 = DOM.getPos(e); m = t.menu; @@ -242,6 +279,8 @@ var t = this; if (t.menu && t.menu.isMenuVisible) { + DOM.removeClass(t.id, t.classPrefix + 'Selected'); + // Prevent double toogles by canceling the mouse click event to the button if (e && e.type == "mousedown" && (e.target.id == t.id + '_text' || e.target.id == t.id + '_open')) return; @@ -269,7 +308,10 @@ max_height : 150 }); - m.onHideMenu.add(t.hideMenu, t); + m.onHideMenu.add(function() { + t.hideMenu(); + t.focus(); + }); m.add({ title : t.settings.title, @@ -316,40 +358,39 @@ var t = this, cp = t.classPrefix; Event.add(t.id, 'click', t.showMenu, t); - Event.add(t.id + '_text', 'focus', function() { + Event.add(t.id, 'keydown', function(evt) { + if (evt.keyCode == 32) { // Space + t.showMenu(evt); + Event.cancel(evt); + } + }); + Event.add(t.id, 'focus', function() { if (!t._focused) { - t.keyDownHandler = Event.add(t.id + '_text', 'keydown', function(e) { - var idx = -1, v, kc = e.keyCode; - - // Find current index - each(t.items, function(v, i) { - if (t.selectedValue == v.value) - idx = i; - }); - - // Move up/down - if (kc == 38) - v = t.items[idx - 1]; - else if (kc == 40) - v = t.items[idx + 1]; - else if (kc == 13) { + t.keyDownHandler = Event.add(t.id, 'keydown', function(e) { + if (e.keyCode == 40) { + t.showMenu(); + Event.cancel(e); + } + }); + t.keyPressHandler = Event.add(t.id, 'keypress', function(e) { + var v; + if (e.keyCode == 13) { // Fake select on enter v = t.selectedValue; t.selectedValue = null; // Needs to be null to fake change + Event.cancel(e); t.settings.onselect(v); - return Event.cancel(e); - } - - if (v) { - t.hideMenu(); - t.select(v.value); } }); } t._focused = 1; }); - Event.add(t.id + '_text', 'blur', function() {Event.remove(t.id + '_text', 'keydown', t.keyDownHandler); t._focused = 0;}); + Event.add(t.id, 'blur', function() { + Event.remove(t.id, 'keydown', t.keyDownHandler); + Event.remove(t.id, 'keypress', t.keyPressHandler); + t._focused = 0; + }); // Old IE doesn't have hover on all elements if (tinymce.isIE6 || !DOM.boxModel) { diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/MenuButton.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/MenuButton.js index 6633bd4a38..48547244d3 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/MenuButton.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/MenuButton.js @@ -17,6 +17,36 @@ * * @class tinymce.ui.MenuButton * @extends tinymce.ui.Control + * @example + * // Creates a new plugin class and a custom menu button + * tinymce.create('tinymce.plugins.ExamplePlugin', { + * createControl: function(n, cm) { + * switch (n) { + * case 'mymenubutton': + * var c = cm.createSplitButton('mysplitbutton', { + * title : 'My menu button', + * image : 'some.gif' + * }); + * + * c.onRenderMenu.add(function(c, m) { + * m.add({title : 'Some title', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + * + * m.add({title : 'Some item 1', onclick : function() { + * alert('Some item 1 was clicked.'); + * }}); + * + * m.add({title : 'Some item 2', onclick : function() { + * alert('Some item 2 was clicked.'); + * }}); + * }); + * + * // Return the new menubutton instance + * return c; + * } + * + * return null; + * } + * }); */ tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', { /** @@ -26,9 +56,10 @@ * @method MenuButton * @param {String} id Control id for the split button. * @param {Object} s Optional name/value settings object. + * @param {Editor} ed Optional the editor instance this button is for. */ - MenuButton : function(id, s) { - this.parent(id, s); + MenuButton : function(id, s, ed) { + this.parent(id, s, ed); /** * Fires when the menu is rendered. @@ -90,7 +121,10 @@ icons : t.settings.icons }); - m.onHideMenu.add(t.hideMenu, t); + m.onHideMenu.add(function() { + t.hideMenu(); + t.focus(); + }); t.onRenderMenu.dispatch(t, m); t.menu = m; diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/MenuItem.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/MenuItem.js index af76922ead..0273a92cab 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/MenuItem.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/MenuItem.js @@ -41,6 +41,7 @@ */ setSelected : function(s) { this.setState('Selected', s); + this.setAriaProperty('checked', !!s); this.selected = s; }, diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/NativeListBox.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/NativeListBox.js index 1689e05f38..e4801e7819 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/NativeListBox.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/NativeListBox.js @@ -41,6 +41,7 @@ */ setDisabled : function(s) { DOM.get(this.id).disabled = s; + this.setAriaProperty('disabled', s); }, /** @@ -156,8 +157,8 @@ h += DOM.createHTML('option', {value : it.value}, it.title); }); - h = DOM.createHTML('select', {id : t.id, 'class' : 'mceNativeListBox'}, h); - + h = DOM.createHTML('select', {id : t.id, 'class' : 'mceNativeListBox', 'aria-labelledby': t.id + '_aria'}, h); + h += DOM.createHTML('span', {id : t.id + '_aria', 'style': 'display: none'}, t.settings.title); return h; }, @@ -168,7 +169,7 @@ * @method postRender */ postRender : function() { - var t = this, ch; + var t = this, ch, changeListenerAdded = true; t.rendered = true; @@ -190,8 +191,11 @@ var bf; Event.remove(t.id, 'change', ch); + changeListenerAdded = false; bf = Event.add(t.id, 'blur', function() { + if (changeListenerAdded) return; + changeListenerAdded = true; Event.add(t.id, 'change', onChange); Event.remove(t.id, 'blur', bf); }); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Separator.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Separator.js index 8ecd690391..9e6daf7932 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Separator.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Separator.js @@ -26,6 +26,7 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', { Separator : function(id, s) { this.parent(id, s); this.classPrefix = 'mceSeparator'; + this.setDisabled(true); }, /** @@ -36,6 +37,6 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', { * @return {String} HTML for the separator control element. */ renderHTML : function() { - return tinymce.DOM.createHTML('span', {'class' : this.classPrefix}); + return tinymce.DOM.createHTML('span', {'class' : this.classPrefix, role : 'separator', 'aria-orientation' : 'vertical', tabindex : '-1'}); } }); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/SplitButton.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/SplitButton.js index 945f5449f6..2065459cd8 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/SplitButton.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/SplitButton.js @@ -16,6 +16,39 @@ * * @class tinymce.ui.SplitButton * @extends tinymce.ui.Button + * @example + * // Creates a new plugin class and a custom split button + * tinymce.create('tinymce.plugins.ExamplePlugin', { + * createControl: function(n, cm) { + * switch (n) { + * case 'mysplitbutton': + * var c = cm.createSplitButton('mysplitbutton', { + * title : 'My split button', + * image : 'some.gif', + * onclick : function() { + * alert('Button was clicked.'); + * } + * }); + * + * c.onRenderMenu.add(function(c, m) { + * m.add({title : 'Some title', 'class' : 'mceMenuItemTitle'}).setDisabled(1); + * + * m.add({title : 'Some item 1', onclick : function() { + * alert('Some item 1 was clicked.'); + * }}); + * + * m.add({title : 'Some item 2', onclick : function() { + * alert('Some item 2 was clicked.'); + * }}); + * }); + * + * // Return the new splitbutton instance + * return c; + * } + * + * return null; + * } + * }); */ tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton', { /** @@ -25,9 +58,10 @@ * @method SplitButton * @param {String} id Control id for the split button. * @param {Object} s Optional name/value settings object. + * @param {Editor} ed Optional the editor instance this button is for. */ - SplitButton : function(id, s) { - this.parent(id, s); + SplitButton : function(id, s, ed) { + this.parent(id, s, ed); this.classPrefix = 'mceSplitButton'; }, @@ -44,18 +78,19 @@ h = ''; if (s.image) - h1 = DOM.createHTML('img ', {src : s.image, 'class' : 'mceAction ' + s['class']}); + h1 = DOM.createHTML('img ', {src : s.image, role: 'presentation', 'class' : 'mceAction ' + s['class']}); else h1 = DOM.createHTML('span', {'class' : 'mceAction ' + s['class']}, ''); - h += '' + DOM.createHTML('a', {id : t.id + '_action', href : 'javascript:;', 'class' : 'mceAction ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + ''; + h1 += DOM.createHTML('span', {'class': 'mceVoiceLabel mceIconOnly', id: t.id + '_voice', style: 'display:none;'}, s.title); + h += '' + DOM.createHTML('a', {role: 'button', id : t.id + '_action', tabindex: '-1', href : 'javascript:;', 'class' : 'mceAction ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + ''; - h1 = DOM.createHTML('span', {'class' : 'mceOpen ' + s['class']}); - h += '' + DOM.createHTML('a', {id : t.id + '_open', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + ''; + h1 = DOM.createHTML('span', {'class' : 'mceOpen ' + s['class']}, ''); + h += '' + DOM.createHTML('a', {role: 'button', id : t.id + '_open', tabindex: '-1', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + ''; h += ''; - - return DOM.createHTML('table', {id : t.id, 'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', onmousedown : 'return false;', title : s.title}, h); + h = DOM.createHTML('table', {id : t.id, role: 'presentation', tabindex: '0', 'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', title : s.title}, h); + return DOM.createHTML('span', {role: 'button', 'aria-labelledby': t.id + '_voice', 'aria-haspopup': 'true'}, h); }, /** @@ -65,18 +100,34 @@ * @method postRender */ postRender : function() { - var t = this, s = t.settings; + var t = this, s = t.settings, activate; if (s.onclick) { - Event.add(t.id + '_action', 'click', function() { - if (!t.isDisabled()) + activate = function(evt) { + if (!t.isDisabled()) { s.onclick(t.value); + Event.cancel(evt); + } + }; + Event.add(t.id + '_action', 'click', activate); + Event.add(t.id, ['click', 'keydown'], function(evt) { + var DOM_VK_SPACE = 32, DOM_VK_ENTER = 14, DOM_VK_RETURN = 13, DOM_VK_UP = 38, DOM_VK_DOWN = 40; + if ((evt.keyCode === 32 || evt.keyCode === 13 || evt.keyCode === 14) && !evt.altKey && !evt.ctrlKey && !evt.metaKey) { + activate(); + Event.cancel(evt); + } else if (evt.type === 'click' || evt.keyCode === DOM_VK_DOWN) { + t.showMenu(); + Event.cancel(evt); + } }); } - Event.add(t.id + '_open', 'click', t.showMenu, t); - Event.add(t.id + '_open', 'focus', function() {t._focused = 1;}); - Event.add(t.id + '_open', 'blur', function() {t._focused = 0;}); + Event.add(t.id + '_open', 'click', function (evt) { + t.showMenu(); + Event.cancel(evt); + }); + Event.add([t.id, t.id + '_open'], 'focus', function() {t._focused = 1;}); + Event.add([t.id, t.id + '_open'], 'blur', function() {t._focused = 0;}); // Old IE doesn't have hover on all elements if (tinymce.isIE6 || !DOM.boxModel) { @@ -97,6 +148,7 @@ Event.clear(this.id + '_action'); Event.clear(this.id + '_open'); + Event.clear(this.id); } }); })(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Toolbar.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Toolbar.js index 4c6142edf8..10b780ab84 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Toolbar.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/Toolbar.js @@ -8,6 +8,9 @@ * Contributing: http://tinymce.moxiecode.com/contributing */ +(function(tinymce) { +// Shorten class names +var dom = tinymce.DOM, each = tinymce.each; /** * This class is used to create toolbars a toolbar is a container for other controls like buttons etc. * @@ -23,7 +26,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { * @return {String} HTML for the toolbar control. */ renderHTML : function() { - var t = this, h = '', c, co, dom = tinymce.DOM, s = t.settings, i, pr, nx, cl; + var t = this, h = '', c, co, s = t.settings, i, pr, nx, cl; cl = t.controls; for (i=0; i')); - return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || ''}, '' + h + ''); + return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || '', role: 'presentation', tabindex: '-1'}, '' + h + ''); } }); +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ToolbarGroup.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ToolbarGroup.js new file mode 100644 index 0000000000..4f30e5f3a2 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/ui/ToolbarGroup.js @@ -0,0 +1,76 @@ +/** + * ToolbarGroup.js + * + * Copyright 2010, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { +// Shorten class names +var dom = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event; +/** + * This class is used to group a set of toolbars together and control the keyboard navigation and focus. + * + * @class tinymce.ui.ToolbarGroup + * @extends tinymce.ui.Container + */ +tinymce.create('tinymce.ui.ToolbarGroup:tinymce.ui.Container', { + /** + * Renders the toolbar group as a HTML string. + * + * @method renderHTML + * @return {String} HTML for the toolbar control. + */ + renderHTML : function() { + var t = this, h = [], controls = t.controls, each = tinymce.each, settings = t.settings; + + h.push('
    '); + //TODO: ACC test this out - adding a role = application for getting the landmarks working well. + h.push(""); + h.push(''); + each(controls, function(toolbar) { + h.push(toolbar.renderHTML()); + }); + h.push(""); + h.push('
    '); + + return h.join(''); + }, + + focus : function() { + this.keyNav.focus(); + }, + + postRender : function() { + var t = this, items = []; + + each(t.controls, function(toolbar) { + each (toolbar.controls, function(control) { + if (control.id) { + items.push(control); + } + }); + }); + + t.keyNav = new tinymce.ui.KeyboardNavigation({ + root: t.id, + items: items, + onCancel: function() { + t.editor.focus(); + }, + excludeFromTabOrder: !t.settings.tab_focus_toolbar + }); + }, + + destroy : function() { + var self = this; + + self.parent(); + self.keyNav.destroy(); + Event.clear(self.id); + } +}); +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Cookie.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Cookie.js index 8209bd70a7..a390554a92 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Cookie.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Cookie.js @@ -16,6 +16,15 @@ * * @class tinymce.util.Cookie * @static + * @example + * // Gets a cookie from the browser + * console.debug(tinymce.util.Cookie.get('mycookie')); + * + * // Gets a hash table cookie from the browser and takes out the x parameter from it + * console.debug(tinymce.util.Cookie.getHash('mycookie').x); + * + * // Sets a hash table cookie to the browser + * tinymce.util.Cookie.setHash({x : '1', y : '2'}); */ tinymce.create('static tinymce.util.Cookie', { /** diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Dispatcher.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Dispatcher.js index 86588a64d4..e97976db31 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Dispatcher.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Dispatcher.js @@ -13,6 +13,12 @@ * All internal events inside TinyMCE uses this class. * * @class tinymce.util.Dispatcher + * @example + * // Creates a custom event + * this.onSomething = new tinymce.util.Dispatcher(this); + * + * // Dispatch/fire the event + * this.onSomething.dispatch('some string'); */ tinymce.create('tinymce.util.Dispatcher', { scope : null, diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/JSON.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/JSON.js index 0d271da868..a916332185 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/JSON.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/JSON.js @@ -8,22 +8,11 @@ * Contributing: http://tinymce.moxiecode.com/contributing */ -/** - * JSON parser and serializer class. - * - * @class tinymce.util.JSON - * @static - */ -tinymce.create('static tinymce.util.JSON', { - /** - * Serializes the specified object as a JSON string. - * - * @method serialize - * @param {Object} o Object to serialize as a JSON string. - * @return {string} JSON string serialized from input. - */ - serialize : function(o) { - var i, v, s = tinymce.util.JSON.serialize, t; +(function() { + function serialize(o, quote) { + var i, v, t; + + quote = quote || '"'; if (o == null) return 'null'; @@ -33,7 +22,11 @@ tinymce.create('static tinymce.util.JSON', { if (t == 'string') { v = '\bb\tt\nn\ff\rr\""\'\'\\\\'; - return '"' + o.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g, function(a, b) { + return quote + o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g, function(a, b) { + // Make sure single quotes never get encoded inside double quotes for JSON compatibility + if (quote === '"' && a === "'") + return a; + i = v.indexOf(b); if (i + 1) @@ -42,13 +35,13 @@ tinymce.create('static tinymce.util.JSON', { a = b.charCodeAt().toString(16); return '\\u' + '0000'.substring(a.length) + a; - }) + '"'; + }) + quote; } if (t == 'object') { if (o.hasOwnProperty && o instanceof Array) { for (i=0, v = '['; i 0 ? ',' : '') + s(o[i]); + v += (i > 0 ? ',' : '') + serialize(o[i], quote); return v + ']'; } @@ -56,28 +49,52 @@ tinymce.create('static tinymce.util.JSON', { v = '{'; for (i in o) - v += typeof o[i] != 'function' ? (v.length > 1 ? ',"' : '"') + i + '":' + s(o[i]) : ''; + v += typeof o[i] != 'function' ? (v.length > 1 ? ',' + quote : quote) + i + quote +':' + serialize(o[i], quote) : ''; return v + '}'; } return '' + o; - }, + }; /** - * Unserializes/parses the specified JSON string into a object. + * JSON parser and serializer class. * - * @method parse - * @param {string} s JSON String to parse into a JavaScript object. - * @return {Object} Object from input JSON string or undefined if it failed. + * @class tinymce.util.JSON + * @static + * @example + * // JSON parse a string into an object + * var obj = tinymce.util.JSON.parse(somestring); + * + * // JSON serialize a object into an string + * var str = tinymce.util.JSON.serialize(obj); */ - parse : function(s) { - try { - return eval('(' + s + ')'); - } catch (ex) { - // Ignore + tinymce.util.JSON = { + /** + * Serializes the specified object as a JSON string. + * + * @method serialize + * @param {Object} obj Object to serialize as a JSON string. + * @param {String} quote Optional quote string defaults to ". + * @return {string} JSON string serialized from input. + */ + serialize: serialize, + + /** + * Unserializes/parses the specified JSON string into a object. + * + * @method parse + * @param {string} s JSON String to parse into a JavaScript object. + * @return {Object} Object from input JSON string or undefined if it failed. + */ + parse: function(s) { + try { + return eval('(' + s + ')'); + } catch (ex) { + // Ignore + } } - } - /**#@-*/ -}); + /**#@-*/ + }; +})(); \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/JSONRequest.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/JSONRequest.js index 7e62b30500..9e502879ce 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/JSONRequest.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/JSONRequest.js @@ -15,6 +15,28 @@ * This class enables you to use JSON-RPC to call backend methods. * * @class tinymce.util.JSONRequest + * @example + * var json = new tinymce.util.JSONRequest({ + * url : 'somebackend.php' + * }); + * + * // Send RPC call 1 + * json.send({ + * method : 'someMethod1', + * params : ['a', 'b'], + * success : function(result) { + * console.dir(result); + * } + * }); + * + * // Send RPC call 2 + * json.send({ + * method : 'someMethod2', + * params : ['a', 'b'], + * success : function(result) { + * console.dir(result); + * } + * }); */ tinymce.create('tinymce.util.JSONRequest', { /** @@ -57,7 +79,8 @@ }; o.error = function(ty, x) { - ecb.call(o.error_scope || o.scope, ty, x); + if (ecb) + ecb.call(o.error_scope || o.scope, ty, x); }; o.data = JSON.serialize({ diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Quirks.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Quirks.js new file mode 100644 index 0000000000..c46e169cc6 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/Quirks.js @@ -0,0 +1,25 @@ +(function(tinymce) { + function cleanupStylesWhenDeleting(ed) { + var dom = ed.dom, selection = ed.selection, VK= tinymce.VK; + ed.onKeyUp.add(function(ed, e) { + if (e.keyCode == VK.DELETE ||e.keyCode == VK.BACKSPACE) { + var startContainer = selection.getRng().startContainer; + var blockElement = startContainer; + while (!dom.isBlock(blockElement)) { + blockElement = blockElement.parentNode; + } + var spans = dom.select("span.Apple-style-span", blockElement); + dom.remove(spans, true); + } + }); + } + + tinymce.create('tinymce.util.Quirks', { + Quirks: function(ed) { + if (tinymce.isWebKit) { + cleanupStylesWhenDeleting(ed); + } + + } + }); +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/URI.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/URI.js index 7af644832c..236c331b36 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/URI.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/URI.js @@ -25,7 +25,7 @@ * @param {Object} s Optional settings object. */ URI : function(u, s) { - var t = this, o, a, b; + var t = this, o, a, b, base_url; // Trim whitespace u = tinymce.trim(u); @@ -44,8 +44,10 @@ u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u; // Relative path http:// or protocol relative //path - if (!/^\w*:?\/\//.test(u)) - u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u); + if (!/^[\w-]*:?\/\//.test(u)) { + base_url = s.base_uri ? s.base_uri.path : new tinymce.util.URI(location.href).directory; + u = ((s.base_uri && s.base_uri.protocol) || 'http') + '://mce_host' + t.toAbsPath(base_url, u); + } // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri) u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something @@ -106,6 +108,9 @@ * @method toRelative * @param {String} u URI to convert into a relative path/URI. * @return {String} Relative URI from the point specified in the current URI instance. + * @example + * // Converts an absolute URL to an relative URL url will be somedir/somefile.htm + * var url = new tinymce.util.URI('http://www.site.com/dir/').toRelative('http://www.site.com/dir/somedir/somefile.htm'); */ toRelative : function(u) { var t = this, o; @@ -139,6 +144,9 @@ * @param {String} u URI to convert into a relative path/URI. * @param {Boolean} nh No host and protocol prefix. * @return {String} Absolute URI from the point specified in the current URI instance. + * @example + * // Converts an relative URL to an absolute URL url will be http://www.site.com/dir/somedir/somefile.htm + * var url = new tinymce.util.URI('http://www.site.com/dir/').toAbsolute('somedir/somefile.htm'); */ toAbsolute : function(u, nh) { var u = new tinymce.util.URI(u, {base_uri : this}); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/VK.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/VK.js new file mode 100644 index 0000000000..8f845c2026 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/VK.js @@ -0,0 +1,12 @@ +/** + * This file exposes a set of the common KeyCodes for use. Please grow it as needed. + */ + +(function(tinymce){ + tinymce.VK = { + DELETE:46, + BACKSPACE:8 + + } + +})(tinymce); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/XHR.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/XHR.js index a444c13643..cbbdd38149 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/XHR.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/util/XHR.js @@ -12,6 +12,14 @@ * This class enables you to send XMLHTTPRequests cross browser. * @class tinymce.util.XHR * @static + * @example + * // Sends a low level Ajax request + * tinymce.util.XHR.send({ + * url : 'someurl', + * success : function(text) { + * console.debug(text); + * } + * }); */ tinymce.create('static tinymce.util.XHR', { /** diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/xml/Parser.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/xml/Parser.js deleted file mode 100644 index 76cd8add59..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/classes/xml/Parser.js +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Parser.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - /** - * XML Parser class. This class is only available for the dev version of TinyMCE. - */ - tinymce.create('tinymce.xml.Parser', { - /** - * Constucts a new XML parser instance. - * - * @param {Object} Optional settings object. - */ - Parser : function(s) { - this.settings = tinymce.extend({ - async : true - }, s); - }, - - /** - * Parses the specified document and executed the callback ones it's parsed. - * - * @param {String} u URL to XML file to parse. - * @param {function} cb Optional callback to execute ones the XML file is loaded. - * @param {Object} s Optional scope for the callback execution. - */ - load : function(u, cb, s) { - var doc, t, w = window, c = 0; - - s = s || this; - - // Explorer, use XMLDOM since it can be used on local fs - if (window.ActiveXObject) { - doc = new ActiveXObject("Microsoft.XMLDOM"); - doc.async = this.settings.async; - - // Wait for response - if (doc.async) { - function check() { - if (doc.readyState == 4 || c++ > 10000) - return cb.call(s, doc); - - w.setTimeout(check, 10); - }; - - t = w.setTimeout(check, 10); - } - - doc.load(u); - - if (!doc.async) - cb.call(s, doc); - - return; - } - - // W3C using XMLHttpRequest - if (window.XMLHttpRequest) { - try { - doc = new window.XMLHttpRequest(); - doc.open('GET', u, this.settings.async); - doc.async = this.settings.async; - - doc.onload = function() { - cb.call(s, doc.responseXML); - }; - - doc.send(''); - } catch (ex) { - cb.call(s, null, ex); - } - } - }, - - /** - * Parses the specified XML string. - * - * @param {String} xml XML String to parse. - * @return {Document} XML Document instance. - */ - loadXML : function(xml) { - var doc; - - // W3C - if (window.DOMParser) - return new DOMParser().parseFromString(xml, "text/xml"); - - // Explorer - if (window.ActiveXObject) { - doc = new ActiveXObject("Microsoft.XMLDOM"); - doc.async = "false"; - doc.loadXML(xml); - - return doc; - } - }, - - /** - * Returns all string contents of a element concated together. - * - * @param {XMLNode} el XML element to retrive text from. - * @return {string} XML element text contents. - */ - getText : function(el) { - var o = ''; - - if (!el) - return ''; - - if (el.hasChildNodes()) { - el = el.firstChild; - - do { - if (el.nodeType == 3 || el.nodeType == 4) - o += el.nodeValue; - } while(el = el.nextSibling); - } - - return o; - } - }); -})(); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/jquery.tinymce.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/jquery.tinymce.js index 4866c2a06b..8e61a3cddb 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/jquery.tinymce.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/jquery.tinymce.js @@ -1 +1 @@ -(function(b){var e,d,a=[],c=window;b.fn.tinymce=function(j){var p=this,g,k,h,m,i,l="",n="";if(!p.length){return p}if(!j){return tinyMCE.get(p[0].id)}function o(){var r=[],q=0;if(f){f();f=null}p.each(function(t,u){var s,w=u.id,v=j.oninit;if(!w){u.id=w=tinymce.DOM.uniqueId()}s=new tinymce.Editor(w,j);r.push(s);if(v){s.onInit.add(function(){var x,y=v;if(++q==r.length){if(tinymce.is(y,"string")){x=(y.indexOf(".")===-1)?null:tinymce.resolve(y.replace(/\.\w+$/,""));y=tinymce.resolve(y)}y.apply(x||tinymce,r)}})}});b.each(r,function(t,s){s.render()})}if(!c.tinymce&&!d&&(g=j.script_url)){d=1;h=g.substring(0,g.lastIndexOf("/"));if(/_(src|dev)\.js/g.test(g)){n="_src"}m=g.lastIndexOf("?");if(m!=-1){l=g.substring(m+1)}c.tinyMCEPreInit=c.tinyMCEPreInit||{base:h,suffix:n,query:l};if(g.indexOf("gzip")!=-1){i=j.language||"en";g=g+(/\?/.test(g)?"&":"?")+"js=true&core=true&suffix="+escape(n)+"&themes="+escape(j.theme)+"&plugins="+escape(j.plugins)+"&languages="+i;if(!c.tinyMCE_GZ){tinyMCE_GZ={start:function(){tinymce.suffix=n;function q(r){tinymce.ScriptLoader.markDone(tinyMCE.baseURI.toAbsolute(r))}q("langs/"+i+".js");q("themes/"+j.theme+"/editor_template"+n+".js");q("themes/"+j.theme+"/langs/"+i+".js");b.each(j.plugins.split(","),function(s,r){if(r){q("plugins/"+r+"/editor_plugin"+n+".js");q("plugins/"+r+"/langs/"+i+".js")}})},end:function(){}}}}b.ajax({type:"GET",url:g,dataType:"script",cache:true,success:function(){tinymce.dom.Event.domLoaded=1;d=2;if(j.script_loaded){j.script_loaded()}o();b.each(a,function(q,r){r()})}})}else{if(d===1){a.push(o)}else{o()}}return p};b.extend(b.expr[":"],{tinymce:function(g){return g.id&&!!tinyMCE.get(g.id)}});function f(){function i(l){if(l==="remove"){this.each(function(n,o){var m=h(o);if(m){m.remove()}})}this.find("span.mceEditor,div.mceEditor").each(function(n,o){var m=tinyMCE.get(o.id.replace(/_parent$/,""));if(m){m.remove()}})}function k(n){var m=this,l;if(n!==e){i.call(m);m.each(function(p,q){var o;if(o=tinyMCE.get(q.id)){o.setContent(n)}})}else{if(m.length>0){if(l=tinyMCE.get(m[0].id)){return l.getContent()}}}}function h(m){var l=null;(m)&&(m.id)&&(c.tinymce)&&(l=tinyMCE.get(m.id));return l}function g(l){return !!((l)&&(l.length)&&(c.tinymce)&&(l.is(":tinymce")))}var j={};b.each(["text","html","val"],function(n,l){var o=j[l]=b.fn[l],m=(l==="text");b.fn[l]=function(s){var p=this;if(!g(p)){return o.apply(p,arguments)}if(s!==e){k.call(p.filter(":tinymce"),s);o.apply(p.not(":tinymce"),arguments);return p}else{var r="";var q=arguments;(m?p:p.eq(0)).each(function(u,v){var t=h(v);r+=t?(m?t.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,""):t.getContent()):o.apply(b(v),q)});return r}}});b.each(["append","prepend"],function(n,m){var o=j[m]=b.fn[m],l=(m==="prepend");b.fn[m]=function(q){var p=this;if(!g(p)){return o.apply(p,arguments)}if(q!==e){p.filter(":tinymce").each(function(s,t){var r=h(t);r&&r.setContent(l?q+r.getContent():r.getContent()+q)});o.apply(p.not(":tinymce"),arguments);return p}}});b.each(["remove","replaceWith","replaceAll","empty"],function(m,l){var n=j[l]=b.fn[l];b.fn[l]=function(){i.call(this,l);return n.apply(this,arguments)}});j.attr=b.fn.attr;b.fn.attr=function(n,q,o){var m=this;if((!n)||(n!=="value")||(!g(m))){return j.attr.call(m,n,q,o)}if(q!==e){k.call(m.filter(":tinymce"),q);j.attr.call(m.not(":tinymce"),n,q,o);return m}else{var p=m[0],l=h(p);return l?l.getContent():j.attr.call(b(p),n,q,o)}}}})(jQuery); \ No newline at end of file +(function(b){var e,d,a=[],c=window;b.fn.tinymce=function(j){var p=this,g,k,h,m,i,l="",n="";if(!p.length){return p}if(!j){return tinyMCE.get(p[0].id)}p.css("visibility","hidden");function o(){var r=[],q=0;if(f){f();f=null}p.each(function(t,u){var s,w=u.id,v=j.oninit;if(!w){u.id=w=tinymce.DOM.uniqueId()}s=new tinymce.Editor(w,j);r.push(s);s.onInit.add(function(){var x,y=v;p.css("visibility","");if(v){if(++q==r.length){if(tinymce.is(y,"string")){x=(y.indexOf(".")===-1)?null:tinymce.resolve(y.replace(/\.\w+$/,""));y=tinymce.resolve(y)}y.apply(x||tinymce,r)}}})});b.each(r,function(t,s){s.render()})}if(!c.tinymce&&!d&&(g=j.script_url)){d=1;h=g.substring(0,g.lastIndexOf("/"));if(/_(src|dev)\.js/g.test(g)){n="_src"}m=g.lastIndexOf("?");if(m!=-1){l=g.substring(m+1)}c.tinyMCEPreInit=c.tinyMCEPreInit||{base:h,suffix:n,query:l};if(g.indexOf("gzip")!=-1){i=j.language||"en";g=g+(/\?/.test(g)?"&":"?")+"js=true&core=true&suffix="+escape(n)+"&themes="+escape(j.theme)+"&plugins="+escape(j.plugins)+"&languages="+i;if(!c.tinyMCE_GZ){tinyMCE_GZ={start:function(){tinymce.suffix=n;function q(r){tinymce.ScriptLoader.markDone(tinyMCE.baseURI.toAbsolute(r))}q("langs/"+i+".js");q("themes/"+j.theme+"/editor_template"+n+".js");q("themes/"+j.theme+"/langs/"+i+".js");b.each(j.plugins.split(","),function(s,r){if(r){q("plugins/"+r+"/editor_plugin"+n+".js");q("plugins/"+r+"/langs/"+i+".js")}})},end:function(){}}}}b.ajax({type:"GET",url:g,dataType:"script",cache:true,success:function(){tinymce.dom.Event.domLoaded=1;d=2;if(j.script_loaded){j.script_loaded()}o();b.each(a,function(q,r){r()})}})}else{if(d===1){a.push(o)}else{o()}}return p};b.extend(b.expr[":"],{tinymce:function(g){return g.id&&!!tinyMCE.get(g.id)}});function f(){function i(l){if(l==="remove"){this.each(function(n,o){var m=h(o);if(m){m.remove()}})}this.find("span.mceEditor,div.mceEditor").each(function(n,o){var m=tinyMCE.get(o.id.replace(/_parent$/,""));if(m){m.remove()}})}function k(n){var m=this,l;if(n!==e){i.call(m);m.each(function(p,q){var o;if(o=tinyMCE.get(q.id)){o.setContent(n)}})}else{if(m.length>0){if(l=tinyMCE.get(m[0].id)){return l.getContent()}}}}function h(m){var l=null;(m)&&(m.id)&&(c.tinymce)&&(l=tinyMCE.get(m.id));return l}function g(l){return !!((l)&&(l.length)&&(c.tinymce)&&(l.is(":tinymce")))}var j={};b.each(["text","html","val"],function(n,l){var o=j[l]=b.fn[l],m=(l==="text");b.fn[l]=function(s){var p=this;if(!g(p)){return o.apply(p,arguments)}if(s!==e){k.call(p.filter(":tinymce"),s);o.apply(p.not(":tinymce"),arguments);return p}else{var r="";var q=arguments;(m?p:p.eq(0)).each(function(u,v){var t=h(v);r+=t?(m?t.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,""):t.getContent()):o.apply(b(v),q)});return r}}});b.each(["append","prepend"],function(n,m){var o=j[m]=b.fn[m],l=(m==="prepend");b.fn[m]=function(q){var p=this;if(!g(p)){return o.apply(p,arguments)}if(q!==e){p.filter(":tinymce").each(function(s,t){var r=h(t);r&&r.setContent(l?q+r.getContent():r.getContent()+q)});o.apply(p.not(":tinymce"),arguments);return p}}});b.each(["remove","replaceWith","replaceAll","empty"],function(m,l){var n=j[l]=b.fn[l];b.fn[l]=function(){i.call(this,l);return n.apply(this,arguments)}});j.attr=b.fn.attr;b.fn.attr=function(n,q,o){var m=this;if((!n)||(n!=="value")||(!g(m))){return j.attr.call(m,n,q,o)}if(q!==e){k.call(m.filter(":tinymce"),q);j.attr.call(m.not(":tinymce"),n,q,o);return m}else{var p=m[0],l=h(p);return l?l.getContent():j.attr.call(b(p),n,q,o)}}}})(jQuery); \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/langs/en.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/langs/en.js index ea4a1b0e14..8a80d46b1a 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/langs/en.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/langs/en.js @@ -12,9 +12,54 @@ not_set:"-- Not set --", clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?", clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.", popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.", -invalid_data:"Error: Invalid values entered, these are marked in red.", +invalid_data:"{#field} is invalid", +invalid_data_number:"{#field} must be a number", +invalid_data_min:"{#field} must be a number greater than {#min}", +invalid_data_size:"{#field} must be a number or percentage", more_colors:"More colors" }, +colors:{ +'000000':'Black', +'993300':'Burnt orange', +'333300':'Dark olive', +'003300':'Dark green', +'003366':'Dark azure', +'000080':'Navy Blue', +'333399':'Indigo', +'333333':'Very dark gray', +'800000':'Maroon', +'FF6600':'Orange', +'808000':'Olive', +'008000':'Green', +'008080':'Teal', +'0000FF':'Blue', +'666699':'Grayish blue', +'808080':'Gray', +'FF0000':'Red', +'FF9900':'Amber', +'99CC00':'Yellow green', +'339966':'Sea green', +'33CCCC':'Turquoise', +'3366FF':'Royal blue', +'800080':'Purple', +'999999':'Medium gray', +'FF00FF':'Magenta', +'FFCC00':'Gold', +'FFFF00':'Yellow', +'00FF00':'Lime', +'00FFFF':'Aqua', +'00CCFF':'Sky blue', +'993366':'Brown', +'C0C0C0':'Silver', +'FF99CC':'Pink', +'FFCC99':'Peach', +'FFFF99':'Light yellow', +'CCFFCC':'Pale green', +'CCFFFF':'Pale cyan', +'99CCFF':'Light sky blue', +'CC99FF':'Plum', +'FFFFFF':'White' +}, contextmenu:{ align:"Alignment", left:"Left", @@ -151,7 +196,8 @@ langs:"Languages", wait:"Please wait...", sug:"Suggestions", no_sug:"No suggestions", -no_mpell:"No misspellings found." +no_mpell:"No misspellings found.", +learn_word:"Learn word" }, pagebreak:{ desc:"Insert page break." @@ -167,4 +213,11 @@ upper_roman:"Upper roman", circle:"Circle", disc:"Disc", square:"Square" -}}}); \ No newline at end of file +}, +aria:{ +rich_text_area:"Rich Text Area" +}, +wordcount:{ +words: 'Words: ' +} +}}); \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js index 873bfd8d38..ad6a7b6988 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js @@ -1,5 +1,7 @@ tinyMCE.addI18n('en.advhr_dlg',{ +normal:"Normal", width:"Width", +widthunits:"Units", size:"Height", noshade:"No shadow" }); \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm index fc37b2aecd..843e1f8f0b 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm @@ -8,43 +8,44 @@ - +
    - - - - - - - - - - - - - -
    - - -
    + + + + + + + + + + + + + +
    + + + +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js index 2625dd2131..d2678cbcf2 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js @@ -14,7 +14,7 @@ // Register commands ed.addCommand('mceAdvImage', function() { // Internal image object like a flash placeholder - if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) + if (ed.dom.getAttrib(ed.selection.getNode(), 'class', '').indexOf('mceItem') != -1) return; ed.windowManager.open({ diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm index 79cff3f19f..ed16b3d4a9 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm @@ -10,13 +10,14 @@ - - + + + @@ -25,15 +26,15 @@
    {#advimage_dlg.general} - +
    - @@ -60,7 +61,7 @@
    {#advimage_dlg.tab_appearance} -
    +
    - + - - + @@ -109,7 +108,7 @@ @@ -118,7 +117,7 @@ @@ -129,7 +128,7 @@ - -
    - x - px + + x + + px
      + +
    @@ -142,18 +145,18 @@
    {#advimage_dlg.swap_image} - + -
    +
    - @@ -161,12 +164,12 @@ - @@ -178,7 +181,7 @@
    {#advimage_dlg.misc} -
    + +
    - - + + -
      
    + +
    - - + + -
      
    +
    @@ -211,12 +214,12 @@ -
    + +
    - - + + -
      
    @@ -227,6 +230,6 @@ - + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js index 3bda86a2d3..f222486131 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js @@ -9,13 +9,13 @@ var ImageDialog = { }, init : function(ed) { - var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(); + var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(), fl = tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList'); tinyMCEPopup.resizeToInnerSize(); this.fillClassList('class_list'); - this.fillFileList('src_list', 'tinyMCEImageList'); - this.fillFileList('over_list', 'tinyMCEImageList'); - this.fillFileList('out_list', 'tinyMCEImageList'); + this.fillFileList('src_list', fl); + this.fillFileList('over_list', fl); + this.fillFileList('out_list', fl); TinyMCE_EditableSelects.init(); if (n.nodeName == 'IMG') { @@ -142,7 +142,7 @@ var ImageDialog = { } tinymce.extend(args, { - src : nl.src.value, + src : nl.src.value.replace(/ /g, '%20'), width : nl.width.value, height : nl.height.value, alt : nl.alt.value, @@ -177,6 +177,8 @@ var ImageDialog = { ed.undoManager.add(); } + tinyMCEPopup.editor.execCommand('mceRepaint'); + tinyMCEPopup.editor.focus(); tinyMCEPopup.close(); }, @@ -285,7 +287,7 @@ var ImageDialog = { fillFileList : function(id, l) { var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - l = window[l]; + l = typeof(l) === 'function' ? l() : window[l]; lst.options.length = 0; if (l && l.length > 0) { @@ -359,7 +361,7 @@ var ImageDialog = { }, updateStyle : function(ty) { - var dom = tinyMCEPopup.dom, st, v, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value}); + var dom = tinyMCEPopup.dom, b, bStyle, bColor, v, isIE = tinymce.isIE, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value}); if (tinyMCEPopup.editor.settings.inline_styles) { // Handle align @@ -378,14 +380,27 @@ var ImageDialog = { // Handle border if (ty == 'border') { + b = img.style.border ? img.style.border.split(' ') : []; + bStyle = dom.getStyle(img, 'border-style'); + bColor = dom.getStyle(img, 'border-color'); + dom.setStyle(img, 'border', ''); v = f.border.value; if (v || v == '0') { if (v == '0') - img.style.border = '0'; - else - img.style.border = v + 'px solid black'; + img.style.border = isIE ? '0' : '0 none none'; + else { + if (b.length == 3 && b[isIE ? 2 : 1]) + bStyle = b[isIE ? 2 : 1]; + else if (!bStyle || bStyle == 'none') + bStyle = 'solid'; + if (b.length == 3 && b[isIE ? 0 : 2]) + bColor = b[isIE ? 0 : 2]; + else if (!bColor || bColor == 'none') + bColor = 'black'; + img.style.border = v + 'px ' + bStyle + ' ' + bColor; + } } } diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js index f493d196fa..d8f11e0303 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js @@ -28,6 +28,8 @@ alt:"Image description", list:"Image list", border:"Border", dimensions:"Dimensions", +width:"Width", +height:"Height", vspace:"Vertical space", hspace:"Horizontal space", align:"Alignment", diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js index b78e82f76b..837c937c66 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js @@ -30,8 +30,6 @@ function init() { document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink'); document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink'); - document.getElementById('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href'); - document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href'); document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target'); // Link list @@ -41,6 +39,13 @@ function init() { else document.getElementById("linklisthrefcontainer").innerHTML = html; + // Anchor list + html = getAnchorListHTML('anchorlist','href'); + if (html == "") + document.getElementById("anchorlistrow").style.display = 'none'; + else + document.getElementById("anchorlistcontainer").innerHTML = html; + // Resize some elements if (isVisible('hrefbrowser')) document.getElementById('href').style.width = '260px'; @@ -360,20 +365,22 @@ function setAttrib(elm, attrib, value) { } function getAnchorListHTML(id, target) { - var inst = tinyMCEPopup.editor; - var nodes = inst.dom.select('a.mceItemAnchor,img.mceItemAnchor'), name, i; - var html = ""; - - html += ''; + if (html == "") + return ""; + + html = ''; return html; } @@ -389,7 +396,6 @@ function insertAction() { // Remove element if there is no href if (!document.forms[0].href.value) { - tinyMCEPopup.execCommand("mceBeginUndoLevel"); i = inst.selection.getBookmark(); inst.dom.remove(elm, 1); inst.selection.moveToBookmark(i); @@ -398,12 +404,10 @@ function insertAction() { return; } - tinyMCEPopup.execCommand("mceBeginUndoLevel"); - // Create new anchor elements if (elm == null) { inst.getDoc().execCommand("unlink", false, null); - tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1}); + tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';}); for (i=0; i - -
    -
    + + + + -
    +
    + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif index 16f68cc1e91a9b8ec6cfa0ba4e0c86f94b177f1a..c7cf1011dad0e7500e29a278b0d395b253871109 100644 GIT binary patch delta 268 zcmV+n0rURY0@eZ$M@dFFIbjk25&-lc0J)nSkq}gWCJF-k?l%Ac03rDV1poja04x9i z000sI5&%F2)8HqHP-&K zLM9f)qQm8C1c`;hGBJ_}h73g_p=1mM^9RXLyb^bpf>AvH6dpB#1`P%p2?GxRIXezw z7zGP+3jz%k3l2poa}fvt8yf%!5pp93KMDvH92^x0V-7i+EDszR8Bewx4-y8WehLpR z33wR8E)NQeD=m2M7#-8v+{*T!alCd#3 z1p^Ir4Fi-428xUrkd&O950`xk9-RXQ4F(zs0}qJ@2n?ee0ving0HzHddj}8`MGLmU z8UhImO%o-q#)2Cf00I^Q4_>?<5El-{nhOg84HOFw7eOBf7YG&%hkqFs2p3Q(*Aoat UP6!j@HP+?<{sHjFeFy;nJK@hu1^@s6 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif index 1606c119e75678c4031f384e0d50849906e8f533..82c5b182e61d32bd394acae551eff180f1eebd26 100644 GIT binary patch delta 269 zcmV+o0rLLX0@nf%M@dFFIbjk25&-lc0K%p+kq}gWQaug+`&s}103rDV1poja04x9i z000sI5&%F2)ZizIQ)!l?Xh>A$7VskoPwh#@I9<*GEDONFahaqh2L%Pf;kcR*isE3L zI2Im3A3bNpK_?^9QN%xH_GCzT(kPR|yLU7KDX_2pAAJa~A*# z2^9-;8v_d!2?_v3DRU7A5(5Jg2N7~31{ezo9uTY$9)TD+oGcI(4STm0Q4*wpwG|r; zF2ODk2{(g0w~m91nJ)p)P~b0v=TXuJkV0)pK%`hRH&5(aq`SQQ0|4*~)Y zj~;||h6NmskCzV%0uYjV3kVjWqM-;FoP`G(WCRQW7Z(8x1b=r16AlX=0u2`oB@7o0 z3LXm%B?eNu8w9Vj0v=tq9}^cH3JDbp8v_d!2?`w-K_3Pe2MZcXM;Z$U7f&hF4hJ0z U3mpdz;x*Id4FABSjR*k%I|lSgp8x;= diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif index b33d3cca1e7b8e62dc689880074d5c61f619520d..fe66220c24b4da4526818a5d68f75a06d9985a29 100644 GIT binary patch delta 249 zcmVc6jM@dFFIbjk25&-lc0Klpjkq}gWQauaR#xDQ>03rDV1poja04x9i z000sI5&%F2z~Co}Q)!l?s2E!2QdA zP6EM+V$0o5egPxNVelL@nuEvS5Py&l$*VJWNgmaeBy#Fc3>i3Y6%ZGOhlmgrZX^W= z8v_Gi8wdrADnAk!5DyO!7!pA_ZyYQc4;~&as7@LN99jl)E**3kv`;r%EDsR|k-xtS zxe5rp69ipb1YdXxI|zjY71PuN7Z3uIlM@dFFIbjk25&+Z_08%{*kq}gWz^WJ3#xDQ>03rDV0RR9W04x9i z000sI5&!@N!r&*0Q)!lCN*2gA3>#8RD(M*Bp=pO_IJA@^(ve^wj|T)J=|mKx31Xqy zL>`%J1fp3WXcLY>lX-YN*)vvS;FJ&#NtObb*E5pGS7DH60e65|cm@i5WOEb=0u&Si zj}nDqhYt}3FPE1Kk%oN{C!Z4r8Io|G1cs;z1QS;X3KIcN6RD}J9RVd52oM(p6~Dj) z7Z3;+U=_R<%FD|T6+s^g3=I$w7#0>7TMZ0QDH9g~2t-Z@0md~SvlqY>7q2NH06S3N BNLv5^ diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif index e6a9e60d5ddd1243fbbf2197b4dc6cd9c1b58b93..fd27edfaaa29a70a8c4563c0eab9f18c74d374fd 100644 GIT binary patch delta 270 zcmV+p0rCFX0@wl&M@dFFIbjk25&-lc0C`{zkq}gWCJF+oiUI%t03rDV1poja04x9i z000sI5&%F2)!-+JP-&K7%&eE7zha(Mk#X<1{oe683qw@BL@`@2pbbn6B`H)6*`?PtqlrLxC~PZrGN+% zE&vU~#TXL^jVmoMhlVv1IR^#>3>*Rg2{s7;0vrr}2N2W=TMrHb0uEwT<0=*g4h65Q U1r7!lv`7aQ0sjH?nF;{_JD=x5hyVZp delta 271 zcmV+q0r39V0@(r(M@dFFIbjk25&+Z?0453okq}gWd0-BziUI%t03rDV0RR9W04x9i z000sI5&!@N*5D_KP-&K9N=8QJd6^MGDoHFCB1y=#5VX{x;y`RB48~-Ga8wQ>h#?`F zTrSD$M3OMjAdy9t(NHAIO37j-Eo?9tg#s>zZwlT+1~Gwm8h(Hn69^dx2V!s-3=a<+ z0|Oj(k{b($iHwq&l93aYdI$^y9-5LK0}m612L=TU90DB)k_jCG91M5|5EKp@jU52N z03D4R4iqJ;3BC^w0s;=jUAi9-78(f%i;WBz2niY%K_3Se1`Y*FM+FWB7EmeH6b2d& V4jKj&;x*Of0sjHsjr$M+06RN6NSOct diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif index cb99cdd9136fa30462a9f57aa6a0adeb7e4124e7..0cc9bb71cca4cdeafbb248ce7e07c3708c1cbd64 100644 GIT binary patch delta 264 zcmV+j0r&pa0@4ByM@dFFIbjk25&-lc0Q=+`kq}gWC=3F`xI_Q|03rDV1poja04x9i z000sI5&%F2&)_GDP-&KpRzaw7*n2_6C!6#^a!K{=W%7!?bX615c=6B?o`2^cO2 zcoM=c7zsElEfNF+&d-7v$p#C7H3(h^g0}_-5C=(GGudGrRNg8V1`i7u92^)64+a;o OM+X-H`T_N$Apkpuj7YZt delta 268 zcmV+n0rURS0@eZ$M@dFFIbjk25&+Z?04NLskq}gW`{WwLxI_Q|03rDV0RR9W04x9i z000sI5&!@N)8HqHP-&K9N=AmpFq#oTDp_dDHci{26|~f$@kn?Cm5RWVcr*?ph(R$C zG%6BFr6HIo3^YhYGr?3AiY&T{^|8V7w7SrQHo z1RaiZ6q6i?idh5$nwygp7?wp6oeuy28l4>&4~Yf~qLT=v2%Qpp2M`ty9FQFur2rir z1RM_*B?nWxk+Q-ZU$-9+7Yzyt5(*g^X$cAq7eOBf7X}Xt7#tiJ3l9btP$|+D21HH< S7T-0|;sN{t?%*Fn0028#VNAdP diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif index 9faf1aff8f4b28e02f4f414975fe1859c43b6b54..0631c7616ec8624ddeee02b633326f697ee72f80 100644 GIT binary patch delta 276 zcmV+v0qg$X0^R};M@dFFIbjk25&-lc0MWuJkq}gWC=CMr@j3ti03rDV1poja04x9i z000sI5&%F2+u$dPQfZc>h%k}mS_`xd!)9v?GD=uwG!#n1P{Bx25L@HjmHz$20{ z93>Ts1_E((z8wcwL#Z4|1qR^|i5v)w!ugXVXaI_D!lF>PGz3-%90v;n3^s`y30029B7)0Cv delta 277 zcmV+w0qXwV0^b4/i); + _htmlToData : function() { + var headerFragment = this._parseHeader(), data = {}, nodes, elm, matches, editor = this.editor; - if (attr && attr[1]) { - bdattr = attr[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g); + function getAttr(elm, name) { + var value = elm.attr(name); - if (bdattr) { - for(i = 0, len = bdattr.length; i < len; i++) { - kv = bdattr[i].split('='); - k = kv[0].replace(/\s/,''); - v = kv[1]; + return value || ''; + }; - if (v) { - v = v.replace(/^\s+/,'').replace(/\s+$/,''); - t = v.match(/^["'](.*)["']$/); + // Default some values + data.fontface = editor.getParam("fullpage_default_fontface", ""); + data.fontsize = editor.getParam("fullpage_default_fontsize", ""); + + // Parse XML PI + elm = headerFragment.firstChild; + if (elm.type == 7) { + data.xml_pi = true; + matches = /encoding="([^"]+)"/.exec(elm.value); + if (matches) + data.docencoding = matches[1]; + } - if (t) - v = t[1]; - } else - v = k; + // Parse doctype + elm = headerFragment.getAll('#doctype')[0]; + if (elm) + data.doctype = '"; - ed.dom.setAttrib(ed.getBody(), 'style', v); - } + // Parse title element + elm = headerFragment.getAll('title')[0]; + if (elm && elm.firstChild) { + data.metatitle = elm.firstChild.value; + } + + // Parse meta elements + each(headerFragment.getAll('meta'), function(meta) { + var name = meta.attr('name'), httpEquiv = meta.attr('http-equiv'), matches; + + if (name) + data['meta' + name.toLowerCase()] = meta.attr('content'); + else if (httpEquiv == "Content-Type") { + matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); + + if (matches) + data.docencoding = matches[1]; } + }); + + // Parse html attribs + elm = headerFragment.getAll('html')[0]; + if (elm) + data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); + + // Parse stylesheet + elm = headerFragment.getAll('link')[0]; + if (elm && elm.attr('rel') == 'stylesheet') + data.stylesheet = elm.attr('href'); + + // Parse body parts + elm = headerFragment.getAll('body')[0]; + if (elm) { + data.langdir = getAttr(elm, 'dir'); + data.style = getAttr(elm, 'style'); + data.visited_color = getAttr(elm, 'vlink'); + data.link_color = getAttr(elm, 'link'); + data.active_color = getAttr(elm, 'alink'); } + + return data; }, - _createSerializer : function() { - return new tinymce.dom.Serializer({ - dom : this.editor.dom, - apply_source_formatting : true + _dataToHtml : function(data) { + var headerFragment, headElement, html, elm, value, dom = this.editor.dom; + + function setAttr(elm, name, value) { + elm.attr(name, value ? value : undefined); + }; + + function addHeadNode(node) { + if (headElement.firstChild) + headElement.insert(node, headElement.firstChild); + else + headElement.append(node); + }; + + headerFragment = this._parseHeader(); + headElement = headerFragment.getAll('head')[0]; + if (!headElement) { + elm = headerFragment.getAll('html')[0]; + headElement = new Node('head', 1); + + if (elm.firstChild) + elm.insert(headElement, elm.firstChild, true); + else + elm.append(headElement); + } + + // Add/update/remove XML-PI + elm = headerFragment.firstChild; + if (data.xml_pi) { + value = 'version="1.0"'; + + if (data.docencoding) + value += ' encoding="' + data.docencoding + '"'; + + if (elm.type != 7) { + elm = new Node('xml', 7); + headerFragment.insert(elm, headerFragment.firstChild, true); + } + + elm.value = value; + } else if (elm && elm.type == 7) + elm.remove(); + + // Add/update/remove doctype + elm = headerFragment.getAll('#doctype')[0]; + if (data.doctype) { + if (!elm) { + elm = new Node('#doctype', 10); + + if (data.xml_pi) + headerFragment.insert(elm, headerFragment.firstChild); + else + addHeadNode(elm); + } + + elm.value = data.doctype.substring(9, data.doctype.length - 1); + } else if (elm) + elm.remove(); + + // Add/update/remove title + elm = headerFragment.getAll('title')[0]; + if (data.metatitle) { + if (!elm) { + elm = new Node('title', 1); + elm.append(new Node('#text', 3)).value = data.metatitle; + addHeadNode(elm); + } + } + + // Add meta encoding + if (data.docencoding) { + elm = null; + each(headerFragment.getAll('meta'), function(meta) { + if (meta.attr('http-equiv') == 'Content-Type') + elm = meta; + }); + + if (!elm) { + elm = new Node('meta', 1); + elm.attr('http-equiv', 'Content-Type'); + elm.shortEnded = true; + addHeadNode(elm); + } + + elm.attr('content', 'text/html; charset=' + data.docencoding); + } + + // Add/update/remove meta + each('keywords,description,author,copyright,robots'.split(','), function(name) { + var nodes = headerFragment.getAll('meta'), i, meta, value = data['meta' + name]; + + for (i = 0; i < nodes.length; i++) { + meta = nodes[i]; + + if (meta.attr('name') == name) { + if (value) + meta.attr('content', value); + else + meta.remove(); + + return; + } + } + + if (value) { + elm = new Node('meta', 1); + elm.attr('name', name); + elm.attr('content', value); + elm.shortEnded = true; + + addHeadNode(elm); + } }); + + // Add/update/delete link + elm = headerFragment.getAll('link')[0]; + if (elm && elm.attr('rel') == 'stylesheet') { + if (data.stylesheet) + elm.attr('href', data.stylesheet); + else + elm.remove(); + } else if (data.stylesheet) { + elm = new Node('link', 1); + elm.attr({ + rel : 'stylesheet', + text : 'text/css', + href : data.stylesheet + }); + elm.shortEnded = true; + + addHeadNode(elm); + } + + // Update body attributes + elm = headerFragment.getAll('body')[0]; + if (elm) { + setAttr(elm, 'dir', data.langdir); + setAttr(elm, 'style', data.style); + setAttr(elm, 'vlink', data.visited_color); + setAttr(elm, 'link', data.link_color); + setAttr(elm, 'alink', data.active_color); + + // Update iframe body as well + dom.setAttribs(this.editor.getBody(), { + style : data.style, + dir : data.dir, + vLink : data.visited_color, + link : data.link_color, + aLink : data.active_color + }); + } + + // Set html attributes + elm = headerFragment.getAll('html')[0]; + if (elm) { + setAttr(elm, 'lang', data.langcode); + setAttr(elm, 'xml:lang', data.langcode); + } + + // Serialize header fragment and crop away body part + html = new tinymce.html.Serializer({ + validate: false, + indent: true, + apply_source_formatting : true, + indent_before: 'head,html,body,meta,title,script,link,style', + indent_after: 'head,html,body,meta,title,script,link,style' + }).serialize(headerFragment); + + this.head = html.substring(0, html.indexOf('')); + }, + + _parseHeader : function() { + // Parse the contents with a DOM parser + return new tinymce.html.DomParser({ + validate: false, + root_name: '#document' + }).parse(this.head); }, _setContent : function(ed, o) { - var t = this, sp, ep, c = o.content, v, st = ''; + var self = this, startPos, endPos, content = o.content, headerFragment, styles = '', dom = self.editor.dom, elm; + + function low(s) { + return s.replace(/<\/?[A-Z]+/g, function(a) { + return a.toLowerCase(); + }) + }; // Ignore raw updated if we already have a head, this will fix issues with undo/redo keeping the head/foot separate - if (o.format == 'raw' && t.head) + if (o.format == 'raw' && self.head) return; if (o.source_view && ed.getParam('fullpage_hide_in_source_view')) return; // Parse out head, body and footer - c = c.replace(/<(\/?)BODY/gi, '<$1body'); - sp = c.indexOf('', sp); - t.head = c.substring(0, sp + 1); + if (startPos != -1) { + startPos = content.indexOf('>', startPos); + self.head = low(content.substring(0, startPos + 1)); - ep = c.indexOf('\n'; + elm = headerFragment.getAll('body')[0]; + if (elm) { + dom.setAttribs(self.editor.getBody(), { + style : elm.attr('style') || '', + dir : elm.attr('dir') || '', + vLink : elm.attr('vlink') || '', + link : elm.attr('link') || '', + aLink : elm.attr('alink') || '' + }); + } - t.head += ed.getParam('fullpage_default_doctype', ''); - t.head += '\n\n\n' + ed.getParam('fullpage_default_title', 'Untitled document') + '\n'; + if (styles) + dom.add(self.editor.getDoc().getElementsByTagName('head')[0], 'style', {id : 'fullpage_styles'}, styles); + else + dom.remove('fullpage_styles'); + }, - if (v = ed.getParam('fullpage_default_encoding')) - t.head += '\n'; + _getDefaultHeader : function() { + var header = '', editor = this.editor, value, styles = ''; - if (v = ed.getParam('fullpage_default_font_family')) - st += 'font-family: ' + v + ';'; + if (editor.getParam('fullpage_default_xml_pi')) + header += '\n'; - if (v = ed.getParam('fullpage_default_font_size')) - st += 'font-size: ' + v + ';'; + header += editor.getParam('fullpage_default_doctype', ''); + header += '\n\n\n'; - if (v = ed.getParam('fullpage_default_text_color')) - st += 'color: ' + v + ';'; + if (value = editor.getParam('fullpage_default_title')) + header += '' + value + '\n'; - t.head += '\n\n'; - t.foot = '\n\n'; - } + if (value = editor.getParam('fullpage_default_encoding')) + header += '\n'; + + if (value = editor.getParam('fullpage_default_font_family')) + styles += 'font-family: ' + value + ';'; + + if (value = editor.getParam('fullpage_default_font_size')) + styles += 'font-size: ' + value + ';'; + + if (value = editor.getParam('fullpage_default_text_color')) + styles += 'color: ' + value + ';'; + + header += '\n\n'; + + return header; }, _getContent : function(ed, o) { - var t = this; + var self = this; if (!o.source_view || !ed.getParam('fullpage_hide_in_source_view')) - o.content = tinymce.trim(t.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(t.foot); + o.content = tinymce.trim(self.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(self.foot); } }); // Register plugin tinymce.PluginManager.add('fullpage', tinymce.plugins.FullPagePlugin); -})(); \ No newline at end of file +})(); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm index c32afaf2d9..14ab8652ea 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm @@ -8,13 +8,12 @@ - -
    + + @@ -72,9 +71,9 @@
       -
    -
    - - +
     
    @@ -147,7 +146,7 @@
    - +
     
    @@ -158,7 +157,7 @@
    - +
     
    @@ -173,15 +172,15 @@ - + - + - + - +
    @@ -195,7 +194,7 @@
    - +
    @@ -205,7 +204,7 @@
    - +
     
    @@ -217,7 +216,7 @@
    - +
     
    @@ -225,16 +224,6 @@
       
    @@ -254,310 +243,9 @@ - - - - -
  • - -
    - - -
    - {#fullpage_dlg.head_elements} - -
    -
    -
    - - -
    -
    - - -
    -
    -
    - -
    -
    - -
    - {#fullpage_dlg.meta_element} - - - - - - - - - - - - - - -
    - - -
    - -
    - {#fullpage_dlg.title_element} - - - - - - -
    - - -
    - -
    - {#fullpage_dlg.script_element} - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    - - - - -
     
    -
    - -
    - -
    -
    - - -
    - -
    - {#fullpage_dlg.style_element} - - - -
    - -
    -
    - - - - - - - - - -
    -
    - -
    - -
    -
    - - -
    - -
    - {#fullpage_dlg.base_element} - - - - - - - - - +
    - - -
    - - - -
    - {#fullpage_dlg.comment_element} - - - -
    @@ -566,6 +254,6 @@
    - + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js index a1bb719a38..3f672ad3ba 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js @@ -8,464 +8,225 @@ * Contributing: http://tinymce.moxiecode.com/contributing */ -tinyMCEPopup.requireLangPack(); - -var doc; - -var defaultDocTypes = - 'XHTML 1.0 Transitional=,' + - 'XHTML 1.0 Frameset=,' + - 'XHTML 1.0 Strict=,' + - 'XHTML 1.1=,' + - 'HTML 4.01 Transitional=,' + - 'HTML 4.01 Strict=,' + - 'HTML 4.01 Frameset='; - -var defaultEncodings = - 'Western european (iso-8859-1)=iso-8859-1,' + - 'Central European (iso-8859-2)=iso-8859-2,' + - 'Unicode (UTF-8)=utf-8,' + - 'Chinese traditional (Big5)=big5,' + - 'Cyrillic (iso-8859-5)=iso-8859-5,' + - 'Japanese (iso-2022-jp)=iso-2022-jp,' + - 'Greek (iso-8859-7)=iso-8859-7,' + - 'Korean (iso-2022-kr)=iso-2022-kr,' + - 'ASCII (us-ascii)=us-ascii'; - -var defaultMediaTypes = - 'all=all,' + - 'screen=screen,' + - 'print=print,' + - 'tty=tty,' + - 'tv=tv,' + - 'projection=projection,' + - 'handheld=handheld,' + - 'braille=braille,' + - 'aural=aural'; - -var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings'; -var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px'; - -function init() { - var f = document.forms['fullpage'], el = f.elements, e, i, p, doctypes, encodings, mediaTypes, fonts, ed = tinyMCEPopup.editor, dom = tinyMCEPopup.dom, style; - - // Setup doctype select box - doctypes = ed.getParam("fullpage_doctypes", defaultDocTypes).split(','); - for (i=0; i 1) - addSelectValue(f, 'doctypes', p[0], p[1]); - } - - // Setup fonts select box - fonts = ed.getParam("fullpage_fonts", defaultFontNames).split(';'); - for (i=0; i 1) - addSelectValue(f, 'fontface', p[0], p[1]); - } - - // Setup fontsize select box - fonts = ed.getParam("fullpage_fontsizes", defaultFontSizes).split(','); - for (i=0; i 1) { - addSelectValue(f, 'element_style_media', p[0], p[1]); - addSelectValue(f, 'element_link_media', p[0], p[1]); - } - } - - // Setup encodings select box - encodings = ed.getParam("fullpage_encodings", defaultEncodings).split(','); - for (i=0; i 1) { - addSelectValue(f, 'docencoding', p[0], p[1]); - addSelectValue(f, 'element_script_charset', p[0], p[1]); - addSelectValue(f, 'element_link_charset', p[0], p[1]); - } - } - - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); - document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color'); - //document.getElementById('hover_color_pickcontainer').innerHTML = getColorPickerHTML('hover_color_pick','hover_color'); - document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color'); - document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color'); - document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor'); - document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage'); - document.getElementById('link_href_pickcontainer').innerHTML = getBrowserHTML('link_href_browser','element_link_href','file','fullpage'); - document.getElementById('script_src_pickcontainer').innerHTML = getBrowserHTML('script_src_browser','element_script_src','file','fullpage'); - document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage'); - - // Resize some elements - if (isVisible('stylesheetbrowser')) - document.getElementById('stylesheet').style.width = '220px'; - - if (isVisible('link_href_browser')) - document.getElementById('element_link_href').style.width = '230px'; - - if (isVisible('bgimage_browser')) - document.getElementById('bgimage').style.width = '210px'; - - // Add iframe - dom.add(document.body, 'iframe', {id : 'documentIframe', src : 'javascript:""', style : {display : 'none'}}); - doc = dom.get('documentIframe').contentWindow.document; - h = tinyMCEPopup.getWindowArg('head_html'); - - // Preprocess the HTML disable scripts and urls - h = h.replace(/'; - } + if (!url) + return url; - return im; - }); - } - }); + if (force_absolute) + return editor.documentBaseURI.toAbsolute(url); + + return urlConverter.call(urlConverterScope, url, 'src', 'object'); }, getInfo : function() { @@ -202,210 +225,595 @@ }; }, - // Private methods - _objectsToSpans : function(ed, o) { - var t = this, h = o.content; + /** + * Converts the JSON data object to an img node. + */ + dataToImg : function(data, force_absolute) { + var self = this, editor = self.editor, baseUri = editor.documentBaseURI, sources, attrs, img, i; + + data.params.src = self.convertUrl(data.params.src, force_absolute); - h = h.replace(/]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, function(a, b, c) { - var o = t._parse(c); + attrs = data.video.attrs; + if (attrs) + attrs.src = self.convertUrl(attrs.src, force_absolute); + + if (attrs) + attrs.poster = self.convertUrl(attrs.poster, force_absolute); + + sources = toArray(data.video.sources); + if (sources) { + for (i = 0; i < sources.length; i++) + sources[i].src = self.convertUrl(sources[i].src, force_absolute); + } - return '' + img = self.editor.dom.create('img', { + id : data.id, + style : data.style, + align : data.align, + src : self.editor.theme.url + '/img/trans.gif', + 'class' : 'mceItemMedia mceItem' + self.getType(data.type).name, + 'data-mce-json' : JSON.serialize(data, "'") }); - h = h.replace(/]*)>/gi, ''); - h = h.replace(/]*)\/?>/gi, ''); - h = h.replace(/]*)>/gi, ''); - h = h.replace(/<\/(object)([^>]*)>/gi, ''); - h = h.replace(/<\/embed>/gi, ''); - h = h.replace(/]*)>/gi, function(a, b) {return ''}); - h = h.replace(/\/ class=\"mceItemParam\"><\/span>/gi, 'class="mceItemParam">'); + img.width = data.width || (data.type == 'audio' ? "300" : "320"); + img.height = data.height || (data.type == 'audio' ? "32" : "240"); - o.content = h; + return img; }, - _buildObj : function(o, n) { - var ob, ed = this.editor, dom = ed.dom, p = this._parse(n.title), stc; - - stc = ed.getParam('media_strict', true) && o.type == 'application/x-shockwave-flash'; - - p.width = o.width = dom.getAttrib(n, 'width') || 100; - p.height = o.height = dom.getAttrib(n, 'height') || 100; - - if (p.src) - p.src = ed.convertURL(p.src, 'src', n); - - if (stc) { - ob = dom.create('span', { - id : p.id, - _mce_name : 'object', - type : 'application/x-shockwave-flash', - data : p.src, - style : dom.getAttrib(n, 'style'), - width : o.width, - height : o.height + /** + * Converts the JSON data object to a HTML string. + */ + dataToHtml : function(data, force_absolute) { + return this.editor.serializer.serialize(this.dataToImg(data, force_absolute), {forced_root_block : '', force_absolute : force_absolute}); + }, + + /** + * Converts the JSON data object to a HTML string. + */ + htmlToData : function(html) { + var fragment, img, data; + + data = { + type : 'flash', + video: {sources:[]}, + params: {} + }; + + fragment = this.editor.parser.parse(html); + img = fragment.getAll('img')[0]; + + if (img) { + data = JSON.parse(img.attr('data-mce-json')); + data.type = this.getType(img.attr('class')).name.toLowerCase(); + + // Add some extra properties to the data object + tinymce.each(rootAttributes, function(name) { + var value = img.attr(name); + + if (value) + data[name] = value; + }); + } + + return data; + }, + + /** + * Get type item by extension, class, clsid or mime type. + * + * @method getType + * @param {String} value Value to get type item by. + * @return {Object} Type item object or undefined. + */ + getType : function(value) { + var i, values, typeItem; + + // Find type by checking the classes + values = tinymce.explode(value, ' '); + for (i = 0; i < values.length; i++) { + typeItem = this.lookup[values[i]]; + + if (typeItem) + return typeItem; + } + }, + + /** + * Converts a tinymce.html.Node image element to video/object/embed. + */ + imgToObject : function(node, args) { + var self = this, editor = self.editor, video, object, embed, iframe, name, value, data, + source, sources, params, param, typeItem, i, item, mp4Source, replacement, + posterSrc, style, audio; + + // Adds the flash player + function addPlayer(video_src, poster_src) { + var baseUri, flashVars, flashVarsOutput, params, flashPlayer; + + flashPlayer = editor.getParam('flash_video_player_url', self.convertUrl(self.url + '/moxieplayer.swf')); + if (flashPlayer) { + baseUri = editor.documentBaseURI; + data.params.src = flashPlayer; + + // Convert the movie url to absolute urls + if (editor.getParam('flash_video_player_absvideourl', true)) { + video_src = baseUri.toAbsolute(video_src || '', true); + poster_src = baseUri.toAbsolute(poster_src || '', true); + } + + // Generate flash vars + flashVarsOutput = ''; + flashVars = editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}); + tinymce.each(flashVars, function(value, name) { + // Replace $url and $poster variables in flashvars value + value = value.replace(/\$url/, video_src || ''); + value = value.replace(/\$poster/, poster_src || ''); + + if (value.length > 0) + flashVarsOutput += (flashVarsOutput ? '&' : '') + name + '=' + escape(value); + }); + + if (flashVarsOutput.length) + data.params.flashvars = flashVarsOutput; + + params = editor.getParam('flash_video_player_params', { + allowfullscreen: true, + allowscriptaccess: true + }); + + tinymce.each(params, function(value, name) { + data.params[name] = "" + value; + }); + } + }; + + data = node.attr('data-mce-json'); + if (!data) + return; + + data = JSON.parse(data); + typeItem = this.getType(node.attr('class')); + + style = node.attr('data-mce-style') + if (!style) { + style = node.attr('style'); + + if (style) + style = editor.dom.serializeStyle(editor.dom.parseStyle(style, 'img')); + } + + // Handle iframe + if (typeItem.name === 'Iframe') { + replacement = new Node('iframe', 1); + + tinymce.each(rootAttributes, function(name) { + var value = node.attr(name); + + if (name == 'class' && value) + value = value.replace(/mceItem.+ ?/g, ''); + + if (value && value.length > 0) + replacement.attr(name, value); }); - } else { - ob = dom.create('span', { - id : p.id, - _mce_name : 'object', - classid : "clsid:" + o.classid, - style : dom.getAttrib(n, 'style'), - codebase : o.codebase, - width : o.width, - height : o.height + + for (name in data.params) + replacement.attr(name, data.params[name]); + + replacement.attr({ + style: style, + src: data.params.src }); + + node.replace(replacement); + + return; } - each (p, function(v, k) { - if (!/^(width|height|codebase|classid|id|_cx|_cy)$/.test(k)) { - // Use url instead of src in IE for Windows media - if (o.type == 'application/x-mplayer2' && k == 'src' && !p.url) - k = 'url'; + // Handle scripts + if (this.editor.settings.media_use_script) { + replacement = new Node('script', 1).attr('type', 'text/javascript'); - if (v) - dom.add(ob, 'span', {_mce_name : 'param', name : k, '_mce_value' : v}); + value = new Node('#text', 3); + value.value = 'write' + typeItem.name + '(' + JSON.serialize(tinymce.extend(data.params, { + width: node.attr('width'), + height: node.attr('height') + })) + ');'; + + replacement.append(value); + node.replace(replacement); + + return; + } + + // Add HTML5 video element + if (typeItem.name === 'Video' && data.video.sources[0]) { + // Create new object element + video = new Node('video', 1).attr(tinymce.extend({ + id : node.attr('id'), + width: node.attr('width'), + height: node.attr('height'), + style : style + }, data.video.attrs)); + + // Get poster source and use that for flash fallback + if (data.video.attrs) + posterSrc = data.video.attrs.poster; + + sources = data.video.sources = toArray(data.video.sources); + for (i = 0; i < sources.length; i++) { + if (/\.mp4$/.test(sources[i].src)) + mp4Source = sources[i].src; } - }); - if (!stc) - dom.add(ob, 'span', tinymce.extend({_mce_name : 'embed', type : o.type, style : dom.getAttrib(n, 'style')}, p)); + if (!sources[0].type) { + video.attr('src', sources[0].src); + sources.splice(0, 1); + } - return ob; - }, + for (i = 0; i < sources.length; i++) { + source = new Node('source', 1).attr(sources[i]); + source.shortEnded = true; + video.append(source); + } - _spansToImgs : function(p) { - var t = this, dom = t.editor.dom, im, ci; + // Create flash fallback for video if we have a mp4 source + if (mp4Source) { + addPlayer(mp4Source, posterSrc); + typeItem = self.getType('flash'); + } else + data.params.src = ''; + } - each(dom.select('span', p), function(n) { - // Convert object into image - if (dom.getAttrib(n, 'class') == 'mceItemObject') { - ci = dom.getAttrib(n, "classid").toLowerCase().replace(/\s+/g, ''); + // Add HTML5 audio element + if (typeItem.name === 'Audio' && data.video.sources[0]) { + // Create new object element + audio = new Node('audio', 1).attr(tinymce.extend({ + id : node.attr('id'), + width: node.attr('width'), + height: node.attr('height'), + style : style + }, data.video.attrs)); + + // Get poster source and use that for flash fallback + if (data.video.attrs) + posterSrc = data.video.attrs.poster; + + sources = data.video.sources = toArray(data.video.sources); + if (!sources[0].type) { + audio.attr('src', sources[0].src); + sources.splice(0, 1); + } - switch (ci) { - case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000': - dom.replace(t._createImg('mceItemFlash', n), n); - break; + for (i = 0; i < sources.length; i++) { + source = new Node('source', 1).attr(sources[i]); + source.shortEnded = true; + audio.append(source); + } - case 'clsid:166b1bca-3f9c-11cf-8075-444553540000': - dom.replace(t._createImg('mceItemShockWave', n), n); - break; + data.params.src = ''; + } - case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6': - case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95': - case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a': - dom.replace(t._createImg('mceItemWindowsMedia', n), n); - break; + // Do we have a params src then we can generate object + if (data.params.src) { + // Is flv movie add player for it + if (/\.flv$/i.test(data.params.src)) + addPlayer(data.params.src, ''); + + if (args && args.force_absolute) + data.params.src = editor.documentBaseURI.toAbsolute(data.params.src); + + // Create new object element + object = new Node('object', 1).attr({ + id : node.attr('id'), + width: node.attr('width'), + height: node.attr('height'), + style : style + }); - case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b': - dom.replace(t._createImg('mceItemQuickTime', n), n); - break; + tinymce.each(rootAttributes, function(name) { + if (data[name] && name != 'type') + object.attr(name, data[name]); + }); - case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa': - dom.replace(t._createImg('mceItemRealMedia', n), n); - break; + // Add params + for (name in data.params) { + param = new Node('param', 1); + param.shortEnded = true; + value = data.params[name]; - default: - dom.replace(t._createImg('mceItemFlash', n), n); - } - - return; + // Windows media needs to use url instead of src for the media URL + if (name === 'src' && typeItem.name === 'WindowsMedia') + name = 'url'; + + param.attr({name: name, value: value}); + object.append(param); } - // Convert embed into image - if (dom.getAttrib(n, 'class') == 'mceItemEmbed') { - switch (dom.getAttrib(n, 'type')) { - case 'application/x-shockwave-flash': - dom.replace(t._createImg('mceItemFlash', n), n); - break; + // Setup add type and classid if strict is disabled + if (this.editor.getParam('media_strict', true)) { + object.attr({ + data: data.params.src, + type: typeItem.mimes[0] + }); + } else { + object.attr({ + classid: "clsid:" + typeItem.clsids[0], + codebase: typeItem.codebase + }); - case 'application/x-director': - dom.replace(t._createImg('mceItemShockWave', n), n); - break; + embed = new Node('embed', 1); + embed.shortEnded = true; + embed.attr({ + id: node.attr('id'), + width: node.attr('width'), + height: node.attr('height'), + style : style, + type: typeItem.mimes[0] + }); - case 'application/x-mplayer2': - dom.replace(t._createImg('mceItemWindowsMedia', n), n); - break; + for (name in data.params) + embed.attr(name, data.params[name]); - case 'video/quicktime': - dom.replace(t._createImg('mceItemQuickTime', n), n); - break; + tinymce.each(rootAttributes, function(name) { + if (data[name] && name != 'type') + embed.attr(name, data[name]); + }); - case 'audio/x-pn-realaudio-plugin': - dom.replace(t._createImg('mceItemRealMedia', n), n); - break; + object.append(embed); + } - default: - dom.replace(t._createImg('mceItemFlash', n), n); - } - } - }); + // Insert raw HTML + if (data.object_html) { + value = new Node('#text', 3); + value.raw = true; + value.value = data.object_html; + object.append(value); + } + + // Append object to video element if it exists + if (video) + video.append(object); + } + + if (video) { + // Insert raw HTML + if (data.video_html) { + value = new Node('#text', 3); + value.raw = true; + value.value = data.video_html; + video.append(value); + } + } + + if (audio) { + // Insert raw HTML + if (data.video_html) { + value = new Node('#text', 3); + value.raw = true; + value.value = data.video_html; + audio.append(value); + } + } + + if (video || audio || object) + node.replace(video || audio || object); + else + node.remove(); }, - _createImg : function(cl, n) { - var im, dom = this.editor.dom, pa = {}, ti = '', args; + /** + * Converts a tinymce.html.Node video/object/embed to an img element. + * + * The video/object/embed will be converted into an image placeholder with a JSON data attribute like this: + * + * + * The JSON structure will be like this: + * {'params':{'flashvars':'something','quality':'high','src':'someurl'}, 'video':{'sources':[{src: 'someurl', type: 'video/mp4'}]}} + */ + objectToImg : function(node) { + var object, embed, video, iframe, img, name, id, width, height, style, i, html, + param, params, source, sources, data, type, lookup = this.lookup, + matches, attrs, urlConverter = this.editor.settings.url_converter, + urlConverterScope = this.editor.settings.url_converter_scope; + + function getInnerHTML(node) { + return new tinymce.html.Serializer({ + inner: true, + validate: false + }).serialize(node); + }; - args = ['id', 'name', 'width', 'height', 'bgcolor', 'align', 'flashvars', 'src', 'wmode', 'allowfullscreen', 'quality', 'data']; + // If node isn't in document + if (!node.parent) + return; - // Create image - im = dom.create('img', { - src : this.url + '/img/trans.gif', - width : dom.getAttrib(n, 'width') || 100, - height : dom.getAttrib(n, 'height') || 100, - style : dom.getAttrib(n, 'style'), - 'class' : cl - }); + // Handle media scripts + if (node.name === 'script') { + if (node.firstChild) + matches = scriptRegExp.exec(node.firstChild.value); - // Setup base parameters - each(args, function(na) { - var v = dom.getAttrib(n, na); + if (!matches) + return; - if (v) - pa[na] = v; - }); + type = matches[1]; + data = {video : {}, params : JSON.parse(matches[2])}; + width = data.params.width; + height = data.params.height; + } + + // Setup data objects + data = data || { + video : {}, + params : {} + }; - // Add optional parameters - each(dom.select('span', n), function(n) { - if (dom.hasClass(n, 'mceItemParam')) - pa[dom.getAttrib(n, 'name')] = dom.getAttrib(n, '_mce_value'); + // Setup new image object + img = new Node('img', 1); + img.attr({ + src : this.editor.theme.url + '/img/trans.gif' }); - // Use src not movie - if (pa.movie) { - pa.src = pa.movie; - delete pa.movie; + // Video element + name = node.name; + if (name === 'video' || name == 'audio') { + video = node; + object = node.getAll('object')[0]; + embed = node.getAll('embed')[0]; + width = video.attr('width'); + height = video.attr('height'); + id = video.attr('id'); + data.video = {attrs : {}, sources : []}; + + // Get all video attributes + attrs = data.video.attrs; + for (name in video.attributes.map) + attrs[name] = video.attributes.map[name]; + + source = node.attr('src'); + if (source) + data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', node.name)}); + + // Get all sources + sources = video.getAll("source"); + for (i = 0; i < sources.length; i++) { + source = sources[i].remove(); + + data.video.sources.push({ + src: urlConverter.call(urlConverterScope, source.attr('src'), 'src', 'source'), + type: source.attr('type'), + media: source.attr('media') + }); + } + + // Convert the poster URL + if (attrs.poster) + attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', node.name); } - // No src try data - if (!pa.src) { - pa.src = pa.data; - delete pa.data; + // Object element + if (node.name === 'object') { + object = node; + embed = node.getAll('embed')[0]; } - // Merge with embed args - n = dom.select('.mceItemEmbed', n)[0]; - if (n) { - each(args, function(na) { - var v = dom.getAttrib(n, na); + // Embed element + if (node.name === 'embed') + embed = node; + + // Iframe element + if (node.name === 'iframe') { + iframe = node; + type = 'Iframe'; + } + + if (object) { + // Get width/height + width = width || object.attr('width'); + height = height || object.attr('height'); + style = style || object.attr('style'); + id = id || object.attr('id'); + + // Get all object params + params = object.getAll("param"); + for (i = 0; i < params.length; i++) { + param = params[i]; + name = param.remove().attr('name'); + + if (!excludedAttrs[name]) + data.params[name] = param.attr('value'); + } + + data.params.src = data.params.src || object.attr('data'); + } - if (v && !pa[na]) - pa[na] = v; + if (embed) { + // Get width/height + width = width || embed.attr('width'); + height = height || embed.attr('height'); + style = style || embed.attr('style'); + id = id || embed.attr('id'); + + // Get all embed attributes + for (name in embed.attributes.map) { + if (!excludedAttrs[name] && !data.params[name]) + data.params[name] = embed.attributes.map[name]; + } + } + + if (iframe) { + // Get width/height + width = iframe.attr('width'); + height = iframe.attr('height'); + style = style || iframe.attr('style'); + id = iframe.attr('id'); + + tinymce.each(rootAttributes, function(name) { + img.attr(name, iframe.attr(name)); }); + + // Get all iframe attributes + for (name in iframe.attributes.map) { + if (!excludedAttrs[name] && !data.params[name]) + data.params[name] = iframe.attributes.map[name]; + } } - delete pa.width; - delete pa.height; + // Use src not movie + if (data.params.movie) { + data.params.src = data.params.src || data.params.movie; + delete data.params.movie; + } - im.title = this._serialize(pa); + // Convert the URL to relative/absolute depending on configuration + if (data.params.src) + data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object'); - return im; - }, + if (video) { + if (node.name === 'video') + type = lookup.video.name; + else if (node.name === 'audio') + type = lookup.audio.name; + } - _parse : function(s) { - return tinymce.util.JSON.parse('{' + s + '}'); - }, + if (object && !type) + type = (lookup[(object.attr('clsid') || '').toLowerCase()] || lookup[(object.attr('type') || '').toLowerCase()] || {}).name; - _serialize : function(o) { - return tinymce.util.JSON.serialize(o).replace(/[{}]/g, ''); + if (embed && !type) + type = (lookup[(embed.attr('type') || '').toLowerCase()] || {}).name; + + // Replace the video/object/embed element with a placeholder image containing the data + node.replace(img); + + // Remove embed + if (embed) + embed.remove(); + + // Serialize the inner HTML of the object element + if (object) { + html = getInnerHTML(object.remove()); + + if (html) + data.object_html = html; + } + + // Serialize the inner HTML of the video element + if (video) { + html = getInnerHTML(video.remove()); + + if (html) + data.video_html = html; + } + + // Set width/height of placeholder + img.attr({ + id : id, + 'class' : 'mceItemMedia mceItem' + (type || 'Flash'), + style : style, + width : width || (node.name == 'audio' ? "300" : "320"), + height : height || (node.name == 'audio' ? "32" : "240"), + "data-mce-json" : JSON.serialize(data, "'") + }); } }); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/flash.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/flash.gif deleted file mode 100644 index cb192e6ceda8d19ad8e7d08dd1cfde0aa72ead2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmVOzlLa+Za}7>m0&NpCfJ0FQc3~F7DE)S%o1)Qi1n@vxX46qnD4hRS-NE*Pw!4UvE=#^N( diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/flv_player.swf b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/flv_player.swf deleted file mode 100644 index 042c2ab969e98a6fdbe08848c4a73bd2c41de906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11668 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 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/quicktime.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/quicktime.gif deleted file mode 100644 index 3b0499145b16138249f653a1a3f2c80230fb292c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmV+~0nq+ONk%w1VGsZi0K^{vH>m7Qv+~s9^fsC5ZpZP=*zu3F=Jxpf8k_5u%JNv6 z=md-84VLU4w)kSE=yI&-yw>b=v+SqE?+kq47pC+YrR?bJ^yu>Zyvpn;hTp*6^mM!O zu+8$^=JX7bb<~J01ZTA{q@86#&8&6~H`Ss{{?p%K!-p%L6P2TpFYz90?pD06UU# BbnE~C diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/shockwave.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/shockwave.gif deleted file mode 100644 index 5f235dfc7363bd4957b5fe352e16a7eee9a38574..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmZ?wbhEHb6lD-#xXJ(m|AF9|(f@B(e|&xQ_v6XWFR%Td$?$)n^p7RFzqSScKhyN< z>ipLaF8n=^^LJP4|1^gGRdo_Rl+a*grZQ1hw@Zo1ikN$oB{QbRq&z?QIckdq1aE3;Fq_(WV>Kc7gjQtQh+9OrtFhn-)LUqD<|MOIl_!(Ed#pPRE;S)g;ew3>pd zn`Wa(lc2DGa)peFw3f88dp-|`@*)AXj;@(8hwDr|7Sxsp;&YxjN*Y{PBB!TIU|!b7Zgv0OaG5)&Kwi diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/js/media.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/js/media.js index 86cfa98563..055a68dc36 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/js/media.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/js/media.js @@ -1,630 +1,389 @@ -tinyMCEPopup.requireLangPack(); +(function() { + var url; -var oldWidth, oldHeight, ed, url; + if (url = tinyMCEPopup.getParam("media_external_list_url")) + document.write(''); -if (url = tinyMCEPopup.getParam("media_external_list_url")) - document.write(''); - -function init() { - var pl = "", f, val; - var type = "flash", fe, i; - - ed = tinyMCEPopup.editor; - - tinyMCEPopup.resizeToInnerSize(); - f = document.forms[0] - - fe = ed.selection.getNode(); - if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) { - pl = fe.title; - - switch (ed.dom.getAttrib(fe, 'class')) { - case 'mceItemFlash': - type = 'flash'; - break; - - case 'mceItemFlashVideo': - type = 'flv'; - break; - - case 'mceItemShockWave': - type = 'shockwave'; - break; - - case 'mceItemWindowsMedia': - type = 'wmp'; - break; - - case 'mceItemQuickTime': - type = 'qt'; - break; - - case 'mceItemRealMedia': - type = 'rmp'; - break; - } - - document.forms[0].insert.value = ed.getLang('update', 'Insert', true); + function get(id) { + return document.getElementById(id); } - document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); - document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media'); - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); - - var html = getMediaListHTML('medialist','src','media','media'); - if (html == "") - document.getElementById("linklistrow").style.display = 'none'; - else - document.getElementById("linklistcontainer").innerHTML = html; - - // Resize some elements - if (isVisible('filebrowser')) - document.getElementById('src').style.width = '230px'; - - // Setup form - if (pl != "") { - pl = tinyMCEPopup.editor.plugins.media._parse(pl); - - switch (type) { - case "flash": - setBool(pl, 'flash', 'play'); - setBool(pl, 'flash', 'loop'); - setBool(pl, 'flash', 'menu'); - setBool(pl, 'flash', 'swliveconnect'); - setStr(pl, 'flash', 'quality'); - setStr(pl, 'flash', 'scale'); - setStr(pl, 'flash', 'salign'); - setStr(pl, 'flash', 'wmode'); - setStr(pl, 'flash', 'base'); - setStr(pl, 'flash', 'flashvars'); - break; - - case "qt": - setBool(pl, 'qt', 'loop'); - setBool(pl, 'qt', 'autoplay'); - setBool(pl, 'qt', 'cache'); - setBool(pl, 'qt', 'controller'); - setBool(pl, 'qt', 'correction'); - setBool(pl, 'qt', 'enablejavascript'); - setBool(pl, 'qt', 'kioskmode'); - setBool(pl, 'qt', 'autohref'); - setBool(pl, 'qt', 'playeveryframe'); - setBool(pl, 'qt', 'tarsetcache'); - setStr(pl, 'qt', 'scale'); - setStr(pl, 'qt', 'starttime'); - setStr(pl, 'qt', 'endtime'); - setStr(pl, 'qt', 'tarset'); - setStr(pl, 'qt', 'qtsrcchokespeed'); - setStr(pl, 'qt', 'volume'); - setStr(pl, 'qt', 'qtsrc'); - break; - - case "shockwave": - setBool(pl, 'shockwave', 'sound'); - setBool(pl, 'shockwave', 'progress'); - setBool(pl, 'shockwave', 'autostart'); - setBool(pl, 'shockwave', 'swliveconnect'); - setStr(pl, 'shockwave', 'swvolume'); - setStr(pl, 'shockwave', 'swstretchstyle'); - setStr(pl, 'shockwave', 'swstretchhalign'); - setStr(pl, 'shockwave', 'swstretchvalign'); - break; - - case "wmp": - setBool(pl, 'wmp', 'autostart'); - setBool(pl, 'wmp', 'enabled'); - setBool(pl, 'wmp', 'enablecontextmenu'); - setBool(pl, 'wmp', 'fullscreen'); - setBool(pl, 'wmp', 'invokeurls'); - setBool(pl, 'wmp', 'mute'); - setBool(pl, 'wmp', 'stretchtofit'); - setBool(pl, 'wmp', 'windowlessvideo'); - setStr(pl, 'wmp', 'balance'); - setStr(pl, 'wmp', 'baseurl'); - setStr(pl, 'wmp', 'captioningid'); - setStr(pl, 'wmp', 'currentmarker'); - setStr(pl, 'wmp', 'currentposition'); - setStr(pl, 'wmp', 'defaultframe'); - setStr(pl, 'wmp', 'playcount'); - setStr(pl, 'wmp', 'rate'); - setStr(pl, 'wmp', 'uimode'); - setStr(pl, 'wmp', 'volume'); - break; - - case "rmp": - setBool(pl, 'rmp', 'autostart'); - setBool(pl, 'rmp', 'loop'); - setBool(pl, 'rmp', 'autogotourl'); - setBool(pl, 'rmp', 'center'); - setBool(pl, 'rmp', 'imagestatus'); - setBool(pl, 'rmp', 'maintainaspect'); - setBool(pl, 'rmp', 'nojava'); - setBool(pl, 'rmp', 'prefetch'); - setBool(pl, 'rmp', 'shuffle'); - setStr(pl, 'rmp', 'console'); - setStr(pl, 'rmp', 'controls'); - setStr(pl, 'rmp', 'numloop'); - setStr(pl, 'rmp', 'scriptcallbacks'); - break; - } - - setStr(pl, null, 'src'); - setStr(pl, null, 'id'); - setStr(pl, null, 'name'); - setStr(pl, null, 'vspace'); - setStr(pl, null, 'hspace'); - setStr(pl, null, 'bgcolor'); - setStr(pl, null, 'align'); - setStr(pl, null, 'width'); - setStr(pl, null, 'height'); - - if ((val = ed.dom.getAttrib(fe, "width")) != "") - pl.width = f.width.value = val; - - if ((val = ed.dom.getAttrib(fe, "height")) != "") - pl.height = f.height.value = val; - - oldWidth = pl.width ? parseInt(pl.width) : 0; - oldHeight = pl.height ? parseInt(pl.height) : 0; - } else - oldWidth = oldHeight = 0; - - selectByValue(f, 'media_type', type); - changedType(type); - updateColor('bgcolor_pick', 'bgcolor'); + function getVal(id) { + var elm = get(id); - TinyMCE_EditableSelects.init(); - generatePreview(); -} + if (elm.nodeName == "SELECT") + return elm.options[elm.selectedIndex].value; -function insertMedia() { - var fe, f = document.forms[0], h; + if (elm.type == "checkbox") + return elm.checked; - tinyMCEPopup.restoreSelection(); - - if (!AutoValidator.validate(f)) { - tinyMCEPopup.alert(ed.getLang('invalid_data')); - return false; + return elm.value; } - f.width.value = f.width.value == "" ? 100 : f.width.value; - f.height.value = f.height.value == "" ? 100 : f.height.value; - - fe = ed.selection.getNode(); - if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) { - switch (f.media_type.options[f.media_type.selectedIndex].value) { - case "flash": - fe.className = "mceItemFlash"; - break; - - case "flv": - fe.className = "mceItemFlashVideo"; - break; - - case "shockwave": - fe.className = "mceItemShockWave"; - break; - - case "qt": - fe.className = "mceItemQuickTime"; - break; - - case "wmp": - fe.className = "mceItemWindowsMedia"; - break; - - case "rmp": - fe.className = "mceItemRealMedia"; - break; - } - - if (fe.width != f.width.value || fe.height != f.height.value) - ed.execCommand('mceRepaint'); - - fe.title = serializeParameters(); - fe.width = f.width.value; - fe.height = f.height.value; - fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : ''); - fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : ''); - fe.align = f.align.options[f.align.selectedIndex].value; - } else { - h = ' 0) { - var html = ""; - - html += ''; - - return html; - } - - return ""; -} - -function getType(v) { - var fo, i, c, el, x, f = document.forms[0]; - - fo = ed.getParam("media_types", "flash=swf;flv=flv;shockwave=dcr;qt=mov,qt,mpg,mp3,mp4,mpeg;shockwave=dcr;wmp=avi,wmv,wm,asf,asx,wmx,wvx;rmp=rm,ra,ram").split(';'); - - // YouTube - if (v.match(/watch\?v=(.+)(.*)/)) { - f.width.value = '425'; - f.height.value = '350'; - f.src.value = 'http://www.youtube.com/v/' + v.match(/v=(.*)(.*)/)[0].split('=')[1]; - return 'flash'; } - // Google video - if (v.indexOf('http://video.google.com/videoplay?docid=') == 0) { - f.width.value = '425'; - f.height.value = '326'; - f.src.value = 'http://video.google.com/googleplayer.swf?docId=' + v.substring('http://video.google.com/videoplay?docid='.length) + '&hl=en'; - return 'flash'; - } - - for (i=0; i 0 ? s.substring(0, s.length - 1) : s; - - return s; -} - -function setBool(pl, p, n) { - if (typeof(pl[n]) == "undefined") - return; - - document.forms[0].elements[p + "_" + n].checked = pl[n] != 'false'; -} - -function setStr(pl, p, n) { - var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n]; - - if (typeof(pl[n]) == "undefined") - return; - - if (e.type == "text") - e.value = pl[n]; - else - selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]); -} - -function getBool(p, n, d, tv, fv) { - var v = document.forms[0].elements[p + "_" + n].checked; - - tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'"; - fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'"; - - return (v == d) ? '' : n + (v ? ':' + tv + ',' : ":\'" + fv + "\',"); -} + window.Media = { + init : function() { + var html, editor; + + this.editor = editor = tinyMCEPopup.editor; -function getStr(p, n, d) { - var e = document.forms[0].elements[(p != null ? p + "_" : "") + n]; - var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value; - - if (n == 'src') - v = tinyMCEPopup.editor.convertURL(v, 'src', null); - - return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',"); -} - -function getInt(p, n, d) { - var e = document.forms[0].elements[(p != null ? p + "_" : "") + n]; - var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value; - - return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ","); -} - -function jsEncode(s) { - s = s.replace(new RegExp('\\\\', 'g'), '\\\\'); - s = s.replace(new RegExp('"', 'g'), '\\"'); - s = s.replace(new RegExp("'", 'g'), "\\'"); + // Setup file browsers and color pickers + get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); + get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media'); + get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource1','video_altsource1','media','media'); + get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource2','video_altsource2','media','media'); + get('audio_altsource1_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource1','audio_altsource1','media','media'); + get('audio_altsource2_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource2','audio_altsource2','media','media'); + get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','media','image'); + + html = this.getMediaListHTML('medialist', 'src', 'media', 'media'); + if (html == "") + get("linklistrow").style.display = 'none'; + else + get("linklistcontainer").innerHTML = html; + + if (isVisible('filebrowser')) + get('src').style.width = '230px'; + + if (isVisible('video_filebrowser_altsource1')) + get('video_altsource1').style.width = '220px'; + + if (isVisible('video_filebrowser_altsource2')) + get('video_altsource2').style.width = '220px'; + + if (isVisible('audio_filebrowser_altsource1')) + get('audio_altsource1').style.width = '220px'; + + if (isVisible('audio_filebrowser_altsource2')) + get('audio_altsource2').style.width = '220px'; + + if (isVisible('filebrowser_poster')) + get('video_poster').style.width = '220px'; + + this.data = tinyMCEPopup.getWindowArg('data'); + this.dataToForm(); + this.preview(); + }, + + insert : function() { + var editor = tinyMCEPopup.editor; + + this.formToData(); + editor.execCommand('mceRepaint'); + tinyMCEPopup.restoreSelection(); + editor.selection.setNode(editor.plugins.media.dataToImg(this.data)); + tinyMCEPopup.close(); + }, + + preview : function() { + get('prev').innerHTML = this.editor.plugins.media.dataToHtml(this.data, true); + }, + + moveStates : function(to_form, field) { + var data = this.data, editor = this.editor, data = this.data, + mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src; + + defaultStates = { + // QuickTime + quicktime_autoplay : true, + quicktime_controller : true, + + // Flash + flash_play : true, + flash_loop : true, + flash_menu : true, + + // WindowsMedia + windowsmedia_autostart : true, + windowsmedia_enablecontextmenu : true, + windowsmedia_invokeurls : true, + + // RealMedia + realmedia_autogotourl : true, + realmedia_imagestatus : true + }; + + function parseQueryParams(str) { + var out = {}; + + if (str) { + tinymce.each(str.split('&'), function(item) { + var parts = item.split('='); + + out[unescape(parts[0])] = unescape(parts[1]); + }); + } + + return out; + }; + + function setOptions(type, names) { + var i, name, formItemName, value, list; + + if (type == data.type || type == 'global') { + names = tinymce.explode(names); + for (i = 0; i < names.length; i++) { + name = names[i]; + formItemName = type == 'global' ? name : type + '_' + name; + + if (type == 'global') + list = data; + else if (type == 'video' || type == 'audio') { + list = data.video.attrs; + + if (!list && !to_form) + data.video.attrs = list = {}; + } else + list = data.params; + + if (list) { + if (to_form) { + setVal(formItemName, list[name], type == 'video' || type == 'audio' ? name : ''); + } else { + delete list[name]; + + value = getVal(formItemName); + if ((type == 'video' || type == 'audio') && value === true) + value = name; + + if (defaultStates[formItemName]) { + if (value !== defaultStates[formItemName]) { + value = "" + value; + list[name] = value; + } + } else if (value) { + value = "" + value; + list[name] = value; + } + } + } + } + } + } - return s; -} + if (!to_form) { + data.type = get('media_type').options[get('media_type').selectedIndex].value; + data.width = getVal('width'); + data.height = getVal('height'); -function generatePreview(c) { - var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh; + // Switch type based on extension + src = getVal('src'); + if (field == 'src') { + ext = src.replace(/^.*\.([^.]+)$/, '$1'); + if (typeInfo = mediaPlugin.getType(ext)) + data.type = typeInfo.name.toLowerCase(); - p.innerHTML = ''; + setVal('media_type', data.type); + } - nw = parseInt(f.width.value); - nh = parseInt(f.height.value); + if (data.type == "video" || data.type == "audio") { + if (!data.video.sources) + data.video.sources = []; - if (f.width.value != "" && f.height.value != "") { - if (f.constrain.checked) { - if (c == 'width' && oldWidth != 0) { - wp = nw / oldWidth; - nh = Math.round(wp * nh); - f.height.value = nh; - } else if (c == 'height' && oldHeight != 0) { - hp = nh / oldHeight; - nw = Math.round(hp * nw); - f.width.value = nw; + data.video.sources[0] = {src: getVal('src')}; + } } - } - } - if (f.width.value != "") - oldWidth = nw; - - if (f.height.value != "") - oldHeight = nh; - - // After constrain - pl = serializeParameters(); - - switch (f.media_type.options[f.media_type.selectedIndex].value) { - case "flash": - cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; - codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; - type = 'application/x-shockwave-flash'; - break; - - case "shockwave": - cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000'; - codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0'; - type = 'application/x-director'; - break; - - case "qt": - cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'; - codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0'; - type = 'video/quicktime'; - break; - - case "wmp": - cls = ed.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6'; - codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; - type = 'application/x-mplayer2'; - break; - - case "rmp": - cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA'; - codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; - type = 'audio/x-pn-realaudio-plugin'; - break; - } - - if (pl == '') { - p.innerHTML = ''; - return; - } + // Hide all fieldsets and show the one active + get('video_options').style.display = 'none'; + get('audio_options').style.display = 'none'; + get('flash_options').style.display = 'none'; + get('quicktime_options').style.display = 'none'; + get('shockwave_options').style.display = 'none'; + get('windowsmedia_options').style.display = 'none'; + get('realmedia_options').style.display = 'none'; + + if (get(data.type + '_options')) + get(data.type + '_options').style.display = 'block'; + + setVal('media_type', data.type); + + setOptions('flash', 'play,loop,menu,swliveconnect,quality,scale,salign,wmode,base,flashvars'); + setOptions('quicktime', 'loop,autoplay,cache,controller,correction,enablejavascript,kioskmode,autohref,playeveryframe,targetcache,scale,starttime,endtime,target,qtsrcchokespeed,volume,qtsrc'); + setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign'); + setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume'); + setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks'); + setOptions('video', 'poster,autoplay,loop,muted,preload,controls'); + setOptions('audio', 'autoplay,loop,preload,controls'); + setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height'); + + if (to_form) { + if (data.type == 'video') { + if (data.video.sources[0]) + setVal('src', data.video.sources[0].src); + + src = data.video.sources[1]; + if (src) + setVal('video_altsource1', src.src); + + src = data.video.sources[2]; + if (src) + setVal('video_altsource2', src.src); + } else if (data.type == 'audio') { + if (data.video.sources[0]) + setVal('src', data.video.sources[0].src); + + src = data.video.sources[1]; + if (src) + setVal('audio_altsource1', src.src); + + src = data.video.sources[2]; + if (src) + setVal('audio_altsource2', src.src); + } else { + // Check flash vars + if (data.type == 'flash') { + tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) { + if (value == '$url') + data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src; + }); + } + + setVal('src', data.params.src); + } + } else { + src = getVal("src"); + + // YouTube + if (src.match(/youtube.com(.+)v=([^&]+)/)) { + data.width = 425; + data.height = 350; + data.params.frameborder = '0'; + data.type = 'iframe'; + src = 'http://www.youtube.com/embed/' + src.match(/v=([^&]+)/)[1]; + setVal('src', src); + setVal('media_type', data.type); + } + + // Google video + if (src.match(/video.google.com(.+)docid=([^&]+)/)) { + data.width = 425; + data.height = 326; + data.type = 'flash'; + src = 'http://video.google.com/googleplayer.swf?docId=' + src.match(/docid=([^&]+)/)[1] + '&hl=en'; + setVal('src', src); + setVal('media_type', data.type); + } + + if (data.type == 'video') { + if (!data.video.sources) + data.video.sources = []; + + data.video.sources[0] = {src : src}; + + src = getVal("video_altsource1"); + if (src) + data.video.sources[1] = {src : src}; + + src = getVal("video_altsource2"); + if (src) + data.video.sources[2] = {src : src}; + } else if (data.type == 'audio') { + if (!data.video.sources) + data.video.sources = []; + + data.video.sources[0] = {src : src}; + + src = getVal("audio_altsource1"); + if (src) + data.video.sources[1] = {src : src}; + + src = getVal("audio_altsource2"); + if (src) + data.video.sources[2] = {src : src}; + } else + data.params.src = src; + + // Set default size + setVal('width', data.width || (data.type == 'audio' ? 300 : 320)); + setVal('height', data.height || (data.type == 'audio' ? 32 : 240)); + } + }, + + dataToForm : function() { + this.moveStates(true); + }, + + formToData : function(field) { + if (field == "width" || field == "height") + this.changeSize(field); + + if (field == 'source') { + this.moveStates(false, field); + setVal('source', this.editor.plugins.media.dataToHtml(this.data)); + this.panel = 'source'; + } else { + if (this.panel == 'source') { + this.data = this.editor.plugins.media.htmlToData(getVal('source')); + this.dataToForm(); + this.panel = ''; + } + + this.moveStates(false, field); + this.preview(); + } + }, + + beforeResize : function() { + this.width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10); + this.height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10); + }, + + changeSize : function(type) { + var width, height, scale, size; + + if (get('constrain').checked) { + width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10); + height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10); + + if (type == 'width') { + this.height = Math.round((width / this.width) * height); + setVal('height', this.height); + } else { + this.width = Math.round((height / this.height) * width); + setVal('width', this.width); + } + } + }, - pl = tinyMCEPopup.editor.plugins.media._parse(pl); + getMediaListHTML : function() { + if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) { + var html = ""; - if (!pl.src) { - p.innerHTML = ''; - return; - } + html += ''; - for (n in pl) { - h += ''; + return html; + } - // Add extra url parameter if it's an absolute URL - if (n == 'src' && pl[n].indexOf('://') != -1) - h += ''; + return ""; } - } - - h += ' - -
    -
    + + + @@ -24,28 +25,30 @@
    {#media_dlg.general} - +
    -
    - + + - - + - - + + +
    - - - + @@ -56,10 +59,10 @@
    + + + - +
     
    - +
    - - + +
    x    x   
    @@ -78,18 +81,18 @@
    {#media_dlg.advanced} - +
    - + - + - + - +
    - @@ -100,9 +103,9 @@ - +
    - +
     
    @@ -111,172 +114,250 @@
    -
    - {#media_dlg.flash_options} +
    + {#media_dlg.html5_video_options} - +
    - + + - + + - + + - + + +
    - + + + + + +
     
    - + + + + + +
     
    - + + + + + +
     
    - + + +
    + -
    - + -
    + - - + +
    - + + + + + +
    + - - + + + +
    +
    + + + + + +
    +
    + + + +
    + +
    + {#media_dlg.html5_audio_options} + + -
    - + + + -
    + - - + +
     
    - + + + -
    + - - + +
     
    - - - + + +
    + +
    + - - + + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    -
    - {#media_dlg.flv_options} - +
    + {#media_dlg.flash_options} + +
    - + - - - - - - - - - - + + - - - + + + + @@ -284,65 +365,57 @@ +
    - - - - + + + + +
    + +
    + + + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    + - + + + - + + +
    - - - - - -
    -
    - - - - - -
    -
    -
    +
    {#media_dlg.qt_options} - +
    @@ -350,19 +423,19 @@ @@ -370,19 +443,19 @@ @@ -390,19 +463,19 @@ @@ -410,27 +483,27 @@ - - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - - - - - -
     
    + + + + + +
     
    -
    +
    {#media_dlg.wmp_options} - +
    @@ -504,19 +577,19 @@ @@ -524,19 +597,19 @@ @@ -544,86 +617,86 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    -
    +
    {#media_dlg.rmp_options} - +
    @@ -631,19 +704,19 @@ @@ -651,19 +724,19 @@ @@ -671,19 +744,19 @@ @@ -691,10 +764,10 @@ @@ -705,19 +778,19 @@ - - + + - - + + - - + + - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    - +
    - - + +
    @@ -725,11 +798,11 @@
    {#media_dlg.shockwave_options} - +
    - +
    - @@ -738,13 +811,13 @@
    - @@ -754,7 +827,7 @@ - @@ -765,18 +838,18 @@
    - +
    - +
    - +
    - +
    @@ -786,18 +859,18 @@
    - +
    - +
    - +
    - +
    @@ -806,6 +879,13 @@
    + +
    +
    + {#media_dlg.source} + +
    +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/moxieplayer.swf b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/moxieplayer.swf new file mode 100644 index 0000000000000000000000000000000000000000..2a040358df0d1f8eb784d2ec0919626198d6eb47 GIT binary patch literal 33931 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 literal 0 HcmV?d00001 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js index ca83ee26e5..b3ea82ee03 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js @@ -17,7 +17,7 @@ // Register commands ed.addCommand('mceNonBreaking', function() { - ed.execCommand('mceInsertContent', false, (ed.plugins.visualchars && ed.plugins.visualchars.state) ? ' ' : ' '); + ed.execCommand('mceInsertContent', false, (ed.plugins.visualchars && ed.plugins.visualchars.state) ? ' ' : ' '); }); // Register buttons diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js index 656c971b8c..916dce29cf 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js @@ -13,7 +13,7 @@ tinymce.create('tinymce.plugins.NonEditablePlugin', { init : function(ed, url) { - var t = this, editClass, nonEditClass; + var t = this, editClass, nonEditClass, state; t.editor = ed; editClass = ed.getParam("noneditable_editable_class", "mceEditable"); @@ -33,10 +33,13 @@ // Block or unblock if (sc || ec) { + state = 1; t._setDisabled(1); return false; - } else + } else if (state == 1) { t._setDisabled(0); + state = 0; + } }); }, @@ -73,11 +76,13 @@ ed.onKeyPress.addToTop(t._block); ed.onKeyUp.addToTop(t._block); ed.onPaste.addToTop(t._block); + ed.onContextMenu.addToTop(t._block); } else { ed.onKeyDown.remove(t._block); ed.onKeyPress.remove(t._block); ed.onKeyUp.remove(t._block); ed.onPaste.remove(t._block); + ed.onContextMenu.remove(t._block); } t.disabled = s; diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/css/content.css b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/css/content.css deleted file mode 100644 index c949d58cc4..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/css/content.css +++ /dev/null @@ -1 +0,0 @@ -.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../img/pagebreak.gif) no-repeat center top;} diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js index 4e1eb0a7aa..a094c19162 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js @@ -11,7 +11,7 @@ (function() { tinymce.create('tinymce.plugins.PageBreakPlugin', { init : function(ed, url) { - var pb = '', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', ''), pbRE; + var pb = '', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', ''), pbRE; pbRE = new RegExp(sep.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, function(a) {return '\\' + a;}), 'g'); @@ -24,9 +24,6 @@ ed.addButton('pagebreak', {title : 'pagebreak.desc', cmd : cls}); ed.onInit.add(function() { - if (ed.settings.content_css !== false) - ed.dom.loadCSS(url + "/css/content.css"); - if (ed.theme.onResolveName) { ed.theme.onResolveName.add(function(th, o) { if (o.node.nodeName == 'IMG' && ed.dom.hasClass(o.node, cls)) diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/img/trans.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/img/trans.gif deleted file mode 100644 index 388486517fa8da13ebd150e8f65d5096c3e10c3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js index bedb3aff56..03e4f77bde 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js @@ -10,9 +10,9 @@ (function() { var each = tinymce.each, - entities = null, defs = { paste_auto_cleanup_on_paste : true, + paste_enable_default_filters : true, paste_block_drop : false, paste_retain_style_properties : "none", paste_strip_class_attributes : "mso", @@ -25,6 +25,7 @@ paste_dialog_height : "400", paste_text_use_dialog : false, paste_text_sticky : false, + paste_text_sticky_default : false, paste_text_notifyalways : false, paste_text_linebreaktype : "p", paste_text_replacements : [ @@ -63,13 +64,19 @@ ed.execCallback('paste_postprocess', pl, o); }); + ed.onKeyDown.addToTop(function(ed, e) { + // Block ctrl+v from adding an undo level since the default logic in tinymce.Editor will add that + if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) + return false; // Stop other listeners + }); + // Initialize plain text flag - ed.pasteAsPlainText = false; + ed.pasteAsPlainText = getParam(ed, 'paste_text_sticky_default'); // This function executes the process handlers and inserts the contents // force_rich overrides plain text mode set by user, important for pasting with execCommand function process(o, force_rich) { - var dom = ed.dom; + var dom = ed.dom, rng; // Execute pre process handlers t.onPreProcess.dispatch(t, o); @@ -77,11 +84,22 @@ // Create DOM structure o.node = dom.create('div', 0, o.content); + // If pasting inside the same element and the contents is only one block + // remove the block and keep the text since Firefox will copy parts of pre and h1-h6 as a pre element + if (tinymce.isGecko) { + rng = ed.selection.getRng(true); + if (rng.startContainer == rng.endContainer && rng.startContainer.nodeType == 3) { + // Is only one block node and it doesn't contain word stuff + if (o.node.childNodes.length === 1 && /^(p|h[1-6]|pre)$/i.test(o.node.firstChild.nodeName) && o.content.indexOf('__MCE_ITEM__') === -1) + dom.remove(o.node.firstChild, true); + } + } + // Execute post process handlers t.onPostProcess.dispatch(t, o); // Serialize content - o.content = ed.serializer.serialize(o.node, {getInner : 1}); + o.content = ed.serializer.serialize(o.node, {getInner : 1, forced_root_block : ''}); // Plain text option active? if ((!force_rich) && (ed.pasteAsPlainText)) { @@ -91,9 +109,6 @@ ed.pasteAsPlainText = false; ed.controlManager.setActive("pastetext", false); } - } else if (/<(p|h[1-6]|ul|ol)/.test(o.content)) { - // Handle insertion of contents containing block elements separately - t._insertBlockContent(ed, dom, o.content); } else { t._insert(o.content); } @@ -132,38 +147,46 @@ // hidden div and placing the caret inside it and after the browser paste // is done it grabs that contents and processes that function grabContent(e) { - var n, or, rng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY; + var n, or, rng, oldRng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY, textContent; // Check if browser supports direct plaintext access - if (ed.pasteAsPlainText && (e.clipboardData || dom.doc.dataTransfer)) { - e.preventDefault(); - process({content : (e.clipboardData || dom.doc.dataTransfer).getData('Text').replace(/\r?\n/g, '
    ')}); - return; + if (e.clipboardData || dom.doc.dataTransfer) { + textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text'); + + if (ed.pasteAsPlainText) { + e.preventDefault(); + process({content : textContent.replace(/\r?\n/g, '
    ')}); + return; + } } if (dom.get('_mcePaste')) return; // Create container to paste into - n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste'}, '\uFEFF
    '); + n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF'); // If contentEditable mode we need to find out the position of the closest element if (body != ed.getDoc().body) posY = dom.getPos(ed.selection.getStart(), body).y; else - posY = body.scrollTop; + posY = body.scrollTop + dom.getViewPort(ed.getWin()).y; // Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles + // If also needs to be in view on IE or the paste would fail dom.setStyles(n, { position : 'absolute', - left : -10000, - top : posY, + left : tinymce.isGecko ? -40 : 0, // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div + top : posY - 25, width : 1, height : 1, overflow : 'hidden' }); if (tinymce.isIE) { + // Store away the old range + oldRng = sel.getRng(); + // Select the container rng = dom.doc.body.createTextRange(); rng.moveToElementText(n); @@ -174,14 +197,23 @@ // Check if the contents was changed, if it wasn't then clipboard extraction failed probably due // to IE security settings so we pass the junk though better than nothing right - if (n.innerHTML === '\uFEFF') { + if (n.innerHTML === '\uFEFF\uFEFF') { ed.execCommand('mcePasteWord'); e.preventDefault(); return; } - // Process contents - process({content : n.innerHTML}); + // Restore the old range and clear the contents before pasting + sel.setRng(oldRng); + sel.setContent(''); + + // For some odd reason we need to detach the the mceInsertContent call from the paste event + // It's like IE has a reference to the parent element that you paste in and the selection gets messed up + // when it tries to restore the selection + setTimeout(function() { + // Process contents + process({content : n.innerHTML}); + }, 0); // Block the real paste event return tinymce.dom.Event.cancel(e); @@ -196,46 +228,52 @@ or = ed.selection.getRng(); - // Move caret into hidden div + // Move select contents inside DIV n = n.firstChild; rng = ed.getDoc().createRange(); rng.setStart(n, 0); - rng.setEnd(n, 1); + rng.setEnd(n, 2); sel.setRng(rng); // Wait a while and grab the pasted contents window.setTimeout(function() { - var h = '', nl = dom.select('div.mcePaste'); + var h = '', nl; - // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string - each(nl, function(n) { - var child = n.firstChild; + // Paste divs duplicated in paste divs seems to happen when you paste plain text so lets first look for that broken behavior in WebKit + if (!dom.select('div.mcePaste > div.mcePaste').length) { + nl = dom.select('div.mcePaste'); - // WebKit inserts a DIV container with lots of odd styles - if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) { - dom.remove(child, 1); - } + // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string + each(nl, function(n) { + var child = n.firstChild; - // WebKit duplicates the divs so we need to remove them - each(dom.select('div.mcePaste', n), function(n) { - dom.remove(n, 1); - }); + // WebKit inserts a DIV container with lots of odd styles + if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) { + dom.remove(child, 1); + } - // Remove apply style spans - each(dom.select('span.Apple-style-span', n), function(n) { - dom.remove(n, 1); - }); + // Remove apply style spans + each(dom.select('span.Apple-style-span', n), function(n) { + dom.remove(n, 1); + }); - // Remove bogus br elements - each(dom.select('br[_mce_bogus]', n), function(n) { - dom.remove(n); - }); + // Remove bogus br elements + each(dom.select('br[data-mce-bogus]', n), function(n) { + dom.remove(n); + }); - h += n.innerHTML; - }); + // WebKit will make a copy of the DIV for each line of plain text pasted and insert them into the DIV + if (n.parentNode.className != 'mcePaste') + h += n.innerHTML; + }); + } else { + // Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc + // So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same + h = '

    ' + dom.encode(textContent).replace(/\r?\n\r?\n/g, '

    ').replace(/\r?\n/g, '
    ') + '

    '; + } // Remove the nodes - each(nl, function(n) { + each(dom.select('div.mcePaste'), function(n) { dom.remove(n); }); @@ -256,7 +294,7 @@ if (getParam(ed, "paste_auto_cleanup_on_paste")) { // Is it's Opera or older FF use key handler if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) { - ed.onKeyDown.add(function(ed, e) { + ed.onKeyDown.addToTop(function(ed, e) { if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) grabContent(e); }); @@ -268,17 +306,19 @@ } } - // Block all drag/drop events - if (getParam(ed, "paste_block_drop")) { - ed.onInit.add(function() { + ed.onInit.add(function() { + ed.controlManager.setActive("pastetext", ed.pasteAsPlainText); + + // Block all drag/drop events + if (getParam(ed, "paste_block_drop")) { ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) { e.preventDefault(); e.stopPropagation(); return false; }); - }); - } + } + }); // Add legacy support t._legacySupport(); @@ -295,8 +335,6 @@ }, _preProcess : function(pl, o) { - //console.log('Before preprocess:' + o.content); - var ed = this.editor, h = o.content, grep = tinymce.grep, @@ -304,6 +342,8 @@ trim = tinymce.trim, len, stripClass; + //console.log('Before preprocess:' + o.content); + function process(items) { each(items, function(v) { // Remove or replace @@ -313,6 +353,23 @@ h = h.replace(v[0], v[1]); }); } + + if (ed.settings.paste_enable_default_filters == false) { + return; + } + + // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser + if (tinymce.isIE && document.documentMode >= 9) { + // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser + process([[/(?:
     [\s\r\n]+|
    )*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
     [\s\r\n]+|
    )*/g, '$1']]); + + // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break + process([ + [/

    /g, '

    '], // Replace multiple BR elements with uppercase BR to keep them intact + [/
    /g, ' '], // Replace single br elements with space since they are word wrap BR:s + [/

    /g, '
    '], // Replace back the double brs but into a single BR + ]); + } // Detect Word content and process it more aggressive if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) { @@ -332,7 +389,8 @@ if (getParam(ed, "paste_convert_middot_lists")) { process([ [//gi, '$&__MCE_ITEM__'], // Convert supportLists to a list item marker - [/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'] // Convert mso-list and symbol spans to item markers + [/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'], // Convert mso-list and symbol spans to item markers + [/(]+(?:MsoListParagraph)[^>]+>)/gi, '$1__MCE_ITEM__'] // Convert mso-list and symbol paragraphs to item markers (FF) ]); } @@ -484,6 +542,11 @@ ]); } + process([ + // Copy paste from Java like Open Office will produce this junk on FF + [/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi, ''] + ]); + // Class attribute options are: leave all as-is ("none"), remove all ("all"), or remove only those starting with mso ("mso"). // Note:- paste_strip_class_attributes: "none", verify_css_classes: true is also a good variation. stripClass = getParam(ed, "paste_strip_class_attributes"); @@ -503,7 +566,7 @@ }; h = h.replace(/ class="([^"]+)"/gi, removeClasses); - h = h.replace(/ class=(\w+)/gi, removeClasses); + h = h.replace(/ class=([\-\w]+)/gi, removeClasses); } // Remove spans option @@ -522,6 +585,10 @@ _postProcess : function(pl, o) { var t = this, ed = t.editor, dom = ed.dom, styleProps; + if (ed.settings.paste_enable_default_filters == false) { + return; + } + if (o.wordContent) { // Remove named anchors or TOC links each(dom.select('a', o.node), function(a) { @@ -573,14 +640,14 @@ if (getParam(ed, "paste_remove_styles") || (getParam(ed, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) { each(dom.select('*[style]', o.node), function(el) { el.removeAttribute('style'); - el.removeAttribute('_mce_style'); + el.removeAttribute('data-mce-style'); }); } else { if (tinymce.isWebKit) { // We need to compress the styles on WebKit since if you paste it will become // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles each(dom.select('*', o.node), function(el) { - el.removeAttribute('_mce_style'); + el.removeAttribute('data-mce-style'); }); } } @@ -603,11 +670,11 @@ val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi, '').replace(/ /g, '\u00a0'); // Detect unordered lists look for bullets - if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0*/.test(val)) + if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(val)) type = 'ul'; // Detect ordered lists 1., a. or ixv. - if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(val)) + if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(val)) type = 'ol'; // Check if node value matches the list pattern: o   @@ -637,9 +704,9 @@ var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, ''); // Remove span with the middot or the number - if (type == 'ul' && /^[\u2022\u00b7\u00a7\u00d8o]/.test(html)) + if (type == 'ul' && /^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(html)) dom.remove(span); - else if (/^[\s\S]*\w+\.( |\u00a0)*\s*/.test(html)) + else if (/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(html)) dom.remove(span); }); @@ -647,7 +714,7 @@ // Remove middot/list items if (type == 'ul') - html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*( |\u00a0)+\s*/, ''); + html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/, ''); else html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.( |\u00a0)+\s*/, ''); @@ -667,65 +734,6 @@ o.node.innerHTML = html.replace(/__MCE_ITEM__/g, ''); }, - /** - * This method will split the current block parent and insert the contents inside the split position. - * This logic can be improved so text nodes at the start/end remain in the start/end block elements - */ - _insertBlockContent : function(ed, dom, content) { - var parentBlock, marker, sel = ed.selection, last, elm, vp, y, elmHeight, markerId = 'mce_marker'; - - function select(n) { - var r; - - if (tinymce.isIE) { - r = ed.getDoc().body.createTextRange(); - r.moveToElementText(n); - r.collapse(false); - r.select(); - } else { - sel.select(n, 1); - sel.collapse(false); - } - } - - // Insert a marker for the caret position - this._insert('', 1); - marker = dom.get(markerId); - parentBlock = dom.getParent(marker, 'p,h1,h2,h3,h4,h5,h6,ul,ol,th,td'); - - // If it's a parent block but not a table cell - if (parentBlock && !/TD|TH/.test(parentBlock.nodeName)) { - // Split parent block - marker = dom.split(parentBlock, marker); - - // Insert nodes before the marker - each(dom.create('div', 0, content).childNodes, function(n) { - last = marker.parentNode.insertBefore(n.cloneNode(true), marker); - }); - - // Move caret after marker - select(last); - } else { - dom.setOuterHTML(marker, content); - sel.select(ed.getBody(), 1); - sel.collapse(0); - } - - // Remove marker if it's left - while (elm = dom.get(markerId)) - dom.remove(elm); - - // Get element, position and height - elm = sel.getStart(); - vp = dom.getViewPort(ed.getWin()); - y = ed.dom.getPos(elm).y; - elmHeight = elm.clientHeight; - - // Is element within viewport if not then scroll it into view - if (y < vp.y || y + elmHeight > vp.y + vp.h) - ed.getDoc().body.scrollTop = y < vp.y ? y : y - vp.h + 25; - }, - /** * Inserts the specified contents at the caret position. */ @@ -736,8 +744,7 @@ if (!ed.selection.isCollapsed() && r.startContainer != r.endContainer) ed.getDoc().execCommand('Delete', false, null); - // It's better to use the insertHTML method on Gecko since it will combine paragraphs correctly before inserting the contents - ed.execCommand(tinymce.isGecko ? 'insertHTML' : 'mceInsertContent', false, h, {skip_undo : skip_undo}); + ed.execCommand('mceInsertContent', false, h, {skip_undo : skip_undo}); }, /** @@ -769,9 +776,6 @@ }; if ((typeof(h) === "string") && (h.length > 0)) { - if (!entities) - entities = ("34,quot,38,amp,39,apos,60,lt,62,gt," + ed.serializer.settings.entities).split(","); - // If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(h)) { process([ @@ -790,26 +794,12 @@ [/<\/t[dh]>\s*]*>/gi, "\t"], // Table cells get tabs betweem them /<[a-z!\/?][^>]*>/gi, // Delete all remaining tags [/ /gi, " "], // Convert non-break spaces to regular spaces (remember, *plain text*) - [ - // HTML entity - /&(#\d+|[a-z0-9]{1,10});/gi, - - // Replace with actual character - function(e, s) { - if (s.charAt(0) === "#") { - return String.fromCharCode(s.slice(1)); - } - else { - return ((e = inArray(entities, s)) > 0)? String.fromCharCode(entities[e-1]) : " "; - } - } - ], [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"], // Cool little RegExp deletes whitespace around linebreak chars. [/\n{3,}/g, "\n\n"], // Max. 2 consecutive linebreaks /^\s+|\s+$/g // Trim the front & back ]); - h = dom.encode(h); + h = dom.decode(tinymce.html.Entities.encodeRaw(h)); // Delete any highlighted text before pasting if (!sel.isCollapsed()) { diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js index 1433a06a4a..4c87e8fa79 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js @@ -12,6 +12,10 @@ tinymce.create('tinymce.plugins.SearchReplacePlugin', { init : function(ed, url) { function open(m) { + // Keep IE from writing out the f/r character to the editor + // instance while initializing a new dialog. See: #3131190 + window.focus(); + ed.windowManager.open({ file : url + '/searchreplace.htm', width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)), diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js index 0137ba0fdd..80284b9f3f 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js @@ -2,14 +2,18 @@ tinyMCEPopup.requireLangPack(); var SearchReplaceDialog = { init : function(ed) { - var f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode"); + var t = this, f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode"); - this.switchMode(m); + t.switchMode(m); f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string"); // Focus input field f[m + '_panel_searchstring'].focus(); + + mcTabs.onChange.add(function(tab_id, panel_id) { + t.switchMode(tab_id.substring(0, tab_id.indexOf('_'))); + }); }, switchMode : function(m) { @@ -51,16 +55,14 @@ var SearchReplaceDialog = { function fix() { // Correct Firefox graphics glitches + // TODO: Verify if this is actually needed any more, maybe it was for very old FF versions? r = se.getRng().cloneRange(); ed.getDoc().execCommand('SelectAll', false, null); se.setRng(r); }; function replace() { - if (tinymce.isIE) - ed.selection.getRng().duplicate().pasteHTML(rs); // Needs to be duplicated due to selection bug in IE - else - ed.getDoc().execCommand('InsertHTML', false, rs); + ed.selection.setContent(rs); // Needs to be duplicated due to selection bug in IE }; // IE flags @@ -74,6 +76,9 @@ var SearchReplaceDialog = { ed.selection.collapse(true); if (tinymce.isIE) { + ed.focus(); + r = ed.getDoc().selection.createRange(); + while (r.findText(s, b ? -1 : 1, fl)) { r.scrollIntoView(); r.select(); @@ -110,15 +115,14 @@ var SearchReplaceDialog = { se.collapse(b); r = se.getRng(); - if (tinymce.isIE) { - r = ed.getDoc().selection.createRange(); - } - // Whats the point if (!s) return; if (tinymce.isIE) { + ed.focus(); + r = ed.getDoc().selection.createRange(); + if (r.findText(s, b ? -1 : 1, fl)) { r.scrollIntoView(); r.select(); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm index d0424cfc9b..5a22d8aa4d 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm @@ -8,27 +8,28 @@ - + +
    - +
    - +
    - - - +
    + + @@ -39,7 +40,7 @@ - - - - - -
    {#style_dlg.padding} - +
    @@ -288,11 +330,14 @@ @@ -300,11 +345,14 @@ @@ -312,11 +360,14 @@ @@ -324,11 +375,14 @@ @@ -341,7 +395,7 @@
    {#style_dlg.margin} -
     
    - +
    - +
      + + +
    - +
    - +
      + + +
    - +
    - +
      + + +
    - +
    - +
      + + +
    +
    @@ -349,11 +403,14 @@ @@ -361,11 +418,14 @@ @@ -373,11 +433,14 @@ @@ -385,11 +448,14 @@ @@ -401,131 +467,148 @@
    -
     
    - +
    - +
      + + +
    - +
    - +
      + + +
    - +
    - +
      + + +
    - +
    - +
      + + +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      {#style_dlg.style} {#style_dlg.width} {#style_dlg.color}
          
    {#style_dlg.top}   - - - - - - -
     
    -
      - - - - - -
     
    -
    {#style_dlg.right}   - - - - - - -
     
    -
      - - - - - -
     
    -
    {#style_dlg.bottom}   - - - - - - -
     
    -
      - - - - - -
     
    -
    {#style_dlg.left}   - - - - - - -
     
    -
      - - - - - +
    + {#style_dlg.border} +
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#style_dlg.style} {#style_dlg.width} {#style_dlg.color}
          
    {#style_dlg.top}   + + + + + + +
      + + +
    +
      + + + + + +
     
    +
    {#style_dlg.right}   + + + + + + +
      + + +
    +
      + + + + + +
     
    +
    {#style_dlg.bottom}   + + + + + + +
      + + +
    +
      + + + + + +
     
    +
    {#style_dlg.left}   + + + + + + +
      + + +
    +
      + + + + + +
     
    +
    -
    +
    - +
    + {#style_dlg.list} +
    @@ -541,10 +624,13 @@
    +
    - +
    + {#style_dlg.position} +
    @@ -555,11 +641,14 @@ @@ -570,11 +659,14 @@ @@ -582,12 +674,13 @@
    - +
    - +
      + + +
    - +
    - +
      + + +
    +
    {#style_dlg.placement} - +
    @@ -595,11 +688,14 @@ @@ -607,11 +703,14 @@ @@ -619,11 +718,14 @@ @@ -631,11 +733,14 @@ @@ -648,7 +753,7 @@
    {#style_dlg.clip} -
     
    {#style_dlg.top} - +
    - +
      + + +
    {#style_dlg.right} - +
    - +
      + + +
    {#style_dlg.bottom} - +
    - +
      + + +
    {#style_dlg.left} - +
    - +
      + + +
    +
    @@ -656,11 +761,14 @@ @@ -668,11 +776,14 @@ @@ -680,11 +791,14 @@ @@ -692,11 +806,14 @@ diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js index c2be2f40a6..a1579c85f2 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js @@ -1,112 +1,122 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode; - - tinymce.create('tinymce.plugins.TabFocusPlugin', { - init : function(ed, url) { - function tabCancel(ed, e) { - if (e.keyCode === 9) - return Event.cancel(e); - }; - - function tabHandler(ed, e) { - var x, i, f, el, v; - - function find(d) { - f = DOM.getParent(ed.id, 'form'); - el = f.elements; - - if (f) { - each(el, function(e, i) { - if (e.id == ed.id) { - x = i; - return false; - } - }); - - if (d > 0) { - for (i = x + 1; i < el.length; i++) { - if (el[i].type != 'hidden') - return el[i]; - } - } else { - for (i = x - 1; i >= 0; i--) { - if (el[i].type != 'hidden') - return el[i]; - } - } - } - - return null; - }; - - if (e.keyCode === 9) { - v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next'))); - - if (v.length == 1) { - v[1] = v[0]; - v[0] = ':prev'; - } - - // Find element to focus - if (e.shiftKey) { - if (v[0] == ':prev') - el = find(-1); - else - el = DOM.get(v[0]); - } else { - if (v[1] == ':next') - el = find(1); - else - el = DOM.get(v[1]); - } - - if (el) { - if (ed = tinymce.get(el.id || el.name)) - ed.focus(); - else - window.setTimeout(function() {window.focus();el.focus();}, 10); - - return Event.cancel(e); - } - } - }; - - ed.onKeyUp.add(tabCancel); - - if (tinymce.isGecko) { - ed.onKeyPress.add(tabHandler); - ed.onKeyDown.add(tabCancel); - } else - ed.onKeyDown.add(tabHandler); - - ed.onInit.add(function() { - each(DOM.select('a:first,a:last', ed.getContainer()), function(n) { - Event.add(n, 'focus', function() {ed.focus();}); - }); - }); - }, - - getInfo : function() { - return { - longname : 'Tabfocus', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin); -})(); \ No newline at end of file +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode; + + tinymce.create('tinymce.plugins.TabFocusPlugin', { + init : function(ed, url) { + function tabCancel(ed, e) { + if (e.keyCode === 9) + return Event.cancel(e); + } + + function tabHandler(ed, e) { + var x, i, f, el, v; + + function find(d) { + el = DOM.select(':input:enabled,*[tabindex]'); + + function canSelectRecursive(e) { + return e.nodeName==="BODY" || (e.type != 'hidden' && + !(e.style.display == "none") && + !(e.style.visibility == "hidden") && canSelectRecursive(e.parentNode)); + } + function canSelectInOldIe(el) { + return el.attributes["tabIndex"].specified || el.nodeName == "INPUT" || el.nodeName == "TEXTAREA"; + } + function isOldIe() { + return tinymce.isIE6 || tinymce.isIE7; + } + function canSelect(el) { + return ((!isOldIe() || canSelectInOldIe(el))) && el.getAttribute("tabindex") != '-1' && canSelectRecursive(el); + } + + each(el, function(e, i) { + if (e.id == ed.id) { + x = i; + return false; + } + }); + if (d > 0) { + for (i = x + 1; i < el.length; i++) { + if (canSelect(el[i])) + return el[i]; + } + } else { + for (i = x - 1; i >= 0; i--) { + if (canSelect(el[i])) + return el[i]; + } + } + + return null; + } + + if (e.keyCode === 9) { + v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next'))); + + if (v.length == 1) { + v[1] = v[0]; + v[0] = ':prev'; + } + + // Find element to focus + if (e.shiftKey) { + if (v[0] == ':prev') + el = find(-1); + else + el = DOM.get(v[0]); + } else { + if (v[1] == ':next') + el = find(1); + else + el = DOM.get(v[1]); + } + + if (el) { + if (el.id && (ed = tinymce.get(el.id || el.name))) + ed.focus(); + else + window.setTimeout(function() { + if (!tinymce.isWebKit) + window.focus(); + el.focus(); + }, 10); + + return Event.cancel(e); + } + } + } + + ed.onKeyUp.add(tabCancel); + + if (tinymce.isGecko) { + ed.onKeyPress.add(tabHandler); + ed.onKeyDown.add(tabCancel); + } else + ed.onKeyDown.add(tabHandler); + + }, + + getInfo : function() { + return { + longname : 'Tabfocus', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin); +})(); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/cell.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/cell.htm index d243e1d833..a72a8d6973 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/cell.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/cell.htm @@ -5,16 +5,17 @@ + - + @@ -23,7 +24,7 @@
    {#table_dlg.general_props} -
     
    {#style_dlg.top} - +
    - +
      + + +
    {#style_dlg.right} - +
    - +
      + + +
    {#style_dlg.bottom} - +
    - +
      + + +
    {#style_dlg.left} - +
    - +
      + + +
    +
    - + - + @@ -92,7 +93,7 @@
    {#table_dlg.advanced_props} -
    @@ -70,10 +71,10 @@
    +
    @@ -124,7 +125,7 @@
    - +
    @@ -133,10 +134,10 @@ - - + +
     
    - +
    @@ -145,10 +146,10 @@ - - + +
     
    - +
    @@ -166,6 +167,7 @@ diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js index 8c30e20494..60cc567db4 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js @@ -1,1139 +1,1363 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function(tinymce) { - var each = tinymce.each; - - // Checks if the selection/caret is at the start of the specified block element - function isAtStart(rng, par) { - var doc = par.ownerDocument, rng2 = doc.createRange(), elm; - - rng2.setStartBefore(par); - rng2.setEnd(rng.endContainer, rng.endOffset); - - elm = doc.createElement('body'); - elm.appendChild(rng2.cloneContents()); - - // Check for text characters of other elements that should be treated as content - return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0; - }; - - /** - * Table Grid class. - */ - function TableGrid(table, dom, selection) { - var grid, startPos, endPos, selectedCell; - - buildGrid(); - selectedCell = dom.getParent(selection.getStart(), 'th,td'); - if (selectedCell) { - startPos = getPos(selectedCell); - endPos = findEndPos(); - selectedCell = getCell(startPos.x, startPos.y); - } - - function cloneNode(node, children) { - node = node.cloneNode(children); - node.removeAttribute('id'); - - return node; - } - - function buildGrid() { - var startY = 0; - - grid = []; - - each(['thead', 'tbody', 'tfoot'], function(part) { - var rows = dom.select('> ' + part + ' tr', table); - - each(rows, function(tr, y) { - y += startY; - - each(dom.select('> td, > th', tr), function(td, x) { - var x2, y2, rowspan, colspan; - - // Skip over existing cells produced by rowspan - if (grid[y]) { - while (grid[y][x]) - x++; - } - - // Get col/rowspan from cell - rowspan = getSpanVal(td, 'rowspan'); - colspan = getSpanVal(td, 'colspan'); - - // Fill out rowspan/colspan right and down - for (y2 = y; y2 < y + rowspan; y2++) { - if (!grid[y2]) - grid[y2] = []; - - for (x2 = x; x2 < x + colspan; x2++) { - grid[y2][x2] = { - part : part, - real : y2 == y && x2 == x, - elm : td, - rowspan : rowspan, - colspan : colspan - }; - } - } - }); - }); - - startY += rows.length; - }); - }; - - function getCell(x, y) { - var row; - - row = grid[y]; - if (row) - return row[x]; - }; - - function getSpanVal(td, name) { - return parseInt(td.getAttribute(name) || 1); - }; - - function isCellSelected(cell) { - return dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell; - }; - - function getSelectedRows() { - var rows = []; - - each(table.rows, function(row) { - each(row.cells, function(cell) { - if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) { - rows.push(row); - return false; - } - }); - }); - - return rows; - }; - - function deleteTable() { - var rng = dom.createRng(); - - rng.setStartAfter(table); - rng.setEndAfter(table); - - selection.setRng(rng); - - dom.remove(table); - }; - - function cloneCell(cell) { - var formatNode; - - // Clone formats - tinymce.walk(cell, function(node) { - var curNode; - - if (node.nodeType == 3) { - each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) { - node = cloneNode(node, false); - - if (!formatNode) - formatNode = curNode = node; - else if (curNode) - curNode.appendChild(node); - - curNode = node; - }); - - // Add something to the inner node - if (curNode) - curNode.innerHTML = tinymce.isIE ? ' ' : '
    '; - - return false; - } - }, 'childNodes'); - - cell = cloneNode(cell, false); - cell.rowSpan = cell.colSpan = 1; - - if (formatNode) { - cell.appendChild(formatNode); - } else { - if (!tinymce.isIE) - cell.innerHTML = '
    '; - } - - return cell; - }; - - function cleanup() { - var rng = dom.createRng(); - - // Empty rows - each(dom.select('tr', table), function(tr) { - if (tr.cells.length == 0) - dom.remove(tr); - }); - - // Empty table - if (dom.select('tr', table).length == 0) { - rng.setStartAfter(table); - rng.setEndAfter(table); - selection.setRng(rng); - dom.remove(table); - return; - } - - // Empty header/body/footer - each(dom.select('thead,tbody,tfoot', table), function(part) { - if (part.rows.length == 0) - dom.remove(part); - }); - - // Restore selection to start position if it still exists - buildGrid(); - - // Restore the selection to the closest table position - row = grid[Math.min(grid.length - 1, startPos.y)]; - if (row) { - selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true); - selection.collapse(true); - } - }; - - function fillLeftDown(x, y, rows, cols) { - var tr, x2, r, c, cell; - - tr = grid[y][x].elm.parentNode; - for (r = 1; r <= rows; r++) { - tr = dom.getNext(tr, 'tr'); - - if (tr) { - // Loop left to find real cell - for (x2 = x; x2 >= 0; x2--) { - cell = grid[y + r][x2].elm; - - if (cell.parentNode == tr) { - // Append clones after - for (c = 1; c <= cols; c++) - dom.insertAfter(cloneCell(cell), cell); - - break; - } - } - - if (x2 == -1) { - // Insert nodes before first cell - for (c = 1; c <= cols; c++) - tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]); - } - } - } - }; - - function split() { - each(grid, function(row, y) { - each(row, function(cell, x) { - var colSpan, rowSpan, newCell, i; - - if (isCellSelected(cell)) { - cell = cell.elm; - colSpan = getSpanVal(cell, 'colspan'); - rowSpan = getSpanVal(cell, 'rowspan'); - - if (colSpan > 1 || rowSpan > 1) { - cell.colSpan = cell.rowSpan = 1; - - // Insert cells right - for (i = 0; i < colSpan - 1; i++) - dom.insertAfter(cloneCell(cell), cell); - - fillLeftDown(x, y, rowSpan - 1, colSpan); - } - } - }); - }); - }; - - function merge(cell, cols, rows) { - var startX, startY, endX, endY, x, y, startCell, endCell, cell, children; - - // Use specified cell and cols/rows - if (cell) { - pos = getPos(cell); - startX = pos.x; - startY = pos.y; - endX = startX + (cols - 1); - endY = startY + (rows - 1); - } else { - // Use selection - startX = startPos.x; - startY = startPos.y; - endX = endPos.x; - endY = endPos.y; - } - - // Find start/end cells - startCell = getCell(startX, startY); - endCell = getCell(endX, endY); - - // Check if the cells exists and if they are of the same part for example tbody = tbody - if (startCell && endCell && startCell.part == endCell.part) { - // Split and rebuild grid - split(); - buildGrid(); - - // Set row/col span to start cell - startCell = getCell(startX, startY).elm; - startCell.colSpan = (endX - startX) + 1; - startCell.rowSpan = (endY - startY) + 1; - - // Remove other cells and add it's contents to the start cell - for (y = startY; y <= endY; y++) { - for (x = startX; x <= endX; x++) { - cell = grid[y][x].elm; - - if (cell != startCell) { - // Move children to startCell - children = tinymce.grep(cell.childNodes); - each(children, function(node, i) { - // Jump over last BR element - if (node.nodeName != 'BR' || i != children.length - 1) - startCell.appendChild(node); - }); - - // Remove cell - dom.remove(cell); - } - } - } - - // Remove empty rows etc and restore caret location - cleanup(); - } - }; - - function insertRow(before) { - var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell; - - // Find first/last row - each(grid, function(row, y) { - each(row, function(cell, x) { - if (isCellSelected(cell)) { - cell = cell.elm; - rowElm = cell.parentNode; - newRow = cloneNode(rowElm, false); - posY = y; - - if (before) - return false; - } - }); - - if (before) - return !posY; - }); - - for (x = 0; x < grid[0].length; x++) { - cell = grid[posY][x].elm; - - if (cell != lastCell) { - if (!before) { - rowSpan = getSpanVal(cell, 'rowspan'); - if (rowSpan > 1) { - cell.rowSpan = rowSpan + 1; - continue; - } - } else { - // Check if cell above can be expanded - if (posY > 0 && grid[posY - 1][x]) { - otherCell = grid[posY - 1][x].elm; - rowSpan = getSpanVal(otherCell, 'rowspan'); - if (rowSpan > 1) { - otherCell.rowSpan = rowSpan + 1; - continue; - } - } - } - - // Insert new cell into new row - newCell = cloneCell(cell) - newCell.colSpan = cell.colSpan; - newRow.appendChild(newCell); - - lastCell = cell; - } - } - - if (newRow.hasChildNodes()) { - if (!before) - dom.insertAfter(newRow, rowElm); - else - rowElm.parentNode.insertBefore(newRow, rowElm); - } - }; - - function insertCol(before) { - var posX, lastCell; - - // Find first/last column - each(grid, function(row, y) { - each(row, function(cell, x) { - if (isCellSelected(cell)) { - posX = x; - - if (before) - return false; - } - }); - - if (before) - return !posX; - }); - - each(grid, function(row, y) { - var cell = row[posX].elm, rowSpan, colSpan; - - if (cell != lastCell) { - colSpan = getSpanVal(cell, 'colspan'); - rowSpan = getSpanVal(cell, 'rowspan'); - - if (colSpan == 1) { - if (!before) { - dom.insertAfter(cloneCell(cell), cell); - fillLeftDown(posX, y, rowSpan - 1, colSpan); - } else { - cell.parentNode.insertBefore(cloneCell(cell), cell); - fillLeftDown(posX, y, rowSpan - 1, colSpan); - } - } else - cell.colSpan++; - - lastCell = cell; - } - }); - }; - - function deleteCols() { - var cols = []; - - // Get selected column indexes - each(grid, function(row, y) { - each(row, function(cell, x) { - if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) { - each(grid, function(row) { - var cell = row[x].elm, colSpan; - - colSpan = getSpanVal(cell, 'colspan'); - - if (colSpan > 1) - cell.colSpan = colSpan - 1; - else - dom.remove(cell); - }); - - cols.push(x); - } - }); - }); - - cleanup(); - }; - - function deleteRows() { - var rows; - - function deleteRow(tr) { - var nextTr, pos, lastCell; - - nextTr = dom.getNext(tr, 'tr'); - - // Move down row spanned cells - each(tr.cells, function(cell) { - var rowSpan = getSpanVal(cell, 'rowspan'); - - if (rowSpan > 1) { - cell.rowSpan = rowSpan - 1; - pos = getPos(cell); - fillLeftDown(pos.x, pos.y, 1, 1); - } - }); - - // Delete cells - pos = getPos(tr.cells[0]); - each(grid[pos.y], function(cell) { - var rowSpan; - - cell = cell.elm; - - if (cell != lastCell) { - rowSpan = getSpanVal(cell, 'rowspan'); - - if (rowSpan <= 1) - dom.remove(cell); - else - cell.rowSpan = rowSpan - 1; - - lastCell = cell; - } - }); - }; - - // Get selected rows and move selection out of scope - rows = getSelectedRows(); - - // Delete all selected rows - each(rows.reverse(), function(tr) { - deleteRow(tr); - }); - - cleanup(); - }; - - function cutRows() { - var rows = getSelectedRows(); - - dom.remove(rows); - cleanup(); - - return rows; - }; - - function copyRows() { - var rows = getSelectedRows(); - - each(rows, function(row, i) { - rows[i] = cloneNode(row, true); - }); - - return rows; - }; - - function pasteRows(rows, before) { - var selectedRows = getSelectedRows(), - targetRow = selectedRows[before ? 0 : selectedRows.length - 1], - targetCellCount = targetRow.cells.length; - - // Calc target cell count - each(grid, function(row) { - var match; - - targetCellCount = 0; - each(row, function(cell, x) { - if (cell.real) - targetCellCount += cell.colspan; - - if (cell.elm.parentNode == targetRow) - match = 1; - }); - - if (match) - return false; - }); - - if (!before) - rows.reverse(); - - each(rows, function(row) { - var cellCount = row.cells.length, cell; - - // Remove col/rowspans - for (i = 0; i < cellCount; i++) { - cell = row.cells[i]; - cell.colSpan = cell.rowSpan = 1; - } - - // Needs more cells - for (i = cellCount; i < targetCellCount; i++) - row.appendChild(cloneCell(row.cells[cellCount - 1])); - - // Needs less cells - for (i = targetCellCount; i < cellCount; i++) - dom.remove(row.cells[i]); - - // Add before/after - if (before) - targetRow.parentNode.insertBefore(row, targetRow); - else - dom.insertAfter(row, targetRow); - }); - }; - - function getPos(target) { - var pos; - - each(grid, function(row, y) { - each(row, function(cell, x) { - if (cell.elm == target) { - pos = {x : x, y : y}; - return false; - } - }); - - return !pos; - }); - - return pos; - }; - - function setStartCell(cell) { - startPos = getPos(cell); - }; - - function findEndPos() { - var pos, maxX, maxY; - - maxX = maxY = 0; - - each(grid, function(row, y) { - each(row, function(cell, x) { - var colSpan, rowSpan; - - if (isCellSelected(cell)) { - cell = grid[y][x]; - - if (x > maxX) - maxX = x; - - if (y > maxY) - maxY = y; - - if (cell.real) { - colSpan = cell.colspan - 1; - rowSpan = cell.rowspan - 1; - - if (colSpan) { - if (x + colSpan > maxX) - maxX = x + colSpan; - } - - if (rowSpan) { - if (y + rowSpan > maxY) - maxY = y + rowSpan; - } - } - } - }); - }); - - return {x : maxX, y : maxY}; - }; - - function setEndCell(cell) { - var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan; - - endPos = getPos(cell); - - if (startPos && endPos) { - // Get start/end positions - startX = Math.min(startPos.x, endPos.x); - startY = Math.min(startPos.y, endPos.y); - endX = Math.max(startPos.x, endPos.x); - endY = Math.max(startPos.y, endPos.y); - - // Expand end positon to include spans - maxX = endX; - maxY = endY; - - // Expand startX - for (y = startY; y <= maxY; y++) { - cell = grid[y][startX]; - - if (!cell.real) { - if (startX - (cell.colspan - 1) < startX) - startX -= cell.colspan - 1; - } - } - - // Expand startY - for (x = startX; x <= maxX; x++) { - cell = grid[startY][x]; - - if (!cell.real) { - if (startY - (cell.rowspan - 1) < startY) - startY -= cell.rowspan - 1; - } - } - - // Find max X, Y - for (y = startY; y <= endY; y++) { - for (x = startX; x <= endX; x++) { - cell = grid[y][x]; - - if (cell.real) { - colSpan = cell.colspan - 1; - rowSpan = cell.rowspan - 1; - - if (colSpan) { - if (x + colSpan > maxX) - maxX = x + colSpan; - } - - if (rowSpan) { - if (y + rowSpan > maxY) - maxY = y + rowSpan; - } - } - } - } - - // Remove current selection - dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); - - // Add new selection - for (y = startY; y <= maxY; y++) { - for (x = startX; x <= maxX; x++) - dom.addClass(grid[y][x].elm, 'mceSelected'); - } - } - }; - - // Expose to public - tinymce.extend(this, { - deleteTable : deleteTable, - split : split, - merge : merge, - insertRow : insertRow, - insertCol : insertCol, - deleteCols : deleteCols, - deleteRows : deleteRows, - cutRows : cutRows, - copyRows : copyRows, - pasteRows : pasteRows, - getPos : getPos, - setStartCell : setStartCell, - setEndCell : setEndCell - }); - }; - - tinymce.create('tinymce.plugins.TablePlugin', { - init : function(ed, url) { - var winMan, clipboardRows; - - function createTableGrid(node) { - var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table'); - - if (tblElm) - return new TableGrid(tblElm, ed.dom, selection); - }; - - function cleanup() { - // Restore selection possibilities - ed.getBody().style.webkitUserSelect = ''; - ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); - }; - - // Register buttons - each([ - ['table', 'table.desc', 'mceInsertTable', true], - ['delete_table', 'table.del', 'mceTableDelete'], - ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'], - ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'], - ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'], - ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'], - ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'], - ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'], - ['row_props', 'table.row_desc', 'mceTableRowProps', true], - ['cell_props', 'table.cell_desc', 'mceTableCellProps', true], - ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true], - ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true] - ], function(c) { - ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]}); - }); - - // Select whole table is a table border is clicked - if (!tinymce.isIE) { - ed.onClick.add(function(ed, e) { - e = e.target; - - if (e.nodeName === 'TABLE') - ed.selection.select(e); - }); - } - - // Handle node change updates - ed.onNodeChange.add(function(ed, cm, n) { - var p; - - n = ed.selection.getStart(); - p = ed.dom.getParent(n, 'td,th,caption'); - cm.setActive('table', n.nodeName === 'TABLE' || !!p); - - // Disable table tools if we are in caption - if (p && p.nodeName === 'CAPTION') - p = 0; - - cm.setDisabled('delete_table', !p); - cm.setDisabled('delete_col', !p); - cm.setDisabled('delete_table', !p); - cm.setDisabled('delete_row', !p); - cm.setDisabled('col_after', !p); - cm.setDisabled('col_before', !p); - cm.setDisabled('row_after', !p); - cm.setDisabled('row_before', !p); - cm.setDisabled('row_props', !p); - cm.setDisabled('cell_props', !p); - cm.setDisabled('split_cells', !p); - cm.setDisabled('merge_cells', !p); - }); - - ed.onInit.add(function(ed) { - var startTable, startCell, dom = ed.dom, tableGrid; - - winMan = ed.windowManager; - - // Add cell selection logic - ed.onMouseDown.add(function(ed, e) { - if (e.button != 2) { - cleanup(); - - startCell = dom.getParent(e.target, 'td,th'); - startTable = dom.getParent(startCell, 'table'); - } - }); - - dom.bind(ed.getDoc(), 'mouseover', function(e) { - var sel, table, target = e.target; - - if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) { - table = dom.getParent(target, 'table'); - if (table == startTable) { - if (!tableGrid) { - tableGrid = createTableGrid(table); - tableGrid.setStartCell(startCell); - - ed.getBody().style.webkitUserSelect = 'none'; - } - - tableGrid.setEndCell(target); - } - - // Remove current selection - sel = ed.selection.getSel(); - - if (sel.removeAllRanges) - sel.removeAllRanges(); - else - sel.empty(); - - e.preventDefault(); - } - }); - - ed.onMouseUp.add(function(ed, e) { - var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode; - - // Move selection to startCell - if (startCell) { - if (tableGrid) - ed.getBody().style.webkitUserSelect = ''; - - function setPoint(node, start) { - var walker = new tinymce.dom.TreeWalker(node, node); - - do { - // Text node - if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { - if (start) - rng.setStart(node, 0); - else - rng.setEnd(node, node.nodeValue.length); - - return; - } - - // BR element - if (node.nodeName == 'BR') { - if (start) - rng.setStartBefore(node); - else - rng.setEndBefore(node); - - return; - } - } while (node = (start ? walker.next() : walker.prev())); - }; - - // Try to expand text selection as much as we can only Gecko supports cell selection - selectedCells = dom.select('td.mceSelected,th.mceSelected'); - if (selectedCells.length > 0) { - rng = dom.createRng(); - node = selectedCells[0]; - endNode = selectedCells[selectedCells.length - 1]; - - setPoint(node, 1); - walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table')); - - do { - if (node.nodeName == 'TD' || node.nodeName == 'TH') { - if (!dom.hasClass(node, 'mceSelected')) - break; - - lastNode = node; - } - } while (node = walker.next()); - - setPoint(lastNode); - - sel.setRng(rng); - } - - ed.nodeChanged(); - startCell = tableGrid = startTable = null; - } - }); - - ed.onKeyUp.add(function(ed, e) { - cleanup(); - }); - - // Add context menu - if (ed && ed.plugins.contextmenu) { - ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) { - var sm, se = ed.selection, el = se.getNode() || ed.getBody(); - - if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) { - m.removeAll(); - - if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) { - m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); - m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); - m.addSeparator(); - } - - if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) { - m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); - m.addSeparator(); - } - - m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}}); - m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'}); - m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'}); - m.addSeparator(); - - // Cell menu - sm = m.addMenu({title : 'table.cell'}); - sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'}); - sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'}); - sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'}); - - // Row menu - sm = m.addMenu({title : 'table.row'}); - sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'}); - sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'}); - sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'}); - sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'}); - sm.addSeparator(); - sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'}); - sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'}); - sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows); - sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows); - - // Column menu - sm = m.addMenu({title : 'table.col'}); - sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'}); - sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'}); - sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'}); - } else - m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'}); - }); - } - - // Fixes an issue on Gecko where it's impossible to place the caret behind a table - // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled - if (!tinymce.isIE) { - function fixTableCaretPos() { - var last; - - // Skip empty text nodes form the end - for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ; - - if (last && last.nodeName == 'TABLE') - ed.dom.add(ed.getBody(), 'p', null, '
    '); - }; - - // Fixes an bug where it's impossible to place the caret before a table in Gecko - // this fix solves it by detecting when the caret is at the beginning of such a table - // and then manually moves the caret infront of the table - if (tinymce.isGecko) { - ed.onKeyDown.add(function(ed, e) { - var rng, table, dom = ed.dom; - - // On gecko it's not possible to place the caret before a table - if (e.keyCode == 37 || e.keyCode == 38) { - rng = ed.selection.getRng(); - table = dom.getParent(rng.startContainer, 'table'); - - if (table && ed.getBody().firstChild == table) { - if (isAtStart(rng, table)) { - rng = dom.createRng(); - - rng.setStartBefore(table); - rng.setEndBefore(table); - - ed.selection.setRng(rng); - - e.preventDefault(); - } - } - } - }); - } - - ed.onKeyUp.add(fixTableCaretPos); - ed.onSetContent.add(fixTableCaretPos); - ed.onVisualAid.add(fixTableCaretPos); - - ed.onPreProcess.add(function(ed, o) { - var last = o.node.lastChild; - - if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR') - ed.dom.remove(last); - }); - - fixTableCaretPos(); - } - }); - - // Register action commands - each({ - mceTableSplitCells : function(grid) { - grid.split(); - }, - - mceTableMergeCells : function(grid) { - var rowSpan, colSpan, cell; - - cell = ed.dom.getParent(ed.selection.getNode(), 'th,td'); - if (cell) { - rowSpan = cell.rowSpan; - colSpan = cell.colSpan; - } - - if (!ed.dom.select('td.mceSelected,th.mceSelected').length) { - winMan.open({ - url : url + '/merge_cells.htm', - width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)), - height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)), - inline : 1 - }, { - rows : rowSpan, - cols : colSpan, - onaction : function(data) { - grid.merge(cell, data.cols, data.rows); - }, - plugin_url : url - }); - } else - grid.merge(); - }, - - mceTableInsertRowBefore : function(grid) { - grid.insertRow(true); - }, - - mceTableInsertRowAfter : function(grid) { - grid.insertRow(); - }, - - mceTableInsertColBefore : function(grid) { - grid.insertCol(true); - }, - - mceTableInsertColAfter : function(grid) { - grid.insertCol(); - }, - - mceTableDeleteCol : function(grid) { - grid.deleteCols(); - }, - - mceTableDeleteRow : function(grid) { - grid.deleteRows(); - }, - - mceTableCutRow : function(grid) { - clipboardRows = grid.cutRows(); - }, - - mceTableCopyRow : function(grid) { - clipboardRows = grid.copyRows(); - }, - - mceTablePasteRowBefore : function(grid) { - grid.pasteRows(clipboardRows, true); - }, - - mceTablePasteRowAfter : function(grid) { - grid.pasteRows(clipboardRows); - }, - - mceTableDelete : function(grid) { - grid.deleteTable(); - } - }, function(func, name) { - ed.addCommand(name, function() { - var grid = createTableGrid(); - - if (grid) { - func(grid); - ed.execCommand('mceRepaint'); - cleanup(); - } - }); - }); - - // Register dialog commands - each({ - mceInsertTable : function(val) { - winMan.open({ - url : url + '/table.htm', - width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)), - height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)), - inline : 1 - }, { - plugin_url : url, - action : val ? val.action : 0 - }); - }, - - mceTableRowProps : function() { - winMan.open({ - url : url + '/row.htm', - width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)), - height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }, - - mceTableCellProps : function() { - winMan.open({ - url : url + '/cell.htm', - width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)), - height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - } - }, function(func, name) { - ed.addCommand(name, function(ui, val) { - func(val); - }); - }); - } - }); - - // Register plugin - tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin); +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + var each = tinymce.each; + + // Checks if the selection/caret is at the start of the specified block element + function isAtStart(rng, par) { + var doc = par.ownerDocument, rng2 = doc.createRange(), elm; + + rng2.setStartBefore(par); + rng2.setEnd(rng.endContainer, rng.endOffset); + + elm = doc.createElement('body'); + elm.appendChild(rng2.cloneContents()); + + // Check for text characters of other elements that should be treated as content + return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0; + }; + + function getSpanVal(td, name) { + return parseInt(td.getAttribute(name) || 1); + } + + /** + * Table Grid class. + */ + function TableGrid(table, dom, selection) { + var grid, startPos, endPos, selectedCell; + + buildGrid(); + selectedCell = dom.getParent(selection.getStart(), 'th,td'); + if (selectedCell) { + startPos = getPos(selectedCell); + endPos = findEndPos(); + selectedCell = getCell(startPos.x, startPos.y); + } + + function cloneNode(node, children) { + node = node.cloneNode(children); + node.removeAttribute('id'); + + return node; + } + + function buildGrid() { + var startY = 0; + + grid = []; + + each(['thead', 'tbody', 'tfoot'], function(part) { + var rows = dom.select('> ' + part + ' tr', table); + + each(rows, function(tr, y) { + y += startY; + + each(dom.select('> td, > th', tr), function(td, x) { + var x2, y2, rowspan, colspan; + + // Skip over existing cells produced by rowspan + if (grid[y]) { + while (grid[y][x]) + x++; + } + + // Get col/rowspan from cell + rowspan = getSpanVal(td, 'rowspan'); + colspan = getSpanVal(td, 'colspan'); + + // Fill out rowspan/colspan right and down + for (y2 = y; y2 < y + rowspan; y2++) { + if (!grid[y2]) + grid[y2] = []; + + for (x2 = x; x2 < x + colspan; x2++) { + grid[y2][x2] = { + part : part, + real : y2 == y && x2 == x, + elm : td, + rowspan : rowspan, + colspan : colspan + }; + } + } + }); + }); + + startY += rows.length; + }); + }; + + function getCell(x, y) { + var row; + + row = grid[y]; + if (row) + return row[x]; + }; + + function setSpanVal(td, name, val) { + if (td) { + val = parseInt(val); + + if (val === 1) + td.removeAttribute(name, 1); + else + td.setAttribute(name, val, 1); + } + } + + function isCellSelected(cell) { + return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell); + }; + + function getSelectedRows() { + var rows = []; + + each(table.rows, function(row) { + each(row.cells, function(cell) { + if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) { + rows.push(row); + return false; + } + }); + }); + + return rows; + }; + + function deleteTable() { + var rng = dom.createRng(); + + rng.setStartAfter(table); + rng.setEndAfter(table); + + selection.setRng(rng); + + dom.remove(table); + }; + + function cloneCell(cell) { + var formatNode; + + // Clone formats + tinymce.walk(cell, function(node) { + var curNode; + + if (node.nodeType == 3) { + each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) { + node = cloneNode(node, false); + + if (!formatNode) + formatNode = curNode = node; + else if (curNode) + curNode.appendChild(node); + + curNode = node; + }); + + // Add something to the inner node + if (curNode) + curNode.innerHTML = tinymce.isIE ? ' ' : '
    '; + + return false; + } + }, 'childNodes'); + + cell = cloneNode(cell, false); + setSpanVal(cell, 'rowSpan', 1); + setSpanVal(cell, 'colSpan', 1); + + if (formatNode) { + cell.appendChild(formatNode); + } else { + if (!tinymce.isIE) + cell.innerHTML = '
    '; + } + + return cell; + }; + + function cleanup() { + var rng = dom.createRng(); + + // Empty rows + each(dom.select('tr', table), function(tr) { + if (tr.cells.length == 0) + dom.remove(tr); + }); + + // Empty table + if (dom.select('tr', table).length == 0) { + rng.setStartAfter(table); + rng.setEndAfter(table); + selection.setRng(rng); + dom.remove(table); + return; + } + + // Empty header/body/footer + each(dom.select('thead,tbody,tfoot', table), function(part) { + if (part.rows.length == 0) + dom.remove(part); + }); + + // Restore selection to start position if it still exists + buildGrid(); + + // Restore the selection to the closest table position + row = grid[Math.min(grid.length - 1, startPos.y)]; + if (row) { + selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true); + selection.collapse(true); + } + }; + + function fillLeftDown(x, y, rows, cols) { + var tr, x2, r, c, cell; + + tr = grid[y][x].elm.parentNode; + for (r = 1; r <= rows; r++) { + tr = dom.getNext(tr, 'tr'); + + if (tr) { + // Loop left to find real cell + for (x2 = x; x2 >= 0; x2--) { + cell = grid[y + r][x2].elm; + + if (cell.parentNode == tr) { + // Append clones after + for (c = 1; c <= cols; c++) + dom.insertAfter(cloneCell(cell), cell); + + break; + } + } + + if (x2 == -1) { + // Insert nodes before first cell + for (c = 1; c <= cols; c++) + tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]); + } + } + } + }; + + function split() { + each(grid, function(row, y) { + each(row, function(cell, x) { + var colSpan, rowSpan, newCell, i; + + if (isCellSelected(cell)) { + cell = cell.elm; + colSpan = getSpanVal(cell, 'colspan'); + rowSpan = getSpanVal(cell, 'rowspan'); + + if (colSpan > 1 || rowSpan > 1) { + setSpanVal(cell, 'rowSpan', 1); + setSpanVal(cell, 'colSpan', 1); + + // Insert cells right + for (i = 0; i < colSpan - 1; i++) + dom.insertAfter(cloneCell(cell), cell); + + fillLeftDown(x, y, rowSpan - 1, colSpan); + } + } + }); + }); + }; + + function merge(cell, cols, rows) { + var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count; + + // Use specified cell and cols/rows + if (cell) { + pos = getPos(cell); + startX = pos.x; + startY = pos.y; + endX = startX + (cols - 1); + endY = startY + (rows - 1); + } else { + // Use selection + startX = startPos.x; + startY = startPos.y; + endX = endPos.x; + endY = endPos.y; + } + + // Find start/end cells + startCell = getCell(startX, startY); + endCell = getCell(endX, endY); + + // Check if the cells exists and if they are of the same part for example tbody = tbody + if (startCell && endCell && startCell.part == endCell.part) { + // Split and rebuild grid + split(); + buildGrid(); + + // Set row/col span to start cell + startCell = getCell(startX, startY).elm; + setSpanVal(startCell, 'colSpan', (endX - startX) + 1); + setSpanVal(startCell, 'rowSpan', (endY - startY) + 1); + + // Remove other cells and add it's contents to the start cell + for (y = startY; y <= endY; y++) { + for (x = startX; x <= endX; x++) { + if (!grid[y] || !grid[y][x]) + continue; + + cell = grid[y][x].elm; + + if (cell != startCell) { + // Move children to startCell + children = tinymce.grep(cell.childNodes); + each(children, function(node) { + startCell.appendChild(node); + }); + + // Remove bogus nodes if there is children in the target cell + if (children.length) { + children = tinymce.grep(startCell.childNodes); + count = 0; + each(children, function(node) { + if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1) + startCell.removeChild(node); + }); + } + + // Remove cell + dom.remove(cell); + } + } + } + + // Remove empty rows etc and restore caret location + cleanup(); + } + }; + + function insertRow(before) { + var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan; + + // Find first/last row + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell)) { + cell = cell.elm; + rowElm = cell.parentNode; + newRow = cloneNode(rowElm, false); + posY = y; + + if (before) + return false; + } + }); + + if (before) + return !posY; + }); + + for (x = 0; x < grid[0].length; x++) { + // Cell not found could be because of an invalid table structure + if (!grid[posY][x]) + continue; + + cell = grid[posY][x].elm; + + if (cell != lastCell) { + if (!before) { + rowSpan = getSpanVal(cell, 'rowspan'); + if (rowSpan > 1) { + setSpanVal(cell, 'rowSpan', rowSpan + 1); + continue; + } + } else { + // Check if cell above can be expanded + if (posY > 0 && grid[posY - 1][x]) { + otherCell = grid[posY - 1][x].elm; + rowSpan = getSpanVal(otherCell, 'rowSpan'); + if (rowSpan > 1) { + setSpanVal(otherCell, 'rowSpan', rowSpan + 1); + continue; + } + } + } + + // Insert new cell into new row + newCell = cloneCell(cell); + setSpanVal(newCell, 'colSpan', cell.colSpan); + + newRow.appendChild(newCell); + + lastCell = cell; + } + } + + if (newRow.hasChildNodes()) { + if (!before) + dom.insertAfter(newRow, rowElm); + else + rowElm.parentNode.insertBefore(newRow, rowElm); + } + }; + + function insertCol(before) { + var posX, lastCell; + + // Find first/last column + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell)) { + posX = x; + + if (before) + return false; + } + }); + + if (before) + return !posX; + }); + + each(grid, function(row, y) { + var cell, rowSpan, colSpan; + + if (!row[posX]) + return; + + cell = row[posX].elm; + if (cell != lastCell) { + colSpan = getSpanVal(cell, 'colspan'); + rowSpan = getSpanVal(cell, 'rowspan'); + + if (colSpan == 1) { + if (!before) { + dom.insertAfter(cloneCell(cell), cell); + fillLeftDown(posX, y, rowSpan - 1, colSpan); + } else { + cell.parentNode.insertBefore(cloneCell(cell), cell); + fillLeftDown(posX, y, rowSpan - 1, colSpan); + } + } else + setSpanVal(cell, 'colSpan', cell.colSpan + 1); + + lastCell = cell; + } + }); + }; + + function deleteCols() { + var cols = []; + + // Get selected column indexes + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) { + each(grid, function(row) { + var cell = row[x].elm, colSpan; + + colSpan = getSpanVal(cell, 'colSpan'); + + if (colSpan > 1) + setSpanVal(cell, 'colSpan', colSpan - 1); + else + dom.remove(cell); + }); + + cols.push(x); + } + }); + }); + + cleanup(); + }; + + function deleteRows() { + var rows; + + function deleteRow(tr) { + var nextTr, pos, lastCell; + + nextTr = dom.getNext(tr, 'tr'); + + // Move down row spanned cells + each(tr.cells, function(cell) { + var rowSpan = getSpanVal(cell, 'rowSpan'); + + if (rowSpan > 1) { + setSpanVal(cell, 'rowSpan', rowSpan - 1); + pos = getPos(cell); + fillLeftDown(pos.x, pos.y, 1, 1); + } + }); + + // Delete cells + pos = getPos(tr.cells[0]); + each(grid[pos.y], function(cell) { + var rowSpan; + + cell = cell.elm; + + if (cell != lastCell) { + rowSpan = getSpanVal(cell, 'rowSpan'); + + if (rowSpan <= 1) + dom.remove(cell); + else + setSpanVal(cell, 'rowSpan', rowSpan - 1); + + lastCell = cell; + } + }); + }; + + // Get selected rows and move selection out of scope + rows = getSelectedRows(); + + // Delete all selected rows + each(rows.reverse(), function(tr) { + deleteRow(tr); + }); + + cleanup(); + }; + + function cutRows() { + var rows = getSelectedRows(); + + dom.remove(rows); + cleanup(); + + return rows; + }; + + function copyRows() { + var rows = getSelectedRows(); + + each(rows, function(row, i) { + rows[i] = cloneNode(row, true); + }); + + return rows; + }; + + function pasteRows(rows, before) { + var selectedRows = getSelectedRows(), + targetRow = selectedRows[before ? 0 : selectedRows.length - 1], + targetCellCount = targetRow.cells.length; + + // Calc target cell count + each(grid, function(row) { + var match; + + targetCellCount = 0; + each(row, function(cell, x) { + if (cell.real) + targetCellCount += cell.colspan; + + if (cell.elm.parentNode == targetRow) + match = 1; + }); + + if (match) + return false; + }); + + if (!before) + rows.reverse(); + + each(rows, function(row) { + var cellCount = row.cells.length, cell; + + // Remove col/rowspans + for (i = 0; i < cellCount; i++) { + cell = row.cells[i]; + setSpanVal(cell, 'colSpan', 1); + setSpanVal(cell, 'rowSpan', 1); + } + + // Needs more cells + for (i = cellCount; i < targetCellCount; i++) + row.appendChild(cloneCell(row.cells[cellCount - 1])); + + // Needs less cells + for (i = targetCellCount; i < cellCount; i++) + dom.remove(row.cells[i]); + + // Add before/after + if (before) + targetRow.parentNode.insertBefore(row, targetRow); + else + dom.insertAfter(row, targetRow); + }); + }; + + function getPos(target) { + var pos; + + each(grid, function(row, y) { + each(row, function(cell, x) { + if (cell.elm == target) { + pos = {x : x, y : y}; + return false; + } + }); + + return !pos; + }); + + return pos; + }; + + function setStartCell(cell) { + startPos = getPos(cell); + }; + + function findEndPos() { + var pos, maxX, maxY; + + maxX = maxY = 0; + + each(grid, function(row, y) { + each(row, function(cell, x) { + var colSpan, rowSpan; + + if (isCellSelected(cell)) { + cell = grid[y][x]; + + if (x > maxX) + maxX = x; + + if (y > maxY) + maxY = y; + + if (cell.real) { + colSpan = cell.colspan - 1; + rowSpan = cell.rowspan - 1; + + if (colSpan) { + if (x + colSpan > maxX) + maxX = x + colSpan; + } + + if (rowSpan) { + if (y + rowSpan > maxY) + maxY = y + rowSpan; + } + } + } + }); + }); + + return {x : maxX, y : maxY}; + }; + + function setEndCell(cell) { + var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan; + + endPos = getPos(cell); + + if (startPos && endPos) { + // Get start/end positions + startX = Math.min(startPos.x, endPos.x); + startY = Math.min(startPos.y, endPos.y); + endX = Math.max(startPos.x, endPos.x); + endY = Math.max(startPos.y, endPos.y); + + // Expand end positon to include spans + maxX = endX; + maxY = endY; + + // Expand startX + for (y = startY; y <= maxY; y++) { + cell = grid[y][startX]; + + if (!cell.real) { + if (startX - (cell.colspan - 1) < startX) + startX -= cell.colspan - 1; + } + } + + // Expand startY + for (x = startX; x <= maxX; x++) { + cell = grid[startY][x]; + + if (!cell.real) { + if (startY - (cell.rowspan - 1) < startY) + startY -= cell.rowspan - 1; + } + } + + // Find max X, Y + for (y = startY; y <= endY; y++) { + for (x = startX; x <= endX; x++) { + cell = grid[y][x]; + + if (cell.real) { + colSpan = cell.colspan - 1; + rowSpan = cell.rowspan - 1; + + if (colSpan) { + if (x + colSpan > maxX) + maxX = x + colSpan; + } + + if (rowSpan) { + if (y + rowSpan > maxY) + maxY = y + rowSpan; + } + } + } + } + + // Remove current selection + dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); + + // Add new selection + for (y = startY; y <= maxY; y++) { + for (x = startX; x <= maxX; x++) { + if (grid[y][x]) + dom.addClass(grid[y][x].elm, 'mceSelected'); + } + } + } + }; + + // Expose to public + tinymce.extend(this, { + deleteTable : deleteTable, + split : split, + merge : merge, + insertRow : insertRow, + insertCol : insertCol, + deleteCols : deleteCols, + deleteRows : deleteRows, + cutRows : cutRows, + copyRows : copyRows, + pasteRows : pasteRows, + getPos : getPos, + setStartCell : setStartCell, + setEndCell : setEndCell + }); + }; + + tinymce.create('tinymce.plugins.TablePlugin', { + init : function(ed, url) { + var winMan, clipboardRows, hasCellSelection = true; // Might be selected cells on reload + + function createTableGrid(node) { + var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table'); + + if (tblElm) + return new TableGrid(tblElm, ed.dom, selection); + }; + + function cleanup() { + // Restore selection possibilities + ed.getBody().style.webkitUserSelect = ''; + + if (hasCellSelection) { + ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); + hasCellSelection = false; + } + }; + + // Register buttons + each([ + ['table', 'table.desc', 'mceInsertTable', true], + ['delete_table', 'table.del', 'mceTableDelete'], + ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'], + ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'], + ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'], + ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'], + ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'], + ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'], + ['row_props', 'table.row_desc', 'mceTableRowProps', true], + ['cell_props', 'table.cell_desc', 'mceTableCellProps', true], + ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true], + ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true] + ], function(c) { + ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]}); + }); + + // Select whole table is a table border is clicked + if (!tinymce.isIE) { + ed.onClick.add(function(ed, e) { + e = e.target; + + if (e.nodeName === 'TABLE') { + ed.selection.select(e); + ed.nodeChanged(); + } + }); + } + + ed.onPreProcess.add(function(ed, args) { + var nodes, i, node, dom = ed.dom, value; + + nodes = dom.select('table', args.node); + i = nodes.length; + while (i--) { + node = nodes[i]; + dom.setAttrib(node, 'data-mce-style', ''); + + if ((value = dom.getAttrib(node, 'width'))) { + dom.setStyle(node, 'width', value); + dom.setAttrib(node, 'width', ''); + } + + if ((value = dom.getAttrib(node, 'height'))) { + dom.setStyle(node, 'height', value); + dom.setAttrib(node, 'height', ''); + } + } + }); + + // Handle node change updates + ed.onNodeChange.add(function(ed, cm, n) { + var p; + + n = ed.selection.getStart(); + p = ed.dom.getParent(n, 'td,th,caption'); + cm.setActive('table', n.nodeName === 'TABLE' || !!p); + + // Disable table tools if we are in caption + if (p && p.nodeName === 'CAPTION') + p = 0; + + cm.setDisabled('delete_table', !p); + cm.setDisabled('delete_col', !p); + cm.setDisabled('delete_table', !p); + cm.setDisabled('delete_row', !p); + cm.setDisabled('col_after', !p); + cm.setDisabled('col_before', !p); + cm.setDisabled('row_after', !p); + cm.setDisabled('row_before', !p); + cm.setDisabled('row_props', !p); + cm.setDisabled('cell_props', !p); + cm.setDisabled('split_cells', !p); + cm.setDisabled('merge_cells', !p); + }); + + ed.onInit.add(function(ed) { + var startTable, startCell, dom = ed.dom, tableGrid; + + winMan = ed.windowManager; + + // Add cell selection logic + ed.onMouseDown.add(function(ed, e) { + if (e.button != 2) { + cleanup(); + + startCell = dom.getParent(e.target, 'td,th'); + startTable = dom.getParent(startCell, 'table'); + } + }); + + dom.bind(ed.getDoc(), 'mouseover', function(e) { + var sel, table, target = e.target; + + if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) { + table = dom.getParent(target, 'table'); + if (table == startTable) { + if (!tableGrid) { + tableGrid = createTableGrid(table); + tableGrid.setStartCell(startCell); + + ed.getBody().style.webkitUserSelect = 'none'; + } + + tableGrid.setEndCell(target); + hasCellSelection = true; + } + + // Remove current selection + sel = ed.selection.getSel(); + + try { + if (sel.removeAllRanges) + sel.removeAllRanges(); + else + sel.empty(); + } catch (ex) { + // IE9 might throw errors here + } + + e.preventDefault(); + } + }); + + ed.onMouseUp.add(function(ed, e) { + var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode; + + // Move selection to startCell + if (startCell) { + if (tableGrid) + ed.getBody().style.webkitUserSelect = ''; + + function setPoint(node, start) { + var walker = new tinymce.dom.TreeWalker(node, node); + + do { + // Text node + if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { + if (start) + rng.setStart(node, 0); + else + rng.setEnd(node, node.nodeValue.length); + + return; + } + + // BR element + if (node.nodeName == 'BR') { + if (start) + rng.setStartBefore(node); + else + rng.setEndBefore(node); + + return; + } + } while (node = (start ? walker.next() : walker.prev())); + } + + // Try to expand text selection as much as we can only Gecko supports cell selection + selectedCells = dom.select('td.mceSelected,th.mceSelected'); + if (selectedCells.length > 0) { + rng = dom.createRng(); + node = selectedCells[0]; + endNode = selectedCells[selectedCells.length - 1]; + rng.setStartBefore(node); + rng.setEndAfter(node); + + setPoint(node, 1); + walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table')); + + do { + if (node.nodeName == 'TD' || node.nodeName == 'TH') { + if (!dom.hasClass(node, 'mceSelected')) + break; + + lastNode = node; + } + } while (node = walker.next()); + + setPoint(lastNode); + + sel.setRng(rng); + } + + ed.nodeChanged(); + startCell = tableGrid = startTable = null; + } + }); + + ed.onKeyUp.add(function(ed, e) { + cleanup(); + }); + + ed.onKeyDown.add(function (ed, e) { + fixTableCellSelection(ed); + }); + + ed.onMouseDown.add(function (ed, e) { + if (e.button != 2) { + fixTableCellSelection(ed); + } + }); + function tableCellSelected(ed, rng, n, currentCell) { + // The decision of when a table cell is selected is somewhat involved. The fact that this code is + // required is actually a pointer to the root cause of this bug. A cell is selected when the start + // and end offsets are 0, the start container is a text, and the selection node is either a TR (most cases) + // or the parent of the table (in the case of the selection containing the last cell of a table). + var TEXT_NODE = 3, table = ed.dom.getParent(rng.startContainer, 'TABLE'), + tableParent, allOfCellSelected, tableCellSelection; + if (table) + tableParent = table.parentNode; + allOfCellSelected =rng.startContainer.nodeType == TEXT_NODE && + rng.startOffset == 0 && + rng.endOffset == 0 && + currentCell && + (n.nodeName=="TR" || n==tableParent); + tableCellSelection = (n.nodeName=="TD"||n.nodeName=="TH")&& !currentCell; + return allOfCellSelected || tableCellSelection; + // return false; + } + + // this nasty hack is here to work around some WebKit selection bugs. + function fixTableCellSelection(ed) { + if (!tinymce.isWebKit) + return; + + var rng = ed.selection.getRng(); + var n = ed.selection.getNode(); + var currentCell = ed.dom.getParent(rng.startContainer, 'TD'); + + if (!tableCellSelected(ed, rng, n, currentCell)) + return; + if (!currentCell) { + currentCell=n; + } + + // Get the very last node inside the table cell + var end = currentCell.lastChild; + while (end.lastChild) + end = end.lastChild; + + // Select the entire table cell. Nothing outside of the table cell should be selected. + rng.setEnd(end, end.nodeValue.length); + ed.selection.setRng(rng); + } + ed.plugins.table.fixTableCellSelection=fixTableCellSelection; + + // Add context menu + if (ed && ed.plugins.contextmenu) { + ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) { + var sm, se = ed.selection, el = se.getNode() || ed.getBody(); + + if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) { + m.removeAll(); + + if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) { + m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); + m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); + m.addSeparator(); + } + + if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) { + m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); + m.addSeparator(); + } + + m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}}); + m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'}); + m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'}); + m.addSeparator(); + + // Cell menu + sm = m.addMenu({title : 'table.cell'}); + sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'}); + sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'}); + sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'}); + + // Row menu + sm = m.addMenu({title : 'table.row'}); + sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'}); + sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'}); + sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'}); + sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'}); + sm.addSeparator(); + sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'}); + sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'}); + sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows); + sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows); + + // Column menu + sm = m.addMenu({title : 'table.col'}); + sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'}); + sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'}); + sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'}); + } else + m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'}); + }); + } + + // Fix to allow navigating up and down in a table in WebKit browsers. + if (tinymce.isWebKit) { + function moveSelection(ed, e) { + + function moveCursorToStartOfElement(n) { + ed.selection.setCursorLocation(n, 0); + } + + function getSibling(event, element) { + return event.keyCode == UP_ARROW ? element.previousSibling : element.nextSibling; + } + + function getNextRow(e, row) { + var sibling = getSibling(e, row); + return sibling !== null && sibling.tagName === 'TR' ? sibling : null; + } + + function getTable(ed, currentRow) { + return ed.dom.getParent(currentRow, 'table'); + } + + function getTableSibling(currentRow) { + var table = getTable(ed, currentRow); + return getSibling(e, table); + } + + function isVerticalMovement(event) { + return event.keyCode == UP_ARROW || event.keyCode == DOWN_ARROW; + } + + function isInTable(ed) { + var node = ed.selection.getNode(); + var currentRow = ed.dom.getParent(node, 'tr'); + return currentRow !== null; + } + + function columnIndex(column) { + var colIndex = 0; + var c = column; + while (c.previousSibling) { + c = c.previousSibling; + colIndex = colIndex + getSpanVal(c, "colspan"); + } + return colIndex; + } + + function findColumn(rowElement, columnIndex) { + var c = 0; + var r = 0; + each(rowElement.children, function(cell, i) { + c = c + getSpanVal(cell, "colspan"); + r = i; + if (c > columnIndex) + return false; + }); + return r; + } + + function moveCursorToRow(ed, node, row) { + var srcColumnIndex = columnIndex(ed.dom.getParent(node, 'td')); + var tgtColumnIndex = findColumn(row, srcColumnIndex) + var tgtNode = row.childNodes[tgtColumnIndex]; + moveCursorToStartOfElement(tgtNode); + } + + function escapeTable(currentRow, e) { + var tableSiblingElement = getTableSibling(currentRow); + if (tableSiblingElement !== null) { + moveCursorToStartOfElement(tableSiblingElement); + return tinymce.dom.Event.cancel(e); + } else { + var element = e.keyCode == UP_ARROW ? currentRow.firstChild : currentRow.lastChild; + // rely on default behaviour to escape table after we are in the last cell of the last row + moveCursorToStartOfElement(element); + return true; + } + } + + var UP_ARROW = 38; + var DOWN_ARROW = 40; + + if (isVerticalMovement(e) && isInTable(ed)) { + var node = ed.selection.getNode(); + var currentRow = ed.dom.getParent(node, 'tr'); + var nextRow = getNextRow(e, currentRow); + + // If we're at the first or last row in the table, we should move the caret outside of the table + if (nextRow == null) { + return escapeTable(currentRow, e); + } else { + moveCursorToRow(ed, node, nextRow); + tinymce.dom.Event.cancel(e); + return true; + } + } + } + + ed.onKeyDown.add(moveSelection); + } + + // Fixes an issue on Gecko where it's impossible to place the caret behind a table + // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled + if (!tinymce.isIE) { + function fixTableCaretPos() { + var last; + + // Skip empty text nodes form the end + for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ; + + if (last && last.nodeName == 'TABLE') + ed.dom.add(ed.getBody(), 'p', null, '
    '); + }; + + // Fixes an bug where it's impossible to place the caret before a table in Gecko + // this fix solves it by detecting when the caret is at the beginning of such a table + // and then manually moves the caret infront of the table + if (tinymce.isGecko) { + ed.onKeyDown.add(function(ed, e) { + var rng, table, dom = ed.dom; + + // On gecko it's not possible to place the caret before a table + if (e.keyCode == 37 || e.keyCode == 38) { + rng = ed.selection.getRng(); + table = dom.getParent(rng.startContainer, 'table'); + + if (table && ed.getBody().firstChild == table) { + if (isAtStart(rng, table)) { + rng = dom.createRng(); + + rng.setStartBefore(table); + rng.setEndBefore(table); + + ed.selection.setRng(rng); + + e.preventDefault(); + } + } + } + }); + } + + ed.onKeyUp.add(fixTableCaretPos); + ed.onSetContent.add(fixTableCaretPos); + ed.onVisualAid.add(fixTableCaretPos); + + ed.onPreProcess.add(function(ed, o) { + var last = o.node.lastChild; + + if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR') + ed.dom.remove(last); + }); + + fixTableCaretPos(); + } + }); + + // Register action commands + each({ + mceTableSplitCells : function(grid) { + grid.split(); + }, + + mceTableMergeCells : function(grid) { + var rowSpan, colSpan, cell; + + cell = ed.dom.getParent(ed.selection.getNode(), 'th,td'); + if (cell) { + rowSpan = cell.rowSpan; + colSpan = cell.colSpan; + } + + if (!ed.dom.select('td.mceSelected,th.mceSelected').length) { + winMan.open({ + url : url + '/merge_cells.htm', + width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)), + height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)), + inline : 1 + }, { + rows : rowSpan, + cols : colSpan, + onaction : function(data) { + grid.merge(cell, data.cols, data.rows); + }, + plugin_url : url + }); + } else + grid.merge(); + }, + + mceTableInsertRowBefore : function(grid) { + grid.insertRow(true); + }, + + mceTableInsertRowAfter : function(grid) { + grid.insertRow(); + }, + + mceTableInsertColBefore : function(grid) { + grid.insertCol(true); + }, + + mceTableInsertColAfter : function(grid) { + grid.insertCol(); + }, + + mceTableDeleteCol : function(grid) { + grid.deleteCols(); + }, + + mceTableDeleteRow : function(grid) { + grid.deleteRows(); + }, + + mceTableCutRow : function(grid) { + clipboardRows = grid.cutRows(); + }, + + mceTableCopyRow : function(grid) { + clipboardRows = grid.copyRows(); + }, + + mceTablePasteRowBefore : function(grid) { + grid.pasteRows(clipboardRows, true); + }, + + mceTablePasteRowAfter : function(grid) { + grid.pasteRows(clipboardRows); + }, + + mceTableDelete : function(grid) { + grid.deleteTable(); + } + }, function(func, name) { + ed.addCommand(name, function() { + var grid = createTableGrid(); + + if (grid) { + func(grid); + ed.execCommand('mceRepaint'); + cleanup(); + } + }); + }); + + // Register dialog commands + each({ + mceInsertTable : function(val) { + winMan.open({ + url : url + '/table.htm', + width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)), + height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)), + inline : 1 + }, { + plugin_url : url, + action : val ? val.action : 0 + }); + }, + + mceTableRowProps : function() { + winMan.open({ + url : url + '/row.htm', + width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)), + height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }, + + mceTableCellProps : function() { + winMan.open({ + url : url + '/cell.htm', + width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)), + height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + } + }, function(func, name) { + ed.addCommand(name, function(ui, val) { + func(val); + }); + }); + } + }); + + // Register plugin + tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin); })(tinymce); \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js index b5fc1fda3d..d6f3290599 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js @@ -63,6 +63,11 @@ function init() { function updateAction() { var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0]; + if (!AutoValidator.validate(formObj)) { + tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.'); + return false; + } + tinyMCEPopup.restoreSelection(); el = ed.selection.getStart(); tdElm = ed.dom.getParent(el, "td,th"); @@ -83,8 +88,6 @@ function updateAction() { return; } - ed.execCommand('mceBeginUndoLevel'); - switch (getSelectValue(formObj, 'action')) { case "cell": var celltype = getSelectValue(formObj, 'celltype'); @@ -125,6 +128,36 @@ function updateAction() { break; + case "col": + var curr, col = 0, cell = trElm.firstChild, rows = tableElm.getElementsByTagName("tr"); + + if (cell.nodeName != "TD" && cell.nodeName != "TH") + cell = nextCell(cell); + + do { + if (cell == tdElm) + break; + col += cell.getAttribute("colspan"); + } while ((cell = nextCell(cell)) != null); + + for (var i=0; i - +
    {#table_dlg.merge_cells_title} -
     
    - - - - - - - - -
    {#table_dlg.cols}:
    {#table_dlg.rows}:
    + + + + + + + + + +
    :
    :
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/row.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/row.htm index 092e6c8270..1885401f6b 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/row.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/row.htm @@ -5,16 +5,17 @@ + - + @@ -23,7 +24,7 @@
    {#table_dlg.general_props} - +
    - +
    @@ -70,7 +71,7 @@
    @@ -80,7 +81,7 @@
    {#table_dlg.advanced_props} - +
    @@ -112,7 +113,7 @@ bug - if (hc && (cn = n.firstChild) && cn.nodeType === 1 && n.childNodes.length === 1) { - if (cn.hasAttribute ? cn.hasAttribute('_mce_bogus') : cn.getAttribute('_mce_bogus')) - w.writeText('\u00a0'); - } else if (!hc) - w.writeText('\u00a0'); // No children then padd it - } + onPreProcess = new tinymce.util.Dispatcher(self); - break; + onPostProcess = new tinymce.util.Dispatcher(self); - case 3: // Text - // Check if valid child - if (s.validate_children && t.elementName && !t.schema.isValid(t.elementName, '#text')) - return; + htmlParser = new tinymce.html.DomParser(settings, schema); - return w.writeText(n.nodeValue); + // Convert move data-mce-src, data-mce-href and data-mce-style into nodes or process them if needed + htmlParser.addAttributeFilter('src,href,style', function(nodes, name) { + var i = nodes.length, node, value, internalName = 'data-mce-' + name, urlConverter = settings.url_converter, urlConverterScope = settings.url_converter_scope, undef; - case 4: // CDATA - return w.writeCDATA(n.nodeValue); + while (i--) { + node = nodes[i]; - case 8: // Comment - return w.writeComment(n.nodeValue); - } - } else if (n.nodeType == 1) - hc = n.hasChildNodes(); + value = node.attributes.map[internalName]; + if (value !== undef) { + // Set external name to internal value and remove internal + node.attr(name, value.length > 0 ? value : null); + node.attr(internalName, null); + } else { + // No internal attribute found then convert the value we have in the DOM + value = node.attributes.map[name]; - if (hc && !closed) { - cn = n.firstChild; + if (name === "style") + value = dom.serializeStyle(dom.parseStyle(value), node.name); + else if (urlConverter) + value = urlConverter.call(urlConverterScope, value, name, node.name); - while (cn) { - t._serializeNode(cn); - t.elementName = nn; - cn = cn.nextSibling; + node.attr(name, value.length > 0 ? value : null); } } + }); - // Write element end - if (!iv) { - if (!closed) - w.writeFullEndElement(); - else - w.writeEndElement(); - } - }, + // Remove internal classes mceItem<..> + htmlParser.addAttributeFilter('class', function(nodes, name) { + var i = nodes.length, node, value; - _protect : function(o) { - var t = this; + while (i--) { + node = nodes[i]; + value = node.attr('class').replace(/\s*mce(Item\w+|Selected)\s*/g, ''); + node.attr('class', value.length > 0 ? value : null); + } + }); - o.items = o.items || []; + // Remove bookmark elements + htmlParser.addAttributeFilter('data-mce-type', function(nodes, name, args) { + var i = nodes.length, node; - function enc(s) { - return s.replace(/[\r\n\\]/g, function(c) { - if (c === '\n') - return '\\n'; - else if (c === '\\') - return '\\\\'; + while (i--) { + node = nodes[i]; - return '\\r'; - }); - }; + if (node.attributes.map['data-mce-type'] === 'bookmark' && !args.cleanup) + node.remove(); + } + }); - function dec(s) { - return s.replace(/\\[\\rn]/g, function(c) { - if (c === '\\n') - return '\n'; - else if (c === '\\\\') - return '\\'; + // Force script into CDATA sections and remove the mce- prefix also add comments around styles + htmlParser.addNodeFilter('script,style', function(nodes, name) { + var i = nodes.length, node, value; - return '\r'; - }); + function trim(value) { + return value.replace(/()/g, '\n') + .replace(/^[\r\n]*|[\r\n]*$/g, '') + .replace(/^\s*(\/\/\s*|\]\]>|-->|\]\]-->)\s*$/g, ''); }; - each(o.patterns, function(p) { - o.content = dec(enc(o.content).replace(p.pattern, function(x, a, b, c) { - b = dec(b); + while (i--) { + node = nodes[i]; + value = node.firstChild ? node.firstChild.value : ''; - if (p.encode) - b = t._encode(b); + if (name === "script") { + // Remove mce- prefix from script elements + node.attr('type', (node.attr('type') || 'text/javascript').replace(/^mce\-/, '')); - o.items.push(b); - return a + '' + c; - })); - }); - - return o; - }, + if (value.length > 0) + node.firstChild.value = '// '; + } else { + if (value.length > 0) + node.firstChild.value = ''; + } + } + }); - _unprotect : function(h, o) { - h = h.replace(/\')); - return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || ''}, '' + h + ''); + return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || '', role: 'presentation', tabindex: '-1'}, '' + h + ''); } }); +})(tinymce); (function(tinymce) { var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each; @@ -8790,37 +10497,83 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }, get : function(n) { - return this.lookup[n]; + if (this.lookup[n]) { + return this.lookup[n].instance; + } else { + return undefined; + } + }, + + dependencies : function(n) { + var result; + if (this.lookup[n]) { + result = this.lookup[n].dependencies; + } + return result || []; }, requireLangPack : function(n) { var s = tinymce.settings; - if (s && s.language) + if (s && s.language && s.language_load !== false) tinymce.ScriptLoader.add(this.urls[n] + '/langs/' + s.language + '.js'); }, - add : function(id, o) { + add : function(id, o, dependencies) { this.items.push(o); - this.lookup[id] = o; + this.lookup[id] = {instance:o, dependencies:dependencies}; this.onAdd.dispatch(this, id, o); return o; }, + createUrl: function(baseUrl, dep) { + if (typeof dep === "object") { + return dep + } else { + return {prefix: baseUrl.prefix, resource: dep, suffix: baseUrl.suffix}; + } + }, + + addComponents: function(pluginName, scripts) { + var pluginUrl = this.urls[pluginName]; + tinymce.each(scripts, function(script){ + tinymce.ScriptLoader.add(pluginUrl+"/"+script); + }); + }, load : function(n, u, cb, s) { - var t = this; + var t = this, url = u; + + function loadDependencies() { + var dependencies = t.dependencies(n); + tinymce.each(dependencies, function(dep) { + var newUrl = t.createUrl(u, dep); + t.load(newUrl.resource, newUrl, undefined, undefined); + }); + if (cb) { + if (s) { + cb.call(s); + } else { + cb.call(tinymce.ScriptLoader); + } + } + } if (t.urls[n]) return; + if (typeof u === "object") + url = u.prefix + u.resource + u.suffix; - if (u.indexOf('/') != 0 && u.indexOf('://') == -1) - u = tinymce.baseURL + '/' + u; + if (url.indexOf('/') != 0 && url.indexOf('://') == -1) + url = tinymce.baseURL + '/' + url; - t.urls[n] = u.substring(0, u.lastIndexOf('/')); + t.urls[n] = url.substring(0, url.lastIndexOf('/')); - if (!t.lookup[n]) - tinymce.ScriptLoader.add(u, cb, s); + if (t.lookup[n]) { + loadDependencies(); + } else { + tinymce.ScriptLoader.add(url, loadDependencies, s); + } } }); @@ -9277,7 +11030,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { apply_source_formatting : 1, directionality : 'ltr', forced_root_block : 'p', - valid_elements : '@[id|class|style|title|dir
    - +
    @@ -122,14 +123,16 @@ - +
     
    - + +
     
    +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/table.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/table.htm index f269039228..09d3700f77 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/table.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/table/table.htm @@ -10,12 +10,13 @@ - + + @@ -23,48 +24,48 @@
    {#table_dlg.general_props} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    @@ -72,7 +73,7 @@
    {#table_dlg.advanced_props} - +
    @@ -98,7 +99,7 @@ bug - if (hc && (cn = n.firstChild) && cn.nodeType === 1 && n.childNodes.length === 1) { - if (cn.hasAttribute ? cn.hasAttribute('_mce_bogus') : cn.getAttribute('_mce_bogus')) - w.writeText('\u00a0'); - } else if (!hc) - w.writeText('\u00a0'); // No children then padd it - } + onPreProcess = new tinymce.util.Dispatcher(self); - break; + onPostProcess = new tinymce.util.Dispatcher(self); - case 3: // Text - // Check if valid child - if (s.validate_children && t.elementName && !t.schema.isValid(t.elementName, '#text')) - return; + htmlParser = new tinymce.html.DomParser(settings, schema); - return w.writeText(n.nodeValue); + // Convert move data-mce-src, data-mce-href and data-mce-style into nodes or process them if needed + htmlParser.addAttributeFilter('src,href,style', function(nodes, name) { + var i = nodes.length, node, value, internalName = 'data-mce-' + name, urlConverter = settings.url_converter, urlConverterScope = settings.url_converter_scope, undef; - case 4: // CDATA - return w.writeCDATA(n.nodeValue); + while (i--) { + node = nodes[i]; - case 8: // Comment - return w.writeComment(n.nodeValue); - } - } else if (n.nodeType == 1) - hc = n.hasChildNodes(); + value = node.attributes.map[internalName]; + if (value !== undef) { + // Set external name to internal value and remove internal + node.attr(name, value.length > 0 ? value : null); + node.attr(internalName, null); + } else { + // No internal attribute found then convert the value we have in the DOM + value = node.attributes.map[name]; - if (hc && !closed) { - cn = n.firstChild; + if (name === "style") + value = dom.serializeStyle(dom.parseStyle(value), node.name); + else if (urlConverter) + value = urlConverter.call(urlConverterScope, value, name, node.name); - while (cn) { - t._serializeNode(cn); - t.elementName = nn; - cn = cn.nextSibling; + node.attr(name, value.length > 0 ? value : null); } } + }); - // Write element end - if (!iv) { - if (!closed) - w.writeFullEndElement(); - else - w.writeEndElement(); - } - }, + // Remove internal classes mceItem<..> + htmlParser.addAttributeFilter('class', function(nodes, name) { + var i = nodes.length, node, value; - _protect : function(o) { - var t = this; + while (i--) { + node = nodes[i]; + value = node.attr('class').replace(/\s*mce(Item\w+|Selected)\s*/g, ''); + node.attr('class', value.length > 0 ? value : null); + } + }); - o.items = o.items || []; + // Remove bookmark elements + htmlParser.addAttributeFilter('data-mce-type', function(nodes, name, args) { + var i = nodes.length, node; - function enc(s) { - return s.replace(/[\r\n\\]/g, function(c) { - if (c === '\n') - return '\\n'; - else if (c === '\\') - return '\\\\'; + while (i--) { + node = nodes[i]; - return '\\r'; - }); - }; + if (node.attributes.map['data-mce-type'] === 'bookmark' && !args.cleanup) + node.remove(); + } + }); - function dec(s) { - return s.replace(/\\[\\rn]/g, function(c) { - if (c === '\\n') - return '\n'; - else if (c === '\\\\') - return '\\'; + // Force script into CDATA sections and remove the mce- prefix also add comments around styles + htmlParser.addNodeFilter('script,style', function(nodes, name) { + var i = nodes.length, node, value; - return '\r'; - }); + function trim(value) { + return value.replace(/()/g, '\n') + .replace(/^[\r\n]*|[\r\n]*$/g, '') + .replace(/^\s*(\/\/\s*|\]\]>|-->|\]\]-->)\s*$/g, ''); }; - each(o.patterns, function(p) { - o.content = dec(enc(o.content).replace(p.pattern, function(x, a, b, c) { - b = dec(b); - - if (p.encode) - b = t._encode(b); + while (i--) { + node = nodes[i]; + value = node.firstChild ? node.firstChild.value : ''; - o.items.push(b); - return a + '' + c; - })); - }); + if (name === "script") { + // Remove mce- prefix from script elements + node.attr('type', (node.attr('type') || 'text/javascript').replace(/^mce\-/, '')); - return o; - }, + if (value.length > 0) + node.firstChild.value = '// '; + } else { + if (value.length > 0) + node.firstChild.value = ''; + } + } + }); - _unprotect : function(h, o) { - h = h.replace(/\')); - return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || ''}, '' + h + ''); + return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || '', role: 'presentation', tabindex: '-1'}, '' + h + ''); } }); +})(tinymce); (function(tinymce) { var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each; @@ -7961,37 +9669,83 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { }, get : function(n) { - return this.lookup[n]; + if (this.lookup[n]) { + return this.lookup[n].instance; + } else { + return undefined; + } + }, + + dependencies : function(n) { + var result; + if (this.lookup[n]) { + result = this.lookup[n].dependencies; + } + return result || []; }, requireLangPack : function(n) { var s = tinymce.settings; - if (s && s.language) + if (s && s.language && s.language_load !== false) tinymce.ScriptLoader.add(this.urls[n] + '/langs/' + s.language + '.js'); }, - add : function(id, o) { + add : function(id, o, dependencies) { this.items.push(o); - this.lookup[id] = o; + this.lookup[id] = {instance:o, dependencies:dependencies}; this.onAdd.dispatch(this, id, o); return o; }, + createUrl: function(baseUrl, dep) { + if (typeof dep === "object") { + return dep + } else { + return {prefix: baseUrl.prefix, resource: dep, suffix: baseUrl.suffix}; + } + }, + + addComponents: function(pluginName, scripts) { + var pluginUrl = this.urls[pluginName]; + tinymce.each(scripts, function(script){ + tinymce.ScriptLoader.add(pluginUrl+"/"+script); + }); + }, load : function(n, u, cb, s) { - var t = this; + var t = this, url = u; + + function loadDependencies() { + var dependencies = t.dependencies(n); + tinymce.each(dependencies, function(dep) { + var newUrl = t.createUrl(u, dep); + t.load(newUrl.resource, newUrl, undefined, undefined); + }); + if (cb) { + if (s) { + cb.call(s); + } else { + cb.call(tinymce.ScriptLoader); + } + } + } if (t.urls[n]) return; + if (typeof u === "object") + url = u.prefix + u.resource + u.suffix; - if (u.indexOf('/') != 0 && u.indexOf('://') == -1) - u = tinymce.baseURL + '/' + u; + if (url.indexOf('/') != 0 && url.indexOf('://') == -1) + url = tinymce.baseURL + '/' + url; - t.urls[n] = u.substring(0, u.lastIndexOf('/')); + t.urls[n] = url.substring(0, url.lastIndexOf('/')); - if (!t.lookup[n]) - tinymce.ScriptLoader.add(u, cb, s); + if (t.lookup[n]) { + loadDependencies(); + } else { + tinymce.ScriptLoader.add(url, loadDependencies, s); + } } }); @@ -8453,7 +10207,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { apply_source_formatting : 1, directionality : 'ltr', forced_root_block : 'p', - valid_elements : '@[id|class|style|title|dir
    - +
    @@ -150,10 +151,10 @@ - - + +
     
    - +
    @@ -162,10 +163,10 @@ - - + + <\/tr>/g, ''); return html; } diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js index fd9700f222..7decac5b43 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js @@ -1,6 +1,6 @@ tinyMCEPopup.requireLangPack(); -var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false; +var detail = 50, strhex = "0123456789ABCDEF", i, isMouseDown = false, isMouseOver = false; var colors = [ "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033", @@ -33,37 +33,41 @@ var colors = [ ]; var named = { - '#F0F8FF':'AliceBlue','#FAEBD7':'AntiqueWhite','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige', - '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'BlanchedAlmond','#0000FF':'Blue','#8A2BE2':'BlueViolet','#A52A2A':'Brown', - '#DEB887':'BurlyWood','#5F9EA0':'CadetBlue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'CornflowerBlue', - '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'DarkBlue','#008B8B':'DarkCyan','#B8860B':'DarkGoldenRod', - '#A9A9A9':'DarkGray','#A9A9A9':'DarkGrey','#006400':'DarkGreen','#BDB76B':'DarkKhaki','#8B008B':'DarkMagenta','#556B2F':'DarkOliveGreen', - '#FF8C00':'Darkorange','#9932CC':'DarkOrchid','#8B0000':'DarkRed','#E9967A':'DarkSalmon','#8FBC8F':'DarkSeaGreen','#483D8B':'DarkSlateBlue', - '#2F4F4F':'DarkSlateGray','#2F4F4F':'DarkSlateGrey','#00CED1':'DarkTurquoise','#9400D3':'DarkViolet','#FF1493':'DeepPink','#00BFFF':'DeepSkyBlue', - '#696969':'DimGray','#696969':'DimGrey','#1E90FF':'DodgerBlue','#B22222':'FireBrick','#FFFAF0':'FloralWhite','#228B22':'ForestGreen', - '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'GhostWhite','#FFD700':'Gold','#DAA520':'GoldenRod','#808080':'Gray','#808080':'Grey', - '#008000':'Green','#ADFF2F':'GreenYellow','#F0FFF0':'HoneyDew','#FF69B4':'HotPink','#CD5C5C':'IndianRed','#4B0082':'Indigo','#FFFFF0':'Ivory', - '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'LavenderBlush','#7CFC00':'LawnGreen','#FFFACD':'LemonChiffon','#ADD8E6':'LightBlue', - '#F08080':'LightCoral','#E0FFFF':'LightCyan','#FAFAD2':'LightGoldenRodYellow','#D3D3D3':'LightGray','#D3D3D3':'LightGrey','#90EE90':'LightGreen', - '#FFB6C1':'LightPink','#FFA07A':'LightSalmon','#20B2AA':'LightSeaGreen','#87CEFA':'LightSkyBlue','#778899':'LightSlateGray','#778899':'LightSlateGrey', - '#B0C4DE':'LightSteelBlue','#FFFFE0':'LightYellow','#00FF00':'Lime','#32CD32':'LimeGreen','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon', - '#66CDAA':'MediumAquaMarine','#0000CD':'MediumBlue','#BA55D3':'MediumOrchid','#9370D8':'MediumPurple','#3CB371':'MediumSeaGreen','#7B68EE':'MediumSlateBlue', - '#00FA9A':'MediumSpringGreen','#48D1CC':'MediumTurquoise','#C71585':'MediumVioletRed','#191970':'MidnightBlue','#F5FFFA':'MintCream','#FFE4E1':'MistyRose','#FFE4B5':'Moccasin', - '#FFDEAD':'NavajoWhite','#000080':'Navy','#FDF5E6':'OldLace','#808000':'Olive','#6B8E23':'OliveDrab','#FFA500':'Orange','#FF4500':'OrangeRed','#DA70D6':'Orchid', - '#EEE8AA':'PaleGoldenRod','#98FB98':'PaleGreen','#AFEEEE':'PaleTurquoise','#D87093':'PaleVioletRed','#FFEFD5':'PapayaWhip','#FFDAB9':'PeachPuff', - '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'PowderBlue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'RosyBrown','#4169E1':'RoyalBlue', - '#8B4513':'SaddleBrown','#FA8072':'Salmon','#F4A460':'SandyBrown','#2E8B57':'SeaGreen','#FFF5EE':'SeaShell','#A0522D':'Sienna','#C0C0C0':'Silver', - '#87CEEB':'SkyBlue','#6A5ACD':'SlateBlue','#708090':'SlateGray','#708090':'SlateGrey','#FFFAFA':'Snow','#00FF7F':'SpringGreen', - '#4682B4':'SteelBlue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet', - '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'WhiteSmoke','#FFFF00':'Yellow','#9ACD32':'YellowGreen' + '#F0F8FF':'Alice Blue','#FAEBD7':'Antique White','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige', + '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'Blanched Almond','#0000FF':'Blue','#8A2BE2':'Blue Violet','#A52A2A':'Brown', + '#DEB887':'Burly Wood','#5F9EA0':'Cadet Blue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'Cornflower Blue', + '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'Dark Blue','#008B8B':'Dark Cyan','#B8860B':'Dark Golden Rod', + '#A9A9A9':'Dark Gray','#A9A9A9':'Dark Grey','#006400':'Dark Green','#BDB76B':'Dark Khaki','#8B008B':'Dark Magenta','#556B2F':'Dark Olive Green', + '#FF8C00':'Darkorange','#9932CC':'Dark Orchid','#8B0000':'Dark Red','#E9967A':'Dark Salmon','#8FBC8F':'Dark Sea Green','#483D8B':'Dark Slate Blue', + '#2F4F4F':'Dark Slate Gray','#2F4F4F':'Dark Slate Grey','#00CED1':'Dark Turquoise','#9400D3':'Dark Violet','#FF1493':'Deep Pink','#00BFFF':'Deep Sky Blue', + '#696969':'Dim Gray','#696969':'Dim Grey','#1E90FF':'Dodger Blue','#B22222':'Fire Brick','#FFFAF0':'Floral White','#228B22':'Forest Green', + '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'Ghost White','#FFD700':'Gold','#DAA520':'Golden Rod','#808080':'Gray','#808080':'Grey', + '#008000':'Green','#ADFF2F':'Green Yellow','#F0FFF0':'Honey Dew','#FF69B4':'Hot Pink','#CD5C5C':'Indian Red','#4B0082':'Indigo','#FFFFF0':'Ivory', + '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'Lavender Blush','#7CFC00':'Lawn Green','#FFFACD':'Lemon Chiffon','#ADD8E6':'Light Blue', + '#F08080':'Light Coral','#E0FFFF':'Light Cyan','#FAFAD2':'Light Golden Rod Yellow','#D3D3D3':'Light Gray','#D3D3D3':'Light Grey','#90EE90':'Light Green', + '#FFB6C1':'Light Pink','#FFA07A':'Light Salmon','#20B2AA':'Light Sea Green','#87CEFA':'Light Sky Blue','#778899':'Light Slate Gray','#778899':'Light Slate Grey', + '#B0C4DE':'Light Steel Blue','#FFFFE0':'Light Yellow','#00FF00':'Lime','#32CD32':'Lime Green','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon', + '#66CDAA':'Medium Aqua Marine','#0000CD':'Medium Blue','#BA55D3':'Medium Orchid','#9370D8':'Medium Purple','#3CB371':'Medium Sea Green','#7B68EE':'Medium Slate Blue', + '#00FA9A':'Medium Spring Green','#48D1CC':'Medium Turquoise','#C71585':'Medium Violet Red','#191970':'Midnight Blue','#F5FFFA':'Mint Cream','#FFE4E1':'Misty Rose','#FFE4B5':'Moccasin', + '#FFDEAD':'Navajo White','#000080':'Navy','#FDF5E6':'Old Lace','#808000':'Olive','#6B8E23':'Olive Drab','#FFA500':'Orange','#FF4500':'Orange Red','#DA70D6':'Orchid', + '#EEE8AA':'Pale Golden Rod','#98FB98':'Pale Green','#AFEEEE':'Pale Turquoise','#D87093':'Pale Violet Red','#FFEFD5':'Papaya Whip','#FFDAB9':'Peach Puff', + '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'Powder Blue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'Rosy Brown','#4169E1':'Royal Blue', + '#8B4513':'Saddle Brown','#FA8072':'Salmon','#F4A460':'Sandy Brown','#2E8B57':'Sea Green','#FFF5EE':'Sea Shell','#A0522D':'Sienna','#C0C0C0':'Silver', + '#87CEEB':'Sky Blue','#6A5ACD':'Slate Blue','#708090':'Slate Gray','#708090':'Slate Grey','#FFFAFA':'Snow','#00FF7F':'Spring Green', + '#4682B4':'Steel Blue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet', + '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'White Smoke','#FFFF00':'Yellow','#9ACD32':'Yellow Green' }; +var namedLookup = {}; + function init() { - var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')); + var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')), key, value; tinyMCEPopup.resizeToInnerSize(); generatePicker(); + generateWebColors(); + generateNamedColors(); if (inputColor) { changeFinalColor(inputColor); @@ -73,6 +77,45 @@ function init() { if (col) updateLight(col.r, col.g, col.b); } + + for (key in named) { + value = named[key]; + namedLookup[value.replace(/\s+/, '').toLowerCase()] = key.replace(/#/, '').toLowerCase(); + } +} + +function toHexColor(color) { + var matches, red, green, blue, toInt = parseInt; + + function hex(value) { + value = parseInt(value).toString(16); + + return value.length > 1 ? value : '0' + value; // Padd with leading zero + }; + + color = color.replace(/[\s#]+/g, '').toLowerCase(); + color = namedLookup[color] || color; + matches = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)|([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})|([a-f0-9])([a-f0-9])([a-f0-9])$/.exec(color); + + if (matches) { + if (matches[1]) { + red = toInt(matches[1]); + green = toInt(matches[2]); + blue = toInt(matches[3]); + } else if (matches[4]) { + red = toInt(matches[4], 16); + green = toInt(matches[5], 16); + blue = toInt(matches[6], 16); + } else if (matches[7]) { + red = toInt(matches[7] + matches[7], 16); + green = toInt(matches[8] + matches[8], 16); + blue = toInt(matches[9] + matches[9], 16); + } + + return '#' + hex(red) + hex(green) + hex(blue); + } + + return ''; } function insertAction() { @@ -81,7 +124,7 @@ function insertAction() { tinyMCEPopup.restoreSelection(); if (f) - f(color); + f(toHexColor(color)); tinyMCEPopup.close(); } @@ -91,7 +134,7 @@ function showColor(color, name) { document.getElementById("colorname").innerHTML = name; document.getElementById("preview").style.backgroundColor = color; - document.getElementById("color").value = color.toLowerCase(); + document.getElementById("color").value = color.toUpperCase(); } function convertRGBToHex(col) { @@ -153,23 +196,40 @@ function generateWebColors() { if (el.className == 'generated') return; - h += '
     
    - +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/template/js/template.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/template/js/template.js index 24045d7311..bc3045d244 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/template/js/template.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/template/js/template.js @@ -42,7 +42,7 @@ var TemplateDialog = { if (e) { e.style.height = Math.abs(h) + 'px'; - e.style.width = Math.abs(w - 5) + 'px'; + e.style.width = Math.abs(w - 5) + 'px'; } }, diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js index 35856e26a0..df985905b6 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js @@ -59,7 +59,7 @@ for (i = 0; i < nl.length; i++) { nv = nl[i].nodeValue; - nv = nv.replace(/(\u00a0)/g, '$1'); + nv = nv.replace(/(\u00a0)/g, '$1'); div = ed.dom.create('div', null, nv); while (node = div.lastChild) diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js index 5cb92fa0f0..e94743bae1 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js @@ -9,7 +9,7 @@ */ (function() { - tinymce.create('tinymce.plugins.WordCount', { + tinymce.create('tinymce.plugins.WordCount', { block : 0, id : null, countre : null, @@ -18,8 +18,8 @@ init : function(ed, url) { var t = this, last = 0; - t.countre = ed.getParam('wordcount_countregex', /\S\s+/g); - t.cleanre = ed.getParam('wordcount_cleanregex', /[0-9.(),;:!?%#$¿'"_+=\\\/-]*/g); + t.countre = ed.getParam('wordcount_countregex', /[\w\u2019\'-]+/g); // u2019 == ’ + t.cleanre = ed.getParam('wordcount_cleanregex', /[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g); t.id = ed.id + '-word-count'; ed.onPostRender.add(function(ed, cm) { @@ -32,11 +32,12 @@ if (row) tinymce.DOM.add(row.parentNode, 'div', {'style': 'float: right'}, ed.getLang('wordcount.words', 'Words: ') + '0'); - } else + } else { tinymce.DOM.add(id, 'span', {}, '0'); + } }); - ed.onInit.add(function(ed) { + ed.onInit.add(function(ed) { ed.selection.onSetContent.add(function() { t._count(ed); }); @@ -59,8 +60,29 @@ }); }, + _getCount : function(ed) { + var tc = 0; + var tx = ed.getContent({ format: 'raw' }); + + if (tx) { + tx = tx.replace(/\.\.\./g, ' '); // convert ellipses to spaces + tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/ | /gi, ' '); // remove html tags and space chars + + // deal with html entities + tx = tx.replace(/(\w+)(&.+?;)+(\w+)/, "$1$3").replace(/&.+?;/g, ' '); + tx = tx.replace(this.cleanre, ''); // remove numbers and punctuation + + var wordArray = tx.match(this.countre); + if (wordArray) { + tc = wordArray.length; + } + } + + return tc; + }, + _count : function(ed) { - var t = this, tc = 0; + var t = this; // Keep multiple calls from happening at the same time if (t.block) @@ -69,21 +91,15 @@ t.block = 1; setTimeout(function() { - var tx = ed.getContent({format : 'raw'}); - - if (tx) { - tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/ | /gi, ' '); // remove html tags and space chars - tx = tx.replace(t.cleanre, ''); // remove numbers and punctuation - tx.replace(t.countre, function() {tc++;}); // count the words + if (!ed.destroyed) { + var tc = t._getCount(ed); + tinymce.DOM.setHTML(t.id, tc.toString()); + setTimeout(function() {t.block = 0;}, 2000); } - - tinymce.DOM.setHTML(t.id, tc.toString()); - - setTimeout(function() {t.block = 0;}, 2000); }, 1); }, - getInfo: function() { + getInfo: function() { return { longname : 'Word Count plugin', author : 'Moxiecode Systems AB', @@ -91,8 +107,8 @@ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount', version : tinymce.majorVersion + "." + tinymce.minorVersion }; - } - }); + } + }); - tinymce.PluginManager.add('wordcount', tinymce.plugins.WordCount); + tinymce.PluginManager.add('wordcount', tinymce.plugins.WordCount); })(); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm index 3aeac0deba..30a894f7c3 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm @@ -10,11 +10,12 @@ - + + @@ -23,7 +24,7 @@
    {#xhtmlxtras_dlg.fieldset_attrib_tab} -
     
    +
    @@ -41,7 +42,7 @@ - + @@ -67,7 +68,7 @@
    {#xhtmlxtras_dlg.fieldset_events_tab} -
    :
    ::
    +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm index 31ee7b70f3..c109345928 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm @@ -10,11 +10,12 @@ - + + @@ -23,7 +24,7 @@
    {#xhtmlxtras_dlg.fieldset_attrib_tab} -
    :
    +
    @@ -41,7 +42,7 @@ - + @@ -67,7 +68,7 @@
    {#xhtmlxtras_dlg.fieldset_events_tab} -
    :
    ::
    +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm index 17054da3ed..e8d606a340 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm @@ -9,12 +9,13 @@ - + + @@ -22,7 +23,7 @@
    {#xhtmlxtras_dlg.attribute_attrib_tab} -
    :
    +
    @@ -75,7 +76,7 @@
    {#xhtmlxtras_dlg.attribute_events_tab} -
    :
    +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm index d0a3e3a8e5..0ac6bdb667 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm @@ -10,11 +10,12 @@ - + + @@ -23,7 +24,7 @@
    {#xhtmlxtras_dlg.fieldset_attrib_tab} -
    :
    +
    @@ -67,7 +68,7 @@
    {#xhtmlxtras_dlg.fieldset_events_tab} -
    :
    +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm index 8b07fa8429..5f667510f5 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm @@ -10,11 +10,12 @@ - + + @@ -23,14 +24,14 @@
    {#xhtmlxtras_dlg.fieldset_general_tab} -
    :
    +
    @@ -43,7 +44,7 @@
    {#xhtmlxtras_dlg.fieldset_attrib_tab} -
    : - +
    - +
    +
    @@ -61,7 +62,7 @@ - + @@ -87,7 +88,7 @@
    {#xhtmlxtras_dlg.fieldset_events_tab} -
    :
    ::
    +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js index 5f9d9bd50b..f24057211c 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js @@ -27,7 +27,7 @@ ed.windowManager.open({ file : url + '/acronym.htm', width : 350 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)), - height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)), + height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_height', 0)), inline : 1 }, { plugin_url : url @@ -38,7 +38,7 @@ ed.windowManager.open({ file : url + '/abbr.htm', width : 350 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)), - height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)), + height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_height', 0)), inline : 1 }, { plugin_url : url @@ -49,7 +49,7 @@ ed.windowManager.open({ file : url + '/del.htm', width : 340 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)), - height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)), + height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_height', 0)), inline : 1 }, { plugin_url : url @@ -60,7 +60,7 @@ ed.windowManager.open({ file : url + '/ins.htm', width : 340 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)), - height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)), + height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_height', 0)), inline : 1 }, { plugin_url : url @@ -70,8 +70,8 @@ ed.addCommand('mceAttributes', function() { ed.windowManager.open({ file : url + '/attributes.htm', - width : 380, - height : 370, + width : 380 + parseInt(ed.getLang('xhtmlxtras.attr_delta_width', 0)), + height : 370 + parseInt(ed.getLang('xhtmlxtras.attr_delta_height', 0)), inline : 1 }, { plugin_url : url diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm index 6c5470cfcc..d001ac7c4d 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm @@ -10,11 +10,12 @@ - + + @@ -23,19 +24,19 @@
    {#xhtmlxtras_dlg.fieldset_general_tab} -
    :
    +
    - + @@ -43,9 +44,9 @@
    {#xhtmlxtras_dlg.fieldset_attrib_tab} -
    : - +
    - +
    :
    +
    - + @@ -61,7 +62,7 @@ - + @@ -87,7 +88,7 @@
    {#xhtmlxtras_dlg.fieldset_events_tab} -
    ::
    ::
    +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js index d62a219e6b..9c99995adb 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js @@ -53,7 +53,6 @@ function insertAction() { var inst = tinyMCEPopup.editor; var elm = inst.selection.getNode(); - tinyMCEPopup.execCommand("mceBeginUndoLevel"); setAllAttribs(elm); tinyMCEPopup.execCommand("mceEndUndoLevel"); tinyMCEPopup.close(); @@ -72,21 +71,7 @@ function setAttrib(elm, attrib, value) { value = valueElm.value; } - if (value != "") { - dom.setAttrib(elm, attrib.toLowerCase(), value); - - if (attrib == "style") - attrib = "style.cssText"; - - if (attrib.substring(0, 2) == 'on') - value = 'return true;' + value; - - if (attrib == "class") - attrib = "className"; - - elm[attrib]=value; - } else - elm.removeAttribute(attrib); + dom.setAttrib(elm, attrib.toLowerCase(), value); } function setAllAttribs(elm) { diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js index e25bacec6c..1f957dc786 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js @@ -21,17 +21,17 @@ function setElementAttribs(elm) { setAllCommonAttribs(elm); setAttrib(elm, 'datetime'); setAttrib(elm, 'cite'); + elm.removeAttribute('data-mce-new'); } function insertDel() { var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'DEL'); - tinyMCEPopup.execCommand('mceBeginUndoLevel'); if (elm == null) { var s = SXE.inst.selection.getContent(); if(s.length > 0) { insertInlineElement('del'); - var elementArray = tinymce.grep(SXE.inst.dom.select('del'), function(n) {return n.id == '#sxe_temp_del#';}); + var elementArray = SXE.inst.dom.select('del[data-mce-new]'); for (var i=0; i 0) { @@ -165,11 +164,11 @@ SXE.insertElement = function(element_name) { for (var i=0; i 0) { - insertInlineElement('INS'); - var elementArray = tinymce.grep(SXE.inst.dom.select('ins'), function(n) {return n.id == '#sxe_temp_ins#';}); + insertInlineElement('ins'); + var elementArray = SXE.inst.dom.select('ins[data-mce-new]'); for (var i=0; i
    :
    +
    - + - - + +
    {#advanced_dlg.anchor_title}{#advanced_dlg.anchor_title}
    {#advanced_dlg.anchor_name}:
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm index 3991b8141b..2c3b3f27bd 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm @@ -6,47 +6,46 @@ - - - - - -
    {#advanced_dlg.charmap_title}
    + + + + + + - - - - - + + + + + +
    - - - - - - - - -
     
     
    -
    - - - - - - - - - - - - - - - - -
    HTML-Code
     
     
    NUM-Code
     
    -
    + + + + + + + +
     
     
    +
    + + + + + + + + + + + + + + + + +
     
     
     
    +
    - diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm index 096e7550c3..ad1bb0f6cc 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm @@ -6,13 +6,14 @@ - + + @@ -34,7 +35,7 @@
    - {#advanced_dlg.colorpicker_palette_title} + {#advanced_dlg.colorpicker_palette_title}
    @@ -44,9 +45,9 @@
    -
    - {#advanced_dlg.colorpicker_named_title} -
    +
    + {#advanced_dlg.colorpicker_named_title} +
    @@ -65,7 +66,7 @@
    - +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js index 12cf1fe2ca..bee26e1610 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js @@ -66,6 +66,9 @@ t.url = url; t.onResolveName = new tinymce.util.Dispatcher(this); + ed.forcedHighContrastMode = ed.settings.detect_highcontrast && t._isHighContrast(); + ed.settings.skin = ed.forcedHighContrastMode ? 'highcontrast' : ed.settings.skin; + // Default settings t.settings = s = extend({ theme_advanced_path : true, @@ -81,6 +84,8 @@ theme_advanced_resize_horizontal : 1, theme_advanced_resizing_use_cookie : 1, theme_advanced_font_sizes : "1,2,3,4,5,6,7", + theme_advanced_font_selector : "span", + theme_advanced_show_current_color: 0, readonly : ed.settings.readonly }, ed.settings); @@ -119,13 +124,19 @@ if (s.theme_advanced_statusbar_location == 'none') s.theme_advanced_statusbar_location = 0; + if (ed.settings.content_css !== false) + ed.contentCSS.push(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css")); + // Init editor ed.onInit.add(function() { - if (!ed.settings.readonly) + if (!ed.settings.readonly) { ed.onNodeChange.add(t._nodeChanged, t); - - if (ed.settings.content_css !== false) - ed.dom.loadCSS(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css")); + ed.onKeyUp.add(t._updateUndoStatus, t); + ed.onMouseUp.add(t._updateUndoStatus, t); + ed.dom.bind(ed.dom.getRoot(), 'dragend', function() { + t._updateUndoStatus(ed); + }); + } }); ed.onSetProgressState.add(function(ed, b, ti) { @@ -153,6 +164,15 @@ DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css"); }, + _isHighContrast : function() { + var actualColor, div = DOM.add(DOM.getRoot(), 'div', {'style': 'background-color: rgb(171,239,86);'}); + + actualColor = (DOM.getStyle(div, 'background-color', true) + '').toLowerCase().replace(/ /g, ''); + DOM.remove(div); + + return actualColor != 'rgb(171,239,86)' && actualColor != '#abef56'; + }, + createControl : function(n, cf) { var cd, c; @@ -230,9 +250,10 @@ // Toggle off the current format matches = ed.formatter.matchAll(formatNames); - if (!name || matches[0] == name) - ed.formatter.remove(matches[0]); - else + if (!name || matches[0] == name) { + if (matches[0]) + ed.formatter.remove(matches[0]); + } else ed.formatter.apply(name); ed.undoManager.add(); @@ -314,6 +335,10 @@ return v == sv; }); + if (cur && cur.value == v) { + c.select(null); + } + return false; // No auto select } }); @@ -361,6 +386,10 @@ return v == sv; }); + if (cur && (cur.value.fontSize == v.fontSize || cur.value['class'] == v['class'])) { + c.select(null); + } + return false; // No auto select }}); @@ -397,7 +426,11 @@ samp : 'advanced.samp' }, t = this; - c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', cmd : 'FormatBlock'}); + c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', onselect : function(v) { + t.editor.execCommand('FormatBlock', false, v); + return false; + }}); + if (c) { each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) { c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v}); @@ -468,12 +501,19 @@ renderUI : function(o) { var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl; - n = p = DOM.create('span', {id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')}); + if (ed.settings) { + ed.settings.aria_label = s.aria_label + ed.getLang('advanced.help_shortcut'); + } + + // TODO: ACC Should have an aria-describedby attribute which is user-configurable to describe what this field is actually for. + // Maybe actually inherit it from the original textara? + n = p = DOM.create('span', {role : 'application', 'aria-labelledby' : ed.id + '_voice', id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')}); + DOM.add(n, 'span', {'class': 'mceVoiceLabel', 'style': 'display:none;', id: ed.id + '_voice'}, s.aria_label); if (!DOM.boxModel) n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'}); - n = sc = DOM.add(n, 'table', {id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0}); + n = sc = DOM.add(n, 'table', {role : "presentation", id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0}); n = tb = DOM.add(n, 'tbody'); switch ((s.theme_advanced_layout_manager || '').toLowerCase()) { @@ -492,7 +532,7 @@ n = o.targetNode; // Add classes to first and last TRs - nl = DOM.stdMode ? sc.getElementsByTagName('tr') : sc.rows; // Quick fix for IE 8 + nl = sc.rows; DOM.addClass(nl[0], 'mceFirst'); DOM.addClass(nl[nl.length - 1], 'mceLast'); @@ -548,6 +588,24 @@ t.deltaHeight = o.deltaHeight; o.targetNode = null; + ed.onKeyDown.add(function(ed, evt) { + var DOM_VK_F10 = 121, DOM_VK_F11 = 122; + + if (evt.altKey) { + if (evt.keyCode === DOM_VK_F10) { + window.focus(); + t.toolbarGroup.focus(); + return Event.cancel(evt); + } else if (evt.keyCode === DOM_VK_F11) { + DOM.get(ed.id + '_path_row').focus(); + return Event.cancel(evt); + } + } + }); + + // alt+0 is the UK recommended shortcut for accessing the list of access controls. + ed.addShortcut('alt+0', '', 'mceShortcuts', t); + return { iframeContainer : ic, editorContainer : ed.id + '_parent', @@ -566,7 +624,7 @@ }, resizeBy : function(dw, dh) { - var e = DOM.get(this.editor.id + '_tbl'); + var e = DOM.get(this.editor.id + '_ifr'); this.resizeTo(e.clientWidth + dw, e.clientHeight + dh); }, @@ -695,7 +753,7 @@ each(explode(s.theme_advanced_containers || ''), function(c, i) { var v = s['theme_advanced_container_' + c] || ''; - switch (v.toLowerCase()) { + switch (c.toLowerCase()) { case 'mceeditor': n = DOM.add(tb, 'tr'); n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); @@ -763,17 +821,19 @@ }, _addToolbars : function(c, o) { - var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a; + var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a, toolbarGroup; - a = s.theme_advanced_toolbar_align.toLowerCase(); - a = 'mce' + t._ufirst(a); + toolbarGroup = cf.createToolbarGroup('toolbargroup', { + 'name': ed.getLang('advanced.toolbar'), + 'tab_focus_toolbar':ed.getParam('theme_advanced_tab_focus_toolbar') + }); - n = DOM.add(DOM.add(c, 'tr'), 'td', {'class' : 'mceToolbar ' + a}); + t.toolbarGroup = toolbarGroup; - if (!ed.getParam('accessibility_focus')) - h.push(DOM.createHTML('a', {href : '#', onfocus : 'tinyMCE.get(\'' + ed.id + '\').focus();'}, '')); + a = s.theme_advanced_toolbar_align.toLowerCase(); + a = 'mce' + t._ufirst(a); - h.push(DOM.createHTML('a', {href : '#', accesskey : 'q', title : ed.getLang("advanced.toolbar_focus")}, '')); + n = DOM.add(DOM.add(c, 'tr', {role: 'presentation'}), 'td', {'class' : 'mceToolbar ' + a, "role":"presentation"}); // Create toolbar and add the controls for (i=1; (v = s['theme_advanced_buttons' + i]); i++) { @@ -786,13 +846,11 @@ v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v; t._addControls(v, tb); - - //n.appendChild(n = tb.render()); - h.push(tb.renderHTML()); + toolbarGroup.add(tb); o.deltaHeight -= s.theme_advanced_row_height; } - + h.push(toolbarGroup.renderHTML()); h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '')); DOM.setHTML(n, h.join('')); }, @@ -801,12 +859,18 @@ var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td; n = DOM.add(tb, 'tr'); - n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); - n = DOM.add(n, 'div', {id : ed.id + '_path_row'}, s.theme_advanced_path ? ed.translate('advanced.path') + ': ' : ' '); - DOM.add(n, 'a', {href : '#', accesskey : 'x'}); + n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); + n = DOM.add(n, 'div', {id : ed.id + '_path_row', 'role': 'group', 'aria-labelledby': ed.id + '_path_voice'}); + if (s.theme_advanced_path) { + DOM.add(n, 'span', {id: ed.id + '_path_voice'}, ed.translate('advanced.path')); + DOM.add(n, 'span', {}, ': '); + } else { + DOM.add(n, 'span', {}, ' '); + } + if (s.theme_advanced_resizing) { - DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'}); + DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize', tabIndex:"-1"}); if (s.theme_advanced_resizing_use_cookie) { ed.onPostRender.add(function() { @@ -872,8 +936,15 @@ n = tb = null; }, + _updateUndoStatus : function(ed) { + var cm = ed.controlManager, um = ed.undoManager; + + cm.setDisabled('undo', !um.hasUndo() && !um.typing); + cm.setDisabled('redo', !um.hasRedo()); + }, + _nodeChanged : function(ed, cm, n, co, ob) { - var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, formatNames, matches; + var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, fc, bc, formatNames, matches; tinymce.each(t.stateControls, function(c) { cm.setActive(c, ed.queryCommandState(t.controls[c][1])); @@ -895,8 +966,7 @@ }; cm.setActive('visualaid', ed.hasVisual); - cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing); - cm.setDisabled('redo', !ed.undoManager.hasRedo()); + t._updateUndoStatus(ed); cm.setDisabled('outdent', !ed.queryCommandState('Outdent')); p = getParent('A'); @@ -913,12 +983,12 @@ } if (c = cm.get('anchor')) { - c.setActive(!!p && p.name); + c.setActive(!co && !!p && p.name); } p = getParent('IMG'); if (c = cm.get('image')) - c.setActive(!!p && n.className.indexOf('mceItem') == -1); + c.setActive(!co && !!p && n.className.indexOf('mceItem') == -1); if (c = cm.get('styleselect')) { t._importClasses(); @@ -944,12 +1014,20 @@ if (n.nodeName === 'SPAN') { if (!cl && n.className) cl = n.className; + } + if (ed.dom.is(n, s.theme_advanced_font_selector)) { if (!fz && n.style.fontSize) fz = n.style.fontSize; if (!fn && n.style.fontFamily) fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase(); + + if (!fc && n.style.color) + fc = n.style.color; + + if (!bc && n.style.backgroundColor) + bc = n.style.backgroundColor; } return false; @@ -975,25 +1053,53 @@ return true; }); } + + if (s.theme_advanced_show_current_color) { + function updateColor(controlId, color) { + if (c = cm.get(controlId)) { + if (!color) + color = c.settings.default_color; + if (color !== c.value) { + c.displayColor(color); + } + } + } + updateColor('forecolor', fc); + updateColor('backcolor', bc); + } + + if (s.theme_advanced_show_current_color) { + function updateColor(controlId, color) { + if (c = cm.get(controlId)) { + if (!color) + color = c.settings.default_color; + if (color !== c.value) { + c.displayColor(color); + } + } + }; + + updateColor('forecolor', fc); + updateColor('backcolor', bc); + } if (s.theme_advanced_path && s.theme_advanced_statusbar_location) { p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'}); + + if (t.statusKeyboardNavigation) { + t.statusKeyboardNavigation.destroy(); + t.statusKeyboardNavigation = null; + } + DOM.setHTML(p, ''); getParent(function(n) { var na = n.nodeName.toLowerCase(), u, pi, ti = ''; - /*if (n.getAttribute('_mce_bogus')) - return; -*/ - // Ignore non element and hidden elements - if (n.nodeType != 1 || n.nodeName === 'BR' || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved'))) + // Ignore non element and bogus/hidden elements + if (n.nodeType != 1 || na === 'br' || n.getAttribute('data-mce-bogus') || DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')) return; - // Fake name - if (v = DOM.getAttrib(n, 'mce_name')) - na = v; - // Handle prefix if (tinymce.isIE && n.scopeName !== 'HTML') na = n.scopeName + ':' + na; @@ -1068,14 +1174,25 @@ na = na.name; //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');"; - pi = DOM.create('a', {'href' : "javascript:;", onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na); + pi = DOM.create('a', {'href' : "javascript:;", role: 'button', onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na); if (p.hasChildNodes()) { - p.insertBefore(DOM.doc.createTextNode(' \u00bb '), p.firstChild); + p.insertBefore(DOM.create('span', {'aria-hidden': 'true'}, '\u00a0\u00bb '), p.firstChild); p.insertBefore(pi, p.firstChild); } else p.appendChild(pi); }, ed.getBody()); + + if (DOM.select('a', p).length > 0) { + t.statusKeyboardNavigation = new tinymce.ui.KeyboardNavigation({ + root: ed.id + "_path_row", + items: DOM.select('a', p), + excludeFromTabOrder: true, + onCancel: function() { + ed.focus(); + } + }, DOM); + } } }, @@ -1124,6 +1241,18 @@ }); }, + _mceShortcuts : function() { + var ed = this.editor; + ed.windowManager.open({ + url: this.url + '/shortcuts.htm', + width: 480, + height: 380, + inline: true + }, { + theme_url: this.url + }); + }, + _mceColorPicker : function(u, v) { var ed = this.editor; @@ -1226,4 +1355,4 @@ }); tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme); -}(tinymce)); \ No newline at end of file +}(tinymce)); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/image.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/image.htm index f30d670641..b8ba729f6f 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/image.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/image.htm @@ -17,57 +17,57 @@
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
     
    - x -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
     
    + x +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg index b4c542d107b25f68a9d4f9d7a109d0565d1f1437..b1a377aba7784d3a0a0fabb4d22b8114cde25ace 100644 GIT binary patch delta 2365 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 W2*l#|Pa-Y~b(9+&nY$I(8UGuz^kRPi literal 3189 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 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/flash.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/flash.gif new file mode 100644 index 0000000000000000000000000000000000000000..dec3f7c7028df98657860529461af29b8793601c GIT binary patch literal 239 zcmVM~p;I&fgwbZVtlRJPxC7uw?yFxEX;uVr4IeWCJ^(5m4hjYVM>G^+2V)FnXE$mS p86yHh03AmHCKD}bWutOkFce4&0zF5CG_Myp4hRT+ig>^g06S0cRV@Gj literal 0 HcmV?d00001 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/icons.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/icons.gif index e46de5333082869b9bdab2576a554a2f9d01a966..641a9e3d314f4ea051692a2274aeb281456f5df9 100644 GIT binary patch delta 5712 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 F{{atF+}!{G delta 5709 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 K-wuZXHvA7eh13lI diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/iframe.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/iframe.gif new file mode 100644 index 0000000000000000000000000000000000000000..410c7ad084db698e9f35e3230233aa4040682566 GIT binary patch literal 600 zcmZ?wbhEHb6krfwcoxm@|NsB$<##6SeDUYszh8g<{{H*-%a7k_-3KZc-T3+YPwBiX zzyAIE^Y`z!U%$Wp{QdX;|FQ*Fw;jIy{pasbUw?o3{yVB>Q_sRgx-G9iegFLZcfrha#d9w;%sU=Zx~6K$tw~$%z4`#O^Y@3Z zKV#~)MpSKh@#b63l#}6=>yq2|{`&JLqwny)|NnC)o%r$l&-Y)yKYjo8?#quSuRaGB zt_&<%`RV)bl#YEr{`~p)?RU|v^Y1_Z`u*?Ux8J`*N>>+5JlMAOZr+qr@y$D{mfVhO z+zt#7208-8pDc_F4ABfaAUi>E!oa?@A-bu#r8Qd6oKeb*Lx9UTz)0QBL@+vxY38ii zvqGa87c5+~h&?)zVa3W-D;=U$88}^qMBJ^ERU|z17!;#97+4%Rd1XcXJq#>t8KR;E z7zr5i6BgH5y=gAD)sAQlGB zh8au?j!n~E(Pks?@!j1fR&j*RWY8GF(-=x H6d0@lT&58X literal 0 HcmV?d00001 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/img/pagebreak.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/pagebreak.gif similarity index 100% rename from TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/pagebreak/img/pagebreak.gif rename to TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/pagebreak.gif diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/quicktime.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/quicktime.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f10e7aa6b6ab40ee69a1a41a961c092168d6fda GIT binary patch literal 301 zcmV+|0n+|QNk%w1VGsZi0Q4UK+~)L6v+~s9^fsC5ZpZP=*zu3F=Jxpf8k_5u%JNv6 z=md-84VLU4w)kSE=yI&-yw>b=v+SqE?+kq47pC+YrR?bJ^yu>Zyvpn;hTp*6^mM!O zu+8!}sO$`q%8%`=C5EEn#1d#z95FHtK5(^#(cp^e+Y!d=4FCrFbY9A3U z4-O0-4kHJPJ2(jk13n5879s!!3Q`V>8VwW`9my3H#|R8ZD+fdx0E-+693cQZ;!k;* literal 0 HcmV?d00001 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/realmedia.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/realmedia.gif similarity index 100% rename from TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/realmedia.gif rename to TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/realmedia.gif diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/shockwave.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/shockwave.gif new file mode 100644 index 0000000000000000000000000000000000000000..9314d044709c9845876e08003cf94526fd69177f GIT binary patch literal 384 zcmZ?wbhEHb6lD-#_^Qe9?Af#b->&}n`s(k;lb>H+`#+Q6|3c{>OLTv23;utm>DSfy zuOD3adm!iUuGar)4FAhzel5=UwZ7*6(K(+k@BP_g{o}}@k7u_2k7W2iGwlom!+#Z( z|Hj5w_4MwTo8QaHxm#EFYX1DUOO|}vvgQBb!_ST${rmj+`+Fep|C$j4HGtwz7FGrZ zO$Hs1VIV&_u+2R%#bJV$RKJIcL*N7vss0Y-EsB{gGlSJaTr>sRLKbLj5HMTpyK;)l zJcfpaMYltBZdEK6Kht6+BPy*VtthFMtIoqFC=#Tu$e^eaDXCC7U0vOYOJjNk(;P!VagC#fQ*?7otVO)-#9rK#nB%ry4`E_DHQ Wm01j~^6E13^D1O7+^=wCum%9s<%z=p literal 0 HcmV?d00001 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/trans.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/trans.gif similarity index 100% rename from TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/media/img/trans.gif rename to TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/trans.gif diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/video.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/img/video.gif new file mode 100644 index 0000000000000000000000000000000000000000..3570104077a3b3585f11403c8d4c3fc9351f35d2 GIT binary patch literal 597 zcmZ?wbhEHb6krfwc$UTx9v<%P?Ok48Ze?YanwpxCkzrwBk(ZYzB_&l;Qw!gmM(Ep^QBwbzIoSdAh>*2n> zz9l6k0Xw#(?);y5^ls9w|LObxXI*si^YfcEYu3*P8J(S-PEJlaNB-yTd}C^Ax@_69 zzP`Ryt5)S5`=P3;TDk9SbaeFk_3NiTjGA~aFd-pf@}tlxQ>GLb7jM|Gp`oFHlaq7F zk|nvhxjsHV=g+oST3Rl6T(N1>rn0iK*Ed>3MMVn>3vF#}**q!otE>Sy|^jDoRUBoBANRc=wyaJged$+}u3x zK}ld>puWET{||NozXdO-0f3nK$V8iNkVNKl+Guy1NeYie$3 zZB}=&Zex!RYq8YfVwgNdMpdFkN|rU!Fha}0m66q>CDxczOhH^pM9qvxw1p`;Rftzu zQJ&9}g>iErlc2ORw;aC_=l*6UJ=st%r*ISVV2jgDT<)w>rXHGL<21Kdo z#'; document.getElementById('iframecontainer').innerHTML = html; document.getElementById('help_tab').style.display = 'block'; + document.getElementById('help_tab').setAttribute("aria-hidden", "false"); } } diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js index 7fe7810558..e528e4f42f 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js @@ -19,6 +19,11 @@ var AnchorDialog = { update : function() { var ed = this.editor, elm, name = document.forms[0].anchorName.value; + if (!name || !/^[a-z][a-z0-9\-\_:\.]*$/i.test(name)) { + tinyMCEPopup.alert('advanced_dlg.anchor_invalid'); + return; + } + tinyMCEPopup.restoreSelection(); if (this.action != 'update') diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js index 8c5aea1721..1cead6dfe8 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js @@ -173,7 +173,7 @@ var charmap = [ ['ý', 'ý', true, 'y - acute'], ['þ', 'þ', true, 'thorn'], ['ÿ', 'ÿ', true, 'y - diaeresis'], - ['Α', 'Α', true, 'Alpha'], + ['Α', 'Α', true, 'Alpha'], ['Β', 'Β', true, 'Beta'], ['Γ', 'Γ', true, 'Gamma'], ['Δ', 'Δ', true, 'Delta'], @@ -258,8 +258,8 @@ var charmap = [ ['⌋', '⌋', false,'right floor'], ['⟨', '〈', false,'left-pointing angle bracket'], ['⟩', '〉', false,'right-pointing angle bracket'], - ['◊', '◊', true,'lozenge'], - ['♠', '♠', false,'black spade suit'], + ['◊', '◊', true, 'lozenge'], + ['♠', '♠', true, 'black spade suit'], ['♣', '♣', true, 'black club suit'], ['♥', '♥', true, 'black heart suit'], ['♦', '♦', true, 'black diamond suit'], @@ -275,19 +275,38 @@ var charmap = [ tinyMCEPopup.onInit.add(function() { tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML()); + addKeyboardNavigation(); }); +function addKeyboardNavigation(){ + var tableElm, cells, settings; + + cells = tinyMCEPopup.dom.select(".charmaplink", "charmapgroup"); + + settings ={ + root: "charmapgroup", + items: cells + }; + + tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom); +} + function renderCharMapHTML() { var charsPerRow = 20, tdWidth=20, tdHeight=20, i; - var html = ''; + var html = '
    '+ + '
    '; var cols=-1; for (i=0; i' - + '' + + '' + charmap[i][1] + ''; if ((cols+1) % charsPerRow == 0) @@ -301,7 +320,8 @@ function renderCharMapHTML() { html += ''; } - html += '
     
    '; + html += '
    '; + html = html.replace(/
    ' + // TODO: VoiceOver doesn't seem to support legend as a label referenced by labelledby. + h += '
    ' + ''; for (i=0; i' - + '' - + ''; + + ''; + if (tinyMCEPopup.editor.forcedHighContrastMode) { + h += ''; + } + h += ''; + h += ''; if ((i+1) % 18 == 0) h += ''; } - h += '
    '; + h += '
    '; el.innerHTML = h; el.className = 'generated'; + + paintCanvas(el); + enableKeyboardNavigation(el.firstChild); } +function paintCanvas(el) { + tinyMCEPopup.getWin().tinymce.each(tinyMCEPopup.dom.select('canvas.mceColorSwatch', el), function(canvas) { + var context; + if (canvas.getContext && (context = canvas.getContext("2d"))) { + context.fillStyle = canvas.getAttribute('data-color'); + context.fillRect(0, 0, 10, 10); + } + }); +} function generateNamedColors() { var el = document.getElementById('namedcolors'), h = '', n, v, i = 0; @@ -178,11 +238,27 @@ function generateNamedColors() { for (n in named) { v = named[n]; - h += '' + h += ''; + if (tinyMCEPopup.editor.forcedHighContrastMode) { + h += ''; + } + h += ''; + h += ''; + i++; } el.innerHTML = h; el.className = 'generated'; + + paintCanvas(el); + enableKeyboardNavigation(el); +} + +function enableKeyboardNavigation(el) { + tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', { + root: el, + items: tinyMCEPopup.dom.select('a', el) + }, tinyMCEPopup.dom); } function dechex(n) { diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/image.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/image.js index 6423d90809..2bccc97b92 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/image.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/image.js @@ -18,7 +18,7 @@ var ImageDialog = { e = ed.selection.getNode(); - this.fillFileList('image_list', 'tinyMCEImageList'); + this.fillFileList('image_list', tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList')); if (e.nodeName == 'IMG') { f.src.value = ed.dom.getAttrib(e, 'src'); @@ -39,7 +39,7 @@ var ImageDialog = { fillFileList : function(id, l) { var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - l = window[l]; + l = typeof(l) === 'function' ? l() : window[l]; if (l && l.length > 0) { lst.options[lst.options.length] = new Option('', ''); @@ -77,7 +77,7 @@ var ImageDialog = { args.style = this.styleVal; tinymce.extend(args, { - src : f.src.value, + src : f.src.value.replace(/ /g, '%20'), alt : f.alt.value, width : f.width.value, height : f.height.value @@ -87,6 +87,8 @@ var ImageDialog = { if (el && el.nodeName == 'IMG') { ed.dom.setAttribs(el, args); + tinyMCEPopup.editor.execCommand('mceRepaint'); + tinyMCEPopup.editor.focus(); } else { ed.execCommand('mceInsertContent', false, '', {skip_undo : 1}); ed.dom.setAttribs('__mce_tmp', args); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js index f67a5bc828..53ff409e79 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js @@ -31,7 +31,7 @@ var LinkDialog = { }, update : function() { - var f = document.forms[0], ed = tinyMCEPopup.editor, e, b; + var f = document.forms[0], ed = tinyMCEPopup.editor, e, b, href = f.href.value.replace(/ /g, '%20'); tinyMCEPopup.restoreSelection(); e = ed.dom.getParent(ed.selection.getNode(), 'A'); @@ -39,7 +39,6 @@ var LinkDialog = { // Remove element if there is no href if (!f.href.value) { if (e) { - tinyMCEPopup.execCommand("mceBeginUndoLevel"); b = ed.selection.getBookmark(); ed.dom.remove(e, 1); ed.selection.moveToBookmark(b); @@ -49,19 +48,17 @@ var LinkDialog = { } } - tinyMCEPopup.execCommand("mceBeginUndoLevel"); - // Create new anchor elements if (e == null) { ed.getDoc().execCommand("unlink", false, null); - tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1}); + tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); tinymce.each(ed.dom.select("a"), function(n) { if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { e = n; ed.dom.setAttribs(e, { - href : f.href.value, + href : href, title : f.linktitle.value, target : f.target_list ? getSelectValue(f, "target_list") : null, 'class' : f.class_list ? getSelectValue(f, "class_list") : null @@ -70,7 +67,7 @@ var LinkDialog = { }); } else { ed.dom.setAttribs(e, { - href : f.href.value, + href : href, title : f.linktitle.value, target : f.target_list ? getSelectValue(f, "target_list") : null, 'class' : f.class_list ? getSelectValue(f, "class_list") : null diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js index aca38bd886..84546ad52e 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js @@ -50,7 +50,7 @@ function resizeInputs() { el = document.getElementById('htmlSource'); if (el) { - el.style.width = (vp.w - 20) + 'px'; + el.style.width = (vp.w - 20) + 'px'; el.style.height = (vp.h - 65) + 'px'; } } diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js index 69694b1f9f..fbf29893fe 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js @@ -58,5 +58,11 @@ clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you path:"Path", newdocument:"Are you sure you want clear all contents?", toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X", -more_colors:"More colors" -}); \ No newline at end of file +more_colors:"More colors", + +// Accessibility Strings +shortcuts_desc:'Accessibility Help', +help_shortcut:'. Press ALT F10 for toolbar. Press ALT 0 for help.', +rich_text_area:"Rich Text Area", +toolbar:"Toolbar" +}); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js index 9d124d7db6..0a459beb5c 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js @@ -10,6 +10,7 @@ about_version:"Version", about_loaded:"Loaded plugins", anchor_title:"Insert/edit anchor", anchor_name:"Anchor name", +anchor_invalid:"Please specify a valid anchor name.", code_title:"HTML Source Editor", code_wordwrap:"Word wrap", colorpicker_title:"Select a color", @@ -45,7 +46,9 @@ link_target:"Target", link_target_same:"Open link in the same window", link_target_blank:"Open link in a new window", link_titlefield:"Title", -link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?", -link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?", -link_list:"Link list" +link_is_email:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", +link_is_external:"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?", +link_list:"Link list", +accessibility_help:"Accessibility Help", +accessibility_usage_title:"General Usage" }); \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/link.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/link.htm index 7565b9ae8b..5d9dea9b8c 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/link.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/link.htm @@ -18,34 +18,33 @@
    - - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
     
    + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
     
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm new file mode 100644 index 0000000000..20ec2f5a34 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm @@ -0,0 +1,47 @@ + + + + {#advanced_dlg.accessibility_help} + + + + +

    {#advanced_dlg.accessibility_usage_title}

    +

    Toolbars

    +

    Press ALT-F10 to move focus to the toolbars. Navigate through the buttons using the arrow keys. + Press enter to activate a button and return focus to the editor. + Press escape to return focus to the editor without performing any actions.

    + +

    Status Bar

    +

    To access the editor status bar, press ALT-F11. Use the left and right arrow keys to navigate between elements in the path. + Press enter or space to select an element. Press escape to return focus to the editor without changing the selection.

    + +

    Context Menu

    +

    Press shift-F10 to activate the context menu. Use the up and down arrow keys to move between menu items. To open sub-menus press the right arrow key. + To close submenus press the left arrow key. Press escape to close the context menu.

    + +

    Keyboard Shortcuts

    + + + + + + + + + + + + + + + + + + + + + +
    KeystrokeFunction
    Control-BBold
    Control-IItalic
    Control-ZUndo
    Control-YRedo
    + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css index 9fba0431da..4845e99d3f 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css @@ -1,6 +1,7 @@ body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} body {background:#FFF;} body.mceForceColors {background:#FFF; color:#000;} +body.mceBrowserDefaults {background:transparent; color:inherit; font-size:inherit; font-family:inherit;} h1 {font-size: 2em} h2 {font-size: 1.5em} h3 {font-size: 1.17em} @@ -8,7 +9,7 @@ h4 {font-size: 1em} h5 {font-size: .83em} h6 {font-size: .75em} .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} -a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat 0 0;} +a.mceItemAnchor {display:inline-block; -webkit-user-select:all; -webkit-user-modify:read-only; -moz-user-select:all; -moz-user-modify:read-only; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat center center} span.mceItemNbsp {background: #DDD} td.mceSelected, th.mceSelected {background-color:#3399ff !important} img {border:0;} @@ -34,3 +35,14 @@ scrollbar-track-color:#F5F5F5; img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} font[face=mceinline] {font-family:inherit !important} + +.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} +.mceItemShockWave {background-image:url(../../img/shockwave.gif)} +.mceItemFlash {background-image:url(../../img/flash.gif)} +.mceItemQuickTime {background-image:url(../../img/quicktime.gif)} +.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} +.mceItemRealMedia {background-image:url(../../img/realmedia.gif)} +.mceItemVideo {background-image:url(../../img/video.gif)} +.mceItemAudio {background-image:url(../../img/video.gif)} +.mceItemIframe {background-image:url(../../img/iframe.gif)} +.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png index 7dd58418ba7cfe58ae7efdf174e0b223fe3aa6a0..1e53560e0aa7bb1b9a0373fc2f330acab7d1d51f 100644 GIT binary patch delta 2525 zcmV<32_p8&8NC>gBe7Up0)GjqNklW6KNnY z5Dmy?f+RtfI3miXgUZ$l3N2OYxbJnZTdVCj)}{MCZD&hL34hpp-*fJkN9^6-rttRd_kS0lKeglM98q|x zSXg)|clwtWRQ;MY1qEx?toa>1R4`M3mjVKlOJfdD-oUKKN?soPS!gqP#L^XT4aOn{ z<|RX4N|~K3sI#VE=T7#D$4&spi{!Bt^$m?o{QUC{rr%gvO7{Aqylm?0S+zX;7S)5x zYH`$|q9m`!4|np5D1R_fYSKe+^>SWz0Y7FK1ysuqN>D&2@AB2F{;N0@haxPiQCh0& zhw4lG5r0WZQ4t;*Lqq;NdgWD1{6j!LBHsQN0n-H)T^-WjVH5Nl`Db5R>T*R~PM05_ zz&}62x_GwK&EQ;@DGPWTGSzxvULAk)dDV>VGDjevLnadS|zjKJgNr z`bf8#+LA20zq{MdV;qyd)>%W;u2b1cxN5qol8KVq;TnzZb$VIutgWfp%2Ix?b*q1c zp^rpdy`U!2+}vDCtV5;l-Wsivb|!ywlycE%FI3t1UC}6o*QwN+^e&e(+6tmh&IV$* zwKr1BS*PP_Wq6=`xrq%|~+T_C5$Ej&(aBhffVASe$q7B6G zIup%|XhSd0Mu0Qgpy>-sR}42bHT5AGzmv^*wAx7)^Unf>~5$T9%lO1CJm!P4FXMOHKz$z zM=wnfkZ6UWhyVA>%nC?#J^af}srE1Jej#Va#*O+2?4ajYUZim8X-e~b+=1AA=!;Li z{LVWs=YIfLPf;Us>ZKfUYN0sSZPfdXhr^3GA$+*;eW5Y@_20p3+g{(S@;An7+c>-4 zzH{fVD(lz(Woh*EW|q5i=WXKKaHDYeKe^uY^@!eVA} zU?3JNw_3}~%v4||MYYOBD+pBBK=CiB2=GM=ZK74QsnEWGf%6%rzj!7P2v}t?l}eTC zl$E#0Ct|T!SuA#?$iibMaNC?>Kiw?CEKd zzJCvBq=2zAM1~_he8t?66 zfn&!4^f)$wyn6yk5sZ(EV*dOH)4w{O@AEl)KA*H@%a$t8Lb%;&pMYYFvGMV7tDQ2w z^uMR<7J&^Nb)p7@Ek2(-Hpb#JGc#^?{(Oh7_Y#hyQXS{kEm_{u>HP%tcr7sFmVeV; zGlCm7l_N*oN4?%UH-)z_WRu>~d7~W&AKja>6GxBYOY^mRsgg|aEiHo5uHm)287)vU zr_lbNqZGYW2PCP^q)&h2+XLDKi)GP5+_T)9>fh5og-X&n zYuzV%<`96qIK=6}-Q;lqal;oUona*U5Yva9&^5?HCzQCBYQePB^} z1G^QI{#~E1|9S|__B%kDaVhkfLtwn|hPKge|6hpk+D-7KxzMN35)ad9$LArF{=NSG z{!d2}qobpb=6s;j0hH0v{xnBWfu(a4gfKE85W&$|9{#7pap|+sgr+|~pMU?=SC_nV zeSOzIPT)Rt_LyM34W+BD~pYLNtW_A6!EA8z!ZnXCe z{-Cr!8XWBV0fzy~;NTt~fi0#gpAQZWzL(Ahi@v_WS(w3%#Nc3J&U@vYs=s*VZae6k zo>dfO@8IF5}l ze2%BrIIn|UoVTuFde>WwT^d-P#5C>en7nrF8d*jxYW`2>4Sop9r3$7^9D z0|tV3X(>MKmaTjdTktrvwvFjGojrtexg~ch8%eTiL$?HEDrQFQ(o|zg&NduBtLhIO zr!H+##_1SX!$S-&LZ~82VT&b<_XeVjKkdaT)8&MZn3s@_Ho}t76Fe-_-RMhe8N;d)Q7$ zgh%o6N^}7$y zR~4_W4h0it*_&N5iO~AmA~pIUX&|1-eOHt8eKM$d&WQn~arrTISYK3<2LI5tZb~ra4Vor00000NkvXXu0mjf6xaGA delta 2666 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 literal 70 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 m$9hVqYNgZs*94epU`y6#e2-qmp8{7)K diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png index 8996c7493e8a58c9c40845cbe8abdc3e6730716d..7fc57f2bc2d63a3ad6fbf98b663f336539f011ec 100644 GIT binary patch delta 618 zcmV-w0+s!k9g78!83+Ra0086$;ro#x7k>cEP)t-s0002HySo4Y08>*_a&~-=k(7~{ zq?n(no1(0rrmv!@vZk!Hsjs-Lv%9dizO=c)x4gu=z{b14$GpMFzQf7C#LL0P%)`gc z#L3Ub%FxKn(aFuz%g@yRt3Us-P5-h`|Fl&9wO9YQTmQIT|GHxTyJi2qY5%`%|9`=9 z|HF3w#e4t9fd9#a|I3O0&5r-ub^qLY|J{H8--Q3*iT~k_|KpSYd|L3Cr z=%)YbtN-h;|LwH@@45f*zW?&W|MbWI_00eO|F&Wq@&Et;0(4SNQveU|I_8w5<1)+Sxjy>khxmTZ^UMAPuDhl=nJ%xacLVXE zN31WKSh0P^hawhnw)jf}#5_+GPu2e^5c51aiV00%6xVrr#$!*$V|i{OPJb2GYE{RI zUk${E_f%7X#d{l5O*06LqA`1W{A{z-KcE#qKx)lR6a_=R{wHo}S^x<1c*Pfemr)l5 zdENxVv+rLvA{OzVh(9zy{H9446TMvi`r@7X*kwhrq7{r{OWVwhm!6C_^4vrmA^ryB ziMy8mgg|d`WSser1qE6f|5sqVKRBqtZ!0b!I11C^6r?oOYvK8FsKs4z{;LqNh=&nh z+Biyl2i(R3MA5bJ5E*aeRfzb1#Gw{<#77AJa-hW>&Xefx-T2hw#sB~S07*qoM6N<$ Eg3||6=l}o! delta 3727 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 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png index bd5d2550c06d83c1141b78c5af7217e89559fc32..c0dcc6cac2003f7405fff3ea5df7bcf276243596 100644 GIT binary patch delta 2072 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 M07*qoM6N<$f@g#ZbN~PV diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css index a6253976af..0916c34e83 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css @@ -4,8 +4,8 @@ .o2k7Skin table td {vertical-align:middle} /* Containers */ -.o2k7Skin table {background:#E5EFFD} -.o2k7Skin iframe {display:block; background:#FFF} +.o2k7Skin table {background:transparent} +.o2k7Skin iframe {display:block;} .o2k7Skin .mceToolbar {height:26px} /* External */ @@ -19,7 +19,8 @@ .o2k7Skin table.mceLayout tr.mceLast td {border-bottom:1px solid #ABC6DD} .o2k7Skin table.mceToolbar, .o2k7Skin tr.mceFirst .mceToolbar tr td, .o2k7Skin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0} .o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD} -.o2k7Skin .mceStatusbar {display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px} +.o2k7Skin td.mceToolbar{background:#E5EFFD} +.o2k7Skin .mceStatusbar {background:#E5EFFD; display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px} .o2k7Skin .mceStatusbar div {float:left; padding:2px} .o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} .o2k7Skin .mceStatusbar a:hover {text-decoration:underline} @@ -50,19 +51,19 @@ .o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} /* ListBox */ -.o2k7Skin .mceListBox {margin-left:3px} +.o2k7Skin .mceListBox {padding-left: 3px} .o2k7Skin .mceListBox, .o2k7Skin .mceListBox a {display:block} .o2k7Skin .mceListBox .mceText {padding-left:4px; text-align:left; width:70px; border:1px solid #b3c7e1; border-right:0; background:#eaf2fb; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} .o2k7Skin .mceListBox .mceOpen {width:14px; height:22px; background:url(img/button_bg.png) -66px 0} .o2k7Skin table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF} .o2k7Skin table.mceListBoxEnabled:hover .mceOpen, .o2k7Skin .mceListBoxHover .mceOpen, .o2k7Skin .mceListBoxSelected .mceOpen {background-position:-66px -22px} .o2k7Skin .mceListBoxDisabled .mceText {color:gray} -.o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden} +.o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden; margin-left:3px} .o2k7Skin .mceOldBoxModel .mceListBox .mceText {height:22px} .o2k7Skin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px; border:1px solid #b3c7e1; background:#FFF;} /* SplitButton */ -.o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px} +.o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px; direction:ltr} .o2k7Skin .mceSplitButton {background:url(img/button_bg.png)} .o2k7Skin .mceSplitButton a.mceAction {width:22px} .o2k7Skin .mceSplitButton span.mceAction {width:22px; background-image:url(../../img/icons.gif)} @@ -105,6 +106,7 @@ .o2k7Skin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center} .o2k7Skin .mceMenu span.mceMenuLine {display:none} .o2k7Skin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;} +.o2k7Skin .mceMenuItem td, .o2k7Skin .mceMenuItem th {line-height: normal} /* Progress,Resize */ .o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css index 153f0c38a6..50c9b76a2d 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css @@ -1,6 +1,6 @@ /* Black */ .o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton a.mceOpen, .o2k7SkinBlack .mceListBox a.mceOpen {background-image:url(img/button_bg_black.png)} -.o2k7SkinBlack table, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF} +.o2k7SkinBlack td.mceToolbar, .o2k7SkinBlack td.mceStatusbar, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF} .o2k7SkinBlack table.mceListBoxEnabled .mceText, o2k7SkinBlack .mceListBox .mceText {background:#FFF; border:1px solid #CBCFD4; border-bottom-color:#989FA9; border-right:0} .o2k7SkinBlack table.mceListBoxEnabled:hover .mceText, .o2k7SkinBlack .mceListBoxHover .mceText, .o2k7SkinBlack .mceListBoxSelected .mceText {background:#FFF; border:1px solid #FFBD69; border-right:0} .o2k7SkinBlack .mceExternalToolbar, .o2k7SkinBlack .mceListBox .mceText, .o2k7SkinBlack div.mceMenu, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceFirst td, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceLast td, .o2k7SkinBlack .mceIframeContainer {border-color: #535353;} diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css index 7fe3b45e12..960a8e4755 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css @@ -1,5 +1,5 @@ /* Silver */ .o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton a.mceOpen, .o2k7SkinSilver .mceListBox a.mceOpen {background-image:url(img/button_bg_silver.png)} -.o2k7SkinSilver table, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee} +.o2k7SkinSilver td.mceToolbar, .o2k7SkinSilver td.mceStatusbar, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee} .o2k7SkinSilver .mceListBox .mceText {background:#FFF} .o2k7SkinSilver .mceExternalToolbar, .o2k7SkinSilver .mceListBox .mceText, .o2k7SkinSilver div.mceMenu, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceFirst td, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceLast td, .o2k7SkinSilver .mceIframeContainer {border-color: #bbb} diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm index 5957bbd178..3c6d65808a 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm @@ -6,7 +6,7 @@
    -
    {#advanced_dlg.code_title}
    +
    @@ -17,8 +17,8 @@
    - - + +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js index 4b862d49d6..01ce87c58a 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js @@ -19,6 +19,7 @@ var t = this, states = ['Bold', 'Italic', 'Underline', 'Strikethrough', 'InsertUnorderedList', 'InsertOrderedList'], s = ed.settings; t.editor = ed; + ed.contentCSS.push(url + "/skins/" + s.skin + "/content.css"); ed.onInit.add(function() { ed.onNodeChange.add(function(ed, cm) { @@ -26,8 +27,6 @@ cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c)); }); }); - - ed.dom.loadCSS(url + "/skins/" + s.skin + "/content.css"); }); DOM.loadCSS((s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : '') || url + "/skins/" + s.skin + "/ui.css"); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/simple/img/icons.gif b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/simple/img/icons.gif index 16af141ff0eea376a889b1e8d28e9c1cacaaab16..6fcbcb5dedf16a5fa1d15c2aa127bceb612f1e71 100644 GIT binary patch literal 806 zcmZ?wbhEHbJi#Es@KuxH{{08bHy>kQU|4+kcV*u?6Yu2z|Nk2X_I-c9E~4fBsnb_x z&7Ngzq1inB@Woqi-rnfiGF7yw9zM z^p;~=3MY4TT)2AY!iC=7fBwej_wPS(UDm1P!}|}9?`#au+qhx#R?Fl=KuakHia%Lc z85lGfbU;Rd{N%v)|G<<24;`ug6HAIt=2*?Yu%d)ZG@><(acbwmDSj%f4MMZ#%vkt3 z%+g~)i8kP^LLB_(WJHBo z)4eilyozQ8a&qqSt%<6xpa0;xA7k;M?mchbzI*>+`RnL~M?L!{MDwZt;o_B2F2$0=pQSpQ!u@RcUGT{(44KaY91N#ws_nDH9G%Qf=ZF z5o_THWH`G~`GwyilS^z$ZvV~I`dh4Lx_8c>?R@8gr-07UIgFjp0y#A&c{B)cE>2kS zL5I1;i$zoEA)6qV`HGJvVWE!{8MZ6ST|PC}d%Kid7{KiD{l18xziSGKuWtj9AkWy-*`}#c~0`Lrjq> z-;O-o=3A#@&dst%_SasuJq0xZW;OwR3vM!diY%Es?;J~Pp}LYununP(i|XxU>#u=* zSvNC^0?cJ=S?=UK4&2DdcCO^BsHxjWc4vR-Z64x&8r#>V9!JMd4O!Z*d@mNrgX=jUy;0|T>ZntHjDU$=-I8y`|tN~Y9 literal 1440 zcmV;R1z-9{Nk%w1VaNa!0QUd@Ib*`7v&H}b0P*i`B{WZ*I4YI8{iDPCZ*XyWj;?N! z&ooP8CcKTM%}ImAk&d@bUef&=iA% zhPA3sm56OYcjMRI^s}jof~E0n!SIozxs`y)bZpaM%~elOt(xIz_1F@`xREtxwxO@X zElsNLx;f_MIwnTOux@bk@5r<-;@s){f~fMSskU>S&vlpdmZGk)n^Ks084*pfMo5}`Y)@uBrt7q^ z_xb)XxI@^-XhLVQWPPfUtMQSg&Xb6UQhU2=S3pa1!Lhs1Kwz1)!P59aI6r5pthLM4 zE-ud4`aC>8zybolqcQ$sRq*)W>+kl^)!br%x2LJkVv+Dui1Oh7|6z>ag023Luhg%= z;=sbh)RP30t>V}2$H?fg=;-%zOTU8v0MO8l85I$+z}bYP#G9DS_#hs}n3hj*tissz zAwYQh{QX~VkH5&*9YTcu{{H^`{_yYcW|;u|{Qilm^upTyi?sd!nVG)6{{LrW`s5%! zQETJeu@Y0sB3Qy+jGVB@-BWO)C1U{h_4v@?@UEu*S8lPiucH6>|4vxO2|0#LaF@v0 z@ZaCy@c8hkxVXaB{z|fT@U~;Hv$d$T$J*xpqPpE8TH+G^0=vlI+KzIEuZN}B@UYO} z&dtoGp5{=vw)ErQRcDJbQgSxGf8JYL_`X^{uFH_9uqY`f`}_Of)zF}&w4mVd!0r05 zoM3>k!2kdMA^8LW00930EC2ui0LTCo000R80RIUbNU)&6g9sBUT*$DY!-o(fN}Ncs zqQ#3CGiuz(v7^V2AVW@EluM+^lPFV4B&kwhfCK?JZW}S8Lq-x8D(>2KU{_0tBn}8A zagb%p1Q&P-6u`78(}*2LRH3FT;{^Z%ooYoWl!#X%K7Tem@Rf*AgGMWAZK^N;uLKrJ zgqs_6Dufyfw<06~AZA3KR{>nO09GJYj!yq2Mo2^;St0-;UpPxp*8_}f6+Z>JE!?&a z+dPb*b~hYDra%-%J`C}|)xna%9$;-yz|zc`Z6DmMS)p07fiENwe4t=jwVQEwY|=zo zxL=@s=&E6Qp)TGXT_1)l*emUVx)m?~6;Hl)c5^2e&KlH&3v877L9rfP;Fp}T4iu?af8AOXd@5C0(U&fK3z8Av u{UxbK\n'; - - document.write(html); - }; - - // Firebug - if (query.debug) - include('firebug/firebug-lite.js'); - - // Core ns - include('tinymce.js'); - - // Load framework adapter - if (query.api) - include('adapter/' + query.api + '/adapter.js'); - - // Core API - include('util/Dispatcher.js'); - include('util/URI.js'); - include('util/Cookie.js'); - include('util/JSON.js'); - include('util/JSONP.js'); - include('util/XHR.js'); - include('util/JSONRequest.js'); - include('dom/DOMUtils.js'); - include('dom/Range.js'); - include('dom/TridentSelection.js'); - include('dom/Sizzle.js'); - include('dom/EventUtils.js'); - include('dom/Element.js'); - include('dom/Selection.js'); - include('dom/XMLWriter.js'); - include('dom/Schema.js'); - include('dom/StringWriter.js'); - include('dom/Serializer.js'); - include('dom/ScriptLoader.js'); - include('dom/TreeWalker.js'); - include('dom/RangeUtils.js'); - include('ui/Control.js'); - include('ui/Container.js'); - include('ui/Separator.js'); - include('ui/MenuItem.js'); - include('ui/Menu.js'); - include('ui/DropMenu.js'); - include('ui/Button.js'); - include('ui/ListBox.js'); - include('ui/NativeListBox.js'); - include('ui/MenuButton.js'); - include('ui/SplitButton.js'); - include('ui/ColorSplitButton.js'); - include('ui/Toolbar.js'); - include('AddOnManager.js'); - include('EditorManager.js'); - include('Editor.js'); - include('EditorCommands.js'); - include('UndoManager.js'); - include('ForceBlocks.js'); - include('ControlManager.js'); - include('WindowManager.js'); - include('Formatter.js'); - include('CommandManager.js'); - include('LegacyInput.js'); - - // Developer API - include('xml/Parser.js'); - include('Developer.js'); - - load(); -}()); \ No newline at end of file +/** + * tiny_mce_dev.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + * + * This file should only be used while developing TinyMCE + * tiny_mce.js or tiny_mce_src.js should be used in a production environment. + * This file loads the js files from classes instead of a merged copy. + */ + +(function() { + var i, nl = document.getElementsByTagName('script'), base, src, p, li, query = '', it, scripts = []; + + if (window.tinyMCEPreInit) { + base = tinyMCEPreInit.base; + query = tinyMCEPreInit.query || ''; + } else { + for (i=0; i\n'; + + document.write(html); + }; + + // Firebug + if (query.debug) + include('firebug/firebug-lite.js'); + + // Core ns + include('tinymce.js'); + + // Load framework adapter + if (query.api) + include('adapter/' + query.api + '/adapter.js'); + + // tinymce.util.* + include('util/Dispatcher.js'); + include('util/URI.js'); + include('util/Cookie.js'); + include('util/JSON.js'); + include('util/JSONP.js'); + include('util/XHR.js'); + include('util/JSONRequest.js'); + include('util/VK.js'); + include('util/Quirks.js'); + + // tinymce.html.* + include('html/Entities.js'); + include('html/Styles.js'); + include('html/Schema.js'); + include('html/SaxParser.js'); + include('html/Node.js'); + include('html/DomParser.js'); + include('html/Serializer.js'); + include('html/Writer.js'); + + // tinymce.dom.* + include('dom/DOMUtils.js'); + include('dom/Range.js'); + include('dom/TridentSelection.js'); + include('dom/Sizzle.js'); + include('dom/EventUtils.js'); + include('dom/Element.js'); + include('dom/Selection.js'); + include('dom/Serializer.js'); + include('dom/ScriptLoader.js'); + include('dom/TreeWalker.js'); + include('dom/RangeUtils.js'); + + // tinymce.ui.* + include('ui/KeyboardNavigation.js'); + include('ui/Control.js'); + include('ui/Container.js'); + include('ui/Separator.js'); + include('ui/MenuItem.js'); + include('ui/Menu.js'); + include('ui/DropMenu.js'); + include('ui/Button.js'); + include('ui/ListBox.js'); + include('ui/NativeListBox.js'); + include('ui/MenuButton.js'); + include('ui/SplitButton.js'); + include('ui/ColorSplitButton.js'); + include('ui/ToolbarGroup.js'); + include('ui/Toolbar.js'); + + // tinymce.* + include('AddOnManager.js'); + include('EditorManager.js'); + include('Editor.js'); + include('EditorCommands.js'); + include('UndoManager.js'); + include('ForceBlocks.js'); + include('ControlManager.js'); + include('WindowManager.js'); + include('Formatter.js'); + include('LegacyInput.js'); + + load(); +}()); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/tiny_mce_jquery_src.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/tiny_mce_jquery_src.js index 11db75ca96..44315cf54c 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/tiny_mce_jquery_src.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/jscripts/tiny_mce/tiny_mce_jquery_src.js @@ -5,9 +5,9 @@ var tinymce = { majorVersion : '3', - minorVersion : '3.9.3', + minorVersion : '4.4', - releaseDate : '2010-12-20', + releaseDate : '2011-08-04', _init : function() { var t = this, d = document, na = navigator, ua = na.userAgent, i, nl, n, base, p, v; @@ -20,6 +20,12 @@ t.isIE6 = t.isIE && /MSIE [56]/.test(ua); + t.isIE7 = t.isIE && /MSIE [7]/.test(ua); + + t.isIE8 = t.isIE && /MSIE [8]/.test(ua); + + t.isIE9 = t.isIE && /MSIE [9]/.test(ua); + t.isGecko = !t.isWebKit && /Gecko/.test(ua); t.isMac = ua.indexOf('Mac') != -1; @@ -27,6 +33,8 @@ t.isAir = /adobeair/i.test(ua); t.isIDevice = /(iPad|iPhone)/.test(ua); + + t.isIOS5 = t.isIDevice && ua.match(/AppleWebKit\/(\d*)/)[1]>=534; // TinyMCE .NET webcontrol might be setting the values for TinyMCE if (win.tinyMCEPreInit) { @@ -103,6 +111,24 @@ return typeof(o) == t; }, + makeMap : function(items, delim, map) { + var i; + + items = items || []; + delim = delim || ','; + + if (typeof(items) == "string") + items = items.split(delim); + + map = map || {}; + + i = items.length; + while (i--) + map[items[i]] = {}; + + return map; + }, + each : function(o, cb, s) { var n, l; @@ -135,7 +161,7 @@ return (s ? '' + s : '').replace(whiteSpaceRe, ''); }, - create : function(s, p) { + create : function(s, p, root) { var t = this, sp, ns, cn, scn, c, de = 0; // Parse : : @@ -143,7 +169,7 @@ cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name // Create namespace for new class - ns = t.createNS(s[3].replace(/\.\w+$/, '')); + ns = t.createNS(s[3].replace(/\.\w+$/, ''), root); // Class already exists if (ns[cn]) @@ -410,14 +436,19 @@ // Expose tinymce namespace to the global namespace (window) win.tinymce = win.tinyMCE = tinymce; -})(window); + + // Describe the different namespaces + + })(window); + (function($, tinymce) { var is = tinymce.is, attrRegExp = /^(href|src|style)$/i, undefined; // jQuery is undefined - if (!$) - return alert("Load jQuery first!"); + if (!$ && window.console) { + return console.log("Load jQuery first!"); + } // Stick jQuery into the tinymce namespace tinymce.$ = $; @@ -427,23 +458,23 @@ patchEditor : function(editor) { var fn = $.fn; - // Adapt the css function to make sure that the _mce_style + // Adapt the css function to make sure that the data-mce-style // attribute gets updated with the new style information function css(name, value) { var self = this; - // Remove _mce_style when set operation occurs + // Remove data-mce-style when set operation occurs if (value) - self.removeAttr('_mce_style'); + self.removeAttr('data-mce-style'); return fn.css.apply(self, arguments); }; - // Apapt the attr function to make sure that it uses the _mce_ prefixed variants + // Apapt the attr function to make sure that it uses the data-mce- prefixed variants function attr(name, value) { var self = this; - // Update/retrive _mce_ attribute variants + // Update/retrive data-mce- attribute variants if (attrRegExp.test(name)) { if (value !== undefined) { // Use TinyMCE behavior when setting the specifc attributes @@ -453,7 +484,7 @@ return self; } else - return self.attr('_mce_' + name); + return self.attr('data-mce-' + name); } // Default behavior @@ -463,7 +494,7 @@ function htmlPatchFunc(func) { // Returns a modified function that processes // the HTML before executing the action this makes sure - // that href/src etc gets moved into the _mce_ variants + // that href/src etc gets moved into the data-mce- variants return function(content) { if (content) content = editor.dom.processHTML(content); @@ -478,7 +509,7 @@ function patch(jq) { // Patch some functions, only patch the object once if (jq.css !== css) { - // Patch css/attr to use the _mce_ prefixed attribute variants + // Patch css/attr to use the data-mce- prefixed attribute variants jq.css = css; jq.attr = attr; @@ -640,7 +671,7 @@ case "style": e.each(function(i, v){ if (s.keep_values) - $(v).attr('_mce_style', v); + $(v).attr('data-mce-style', v); v.style.cssText = v; }); @@ -659,7 +690,7 @@ if (s.url_converter) v = s.url_converter.call(s.url_converter_scope || t, v, n, v); - t.setAttrib(v, '_mce_' + n, v); + t.setAttrib(v, 'data-mce-' + n, v); } }); @@ -795,7 +826,7 @@ tinymce.create('tinymce.util.Dispatcher', { tinymce.create('tinymce.util.URI', { URI : function(u, s) { - var t = this, o, a, b; + var t = this, o, a, b, base_url; // Trim whitespace u = tinymce.trim(u); @@ -814,8 +845,10 @@ tinymce.create('tinymce.util.Dispatcher', { u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u; // Relative path http:// or protocol relative //path - if (!/^\w*:?\/\//.test(u)) - u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u); + if (!/^[\w-]*:?\/\//.test(u)) { + base_url = s.base_uri ? s.base_uri.path : new tinymce.util.URI(location.href).directory; + u = ((s.base_uri && s.base_uri.protocol) || 'http') + '://mce_host' + t.toAbsPath(base_url, u); + } // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri) u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something @@ -1102,9 +1135,11 @@ tinymce.create('tinymce.util.Dispatcher', { }); })(); -tinymce.create('static tinymce.util.JSON', { - serialize : function(o) { - var i, v, s = tinymce.util.JSON.serialize, t; +(function() { + function serialize(o, quote) { + var i, v, t; + + quote = quote || '"'; if (o == null) return 'null'; @@ -1114,7 +1149,11 @@ tinymce.create('static tinymce.util.JSON', { if (t == 'string') { v = '\bb\tt\nn\ff\rr\""\'\'\\\\'; - return '"' + o.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g, function(a, b) { + return quote + o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g, function(a, b) { + // Make sure single quotes never get encoded inside double quotes for JSON compatibility + if (quote === '"' && a === "'") + return a; + i = v.indexOf(b); if (i + 1) @@ -1123,13 +1162,13 @@ tinymce.create('static tinymce.util.JSON', { a = b.charCodeAt().toString(16); return '\\u' + '0000'.substring(a.length) + a; - }) + '"'; + }) + quote; } if (t == 'object') { if (o.hasOwnProperty && o instanceof Array) { for (i=0, v = '['; i 0 ? ',' : '') + s(o[i]); + v += (i > 0 ? ',' : '') + serialize(o[i], quote); return v + ']'; } @@ -1137,24 +1176,27 @@ tinymce.create('static tinymce.util.JSON', { v = '{'; for (i in o) - v += typeof o[i] != 'function' ? (v.length > 1 ? ',"' : '"') + i + '":' + s(o[i]) : ''; + v += typeof o[i] != 'function' ? (v.length > 1 ? ',' + quote : quote) + i + quote +':' + serialize(o[i], quote) : ''; return v + '}'; } return '' + o; - }, + }; - parse : function(s) { - try { - return eval('(' + s + ')'); - } catch (ex) { - // Ignore - } - } + tinymce.util.JSON = { + serialize: serialize, - }); + parse: function(s) { + try { + return eval('(' + s + ')'); + } catch (ex) { + // Ignore + } + } + }; +})(); tinymce.create('static tinymce.util.XHR', { send : function(o) { var x, t, w = window, c = 0; @@ -1245,7 +1287,8 @@ tinymce.create('static tinymce.util.XHR', { }; o.error = function(ty, x) { - ecb.call(o.error_scope || o.scope, ty, x); + if (ecb) + ecb.call(o.error_scope || o.scope, ty, x); }; o.data = JSON.serialize({ @@ -1267,4713 +1310,6222 @@ tinymce.create('static tinymce.util.XHR', { } }); }()); +(function(tinymce){ + tinymce.VK = { + DELETE:46, + BACKSPACE:8 + + } + +})(tinymce); + (function(tinymce) { - // Shorten names - var each = tinymce.each, - is = tinymce.is, - isWebKit = tinymce.isWebKit, - isIE = tinymce.isIE, - blockRe = /^(H[1-6R]|P|DIV|ADDRESS|PRE|FORM|T(ABLE|BODY|HEAD|FOOT|H|R|D)|LI|OL|UL|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|MENU|ISINDEX|SAMP)$/, - boolAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'), - mceAttribs = makeMap('src,href,style,coords,shape'), - encodedChars = {'&' : '&', '"' : '"', '<' : '<', '>' : '>'}, - encodeCharsRe = /[<>&\"]/g, - simpleSelectorRe = /^([a-z0-9],?)+$/i, - tagRegExp = /<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)(\s*\/?)>/g, - attrRegExp = /(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; + function cleanupStylesWhenDeleting(ed) { + var dom = ed.dom, selection = ed.selection, VK= tinymce.VK; + ed.onKeyUp.add(function(ed, e) { + if (e.keyCode == VK.DELETE ||e.keyCode == VK.BACKSPACE) { + var startContainer = selection.getRng().startContainer; + var blockElement = startContainer; + while (!dom.isBlock(blockElement)) { + blockElement = blockElement.parentNode; + } + var spans = dom.select("span.Apple-style-span", blockElement); + dom.remove(spans, true); + } + }); + } - function makeMap(str) { - var map = {}, i; + tinymce.create('tinymce.util.Quirks', { + Quirks: function(ed) { + if (tinymce.isWebKit) { + cleanupStylesWhenDeleting(ed); + } + + } + }); +})(tinymce); - str = str.split(','); - for (i = str.length; i >= 0; i--) - map[str[i]] = 1; +(function(tinymce) { + var namedEntities, baseEntities, reverseEntities, + attrsCharsRegExp = /[&<>\"\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + textCharsRegExp = /[<>&\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + rawCharsRegExp = /[<>&\"\']/g, + entityRegExp = /&(#x|#)?([\w]+);/g, + asciiMap = { + 128 : "\u20AC", 130 : "\u201A", 131 : "\u0192", 132 : "\u201E", 133 : "\u2026", 134 : "\u2020", + 135 : "\u2021", 136 : "\u02C6", 137 : "\u2030", 138 : "\u0160", 139 : "\u2039", 140 : "\u0152", + 142 : "\u017D", 145 : "\u2018", 146 : "\u2019", 147 : "\u201C", 148 : "\u201D", 149 : "\u2022", + 150 : "\u2013", 151 : "\u2014", 152 : "\u02DC", 153 : "\u2122", 154 : "\u0161", 155 : "\u203A", + 156 : "\u0153", 158 : "\u017E", 159 : "\u0178" + }; - return map; + // Raw entities + baseEntities = { + '\"' : '"', // Needs to be escaped since the YUI compressor would otherwise break the code + "'" : ''', + '<' : '<', + '>' : '>', + '&' : '&' }; - tinymce.create('tinymce.dom.DOMUtils', { - doc : null, - root : null, - files : null, - pixelStyles : /^(top|left|bottom|right|width|height|borderWidth)$/, - props : { - "for" : "htmlFor", - "class" : "className", - className : "className", - checked : "checked", - disabled : "disabled", - maxlength : "maxLength", - readonly : "readOnly", - selected : "selected", - value : "value", - id : "id", - name : "name", - type : "type" - }, + // Reverse lookup table for raw entities + reverseEntities = { + '<' : '<', + '>' : '>', + '&' : '&', + '"' : '"', + ''' : "'" + }; - DOMUtils : function(d, s) { - var t = this, globalStyle; + // Decodes text by using the browser + function nativeDecode(text) { + var elm; - t.doc = d; - t.win = window; - t.files = {}; - t.cssFlicker = false; - t.counter = 0; - t.stdMode = d.documentMode >= 8; - t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat" || t.stdMode; + elm = document.createElement("div"); + elm.innerHTML = text; - t.settings = s = tinymce.extend({ - keep_values : false, - hex_colors : 1, - process_html : 1 - }, s); + return elm.textContent || elm.innerText || text; + }; - // Fix IE6SP2 flicker and check it failed for pre SP2 - if (tinymce.isIE6) { - try { - d.execCommand('BackgroundImageCache', false, true); - } catch (e) { - t.cssFlicker = true; + // Build a two way lookup table for the entities + function buildEntitiesLookup(items, radix) { + var i, chr, entity, lookup = {}; + + if (items) { + items = items.split(','); + radix = radix || 10; + + // Build entities lookup table + for (i = 0; i < items.length; i += 2) { + chr = String.fromCharCode(parseInt(items[i], radix)); + + // Only add non base entities + if (!baseEntities[chr]) { + entity = '&' + items[i + 1] + ';'; + lookup[chr] = entity; + lookup[entity] = chr; } } - // Build styles list - if (s.valid_styles) { - t._styles = {}; + return lookup; + } + }; - // Convert styles into a rule list - each(s.valid_styles, function(value, key) { - t._styles[key] = tinymce.explode(value); - }); - } + // Unpack entities lookup where the numbers are in radix 32 to reduce the size + namedEntities = buildEntitiesLookup( + '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro' + , 32); + + tinymce.html = tinymce.html || {}; + + tinymce.html.Entities = { + encodeRaw : function(text, attr) { + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + return baseEntities[chr] || chr; + }); + }, - tinymce.addUnload(t.destroy, t); + encodeAllRaw : function(text) { + return ('' + text).replace(rawCharsRegExp, function(chr) { + return baseEntities[chr] || chr; + }); }, - getRoot : function() { - var t = this, s = t.settings; + encodeNumeric : function(text, attr) { + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + // Multi byte sequence convert it to a single entity + if (chr.length > 1) + return '&#' + (((chr.charCodeAt(0) - 0xD800) * 0x400) + (chr.charCodeAt(1) - 0xDC00) + 0x10000) + ';'; - return (s && t.get(s.root_element)) || t.doc.body; + return baseEntities[chr] || '&#' + chr.charCodeAt(0) + ';'; + }); }, - getViewPort : function(w) { - var d, b; - - w = !w ? this.win : w; - d = w.document; - b = this.boxModel ? d.documentElement : d.body; + encodeNamed : function(text, attr, entities) { + entities = entities || namedEntities; - // Returns viewport size excluding scrollbars - return { - x : w.pageXOffset || b.scrollLeft, - y : w.pageYOffset || b.scrollTop, - w : w.innerWidth || b.clientWidth, - h : w.innerHeight || b.clientHeight - }; + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + return baseEntities[chr] || entities[chr] || chr; + }); }, - getRect : function(e) { - var p, t = this, sr; + getEncodeFunc : function(name, entities) { + var Entities = tinymce.html.Entities; - e = t.get(e); - p = t.getPos(e); - sr = t.getSize(e); + entities = buildEntitiesLookup(entities) || namedEntities; - return { - x : p.x, - y : p.y, - w : sr.w, - h : sr.h + function encodeNamedAndNumeric(text, attr) { + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + return baseEntities[chr] || entities[chr] || '&#' + chr.charCodeAt(0) + ';' || chr; + }); }; - }, - - getSize : function(e) { - var t = this, w, h; - e = t.get(e); - w = t.getStyle(e, 'width'); - h = t.getStyle(e, 'height'); + function encodeCustomNamed(text, attr) { + return Entities.encodeNamed(text, attr, entities); + }; - // Non pixel value, then force offset/clientWidth - if (w.indexOf('px') === -1) - w = 0; + // Replace + with , to be compatible with previous TinyMCE versions + name = tinymce.makeMap(name.replace(/\+/g, ',')); - // Non pixel value, then force offset/clientWidth - if (h.indexOf('px') === -1) - h = 0; + // Named and numeric encoder + if (name.named && name.numeric) + return encodeNamedAndNumeric; - return { - w : parseInt(w) || e.offsetWidth || e.clientWidth, - h : parseInt(h) || e.offsetHeight || e.clientHeight - }; - }, + // Named encoder + if (name.named) { + // Custom names + if (entities) + return encodeCustomNamed; - getParent : function(n, f, r) { - return this.getParents(n, f, r, false); - }, + return Entities.encodeNamed; + } - getParents : function(n, f, r, c) { - var t = this, na, se = t.settings, o = []; + // Numeric + if (name.numeric) + return Entities.encodeNumeric; - n = t.get(n); - c = c === undefined; + // Raw encoder + return Entities.encodeRaw; + }, - if (se.strict_root) - r = r || t.getRoot(); + decode : function(text) { + return text.replace(entityRegExp, function(all, numeric, value) { + if (numeric) { + value = parseInt(value, numeric.length === 2 ? 16 : 10); - // Wrap node name as func - if (is(f, 'string')) { - na = f; + // Support upper UTF + if (value > 0xFFFF) { + value -= 0x10000; - if (f === '*') { - f = function(n) {return n.nodeType == 1;}; - } else { - f = function(n) { - return t.is(n, na); - }; + return String.fromCharCode(0xD800 + (value >> 10), 0xDC00 + (value & 0x3FF)); + } else + return asciiMap[value] || String.fromCharCode(value); } - } - while (n) { - if (n == r || !n.nodeType || n.nodeType === 9) - break; + return reverseEntities[all] || namedEntities[all] || nativeDecode(all); + }); + } + }; +})(tinymce); - if (!f || f(n)) { - if (c) - o.push(n); - else - return n; - } +tinymce.html.Styles = function(settings, schema) { + var rgbRegExp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi, + urlOrStrRegExp = /(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi, + styleRegExp = /\s*([^:]+):\s*([^;]+);?/g, + trimRightRegExp = /\s+$/, + urlColorRegExp = /rgb/, + undef, i, encodingLookup = {}, encodingItems; - n = n.parentNode; - } + settings = settings || {}; - return c ? o : null; - }, + encodingItems = '\\" \\\' \\; \\: ; : \uFEFF'.split(' '); + for (i = 0; i < encodingItems.length; i++) { + encodingLookup[encodingItems[i]] = '\uFEFF' + i; + encodingLookup['\uFEFF' + i] = encodingItems[i]; + } - get : function(e) { - var n; + function toHex(match, r, g, b) { + function hex(val) { + val = parseInt(val).toString(16); - if (e && this.doc && typeof(e) == 'string') { - n = e; - e = this.doc.getElementById(e); + return val.length > 1 ? val : '0' + val; // 0 -> 00 + }; - // IE and Opera returns meta elements when they match the specified input ID, but getElementsByName seems to do the trick - if (e && e.id !== n) - return this.doc.getElementsByName(n)[1]; - } + return '#' + hex(r) + hex(g) + hex(b); + }; - return e; + return { + toHex : function(color) { + return color.replace(rgbRegExp, toHex); }, - getNext : function(node, selector) { - return this._findSib(node, selector, 'nextSibling'); - }, + parse : function(css) { + var styles = {}, matches, name, value, isEncoded, urlConverter = settings.url_converter, urlConverterScope = settings.url_converter_scope || this; - getPrev : function(node, selector) { - return this._findSib(node, selector, 'previousSibling'); - }, + function compress(prefix, suffix) { + var top, right, bottom, left; + // Get values and check it it needs compressing + top = styles[prefix + '-top' + suffix]; + if (!top) + return; - add : function(p, n, a, h, c) { - var t = this; + right = styles[prefix + '-right' + suffix]; + if (top != right) + return; - return this.run(p, function(p) { - var e, k; + bottom = styles[prefix + '-bottom' + suffix]; + if (right != bottom) + return; - e = is(n, 'string') ? t.doc.createElement(n) : n; - t.setAttribs(e, a); + left = styles[prefix + '-left' + suffix]; + if (bottom != left) + return; - if (h) { - if (h.nodeType) - e.appendChild(h); - else - t.setHTML(e, h); - } + // Compress + styles[prefix + suffix] = left; + delete styles[prefix + '-top' + suffix]; + delete styles[prefix + '-right' + suffix]; + delete styles[prefix + '-bottom' + suffix]; + delete styles[prefix + '-left' + suffix]; + }; - return !c ? p.appendChild(e) : e; - }); - }, + function canCompress(key) { + var value = styles[key], i; - create : function(n, a, h) { - return this.add(this.doc.createElement(n), n, a, h, 1); - }, + if (!value || value.indexOf(' ') < 0) + return; - createHTML : function(n, a, h) { - var o = '', t = this, k; + value = value.split(' '); + i = value.length; + while (i--) { + if (value[i] !== value[0]) + return false; + } - o += '<' + n; + styles[key] = value[0]; - for (k in a) { - if (a.hasOwnProperty(k)) - o += ' ' + k + '="' + t.encode(a[k]) + '"'; - } + return true; + }; - // A call to tinymce.is doesn't work for some odd reason on IE9 possible bug inside their JS runtime - if (typeof(h) != "undefined") - return o + '>' + h + ''; + function compress2(target, a, b, c) { + if (!canCompress(a)) + return; - return o + ' />'; - }, + if (!canCompress(b)) + return; - remove : function(node, keep_children) { - return this.run(node, function(node) { - var parent, child; + if (!canCompress(c)) + return; - parent = node.parentNode; + // Compress + styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c]; + delete styles[a]; + delete styles[b]; + delete styles[c]; + }; - if (!parent) - return null; + // Encodes the specified string by replacing all \" \' ; : with _ + function encode(str) { + isEncoded = true; - if (keep_children) { - while (child = node.firstChild) { - // IE 8 will crash if you don't remove completely empty text nodes - if (!tinymce.isIE || child.nodeType !== 3 || child.nodeValue) - parent.insertBefore(child, node); - else - node.removeChild(child); - } + return encodingLookup[str]; + }; + + // Decodes the specified string by replacing all _ with it's original value \" \' etc + // It will also decode the \" \' if keep_slashes is set to fale or omitted + function decode(str, keep_slashes) { + if (isEncoded) { + str = str.replace(/\uFEFF[0-9]/g, function(str) { + return encodingLookup[str]; + }); } - return parent.removeChild(node); - }); - }, + if (!keep_slashes) + str = str.replace(/\\([\'\";:])/g, "$1"); - setStyle : function(n, na, v) { - var t = this; + return str; + } - return t.run(n, function(e) { - var s, i; + if (css) { + // Encode \" \' % and ; and : inside strings so they don't interfere with the style parsing + css = css.replace(/\\[\"\';:\uFEFF]/g, encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, function(str) { + return str.replace(/[;:]/g, encode); + }); - s = e.style; + // Parse styles + while (matches = styleRegExp.exec(css)) { + name = matches[1].replace(trimRightRegExp, '').toLowerCase(); + value = matches[2].replace(trimRightRegExp, ''); - // Camelcase it, if needed - na = na.replace(/-(\D)/g, function(a, b){ - return b.toUpperCase(); - }); + if (name && value.length > 0) { + // Opera will produce 700 instead of bold in their style values + if (name === 'font-weight' && value === '700') + value = 'bold'; + else if (name === 'color' || name === 'background-color') // Lowercase colors like RED + value = value.toLowerCase(); - // Default px suffix on these - if (t.pixelStyles.test(na) && (tinymce.is(v, 'number') || /^[\-0-9\.]+$/.test(v))) - v += 'px'; + // Convert RGB colors to HEX + value = value.replace(rgbRegExp, toHex); - switch (na) { - case 'opacity': - // IE specific opacity - if (isIE) { - s.filter = v === '' ? '' : "alpha(opacity=" + (v * 100) + ")"; + // Convert URLs and force them into url('value') format + value = value.replace(urlOrStrRegExp, function(match, url, url2, url3, str, str2) { + str = str || str2; - if (!n.currentStyle || !n.currentStyle.hasLayout) - s.display = 'inline-block'; - } + if (str) { + str = decode(str); - // Fix for older browsers - s[na] = s['-moz-opacity'] = s['-khtml-opacity'] = v || ''; - break; + // Force strings into single quote format + return "'" + str.replace(/\'/g, "\\'") + "'"; + } - case 'float': - isIE ? s.styleFloat = v : s.cssFloat = v; - break; - - default: - s[na] = v || ''; + url = decode(url || url2 || url3); + + // Convert the URL to relative/absolute depending on config + if (urlConverter) + url = urlConverter.call(urlConverterScope, url, 'style'); + + // Output new URL format + return "url('" + url.replace(/\'/g, "\\'") + "')"; + }); + + styles[name] = isEncoded ? decode(value, true) : value; + } + + styleRegExp.lastIndex = matches.index + matches[0].length; } - // Force update of the style data - if (t.settings.update_styles) - t.setAttrib(e, '_mce_style'); - }); + // Compress the styles to reduce it's size for example IE will expand styles + compress("border", ""); + compress("border", "-width"); + compress("border", "-color"); + compress("border", "-style"); + compress("padding", ""); + compress("margin", ""); + compress2('border', 'border-width', 'border-style', 'border-color'); + + // Remove pointless border, IE produces these + if (styles.border === 'medium none') + delete styles.border; + } + + return styles; }, - getStyle : function(n, na, c) { - n = this.get(n); + serialize : function(styles, element_name) { + var css = '', name, value; - if (!n) - return false; + function serializeStyles(name) { + var styleList, i, l, value; - // Gecko - if (this.doc.defaultView && c) { - // Remove camelcase - na = na.replace(/[A-Z]/g, function(a){ - return '-' + a; - }); + styleList = schema.styles[name]; + if (styleList) { + for (i = 0, l = styleList.length; i < l; i++) { + name = styleList[i]; + value = styles[name]; - try { - return this.doc.defaultView.getComputedStyle(n, null).getPropertyValue(na); - } catch (ex) { - // Old safari might fail - return null; + if (value !== undef && value.length > 0) + css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';'; + } } - } + }; - // Camelcase it, if needed - na = na.replace(/-(\D)/g, function(a, b){ - return b.toUpperCase(); - }); + // Serialize styles according to schema + if (element_name && schema && schema.styles) { + // Serialize global styles and element specific styles + serializeStyles('*'); + serializeStyles(element_name); + } else { + // Output the styles in the order they are inside the object + for (name in styles) { + value = styles[name]; - if (na == 'float') - na = isIE ? 'styleFloat' : 'cssFloat'; + if (value !== undef && value.length > 0) + css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';'; + } + } - // IE & Opera - if (n.currentStyle && c) - return n.currentStyle[na]; + return css; + } + }; +}; - return n.style[na]; - }, +(function(tinymce) { + var transitional = {}, boolAttrMap, blockElementsMap, shortEndedElementsMap, nonEmptyElementsMap, customElementsMap = {}, + whiteSpaceElementsMap, selfClosingElementsMap, makeMap = tinymce.makeMap, each = tinymce.each; - setStyles : function(e, o) { - var t = this, s = t.settings, ol; + function split(str, delim) { + return str.split(delim || ','); + }; - ol = s.update_styles; - s.update_styles = 0; + function unpack(lookup, data) { + var key, elements = {}; - each(o, function(v, n) { - t.setStyle(e, n, v); + function replace(value) { + return value.replace(/[A-Z]+/g, function(key) { + return replace(lookup[key]); }); + }; - // Update style info - s.update_styles = ol; - if (s.update_styles) - t.setAttrib(e, s.cssText); - }, + // Unpack lookup + for (key in lookup) { + if (lookup.hasOwnProperty(key)) + lookup[key] = replace(lookup[key]); + } - setAttrib : function(e, n, v) { - var t = this; + // Unpack and parse data into object map + replace(data).replace(/#/g, '#text').replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g, function(str, name, attributes, children) { + attributes = split(attributes, '|'); - // Whats the point - if (!e || !n) - return; + elements[name] = { + attributes : makeMap(attributes), + attributesOrder : attributes, + children : makeMap(children, '|', {'#comment' : {}}) + } + }); - // Strict XML mode - if (t.settings.strict) - n = n.toLowerCase(); + return elements; + }; - return this.run(e, function(e) { - var s = t.settings; + // Build a lookup table for block elements both lowercase and uppercase + blockElementsMap = 'h1,h2,h3,h4,h5,h6,hr,p,div,address,pre,form,table,tbody,thead,tfoot,' + + 'th,tr,td,li,ol,ul,caption,blockquote,center,dl,dt,dd,dir,fieldset,' + + 'noscript,menu,isindex,samp,header,footer,article,section,hgroup'; + blockElementsMap = makeMap(blockElementsMap, ',', makeMap(blockElementsMap.toUpperCase())); + + // This is the XHTML 1.0 transitional elements with it's attributes and children packed to reduce it's size + transitional = unpack({ + Z : 'H|K|N|O|P', + Y : 'X|form|R|Q', + ZG : 'E|span|width|align|char|charoff|valign', + X : 'p|T|div|U|W|isindex|fieldset|table', + ZF : 'E|align|char|charoff|valign', + W : 'pre|hr|blockquote|address|center|noframes', + ZE : 'abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height', + ZD : '[E][S]', + U : 'ul|ol|dl|menu|dir', + ZC : 'p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q', + T : 'h1|h2|h3|h4|h5|h6', + ZB : 'X|S|Q', + S : 'R|P', + ZA : 'a|G|J|M|O|P', + R : 'a|H|K|N|O', + Q : 'noscript|P', + P : 'ins|del|script', + O : 'input|select|textarea|label|button', + N : 'M|L', + M : 'em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym', + L : 'sub|sup', + K : 'J|I', + J : 'tt|i|b|u|s|strike', + I : 'big|small|font|basefont', + H : 'G|F', + G : 'br|span|bdo', + F : 'object|applet|img|map|iframe', + E : 'A|B|C', + D : 'accesskey|tabindex|onfocus|onblur', + C : 'onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup', + B : 'lang|xml:lang|dir', + A : 'id|class|style|title' + }, 'script[id|charset|type|language|src|defer|xml:space][]' + + 'style[B|id|type|media|title|xml:space][]' + + 'object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]' + + 'param[id|name|value|valuetype|type][]' + + 'p[E|align][#|S]' + + 'a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]' + + 'br[A|clear][]' + + 'span[E][#|S]' + + 'bdo[A|C|B][#|S]' + + 'applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]' + + 'h1[E|align][#|S]' + + 'img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]' + + 'map[B|C|A|name][X|form|Q|area]' + + 'h2[E|align][#|S]' + + 'iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]' + + 'h3[E|align][#|S]' + + 'tt[E][#|S]' + + 'i[E][#|S]' + + 'b[E][#|S]' + + 'u[E][#|S]' + + 's[E][#|S]' + + 'strike[E][#|S]' + + 'big[E][#|S]' + + 'small[E][#|S]' + + 'font[A|B|size|color|face][#|S]' + + 'basefont[id|size|color|face][]' + + 'em[E][#|S]' + + 'strong[E][#|S]' + + 'dfn[E][#|S]' + + 'code[E][#|S]' + + 'q[E|cite][#|S]' + + 'samp[E][#|S]' + + 'kbd[E][#|S]' + + 'var[E][#|S]' + + 'cite[E][#|S]' + + 'abbr[E][#|S]' + + 'acronym[E][#|S]' + + 'sub[E][#|S]' + + 'sup[E][#|S]' + + 'input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]' + + 'select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]' + + 'optgroup[E|disabled|label][option]' + + 'option[E|selected|disabled|label|value][]' + + 'textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]' + + 'label[E|for|accesskey|onfocus|onblur][#|S]' + + 'button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]' + + 'h4[E|align][#|S]' + + 'ins[E|cite|datetime][#|Y]' + + 'h5[E|align][#|S]' + + 'del[E|cite|datetime][#|Y]' + + 'h6[E|align][#|S]' + + 'div[E|align][#|Y]' + + 'ul[E|type|compact][li]' + + 'li[E|type|value][#|Y]' + + 'ol[E|type|compact|start][li]' + + 'dl[E|compact][dt|dd]' + + 'dt[E][#|S]' + + 'dd[E][#|Y]' + + 'menu[E|compact][li]' + + 'dir[E|compact][li]' + + 'pre[E|width|xml:space][#|ZA]' + + 'hr[E|align|noshade|size|width][]' + + 'blockquote[E|cite][#|Y]' + + 'address[E][#|S|p]' + + 'center[E][#|Y]' + + 'noframes[E][#|Y]' + + 'isindex[A|B|prompt][]' + + 'fieldset[E][#|legend|Y]' + + 'legend[E|accesskey|align][#|S]' + + 'table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]' + + 'caption[E|align][#|S]' + + 'col[ZG][]' + + 'colgroup[ZG][col]' + + 'thead[ZF][tr]' + + 'tr[ZF|bgcolor][th|td]' + + 'th[E|ZE][#|Y]' + + 'form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]' + + 'noscript[E][#|Y]' + + 'td[E|ZE][#|Y]' + + 'tfoot[ZF][tr]' + + 'tbody[ZF][tr]' + + 'area[E|D|shape|coords|href|nohref|alt|target][]' + + 'base[id|href|target][]' + + 'body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]' + ); - switch (n) { - case "style": - if (!is(v, 'string')) { - each(v, function(v, n) { - t.setStyle(e, n, v); - }); + boolAttrMap = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,autoplay,loop,controls'); + shortEndedElementsMap = makeMap('area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source'); + nonEmptyElementsMap = tinymce.extend(makeMap('td,th,iframe,video,audio,object'), shortEndedElementsMap); + whiteSpaceElementsMap = makeMap('pre,script,style,textarea'); + selfClosingElementsMap = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); - return; - } + tinymce.html.Schema = function(settings) { + var self = this, elements = {}, children = {}, patternElements = [], validStyles; - // No mce_style for elements with these since they might get resized by the user - if (s.keep_values) { - if (v && !t._isRes(v)) - e.setAttribute('_mce_style', v, 2); - else - e.removeAttribute('_mce_style', 2); - } + settings = settings || {}; - e.style.cssText = v; - break; + // Allow all elements and attributes if verify_html is set to false + if (settings.verify_html === false) + settings.valid_elements = '*[*]'; - case "class": - e.className = v || ''; // Fix IE null bug - break; + // Build styles list + if (settings.valid_styles) { + validStyles = {}; - case "src": - case "href": - if (s.keep_values) { - if (s.url_converter) - v = s.url_converter.call(s.url_converter_scope || t, v, n, e); + // Convert styles into a rule list + each(settings.valid_styles, function(value, key) { + validStyles[key] = tinymce.explode(value); + }); + } + + // Converts a wildcard expression string to a regexp for example *a will become /.*a/. + function patternToRegExp(str) { + return new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$'); + }; + + // Parses the specified valid_elements string and adds to the current rules + // This function is a bit hard to read since it's heavily optimized for speed + function addValidElements(valid_elements) { + var ei, el, ai, al, yl, matches, element, attr, attrData, elementName, attrName, attrType, attributes, attributesOrder, + prefix, outputName, globalAttributes, globalAttributesOrder, transElement, key, childKey, value, + elementRuleRegExp = /^([#+-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/, + attrRuleRegExp = /^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/, + hasPatternsRegExp = /[*?+]/; + + if (valid_elements) { + // Split valid elements into an array with rules + valid_elements = split(valid_elements); + + if (elements['@']) { + globalAttributes = elements['@'].attributes; + globalAttributesOrder = elements['@'].attributesOrder; + } + + // Loop all rules + for (ei = 0, el = valid_elements.length; ei < el; ei++) { + // Parse element rule + matches = elementRuleRegExp.exec(valid_elements[ei]); + if (matches) { + // Setup local names for matches + prefix = matches[1]; + elementName = matches[2]; + outputName = matches[3]; + attrData = matches[4]; + + // Create new attributes and attributesOrder + attributes = {}; + attributesOrder = []; + + // Create the new element + element = { + attributes : attributes, + attributesOrder : attributesOrder + }; + + // Padd empty elements prefix + if (prefix === '#') + element.paddEmpty = true; - t.setAttrib(e, '_mce_' + n, v, 2); + // Remove empty elements prefix + if (prefix === '-') + element.removeEmpty = true; + + // Copy attributes from global rule into current rule + if (globalAttributes) { + for (key in globalAttributes) + attributes[key] = globalAttributes[key]; + + attributesOrder.push.apply(attributesOrder, globalAttributesOrder); } - break; - - case "shape": - e.setAttribute('_mce_style', v); - break; - } + // Attributes defined + if (attrData) { + attrData = split(attrData, '|'); + for (ai = 0, al = attrData.length; ai < al; ai++) { + matches = attrRuleRegExp.exec(attrData[ai]); + if (matches) { + attr = {}; + attrType = matches[1]; + attrName = matches[2].replace(/::/g, ':'); + prefix = matches[3]; + value = matches[4]; + + // Required + if (attrType === '!') { + element.attributesRequired = element.attributesRequired || []; + element.attributesRequired.push(attrName); + attr.required = true; + } - if (is(v) && v !== null && v.length !== 0) - e.setAttribute(n, '' + v, 2); - else - e.removeAttribute(n, 2); - }); - }, + // Denied from global + if (attrType === '-') { + delete attributes[attrName]; + attributesOrder.splice(tinymce.inArray(attributesOrder, attrName), 1); + continue; + } - setAttribs : function(e, o) { - var t = this; + // Default value + if (prefix) { + // Default value + if (prefix === '=') { + element.attributesDefault = element.attributesDefault || []; + element.attributesDefault.push({name: attrName, value: value}); + attr.defaultValue = value; + } - return this.run(e, function(e) { - each(o, function(v, n) { - t.setAttrib(e, n, v); - }); - }); - }, + // Forced value + if (prefix === ':') { + element.attributesForced = element.attributesForced || []; + element.attributesForced.push({name: attrName, value: value}); + attr.forcedValue = value; + } - getAttrib : function(e, n, dv) { - var v, t = this; + // Required values + if (prefix === '<') + attr.validValues = makeMap(value, '?'); + } - e = t.get(e); + // Check for attribute patterns + if (hasPatternsRegExp.test(attrName)) { + element.attributePatterns = element.attributePatterns || []; + attr.pattern = patternToRegExp(attrName); + element.attributePatterns.push(attr); + } else { + // Add attribute to order list if it doesn't already exist + if (!attributes[attrName]) + attributesOrder.push(attrName); - if (!e || e.nodeType !== 1) - return false; + attributes[attrName] = attr; + } + } + } + } - if (!is(dv)) - dv = ''; + // Global rule, store away these for later usage + if (!globalAttributes && elementName == '@') { + globalAttributes = attributes; + globalAttributesOrder = attributesOrder; + } - // Try the mce variant for these - if (/^(src|href|style|coords|shape)$/.test(n)) { - v = e.getAttribute("_mce_" + n); + // Handle substitute elements such as b/strong + if (outputName) { + element.outputName = elementName; + elements[outputName] = element; + } - if (v) - return v; + // Add pattern or exact element + if (hasPatternsRegExp.test(elementName)) { + element.pattern = patternToRegExp(elementName); + patternElements.push(element); + } else + elements[elementName] = element; + } + } } + }; - if (isIE && t.props[n]) { - v = e[t.props[n]]; - v = v && v.nodeValue ? v.nodeValue : v; - } + function setValidElements(valid_elements) { + elements = {}; + patternElements = []; - if (!v) - v = e.getAttribute(n, 2); + addValidElements(valid_elements); - // Check boolean attribs - if (/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(n)) { - if (e[t.props[n]] === true && v === '') - return n; + each(transitional, function(element, name) { + children[name] = element.children; + }); + }; - return v ? n : ''; - } + // Adds custom non HTML elements to the schema + function addCustomElements(custom_elements) { + var customElementRegExp = /^(~)?(.+)$/; - // Inner input elements will override attributes on form elements - if (e.nodeName === "FORM" && e.getAttributeNode(n)) - return e.getAttributeNode(n).nodeValue; + if (custom_elements) { + each(split(custom_elements), function(rule) { + var matches = customElementRegExp.exec(rule), + inline = matches[1] === '~', + cloneName = inline ? 'span' : 'div', + name = matches[2]; - if (n === 'style') { - v = v || e.style.cssText; + children[name] = children[cloneName]; + customElementsMap[name] = cloneName; - if (v) { - v = t.serializeStyle(t.parseStyle(v), e.nodeName); + // If it's not marked as inline then add it to valid block elements + if (!inline) + blockElementsMap[name] = {}; - if (t.settings.keep_values && !t._isRes(v)) - e.setAttribute('_mce_style', v); - } + // Add custom elements at span/div positions + each(children, function(element, child) { + if (element[cloneName]) + element[name] = element[cloneName]; + }); + }); } + }; - // Remove Apple and WebKit stuff - if (isWebKit && n === "class" && v) - v = v.replace(/(apple|webkit)\-[a-z\-]+/gi, ''); - - // Handle IE issues - if (isIE) { - switch (n) { - case 'rowspan': - case 'colspan': - // IE returns 1 as default value - if (v === 1) - v = ''; - - break; - - case 'size': - // IE returns +0 as default value for size - if (v === '+0' || v === 20 || v === 0) - v = ''; + // Adds valid children to the schema object + function addValidChildren(valid_children) { + var childRuleRegExp = /^([+\-]?)(\w+)\[([^\]]+)\]$/; - break; + if (valid_children) { + each(split(valid_children), function(rule) { + var matches = childRuleRegExp.exec(rule), parent, prefix; - case 'width': - case 'height': - case 'vspace': - case 'checked': - case 'disabled': - case 'readonly': - if (v === 0) - v = ''; + if (matches) { + prefix = matches[1]; - break; + // Add/remove items from default + if (prefix) + parent = children[matches[2]]; + else + parent = children[matches[2]] = {'#comment' : {}}; - case 'hspace': - // IE returns -1 as default value - if (v === -1) - v = ''; + parent = children[matches[2]]; - break; + each(split(matches[3], '|'), function(child) { + if (prefix === '-') + delete parent[child]; + else + parent[child] = {}; + }); + } + }); + } + }; - case 'maxlength': - case 'tabindex': - // IE returns default value - if (v === 32768 || v === 2147483647 || v === '32768') - v = ''; + function getElementRule(name) { + var element = elements[name], i; - break; + // Exact match found + if (element) + return element; - case 'multiple': - case 'compact': - case 'noshade': - case 'nowrap': - if (v === 65535) - return n; + // No exact match then try the patterns + i = patternElements.length; + while (i--) { + element = patternElements[i]; - return dv; + if (element.pattern.test(name)) + return element; + } + }; - case 'shape': - v = v.toLowerCase(); - break; + if (!settings.valid_elements) { + // No valid elements defined then clone the elements from the transitional spec + each(transitional, function(element, name) { + elements[name] = { + attributes : element.attributes, + attributesOrder : element.attributesOrder + }; - default: - // IE has odd anonymous function for event attributes - if (n.indexOf('on') === 0 && v) - v = tinymce._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/, '$1', '' + v); - } - } + children[name] = element.children; + }); - return (v !== undefined && v !== null && v !== '') ? '' + v : dv; - }, + // Switch these + each(split('strong/b,em/i'), function(item) { + item = split(item, '/'); + elements[item[1]].outputName = item[0]; + }); - getPos : function(n, ro) { - var t = this, x = 0, y = 0, e, d = t.doc, r; + // Add default alt attribute for images + elements.img.attributesDefault = [{name: 'alt', value: ''}]; - n = t.get(n); - ro = ro || d.body; + // Remove these if they are empty by default + each(split('ol,ul,sub,sup,blockquote,span,font,a,table,tbody,tr'), function(name) { + elements[name].removeEmpty = true; + }); - if (n) { - // Use getBoundingClientRect on IE, Opera has it but it's not perfect - if (isIE && !t.stdMode) { - n = n.getBoundingClientRect(); - e = t.boxModel ? d.documentElement : d.body; - x = t.getStyle(t.select('html')[0], 'borderWidth'); // Remove border - x = (x == 'medium' || t.boxModel && !t.isIE6) && 2 || x; + // Padd these by default + each(split('p,h1,h2,h3,h4,h5,h6,th,td,pre,div,address,caption'), function(name) { + elements[name].paddEmpty = true; + }); + } else + setValidElements(settings.valid_elements); - return {x : n.left + e.scrollLeft - x, y : n.top + e.scrollTop - x}; - } + addCustomElements(settings.custom_elements); + addValidChildren(settings.valid_children); + addValidElements(settings.extended_valid_elements); - r = n; - while (r && r != ro && r.nodeType) { - x += r.offsetLeft || 0; - y += r.offsetTop || 0; - r = r.offsetParent; - } + // Todo: Remove this when we fix list handling to be valid + addValidChildren('+ol[ul|ol],+ul[ul|ol]'); - r = n.parentNode; - while (r && r != ro && r.nodeType) { - x -= r.scrollLeft || 0; - y -= r.scrollTop || 0; - r = r.parentNode; - } - } + // If the user didn't allow span only allow internal spans + if (!getElementRule('span')) + addValidElements('span[!data-mce-type|*]'); - return {x : x, y : y}; - }, + // Delete invalid elements + if (settings.invalid_elements) { + tinymce.each(tinymce.explode(settings.invalid_elements), function(item) { + if (elements[item]) + delete elements[item]; + }); + } - parseStyle : function(st) { - var t = this, s = t.settings, o = {}; + self.children = children; - if (!st) - return o; + self.styles = validStyles; - function compress(p, s, ot) { - var t, r, b, l; + self.getBoolAttrs = function() { + return boolAttrMap; + }; - // Get values and check it it needs compressing - t = o[p + '-top' + s]; - if (!t) - return; + self.getBlockElements = function() { + return blockElementsMap; + }; - r = o[p + '-right' + s]; - if (t != r) - return; + self.getShortEndedElements = function() { + return shortEndedElementsMap; + }; - b = o[p + '-bottom' + s]; - if (r != b) - return; + self.getSelfClosingElements = function() { + return selfClosingElementsMap; + }; - l = o[p + '-left' + s]; - if (b != l) - return; + self.getNonEmptyElements = function() { + return nonEmptyElementsMap; + }; - // Compress - o[ot] = l; - delete o[p + '-top' + s]; - delete o[p + '-right' + s]; - delete o[p + '-bottom' + s]; - delete o[p + '-left' + s]; - }; + self.getWhiteSpaceElements = function() { + return whiteSpaceElementsMap; + }; - function compress2(ta, a, b, c) { - var t; + self.isValidChild = function(name, child) { + var parent = children[name]; - t = o[a]; - if (!t) - return; + return !!(parent && parent[child]); + }; - t = o[b]; - if (!t) - return; + self.getElementRule = getElementRule; - t = o[c]; - if (!t) - return; + self.getCustomElements = function() { + return customElementsMap; + }; - // Compress - o[ta] = o[a] + ' ' + o[b] + ' ' + o[c]; - delete o[a]; - delete o[b]; - delete o[c]; - }; + self.addValidElements = addValidElements; - st = st.replace(/&(#?[a-z0-9]+);/g, '&$1_MCE_SEMI_'); // Protect entities + self.setValidElements = setValidElements; - each(st.split(';'), function(v) { - var sv, ur = []; + self.addCustomElements = addCustomElements; - if (v) { - v = v.replace(/_MCE_SEMI_/g, ';'); // Restore entities - v = v.replace(/url\([^\)]+\)/g, function(v) {ur.push(v);return 'url(' + ur.length + ')';}); - v = v.split(':'); - sv = tinymce.trim(v[1]); - sv = sv.replace(/url\(([^\)]+)\)/g, function(a, b) {return ur[parseInt(b) - 1];}); - - sv = sv.replace(/rgb\([^\)]+\)/g, function(v) { - return t.toHex(v); - }); + self.addValidChildren = addValidChildren; + }; - if (s.url_converter) { - sv = sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g, function(x, c) { - return 'url(' + s.url_converter.call(s.url_converter_scope || t, t.decode(c), 'style', null) + ')'; - }); - } + // Expose boolMap and blockElementMap as static properties for usage in DOMUtils + tinymce.html.Schema.boolAttrMap = boolAttrMap; + tinymce.html.Schema.blockElementsMap = blockElementsMap; +})(tinymce); - o[tinymce.trim(v[0]).toLowerCase()] = sv; - } - }); +(function(tinymce) { + tinymce.html.SaxParser = function(settings, schema) { + var self = this, noop = function() {}; - compress("border", "", "border"); - compress("border", "-width", "border-width"); - compress("border", "-color", "border-color"); - compress("border", "-style", "border-style"); - compress("padding", "", "padding"); - compress("margin", "", "margin"); - compress2('border', 'border-width', 'border-style', 'border-color'); + settings = settings || {}; + self.schema = schema = schema || new tinymce.html.Schema(); - if (isIE) { - // Remove pointless border - if (o.border == 'medium none') - o.border = ''; - } + if (settings.fix_self_closing !== false) + settings.fix_self_closing = true; - return o; - }, + // Add handler functions from settings and setup default handlers + tinymce.each('comment cdata text start end pi doctype'.split(' '), function(name) { + if (name) + self[name] = settings[name] || noop; + }); - serializeStyle : function(o, name) { - var t = this, s = ''; + self.parse = function(html) { + var self = this, matches, index = 0, value, endRegExp, stack = [], attrList, i, text, name, isInternalElement, removeInternalElements, + shortEndedElements, fillAttrsMap, isShortEnded, validate, elementRule, isValidElement, attr, attribsValue, + validAttributesMap, validAttributePatterns, attributesRequired, attributesDefault, attributesForced, selfClosing, + tokenRegExp, attrRegExp, specialElements, attrValue, idCount = 0, decode = tinymce.html.Entities.decode, fixSelfClosing; - function add(v, k) { - if (k && v) { - // Remove browser specific styles like -moz- or -webkit- - if (k.indexOf('-') === 0) - return; + function processEndTag(name) { + var pos, i; - switch (k) { - case 'font-weight': - // Opera will output bold as 700 - if (v == 700) - v = 'bold'; + // Find position of parent of the same type + pos = stack.length; + while (pos--) { + if (stack[pos].name === name) + break; + } - break; + // Found parent + if (pos >= 0) { + // Close all the open elements + for (i = stack.length - 1; i >= pos; i--) { + name = stack[i]; - case 'color': - case 'background-color': - v = v.toLowerCase(); - break; + if (name.valid) + self.end(name.name); } - s += (s ? ' ' : '') + k + ': ' + v + ';'; + // Remove the open elements from the stack + stack.length = pos; } }; - // Validate style output - if (name && t._styles) { - each(t._styles['*'], function(name) { - add(o[name], name); - }); - - each(t._styles[name.toLowerCase()], function(name) { - add(o[name], name); - }); - } else - each(o, add); - - return s; - }, + // Precompile RegExps and map objects + tokenRegExp = new RegExp('<(?:' + + '(?:!--([\\w\\W]*?)-->)|' + // Comment + '(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|' + // CDATA + '(?:!DOCTYPE([\\w\\W]*?)>)|' + // DOCTYPE + '(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|' + // PI + '(?:\\/([^>]+)>)|' + // End element + '(?:([^\\s\\/<>]+)\\s*((?:[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*)>)' + // Start element + ')', 'g'); + + attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g; + specialElements = { + 'script' : /<\/script[^>]*>/gi, + 'style' : /<\/style[^>]*>/gi, + 'noscript' : /<\/noscript[^>]*>/gi + }; - loadCSS : function(u) { - var t = this, d = t.doc, head; + // Setup lookup tables for empty elements and boolean attributes + shortEndedElements = schema.getShortEndedElements(); + selfClosing = schema.getSelfClosingElements(); + fillAttrsMap = schema.getBoolAttrs(); + validate = settings.validate; + removeInternalElements = settings.remove_internals; + fixSelfClosing = settings.fix_self_closing; + + while (matches = tokenRegExp.exec(html)) { + // Text + if (index < matches.index) + self.text(decode(html.substr(index, matches.index - index))); + + if (value = matches[6]) { // End element + processEndTag(value.toLowerCase()); + } else if (value = matches[7]) { // Start element + value = value.toLowerCase(); + isShortEnded = value in shortEndedElements; + + // Is self closing tag for example an
  • after an open
  • + if (fixSelfClosing && selfClosing[value] && stack.length > 0 && stack[stack.length - 1].name === value) + processEndTag(value); + + // Validate element + if (!validate || (elementRule = schema.getElementRule(value))) { + isValidElement = true; + + // Grab attributes map and patters when validation is enabled + if (validate) { + validAttributesMap = elementRule.attributes; + validAttributePatterns = elementRule.attributePatterns; + } - if (!u) - u = ''; + // Parse attributes + if (attribsValue = matches[8]) { + isInternalElement = attribsValue.indexOf('data-mce-type') !== -1; // Check if the element is an internal element - head = t.select('head')[0]; + // If the element has internal attributes then remove it if we are told to do so + if (isInternalElement && removeInternalElements) + isValidElement = false; - each(u.split(','), function(u) { - var link; + attrList = []; + attrList.map = {}; - if (t.files[u]) - return; + attribsValue.replace(attrRegExp, function(match, name, value, val2, val3) { + var attrRule, i; - t.files[u] = true; - link = t.create('link', {rel : 'stylesheet', href : tinymce._addVer(u)}); + name = name.toLowerCase(); + value = name in fillAttrsMap ? name : decode(value || val2 || val3 || ''); // Handle boolean attribute than value attribute - // IE 8 has a bug where dynamically loading stylesheets would produce a 1 item remaining bug - // This fix seems to resolve that issue by realcing the document ones a stylesheet finishes loading - // It's ugly but it seems to work fine. - if (isIE && d.documentMode && d.recalc) { - link.onload = function() { - d.recalc(); - link.onload = null; - }; - } + // Validate name and value + if (validate && !isInternalElement && name.indexOf('data-') !== 0) { + attrRule = validAttributesMap[name]; - head.appendChild(link); - }); - }, + // Find rule by pattern matching + if (!attrRule && validAttributePatterns) { + i = validAttributePatterns.length; + while (i--) { + attrRule = validAttributePatterns[i]; + if (attrRule.pattern.test(name)) + break; + } - addClass : function(e, c) { - return this.run(e, function(e) { - var o; + // No rule matched + if (i === -1) + attrRule = null; + } - if (!c) - return 0; + // No attribute rule found + if (!attrRule) + return; - if (this.hasClass(e, c)) - return e.className; + // Validate value + if (attrRule.validValues && !(value in attrRule.validValues)) + return; + } - o = this.removeClass(e, c); + // Add attribute to list and map + attrList.map[name] = value; + attrList.push({ + name: name, + value: value + }); + }); + } else { + attrList = []; + attrList.map = {}; + } - return e.className = (o != '' ? (o + ' ') : '') + c; - }); - }, + // Process attributes if validation is enabled + if (validate && !isInternalElement) { + attributesRequired = elementRule.attributesRequired; + attributesDefault = elementRule.attributesDefault; + attributesForced = elementRule.attributesForced; + + // Handle forced attributes + if (attributesForced) { + i = attributesForced.length; + while (i--) { + attr = attributesForced[i]; + name = attr.name; + attrValue = attr.value; + + if (attrValue === '{$uid}') + attrValue = 'mce_' + idCount++; + + attrList.map[name] = attrValue; + attrList.push({name: name, value: attrValue}); + } + } - removeClass : function(e, c) { - var t = this, re; + // Handle default attributes + if (attributesDefault) { + i = attributesDefault.length; + while (i--) { + attr = attributesDefault[i]; + name = attr.name; - return t.run(e, function(e) { - var v; + if (!(name in attrList.map)) { + attrValue = attr.value; - if (t.hasClass(e, c)) { - if (!re) - re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g"); + if (attrValue === '{$uid}') + attrValue = 'mce_' + idCount++; - v = e.className.replace(re, ' '); - v = tinymce.trim(v != ' ' ? v : ''); + attrList.map[name] = attrValue; + attrList.push({name: name, value: attrValue}); + } + } + } - e.className = v; + // Handle required attributes + if (attributesRequired) { + i = attributesRequired.length; + while (i--) { + if (attributesRequired[i] in attrList.map) + break; + } - // Empty class attr - if (!v) { - e.removeAttribute('class'); - e.removeAttribute('className'); - } + // None of the required attributes where found + if (i === -1) + isValidElement = false; + } - return v; - } + // Invalidate element if it's marked as bogus + if (attrList.map['data-mce-bogus']) + isValidElement = false; + } - return e.className; - }); - }, + if (isValidElement) + self.start(value, attrList, isShortEnded); + } else + isValidElement = false; - hasClass : function(n, c) { - n = this.get(n); + // Treat script, noscript and style a bit different since they may include code that looks like elements + if (endRegExp = specialElements[value]) { + endRegExp.lastIndex = index = matches.index + matches[0].length; - if (!n || !c) - return false; + if (matches = endRegExp.exec(html)) { + if (isValidElement) + text = html.substr(index, matches.index - index); - return (' ' + n.className + ' ').indexOf(' ' + c + ' ') !== -1; - }, + index = matches.index + matches[0].length; + } else { + text = html.substr(index); + index = html.length; + } - show : function(e) { - return this.setStyle(e, 'display', 'block'); - }, + if (isValidElement && text.length > 0) + self.text(text, true); - hide : function(e) { - return this.setStyle(e, 'display', 'none'); - }, + if (isValidElement) + self.end(value); - isHidden : function(e) { - e = this.get(e); + tokenRegExp.lastIndex = index; + continue; + } - return !e || e.style.display == 'none' || this.getStyle(e, 'display') == 'none'; - }, + // Push value on to stack + if (!isShortEnded) { + if (!attribsValue || attribsValue.indexOf('/') != attribsValue.length - 1) + stack.push({name: value, valid: isValidElement}); + else if (isValidElement) + self.end(value); + } + } else if (value = matches[1]) { // Comment + self.comment(value); + } else if (value = matches[2]) { // CDATA + self.cdata(value); + } else if (value = matches[3]) { // DOCTYPE + self.doctype(value); + } else if (value = matches[4]) { // PI + self.pi(value, matches[5]); + } - uniqueId : function(p) { - return (!p ? 'mce_' : p) + (this.counter++); - }, + index = matches.index + matches[0].length; + } - setHTML : function(e, h) { - var t = this; + // Text + if (index < html.length) + self.text(decode(html.substr(index))); - return this.run(e, function(e) { - var x, i, nl, n, p, x; + // Close any open elements + for (i = stack.length - 1; i >= 0; i--) { + value = stack[i]; - h = t.processHTML(h); + if (value.valid) + self.end(value.name); + } + }; + } +})(tinymce); - if (isIE) { - function set() { - // Remove all child nodes - while (e.firstChild) - e.firstChild.removeNode(); +(function(tinymce) { + var whiteSpaceRegExp = /^[ \t\r\n]*$/, typeLookup = { + '#text' : 3, + '#comment' : 8, + '#cdata' : 4, + '#pi' : 7, + '#doctype' : 10, + '#document-fragment' : 11 + }; - try { - // IE will remove comments from the beginning - // unless you padd the contents with something - e.innerHTML = '
    ' + h; - e.removeChild(e.firstChild); - } catch (ex) { - // IE sometimes produces an unknown runtime error on innerHTML if it's an block element within a block element for example a div inside a p - // This seems to fix this problem - - // Create new div with HTML contents and a BR infront to keep comments - x = t.create('div'); - x.innerHTML = '
    ' + h; - - // Add all children from div to target - each (x.childNodes, function(n, i) { - // Skip br element - if (i) - e.appendChild(n); - }); - } - }; + // Walks the tree left/right + function walk(node, root_node, prev) { + var sibling, parent, startName = prev ? 'lastChild' : 'firstChild', siblingName = prev ? 'prev' : 'next'; - // IE has a serious bug when it comes to paragraphs it can produce an invalid - // DOM tree if contents like this

    • Item 1

    is inserted - // It seems to be that IE doesn't like a root block element placed inside another root block element - if (t.settings.fix_ie_paragraphs) - h = h.replace(/

    <\/p>|]+)><\/p>|/gi, ' 

    '); + // Walk into nodes if it has a start + if (node[startName]) + return node[startName]; - set(); + // Return the sibling if it has one + if (node !== root_node) { + sibling = node[siblingName]; - if (t.settings.fix_ie_paragraphs) { - // Check for odd paragraphs this is a sign of a broken DOM - nl = e.getElementsByTagName("p"); - for (i = nl.length - 1, x = 0; i >= 0; i--) { - n = nl[i]; + if (sibling) + return sibling; - if (!n.hasChildNodes()) { - if (!n._mce_keep) { - x = 1; // Is broken - break; - } + // Walk up the parents to look for siblings + for (parent = node.parent; parent && parent !== root_node; parent = parent.parent) { + sibling = parent[siblingName]; - n.removeAttribute('_mce_keep'); - } - } - } + if (sibling) + return sibling; + } + } + }; - // Time to fix the madness IE left us - if (x) { - // So if we replace the p elements with divs and mark them and then replace them back to paragraphs - // after we use innerHTML we can fix the DOM tree - h = h.replace(/

    ]+)>|

    /ig, '

    '); - h = h.replace(/<\/p>/gi, '
    '); + function Node(name, type) { + this.name = name; + this.type = type; - // Set the new HTML with DIVs - set(); + if (type === 1) { + this.attributes = []; + this.attributes.map = {}; + } + } + + tinymce.extend(Node.prototype, { + replace : function(node) { + var self = this; - // Replace all DIV elements with the _mce_tmp attibute back to paragraphs - // This is needed since IE has a annoying bug see above for details - // This is a slow process but it has to be done. :( - if (t.settings.fix_ie_paragraphs) { - nl = e.getElementsByTagName("DIV"); - for (i = nl.length - 1; i >= 0; i--) { - n = nl[i]; + if (node.parent) + node.remove(); - // Is it a temp div - if (n._mce_tmp) { - // Create new paragraph - p = t.doc.createElement('p'); + self.insert(node, self); + self.remove(); - // Copy all attributes - n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi, function(a, b) { - var v; + return self; + }, - if (b !== '_mce_tmp') { - v = n.getAttribute(b); + attr : function(name, value) { + var self = this, attrs, i, undef; - if (!v && b === 'class') - v = n.className; + if (typeof name !== "string") { + for (i in name) + self.attr(i, name[i]); - p.setAttribute(b, v); - } - }); + return self; + } - // Append all children to new paragraph - for (x = 0; x]+)\/>|/gi, '', h); // Force open + clone.value = self.value; + clone.shortEnded = self.shortEnded; - // Store away src and href in _mce_src and mce_href since browsers mess them up - if (s.keep_values) { - // Wrap scripts and styles in comments for serialization purposes - if (/)/g, '\n'); - s = s.replace(/^[\r\n]*|[\r\n]*$/g, ''); - s = s.replace(/^\s*(\/\/\s*|\]\]>|-->|\]\]-->)\s*$/g, ''); + return clone; + }, - return s; - }; + wrap : function(wrapper) { + var self = this; - // Wrap the script contents in CDATA and keep them from executing - h = h.replace(/]+|)>([\s\S]*?)<\/script>/gi, function(v, attribs, text) { - // Force type attribute - if (!attribs) - attribs = ' type="text/javascript"'; + self.parent.insert(wrapper, self); + wrapper.append(self); - // Convert the src attribute of the scripts - attribs = attribs.replace(/src=\"([^\"]+)\"?/i, function(a, url) { - if (s.url_converter) - url = t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(url), 'src', 'script')); + return self; + }, - return '_mce_src="' + url + '"'; - }); + unwrap : function() { + var self = this, node, next; - // Wrap text contents - if (tinymce.trim(text)) { - codeBlocks.push(trim(text)); - text = ''; - } + for (node = self.firstChild; node; ) { + next = node.next; + self.insert(node, self, true); + node = next; + } - return '' + text + ''; - }); + self.remove(); + }, - // Wrap style elements - h = h.replace(/]+|)>([\s\S]*?)<\/style>/gi, function(v, attribs, text) { - // Wrap text contents - if (text) { - codeBlocks.push(trim(text)); - text = ''; - } + remove : function() { + var self = this, parent = self.parent, next = self.next, prev = self.prev; - return '' + text + ''; - }); + if (parent) { + if (parent.firstChild === self) { + parent.firstChild = next; - // Wrap noscript elements - h = h.replace(/]+|)>([\s\S]*?)<\/noscript>/g, function(v, attribs, text) { - return ''; - }); + if (next) + next.prev = null; + } else { + prev.next = next; } - h = tinymce._replace(//g, '', h); + if (parent.lastChild === self) { + parent.lastChild = prev; - // This function processes the attributes in the HTML string to force boolean - // attributes to the attr="attr" format and convert style, src and href to _mce_ versions - function processTags(html) { - return html.replace(tagRegExp, function(match, elm_name, attrs, end) { - return '<' + elm_name + attrs.replace(attrRegExp, function(match, name, value, val2, val3) { - var mceValue; + if (prev) + prev.next = null; + } else { + next.prev = prev; + } - name = name.toLowerCase(); - value = value || val2 || val3 || ""; + self.parent = self.next = self.prev = null; + } - // Treat boolean attributes - if (boolAttrs[name]) { - // false or 0 is treated as a missing attribute - if (value === 'false' || value === '0') - return; + return self; + }, - return name + '="' + name + '"'; - } + append : function(node) { + var self = this, last; - // Is attribute one that needs special treatment - if (mceAttribs[name] && attrs.indexOf('_mce_' + name) == -1) { - mceValue = t.decode(value); + if (node.parent) + node.remove(); - // Convert URLs to relative/absolute ones - if (s.url_converter && (name == "src" || name == "href")) - mceValue = s.url_converter.call(s.url_converter_scope || t, mceValue, name, elm_name); + last = self.lastChild; + if (last) { + last.next = node; + node.prev = last; + self.lastChild = node; + } else + self.lastChild = self.firstChild = node; - // Process styles lowercases them and compresses them - if (name == 'style') - mceValue = t.serializeStyle(t.parseStyle(mceValue), name); + node.parent = self; - return name + '="' + value + '"' + ' _mce_' + name + '="' + t.encode(mceValue) + '"'; - } + return node; + }, - return match; - }) + end + '>'; - }); - }; + insert : function(node, ref_node, before) { + var parent; - h = processTags(h); + if (node.parent) + node.remove(); - // Restore script blocks - h = h.replace(/MCE_SCRIPT:([0-9]+)/g, function(val, idx) { - return codeBlocks[idx]; - }); - } + parent = ref_node.parent || this; - return h; - }, + if (before) { + if (ref_node === parent.firstChild) + parent.firstChild = node; + else + ref_node.prev.next = node; - getOuterHTML : function(e) { - var d; + node.prev = ref_node.prev; + node.next = ref_node; + ref_node.prev = node; + } else { + if (ref_node === parent.lastChild) + parent.lastChild = node; + else + ref_node.next.prev = node; - e = this.get(e); + node.next = ref_node.next; + node.prev = ref_node; + ref_node.next = node; + } - if (!e) - return null; + node.parent = parent; + + return node; + }, - if (e.outerHTML !== undefined) - return e.outerHTML; + getAll : function(name) { + var self = this, node, collection = []; - d = (e.ownerDocument || this.doc).createElement("body"); - d.appendChild(e.cloneNode(true)); + for (node = self.firstChild; node; node = walk(node, self)) { + if (node.name === name) + collection.push(node); + } - return d.innerHTML; + return collection; }, - setOuterHTML : function(e, h, d) { - var t = this; + empty : function() { + var self = this, nodes, i, node; - function setHTML(e, h, d) { - var n, tp; + // Remove all children + if (self.firstChild) { + nodes = []; - tp = d.createElement("body"); - tp.innerHTML = h; + // Collect the children + for (node = self.firstChild; node; node = walk(node, self)) + nodes.push(node); - n = tp.lastChild; - while (n) { - t.insertAfter(n.cloneNode(true), e); - n = n.previousSibling; + // Remove the children + i = nodes.length; + while (i--) { + node = nodes[i]; + node.parent = node.firstChild = node.lastChild = node.next = node.prev = null; } + } - t.remove(e); - }; + self.firstChild = self.lastChild = null; - return this.run(e, function(e) { - e = t.get(e); + return self; + }, - // Only set HTML on elements - if (e.nodeType == 1) { - d = d || e.ownerDocument || t.doc; + isEmpty : function(elements) { + var self = this, node = self.firstChild, i, name; - if (isIE) { - try { - // Try outerHTML for IE it sometimes produces an unknown runtime error - if (isIE && e.nodeType == 1) - e.outerHTML = h; - else - setHTML(e, h, d); - } catch (ex) { - // Fix for unknown runtime error - setHTML(e, h, d); + if (node) { + do { + if (node.type === 1) { + // Ignore bogus elements + if (node.attributes.map['data-mce-bogus']) + continue; + + // Keep empty elements like + if (elements[node.name]) + return false; + + // Keep elements with data attributes or name attribute like + i = node.attributes.length; + while (i--) { + name = node.attributes[i].name; + if (name === "name" || name.indexOf('data-') === 0) + return false; } - } else - setHTML(e, h, d); - } - }); + } + + // Keep non whitespace text nodes + if ((node.type === 3 && !whiteSpaceRegExp.test(node.value))) + return false; + } while (node = walk(node, self)); + } + + return true; }, - decode : function(s) { - var e, n, v; + walk : function(prev) { + return walk(this, null, prev); + } + }); - // Look for entities to decode - if (/&[\w#]+;/.test(s)) { - // Decode the entities using a div element not super efficient but less code - e = this.doc.createElement("div"); - e.innerHTML = s; - n = e.firstChild; - v = ''; + tinymce.extend(Node, { + create : function(name, attrs) { + var node, attrName; - if (n) { - do { - v += n.nodeValue; - } while (n = n.nextSibling); - } + // Create node + node = new Node(name, typeLookup[name] || 1); - return v || s; + // Add attributes if needed + if (attrs) { + for (attrName in attrs) + node.attr(attrName, attrs[attrName]); } - return s; - }, + return node; + } + }); - encode : function(str) { - return ('' + str).replace(encodeCharsRe, function(chr) { - return encodedChars[chr]; - }); - }, + tinymce.html.Node = Node; +})(tinymce); - insertAfter : function(node, reference_node) { - reference_node = this.get(reference_node); +(function(tinymce) { + var Node = tinymce.html.Node; - return this.run(node, function(node) { - var parent, nextSibling; + tinymce.html.DomParser = function(settings, schema) { + var self = this, nodeFilters = {}, attributeFilters = [], matchedNodes = {}, matchedAttributes = {}; - parent = reference_node.parentNode; - nextSibling = reference_node.nextSibling; + settings = settings || {}; + settings.validate = "validate" in settings ? settings.validate : true; + settings.root_name = settings.root_name || 'body'; + self.schema = schema = schema || new tinymce.html.Schema(); - if (nextSibling) - parent.insertBefore(node, nextSibling); - else - parent.appendChild(node); + function fixInvalidChildren(nodes) { + var ni, node, parent, parents, newParent, currentNode, tempNode, childNode, i, + childClone, nonEmptyElements, nonSplitableElements, sibling, nextNode; - return node; - }); - }, + nonSplitableElements = tinymce.makeMap('tr,td,th,tbody,thead,tfoot,table'); + nonEmptyElements = schema.getNonEmptyElements(); - isBlock : function(n) { - if (n.nodeType && n.nodeType !== 1) - return false; + for (ni = 0; ni < nodes.length; ni++) { + node = nodes[ni]; - n = n.nodeName || n; + // Already removed + if (!node.parent) + continue; - return blockRe.test(n); - }, + // Get list of all parent nodes until we find a valid parent to stick the child into + parents = [node]; + for (parent = node.parent; parent && !schema.isValidChild(parent.name, node.name) && !nonSplitableElements[parent.name]; parent = parent.parent) + parents.push(parent); - replace : function(n, o, k) { - var t = this; + // Found a suitable parent + if (parent && parents.length > 1) { + // Reverse the array since it makes looping easier + parents.reverse(); - if (is(o, 'array')) - n = n.cloneNode(true); + // Clone the related parent and insert that after the moved node + newParent = currentNode = self.filterNode(parents[0].clone()); - return t.run(o, function(o) { - if (k) { - each(tinymce.grep(o.childNodes), function(c) { - n.appendChild(c); - }); - } + // Start cloning and moving children on the left side of the target node + for (i = 0; i < parents.length - 1; i++) { + if (schema.isValidChild(currentNode.name, parents[i].name)) { + tempNode = self.filterNode(parents[i].clone()); + currentNode.append(tempNode); + } else + tempNode = currentNode; - return o.parentNode.replaceChild(n, o); - }); - }, + for (childNode = parents[i].firstChild; childNode && childNode != parents[i + 1]; ) { + nextNode = childNode.next; + tempNode.append(childNode); + childNode = nextNode; + } - rename : function(elm, name) { - var t = this, newElm; + currentNode = tempNode; + } - if (elm.nodeName != name.toUpperCase()) { - // Rename block element - newElm = t.create(name); + if (!newParent.isEmpty(nonEmptyElements)) { + parent.insert(newParent, parents[0], true); + parent.insert(node, newParent); + } else { + parent.insert(node, parents[0], true); + } - // Copy attribs to new block - each(t.getAttribs(elm), function(attr_node) { - t.setAttrib(newElm, attr_node.nodeName, t.getAttrib(elm, attr_node.nodeName)); - }); + // Check if the element is empty by looking through it's contents and special treatment for


    + parent = parents[0]; + if (parent.isEmpty(nonEmptyElements) || parent.firstChild === parent.lastChild && parent.firstChild.name === 'br') { + parent.empty().remove(); + } + } else if (node.parent) { + // If it's an LI try to find a UL/OL for it or wrap it + if (node.name === 'li') { + sibling = node.prev; + if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) { + sibling.append(node); + continue; + } - // Replace block - t.replace(newElm, elm, 1); + sibling = node.next; + if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) { + sibling.insert(node, sibling.firstChild, true); + continue; + } + + node.wrap(self.filterNode(new Node('ul', 1))); + continue; + } + + // Try wrapping the element in a DIV + if (schema.isValidChild(node.parent.name, 'div') && schema.isValidChild('div', node.name)) { + node.wrap(self.filterNode(new Node('div', 1))); + } else { + // We failed wrapping it, then remove or unwrap it + if (node.name === 'style' || node.name === 'script') + node.empty().remove(); + else + node.unwrap(); + } + } } + }; - return newElm || elm; - }, + self.filterNode = function(node) { + var i, name, list; - findCommonAncestor : function(a, b) { - var ps = a, pe; + // Run element filters + if (name in nodeFilters) { + list = matchedNodes[name]; - while (ps) { - pe = b; + if (list) + list.push(node); + else + matchedNodes[name] = [node]; + } - while (pe && ps != pe) - pe = pe.parentNode; + // Run attribute filters + i = attributeFilters.length; + while (i--) { + name = attributeFilters[i].name; - if (ps == pe) - break; + if (name in node.attributes.map) { + list = matchedAttributes[name]; - ps = ps.parentNode; + if (list) + list.push(node); + else + matchedAttributes[name] = [node]; + } } - if (!ps && a.ownerDocument) - return a.ownerDocument.documentElement; + return node; + }; - return ps; - }, + self.addNodeFilter = function(name, callback) { + tinymce.each(tinymce.explode(name), function(name) { + var list = nodeFilters[name]; - toHex : function(s) { - var c = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s); + if (!list) + nodeFilters[name] = list = []; - function hex(s) { - s = parseInt(s).toString(16); + list.push(callback); + }); + }; - return s.length > 1 ? s : '0' + s; // 0 -> 00 + self.addAttributeFilter = function(name, callback) { + tinymce.each(tinymce.explode(name), function(name) { + var i; + + for (i = 0; i < attributeFilters.length; i++) { + if (attributeFilters[i].name === name) { + attributeFilters[i].callbacks.push(callback); + return; + } + } + + attributeFilters.push({name: name, callbacks: [callback]}); + }); + }; + + self.parse = function(html, args) { + var parser, rootNode, node, nodes, i, l, fi, fl, list, name, validate, + blockElements, startWhiteSpaceRegExp, invalidChildren = [], + endWhiteSpaceRegExp, allWhiteSpaceRegExp, whiteSpaceElements, children, nonEmptyElements, rootBlockName; + + args = args || {}; + matchedNodes = {}; + matchedAttributes = {}; + blockElements = tinymce.extend(tinymce.makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements()); + nonEmptyElements = schema.getNonEmptyElements(); + children = schema.children; + validate = settings.validate; + rootBlockName = "forced_root_block" in args ? args.forced_root_block : settings.forced_root_block; + + whiteSpaceElements = schema.getWhiteSpaceElements(); + startWhiteSpaceRegExp = /^[ \t\r\n]+/; + endWhiteSpaceRegExp = /[ \t\r\n]+$/; + allWhiteSpaceRegExp = /[ \t\r\n]+/g; + + function addRootBlocks() { + var node = rootNode.firstChild, next, rootBlockNode; + + while (node) { + next = node.next; + + if (node.type == 3 || (node.type == 1 && node.name !== 'p' && !blockElements[node.name] && !node.attr('data-mce-type'))) { + if (!rootBlockNode) { + // Create a new root block element + rootBlockNode = createNode(rootBlockName, 1); + rootNode.insert(rootBlockNode, node); + rootBlockNode.append(node); + } else + rootBlockNode.append(node); + } else { + rootBlockNode = null; + } + + node = next; + }; }; - if (c) { - s = '#' + hex(c[1]) + hex(c[2]) + hex(c[3]); + function createNode(name, type) { + var node = new Node(name, type), list; - return s; - } + if (name in nodeFilters) { + list = matchedNodes[name]; - return s; - }, + if (list) + list.push(node); + else + matchedNodes[name] = [node]; + } - getClasses : function() { - var t = this, cl = [], i, lo = {}, f = t.settings.class_filter, ov; + return node; + }; - if (t.classes) - return t.classes; + function removeWhitespaceBefore(node) { + var textNode, textVal, sibling; - function addClasses(s) { - // IE style imports - each(s.imports, function(r) { - addClasses(r); - }); + for (textNode = node.prev; textNode && textNode.type === 3; ) { + textVal = textNode.value.replace(endWhiteSpaceRegExp, ''); - each(s.cssRules || s.rules, function(r) { - // Real type or fake it on IE - switch (r.type || 1) { - // Rule - case 1: - if (r.selectorText) { - each(r.selectorText.split(','), function(v) { - v = v.replace(/^\s*|\s*$|^\s\./g, ""); + if (textVal.length > 0) { + textNode.value = textVal; + textNode = textNode.prev; + } else { + sibling = textNode.prev; + textNode.remove(); + textNode = sibling; + } + } + }; - // Is internal or it doesn't contain a class - if (/\.mce/.test(v) || !/\.[\w\-]+$/.test(v)) - return; + parser = new tinymce.html.SaxParser({ + validate : validate, + fix_self_closing : !validate, // Let the DOM parser handle
  • in
  • or

    in

    for better results - // Remove everything but class name - ov = v; - v = tinymce._replace(/.*\.([a-z0-9_\-]+).*/i, '$1', v); + cdata: function(text) { + node.append(createNode('#cdata', 4)).value = text; + }, - // Filter classes - if (f && !(v = f(v, ov))) - return; + text: function(text, raw) { + var textNode; - if (!lo[v]) { - cl.push({'class' : v}); - lo[v] = 1; - } - }); - } - break; + // Trim all redundant whitespace on non white space elements + if (!whiteSpaceElements[node.name]) { + text = text.replace(allWhiteSpaceRegExp, ' '); - // Import - case 3: - addClasses(r.styleSheet); - break; + if (node.lastChild && blockElements[node.lastChild.name]) + text = text.replace(startWhiteSpaceRegExp, ''); } - }); - }; - try { - each(t.doc.styleSheets, addClasses); - } catch (ex) { - // Ignore - } + // Do we need to create the node + if (text.length !== 0) { + textNode = createNode('#text', 3); + textNode.raw = !!raw; + node.append(textNode).value = text; + } + }, - if (cl.length > 0) - t.classes = cl; + comment: function(text) { + node.append(createNode('#comment', 8)).value = text; + }, - return cl; - }, + pi: function(name, text) { + node.append(createNode(name, 7)).value = text; + removeWhitespaceBefore(node); + }, - run : function(e, f, s) { - var t = this, o; + doctype: function(text) { + var newNode; + + newNode = node.append(createNode('#doctype', 10)); + newNode.value = text; + removeWhitespaceBefore(node); + }, - if (t.doc && typeof(e) === 'string') - e = t.get(e); + start: function(name, attrs, empty) { + var newNode, attrFiltersLen, elementRule, textNode, attrName, text, sibling, parent; - if (!e) - return false; + elementRule = validate ? schema.getElementRule(name) : {}; + if (elementRule) { + newNode = createNode(elementRule.outputName || name, 1); + newNode.attributes = attrs; + newNode.shortEnded = empty; - s = s || this; - if (!e.nodeType && (e.length || e.length === 0)) { - o = []; + node.append(newNode); - each(e, function(e, i) { - if (e) { - if (typeof(e) == 'string') - e = t.doc.getElementById(e); + // Check if node is valid child of the parent node is the child is + // unknown we don't collect it since it's probably a custom element + parent = children[node.name]; + if (parent && children[newNode.name] && !parent[newNode.name]) + invalidChildren.push(newNode); - o.push(f.call(s, e, i)); + attrFiltersLen = attributeFilters.length; + while (attrFiltersLen--) { + attrName = attributeFilters[attrFiltersLen].name; + + if (attrName in attrs.map) { + list = matchedAttributes[attrName]; + + if (list) + list.push(newNode); + else + matchedAttributes[attrName] = [newNode]; + } + } + + // Trim whitespace before block + if (blockElements[name]) + removeWhitespaceBefore(newNode); + + // Change current node if the element wasn't empty i.e not
    or + if (!empty) + node = newNode; } - }); + }, - return o; - } + end: function(name) { + var textNode, elementRule, text, sibling, tempNode; - return f.call(s, e); - }, + elementRule = validate ? schema.getElementRule(name) : {}; + if (elementRule) { + if (blockElements[name]) { + if (!whiteSpaceElements[node.name]) { + // Trim whitespace at beginning of block + for (textNode = node.firstChild; textNode && textNode.type === 3; ) { + text = textNode.value.replace(startWhiteSpaceRegExp, ''); - getAttribs : function(n) { - var o; + if (text.length > 0) { + textNode.value = text; + textNode = textNode.next; + } else { + sibling = textNode.next; + textNode.remove(); + textNode = sibling; + } + } - n = this.get(n); + // Trim whitespace at end of block + for (textNode = node.lastChild; textNode && textNode.type === 3; ) { + text = textNode.value.replace(endWhiteSpaceRegExp, ''); - if (!n) - return []; + if (text.length > 0) { + textNode.value = text; + textNode = textNode.prev; + } else { + sibling = textNode.prev; + textNode.remove(); + textNode = sibling; + } + } + } - if (isIE) { - o = []; + // Trim start white space + textNode = node.prev; + if (textNode && textNode.type === 3) { + text = textNode.value.replace(startWhiteSpaceRegExp, ''); - // Object will throw exception in IE - if (n.nodeName == 'OBJECT') - return n.attributes; + if (text.length > 0) + textNode.value = text; + else + textNode.remove(); + } + } - // IE doesn't keep the selected attribute if you clone option elements - if (n.nodeName === 'OPTION' && this.getAttrib(n, 'selected')) - o.push({specified : 1, nodeName : 'selected'}); + // Handle empty nodes + if (elementRule.removeEmpty || elementRule.paddEmpty) { + if (node.isEmpty(nonEmptyElements)) { + if (elementRule.paddEmpty) + node.empty().append(new Node('#text', '3')).value = '\u00a0'; + else { + // Leave nodes that have a name like + if (!node.attributes.map.name) { + tempNode = node.parent; + node.empty().remove(); + node = tempNode; + return; + } + } + } + } - // It's crazy that this is faster in IE but it's because it returns all attributes all the time - n.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi, '').replace(/[\w:\-]+/gi, function(a) { - o.push({specified : 1, nodeName : a}); - }); + node = node.parent; + } + } + }, schema); - return o; - } + rootNode = node = new Node(args.context || settings.root_name, 11); - return n.attributes; - }, + parser.parse(html); - destroy : function(s) { - var t = this; + // Fix invalid children or report invalid children in a contextual parsing + if (validate && invalidChildren.length) { + if (!args.context) + fixInvalidChildren(invalidChildren); + else + args.invalid = true; + } - if (t.events) - t.events.destroy(); + // Wrap nodes in the root into block elements if the root is body + if (rootBlockName && rootNode.name == 'body') + addRootBlocks(); - t.win = t.doc = t.root = t.events = null; + // Run filters only when the contents is valid + if (!args.invalid) { + // Run node filters + for (name in matchedNodes) { + list = nodeFilters[name]; + nodes = matchedNodes[name]; - // Manual destroy then remove unload handler - if (!s) - tinymce.removeUnload(t.destroy); - }, + // Remove already removed children + fi = nodes.length; + while (fi--) { + if (!nodes[fi].parent) + nodes.splice(fi, 1); + } - createRng : function() { - var d = this.doc; + for (i = 0, l = list.length; i < l; i++) + list[i](nodes, name, args); + } - return d.createRange ? d.createRange() : new tinymce.dom.Range(this); - }, + // Run attribute filters + for (i = 0, l = attributeFilters.length; i < l; i++) { + list = attributeFilters[i]; - nodeIndex : function(node, normalized) { - var idx = 0, lastNodeType, lastNode, nodeType; + if (list.name in matchedAttributes) { + nodes = matchedAttributes[list.name]; - if (node) { - for (lastNodeType = node.nodeType, node = node.previousSibling, lastNode = node; node; node = node.previousSibling) { - nodeType = node.nodeType; + // Remove already removed children + fi = nodes.length; + while (fi--) { + if (!nodes[fi].parent) + nodes.splice(fi, 1); + } - // Normalize text nodes - if (normalized && nodeType == 3) { - if (nodeType == lastNodeType || !node.nodeValue.length) - continue; + for (fi = 0, fl = list.callbacks.length; fi < fl; fi++) + list.callbacks[fi](nodes, list.name, args); } - - idx++; - lastNodeType = nodeType; } } - return idx; - }, + return rootNode; + }; - split : function(pe, e, re) { - var t = this, r = t.createRng(), bef, aft, pa; + // Remove
    at end of block elements Gecko and WebKit injects BR elements to + // make it possible to place the caret inside empty blocks. This logic tries to remove + // these elements and keep br elements that where intended to be there intact + if (settings.remove_trailing_brs) { + self.addNodeFilter('br', function(nodes, name) { + var i, l = nodes.length, node, blockElements = schema.getBlockElements(), + nonEmptyElements = schema.getNonEmptyElements(), parent, prev, prevName; + + // Remove brs from body element as well + blockElements.body = 1; + + // Must loop forwards since it will otherwise remove all brs in

    a


    + for (i = 0; i < l; i++) { + node = nodes[i]; + parent = node.parent; + + if (blockElements[node.parent.name] && node === parent.lastChild) { + // Loop all nodes to the right of the current node and check for other BR elements + // excluding bookmarks since they are invisible + prev = node.prev; + while (prev) { + prevName = prev.name; + + // Ignore bookmarks + if (prevName !== "span" || prev.attr('data-mce-type') !== 'bookmark') { + // Found a non BR element + if (prevName !== "br") + break; + + // Found another br it's a

    structure then don't remove anything + if (prevName === 'br') { + node = null; + break; + } + } - // W3C valid browsers tend to leave empty nodes to the left/right side of the contents, this makes sense - // but we don't want that in our code since it serves no purpose for the end user - // For example if this is chopped: - //

    text 1CHOPtext 2

    - // would produce: - //

    text 1

    CHOP

    text 2

    - // this function will then trim of empty edges and produce: - //

    text 1

    CHOP

    text 2

    - function trim(node) { - var i, children = node.childNodes; + prev = prev.prev; + } - if (node.nodeType == 1 && node.getAttribute('_mce_type') == 'bookmark') - return; + if (node) { + node.remove(); - for (i = children.length - 1; i >= 0; i--) - trim(children[i]); + // Is the parent to be considered empty after we removed the BR + if (parent.isEmpty(nonEmptyElements)) { + elementRule = schema.getElementRule(parent.name); - if (node.nodeType != 9) { - // Keep non whitespace text nodes - if (node.nodeType == 3 && node.nodeValue.length > 0) { - // If parent element isn't a block or there isn't any useful contents for example "

    " - if (!t.isBlock(node.parentNode) || tinymce.trim(node.nodeValue).length > 0) - return; + // Remove or padd the element depending on schema rule + if (elementRule.removeEmpty) + parent.remove(); + else if (elementRule.paddEmpty) + parent.empty().append(new tinymce.html.Node('#text', 3)).value = '\u00a0'; + } + } } + } + }); + } + } +})(tinymce); - if (node.nodeType == 1) { - // If the only child is a bookmark then move it up - children = node.childNodes; - if (children.length == 1 && children[0] && children[0].nodeType == 1 && children[0].getAttribute('_mce_type') == 'bookmark') - node.parentNode.insertBefore(children[0], node); +tinymce.html.Writer = function(settings) { + var html = [], indent, indentBefore, indentAfter, encode, htmlOutput; - // Keep non empty elements or img, hr etc - if (children.length || /^(br|hr|input|img)$/i.test(node.nodeName)) - return; - } + settings = settings || {}; + indent = settings.indent; + indentBefore = tinymce.makeMap(settings.indent_before || ''); + indentAfter = tinymce.makeMap(settings.indent_after || ''); + encode = tinymce.html.Entities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities); + htmlOutput = settings.element_format == "html"; - t.remove(node); - } + return { + start: function(name, attrs, empty) { + var i, l, attr, value; - return node; - }; + if (indent && indentBefore[name] && html.length > 0) { + value = html[html.length - 1]; - if (pe && e) { - // Get before chunk - r.setStart(pe.parentNode, t.nodeIndex(pe)); - r.setEnd(e.parentNode, t.nodeIndex(e)); - bef = r.extractContents(); + if (value.length > 0 && value !== '\n') + html.push('\n'); + } - // Get after chunk - r = t.createRng(); - r.setStart(e.parentNode, t.nodeIndex(e) + 1); - r.setEnd(pe.parentNode, t.nodeIndex(pe) + 1); - aft = r.extractContents(); + html.push('<', name); - // Insert before chunk - pa = pe.parentNode; - pa.insertBefore(trim(bef), pe); + if (attrs) { + for (i = 0, l = attrs.length; i < l; i++) { + attr = attrs[i]; + html.push(' ', attr.name, '="', encode(attr.value, true), '"'); + } + } - // Insert middle chunk - if (re) - pa.replaceChild(re, e); - else - pa.insertBefore(e, pe); + if (!empty || htmlOutput) + html[html.length] = '>'; + else + html[html.length] = ' />'; - // Insert after chunk - pa.insertBefore(trim(aft), pe); - t.remove(pe); + if (empty && indent && indentAfter[name] && html.length > 0) { + value = html[html.length - 1]; - return re || e; + if (value.length > 0 && value !== '\n') + html.push('\n'); } }, - bind : function(target, name, func, scope) { - var t = this; + end: function(name) { + var value; - if (!t.events) - t.events = new tinymce.dom.EventUtils(); + /*if (indent && indentBefore[name] && html.length > 0) { + value = html[html.length - 1]; - return t.events.add(target, name, func, scope || this); - }, + if (value.length > 0 && value !== '\n') + html.push('\n'); + }*/ - unbind : function(target, name, func) { - var t = this; + html.push(''); - if (!t.events) - t.events = new tinymce.dom.EventUtils(); + if (indent && indentAfter[name] && html.length > 0) { + value = html[html.length - 1]; - return t.events.remove(target, name, func); + if (value.length > 0 && value !== '\n') + html.push('\n'); + } }, + text: function(text, raw) { + if (text.length > 0) + html[html.length] = raw ? text : encode(text); + }, - _findSib : function(node, selector, name) { - var t = this, f = selector; + cdata: function(text) { + html.push(''); + }, - if (node) { - // If expression make a function of it using is - if (is(f, 'string')) { - f = function(node) { - return t.is(node, selector); - }; - } + comment: function(text) { + html.push(''); + }, - // Loop all siblings - for (node = node[name]; node; node = node[name]) { - if (f(node)) - return node; - } - } + pi: function(name, text) { + if (text) + html.push(''); + else + html.push(''); - return null; + if (indent) + html.push('\n'); }, - _isRes : function(c) { - // Is live resizble element - return /^(top|left|bottom|right|width|height)/i.test(c) || /;\s*(top|left|bottom|right|width|height)/i.test(c); - } + doctype: function(text) { + html.push('', indent ? '\n' : ''); + }, - /* - walk : function(n, f, s) { - var d = this.doc, w; + reset: function() { + html.length = 0; + }, - if (d.createTreeWalker) { - w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); - - while ((n = w.nextNode()) != null) - f.call(s || this, n); - } else - tinymce.walk(n, f, 'childNodes', s); + getContent: function() { + return html.join('').replace(/\n$/, ''); } - */ + }; +}; - /* - toRGB : function(s) { - var c = /^\s*?#([0-9A-F]{2})([0-9A-F]{1,2})([0-9A-F]{2})?\s*?$/.exec(s); +(function(tinymce) { + tinymce.html.Serializer = function(settings, schema) { + var self = this, writer = new tinymce.html.Writer(settings); - if (c) { - // #FFF -> #FFFFFF - if (!is(c[3])) - c[3] = c[2] = c[1]; + settings = settings || {}; + settings.validate = "validate" in settings ? settings.validate : true; - return "rgb(" + parseInt(c[1], 16) + "," + parseInt(c[2], 16) + "," + parseInt(c[3], 16) + ")"; - } + self.schema = schema = schema || new tinymce.html.Schema(); + self.writer = writer; - return s; - } - */ - }); + self.serialize = function(node) { + var handlers, validate; - tinymce.DOM = new tinymce.dom.DOMUtils(document, {process_html : 0}); -})(tinymce); + validate = settings.validate; -(function(ns) { - // Range constructor - function Range(dom) { - var t = this, - doc = dom.doc, - EXTRACT = 0, - CLONE = 1, - DELETE = 2, - TRUE = true, - FALSE = false, - START_OFFSET = 'startOffset', - START_CONTAINER = 'startContainer', - END_CONTAINER = 'endContainer', - END_OFFSET = 'endOffset', - extend = tinymce.extend, - nodeIndex = dom.nodeIndex; + handlers = { + // #text + 3: function(node, raw) { + writer.text(node.value, node.raw); + }, - extend(t, { - // Inital states - startContainer : doc, - startOffset : 0, - endContainer : doc, - endOffset : 0, - collapsed : TRUE, - commonAncestorContainer : doc, + // #comment + 8: function(node) { + writer.comment(node.value); + }, - // Range constants - START_TO_START : 0, - START_TO_END : 1, - END_TO_END : 2, - END_TO_START : 3, + // Processing instruction + 7: function(node) { + writer.pi(node.name, node.value); + }, - // Public methods - setStart : setStart, - setEnd : setEnd, - setStartBefore : setStartBefore, - setStartAfter : setStartAfter, - setEndBefore : setEndBefore, - setEndAfter : setEndAfter, - collapse : collapse, - selectNode : selectNode, - selectNodeContents : selectNodeContents, - compareBoundaryPoints : compareBoundaryPoints, - deleteContents : deleteContents, - extractContents : extractContents, - cloneContents : cloneContents, - insertNode : insertNode, - surroundContents : surroundContents, - cloneRange : cloneRange - }); + // Doctype + 10: function(node) { + writer.doctype(node.value); + }, - function setStart(n, o) { - _setEndPoint(TRUE, n, o); - }; + // CDATA + 4: function(node) { + writer.cdata(node.value); + }, - function setEnd(n, o) { - _setEndPoint(FALSE, n, o); - }; + // Document fragment + 11: function(node) { + if ((node = node.firstChild)) { + do { + walk(node); + } while (node = node.next); + } + } + }; - function setStartBefore(n) { - setStart(n.parentNode, nodeIndex(n)); - }; + writer.reset(); - function setStartAfter(n) { - setStart(n.parentNode, nodeIndex(n) + 1); - }; + function walk(node) { + var handler = handlers[node.type], name, isEmpty, attrs, attrName, attrValue, sortedAttrs, i, l, elementRule; - function setEndBefore(n) { - setEnd(n.parentNode, nodeIndex(n)); - }; + if (!handler) { + name = node.name; + isEmpty = node.shortEnded; + attrs = node.attributes; - function setEndAfter(n) { - setEnd(n.parentNode, nodeIndex(n) + 1); - }; + // Sort attributes + if (validate && attrs && attrs.length > 1) { + sortedAttrs = []; + sortedAttrs.map = {}; - function collapse(ts) { - if (ts) { - t[END_CONTAINER] = t[START_CONTAINER]; - t[END_OFFSET] = t[START_OFFSET]; - } else { - t[START_CONTAINER] = t[END_CONTAINER]; - t[START_OFFSET] = t[END_OFFSET]; - } + elementRule = schema.getElementRule(node.name); + for (i = 0, l = elementRule.attributesOrder.length; i < l; i++) { + attrName = elementRule.attributesOrder[i]; - t.collapsed = TRUE; - }; + if (attrName in attrs.map) { + attrValue = attrs.map[attrName]; + sortedAttrs.map[attrName] = attrValue; + sortedAttrs.push({name: attrName, value: attrValue}); + } + } - function selectNode(n) { - setStartBefore(n); - setEndAfter(n); - }; + for (i = 0, l = attrs.length; i < l; i++) { + attrName = attrs[i].name; - function selectNodeContents(n) { - setStart(n, 0); - setEnd(n, n.nodeType === 1 ? n.childNodes.length : n.nodeValue.length); - }; + if (!(attrName in sortedAttrs.map)) { + attrValue = attrs.map[attrName]; + sortedAttrs.map[attrName] = attrValue; + sortedAttrs.push({name: attrName, value: attrValue}); + } + } - function compareBoundaryPoints(h, r) { - var sc = t[START_CONTAINER], so = t[START_OFFSET], ec = t[END_CONTAINER], eo = t[END_OFFSET]; + attrs = sortedAttrs; + } - // Check START_TO_START - if (h === 0) - return _compareBoundaryPoints(sc, so, sc, so); + writer.start(node.name, attrs, isEmpty); - // Check START_TO_END - if (h === 1) - return _compareBoundaryPoints(sc, so, ec, eo); + if (!isEmpty) { + if ((node = node.firstChild)) { + do { + walk(node); + } while (node = node.next); + } - // Check END_TO_END - if (h === 2) - return _compareBoundaryPoints(ec, eo, ec, eo); + writer.end(name); + } + } else + handler(node); + } - // Check END_TO_START - if (h === 3) - return _compareBoundaryPoints(ec, eo, sc, so); - }; + // Serialize element and treat all non elements as fragments + if (node.type == 1 && !settings.inner) + walk(node); + else + handlers[11](node); - function deleteContents() { - _traverse(DELETE); + return writer.getContent(); }; + } +})(tinymce); - function extractContents() { - return _traverse(EXTRACT); - }; +(function(tinymce) { + // Shorten names + var each = tinymce.each, + is = tinymce.is, + isWebKit = tinymce.isWebKit, + isIE = tinymce.isIE, + Entities = tinymce.html.Entities, + simpleSelectorRe = /^([a-z0-9],?)+$/i, + blockElementsMap = tinymce.html.Schema.blockElementsMap, + whiteSpaceRegExp = /^[ \t\r\n]*$/; - function cloneContents() { - return _traverse(CLONE); - }; + tinymce.create('tinymce.dom.DOMUtils', { + doc : null, + root : null, + files : null, + pixelStyles : /^(top|left|bottom|right|width|height|borderWidth)$/, + props : { + "for" : "htmlFor", + "class" : "className", + className : "className", + checked : "checked", + disabled : "disabled", + maxlength : "maxLength", + readonly : "readOnly", + selected : "selected", + value : "value", + id : "id", + name : "name", + type : "type" + }, - function insertNode(n) { - var startContainer = this[START_CONTAINER], - startOffset = this[START_OFFSET], nn, o; + DOMUtils : function(d, s) { + var t = this, globalStyle, name; - // Node is TEXT_NODE or CDATA - if ((startContainer.nodeType === 3 || startContainer.nodeType === 4) && startContainer.nodeValue) { - if (!startOffset) { - // At the start of text - startContainer.parentNode.insertBefore(n, startContainer); - } else if (startOffset >= startContainer.nodeValue.length) { - // At the end of text - dom.insertAfter(n, startContainer); - } else { - // Middle, need to split - nn = startContainer.splitText(startOffset); - startContainer.parentNode.insertBefore(n, nn); - } - } else { - // Insert element node - if (startContainer.childNodes.length > 0) - o = startContainer.childNodes[startOffset]; + t.doc = d; + t.win = window; + t.files = {}; + t.cssFlicker = false; + t.counter = 0; + t.stdMode = !tinymce.isIE || d.documentMode >= 8; + t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat" || t.stdMode; + t.hasOuterHTML = "outerHTML" in d.createElement("a"); - if (o) - startContainer.insertBefore(n, o); - else - startContainer.appendChild(n); + t.settings = s = tinymce.extend({ + keep_values : false, + hex_colors : 1 + }, s); + + t.schema = s.schema; + t.styles = new tinymce.html.Styles({ + url_converter : s.url_converter, + url_converter_scope : s.url_converter_scope + }, s.schema); + + // Fix IE6SP2 flicker and check it failed for pre SP2 + if (tinymce.isIE6) { + try { + d.execCommand('BackgroundImageCache', false, true); + } catch (e) { + t.cssFlicker = true; + } } - }; - function surroundContents(n) { - var f = t.extractContents(); + if (isIE && s.schema) { + // Add missing HTML 4/5 elements to IE + ('abbr article aside audio canvas ' + + 'details figcaption figure footer ' + + 'header hgroup mark menu meter nav ' + + 'output progress section summary ' + + 'time video').replace(/\w+/g, function(name) { + d.createElement(name); + }); - t.insertNode(n); - n.appendChild(f); - t.selectNode(n); - }; + // Create all custom elements + for (name in s.schema.getCustomElements()) { + d.createElement(name); + } + } - function cloneRange() { - return extend(new Range(dom), { - startContainer : t[START_CONTAINER], - startOffset : t[START_OFFSET], - endContainer : t[END_CONTAINER], - endOffset : t[END_OFFSET], - collapsed : t.collapsed, - commonAncestorContainer : t.commonAncestorContainer - }); - }; + tinymce.addUnload(t.destroy, t); + }, - // Private methods + getRoot : function() { + var t = this, s = t.settings; - function _getSelectedNode(container, offset) { - var child; + return (s && t.get(s.root_element)) || t.doc.body; + }, - if (container.nodeType == 3 /* TEXT_NODE */) - return container; + getViewPort : function(w) { + var d, b; - if (offset < 0) - return container; + w = !w ? this.win : w; + d = w.document; + b = this.boxModel ? d.documentElement : d.body; - child = container.firstChild; - while (child && offset > 0) { - --offset; - child = child.nextSibling; - } + // Returns viewport size excluding scrollbars + return { + x : w.pageXOffset || b.scrollLeft, + y : w.pageYOffset || b.scrollTop, + w : w.innerWidth || b.clientWidth, + h : w.innerHeight || b.clientHeight + }; + }, - if (child) - return child; + getRect : function(e) { + var p, t = this, sr; - return container; - }; + e = t.get(e); + p = t.getPos(e); + sr = t.getSize(e); - function _isCollapsed() { - return (t[START_CONTAINER] == t[END_CONTAINER] && t[START_OFFSET] == t[END_OFFSET]); - }; + return { + x : p.x, + y : p.y, + w : sr.w, + h : sr.h + }; + }, - function _compareBoundaryPoints(containerA, offsetA, containerB, offsetB) { - var c, offsetC, n, cmnRoot, childA, childB; + getSize : function(e) { + var t = this, w, h; - // In the first case the boundary-points have the same container. A is before B - // if its offset is less than the offset of B, A is equal to B if its offset is - // equal to the offset of B, and A is after B if its offset is greater than the - // offset of B. - if (containerA == containerB) { - if (offsetA == offsetB) - return 0; // equal + e = t.get(e); + w = t.getStyle(e, 'width'); + h = t.getStyle(e, 'height'); - if (offsetA < offsetB) - return -1; // before + // Non pixel value, then force offset/clientWidth + if (w.indexOf('px') === -1) + w = 0; - return 1; // after - } + // Non pixel value, then force offset/clientWidth + if (h.indexOf('px') === -1) + h = 0; - // In the second case a child node C of the container of A is an ancestor - // container of B. In this case, A is before B if the offset of A is less than or - // equal to the index of the child node C and A is after B otherwise. - c = containerB; - while (c && c.parentNode != containerA) - c = c.parentNode; + return { + w : parseInt(w) || e.offsetWidth || e.clientWidth, + h : parseInt(h) || e.offsetHeight || e.clientHeight + }; + }, - if (c) { - offsetC = 0; - n = containerA.firstChild; + getParent : function(n, f, r) { + return this.getParents(n, f, r, false); + }, - while (n != c && offsetC < offsetA) { - offsetC++; - n = n.nextSibling; - } + getParents : function(n, f, r, c) { + var t = this, na, se = t.settings, o = []; - if (offsetA <= offsetC) - return -1; // before + n = t.get(n); + c = c === undefined; - return 1; // after - } + if (se.strict_root) + r = r || t.getRoot(); - // In the third case a child node C of the container of B is an ancestor container - // of A. In this case, A is before B if the index of the child node C is less than - // the offset of B and A is after B otherwise. - c = containerA; - while (c && c.parentNode != containerB) { - c = c.parentNode; + // Wrap node name as func + if (is(f, 'string')) { + na = f; + + if (f === '*') { + f = function(n) {return n.nodeType == 1;}; + } else { + f = function(n) { + return t.is(n, na); + }; + } } - if (c) { - offsetC = 0; - n = containerB.firstChild; + while (n) { + if (n == r || !n.nodeType || n.nodeType === 9) + break; - while (n != c && offsetC < offsetB) { - offsetC++; - n = n.nextSibling; + if (!f || f(n)) { + if (c) + o.push(n); + else + return n; } - if (offsetC < offsetB) - return -1; // before - - return 1; // after + n = n.parentNode; } - // In the fourth case, none of three other cases hold: the containers of A and B - // are siblings or descendants of sibling nodes. In this case, A is before B if - // the container of A is before the container of B in a pre-order traversal of the - // Ranges' context tree and A is after B otherwise. - cmnRoot = dom.findCommonAncestor(containerA, containerB); - childA = containerA; - - while (childA && childA.parentNode != cmnRoot) - childA = childA.parentNode; - - if (!childA) - childA = cmnRoot; + return c ? o : null; + }, - childB = containerB; - while (childB && childB.parentNode != cmnRoot) - childB = childB.parentNode; + get : function(e) { + var n; - if (!childB) - childB = cmnRoot; + if (e && this.doc && typeof(e) == 'string') { + n = e; + e = this.doc.getElementById(e); - if (childA == childB) - return 0; // equal + // IE and Opera returns meta elements when they match the specified input ID, but getElementsByName seems to do the trick + if (e && e.id !== n) + return this.doc.getElementsByName(n)[1]; + } - n = cmnRoot.firstChild; - while (n) { - if (n == childA) - return -1; // before + return e; + }, - if (n == childB) - return 1; // after + getNext : function(node, selector) { + return this._findSib(node, selector, 'nextSibling'); + }, - n = n.nextSibling; - } - }; + getPrev : function(node, selector) { + return this._findSib(node, selector, 'previousSibling'); + }, - function _setEndPoint(st, n, o) { - var ec, sc; - if (st) { - t[START_CONTAINER] = n; - t[START_OFFSET] = o; - } else { - t[END_CONTAINER] = n; - t[END_OFFSET] = o; - } + add : function(p, n, a, h, c) { + var t = this; - // If one boundary-point of a Range is set to have a root container - // other than the current one for the Range, the Range is collapsed to - // the new position. This enforces the restriction that both boundary- - // points of a Range must have the same root container. - ec = t[END_CONTAINER]; - while (ec.parentNode) - ec = ec.parentNode; + return this.run(p, function(p) { + var e, k; - sc = t[START_CONTAINER]; - while (sc.parentNode) - sc = sc.parentNode; + e = is(n, 'string') ? t.doc.createElement(n) : n; + t.setAttribs(e, a); - if (sc == ec) { - // The start position of a Range is guaranteed to never be after the - // end position. To enforce this restriction, if the start is set to - // be at a position after the end, the Range is collapsed to that - // position. - if (_compareBoundaryPoints(t[START_CONTAINER], t[START_OFFSET], t[END_CONTAINER], t[END_OFFSET]) > 0) - t.collapse(st); - } else - t.collapse(st); + if (h) { + if (h.nodeType) + e.appendChild(h); + else + t.setHTML(e, h); + } - t.collapsed = _isCollapsed(); - t.commonAncestorContainer = dom.findCommonAncestor(t[START_CONTAINER], t[END_CONTAINER]); - }; + return !c ? p.appendChild(e) : e; + }); + }, - function _traverse(how) { - var c, endContainerDepth = 0, startContainerDepth = 0, p, depthDiff, startNode, endNode, sp, ep; + create : function(n, a, h) { + return this.add(this.doc.createElement(n), n, a, h, 1); + }, - if (t[START_CONTAINER] == t[END_CONTAINER]) - return _traverseSameContainer(how); + createHTML : function(n, a, h) { + var o = '', t = this, k; - for (c = t[END_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { - if (p == t[START_CONTAINER]) - return _traverseCommonStartContainer(c, how); + o += '<' + n; - ++endContainerDepth; + for (k in a) { + if (a.hasOwnProperty(k)) + o += ' ' + k + '="' + t.encode(a[k]) + '"'; } - for (c = t[START_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { - if (p == t[END_CONTAINER]) - return _traverseCommonEndContainer(c, how); + // A call to tinymce.is doesn't work for some odd reason on IE9 possible bug inside their JS runtime + if (typeof(h) != "undefined") + return o + '>' + h + ''; - ++startContainerDepth; - } + return o + ' />'; + }, - depthDiff = startContainerDepth - endContainerDepth; + remove : function(node, keep_children) { + return this.run(node, function(node) { + var child, parent = node.parentNode; - startNode = t[START_CONTAINER]; - while (depthDiff > 0) { - startNode = startNode.parentNode; - depthDiff--; - } + if (!parent) + return null; - endNode = t[END_CONTAINER]; - while (depthDiff < 0) { - endNode = endNode.parentNode; - depthDiff++; - } + if (keep_children) { + while (child = node.firstChild) { + // IE 8 will crash if you don't remove completely empty text nodes + if (!tinymce.isIE || child.nodeType !== 3 || child.nodeValue) + parent.insertBefore(child, node); + else + node.removeChild(child); + } + } - // ascend the ancestor hierarchy until we have a common parent. - for (sp = startNode.parentNode, ep = endNode.parentNode; sp != ep; sp = sp.parentNode, ep = ep.parentNode) { - startNode = sp; - endNode = ep; - } + return parent.removeChild(node); + }); + }, - return _traverseCommonAncestors(startNode, endNode, how); - }; + setStyle : function(n, na, v) { + var t = this; - function _traverseSameContainer(how) { - var frag, s, sub, n, cnt, sibling, xferNode; + return t.run(n, function(e) { + var s, i; - if (how != DELETE) - frag = doc.createDocumentFragment(); + s = e.style; - // If selection is empty, just return the fragment - if (t[START_OFFSET] == t[END_OFFSET]) - return frag; + // Camelcase it, if needed + na = na.replace(/-(\D)/g, function(a, b){ + return b.toUpperCase(); + }); - // Text node needs special case handling - if (t[START_CONTAINER].nodeType == 3 /* TEXT_NODE */) { - // get the substring - s = t[START_CONTAINER].nodeValue; - sub = s.substring(t[START_OFFSET], t[END_OFFSET]); + // Default px suffix on these + if (t.pixelStyles.test(na) && (tinymce.is(v, 'number') || /^[\-0-9\.]+$/.test(v))) + v += 'px'; - // set the original text node to its new value - if (how != CLONE) { - t[START_CONTAINER].deleteData(t[START_OFFSET], t[END_OFFSET] - t[START_OFFSET]); + switch (na) { + case 'opacity': + // IE specific opacity + if (isIE) { + s.filter = v === '' ? '' : "alpha(opacity=" + (v * 100) + ")"; - // Nothing is partially selected, so collapse to start point - t.collapse(TRUE); - } + if (!n.currentStyle || !n.currentStyle.hasLayout) + s.display = 'inline-block'; + } - if (how == DELETE) - return; + // Fix for older browsers + s[na] = s['-moz-opacity'] = s['-khtml-opacity'] = v || ''; + break; - frag.appendChild(doc.createTextNode(sub)); - return frag; - } + case 'float': + isIE ? s.styleFloat = v : s.cssFloat = v; + break; + + default: + s[na] = v || ''; + } - // Copy nodes between the start/end offsets. - n = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]); - cnt = t[END_OFFSET] - t[START_OFFSET]; + // Force update of the style data + if (t.settings.update_styles) + t.setAttrib(e, 'data-mce-style'); + }); + }, - while (cnt > 0) { - sibling = n.nextSibling; - xferNode = _traverseFullySelected(n, how); + getStyle : function(n, na, c) { + n = this.get(n); - if (frag) - frag.appendChild( xferNode ); + if (!n) + return; - --cnt; - n = sibling; + // Gecko + if (this.doc.defaultView && c) { + // Remove camelcase + na = na.replace(/[A-Z]/g, function(a){ + return '-' + a; + }); + + try { + return this.doc.defaultView.getComputedStyle(n, null).getPropertyValue(na); + } catch (ex) { + // Old safari might fail + return null; + } } - // Nothing is partially selected, so collapse to start point - if (how != CLONE) - t.collapse(TRUE); + // Camelcase it, if needed + na = na.replace(/-(\D)/g, function(a, b){ + return b.toUpperCase(); + }); - return frag; - }; + if (na == 'float') + na = isIE ? 'styleFloat' : 'cssFloat'; - function _traverseCommonStartContainer(endAncestor, how) { - var frag, n, endIdx, cnt, sibling, xferNode; + // IE & Opera + if (n.currentStyle && c) + return n.currentStyle[na]; - if (how != DELETE) - frag = doc.createDocumentFragment(); + return n.style ? n.style[na] : undefined; + }, - n = _traverseRightBoundary(endAncestor, how); + setStyles : function(e, o) { + var t = this, s = t.settings, ol; - if (frag) - frag.appendChild(n); + ol = s.update_styles; + s.update_styles = 0; - endIdx = nodeIndex(endAncestor); - cnt = endIdx - t[START_OFFSET]; + each(o, function(v, n) { + t.setStyle(e, n, v); + }); - if (cnt <= 0) { - // Collapse to just before the endAncestor, which - // is partially selected. - if (how != CLONE) { - t.setEndBefore(endAncestor); - t.collapse(FALSE); + // Update style info + s.update_styles = ol; + if (s.update_styles) + t.setAttrib(e, s.cssText); + }, + + removeAllAttribs: function(e) { + return this.run(e, function(e) { + var i, attrs = e.attributes; + for (i = attrs.length - 1; i >= 0; i--) { + e.removeAttributeNode(attrs.item(i)); } + }); + }, - return frag; - } + setAttrib : function(e, n, v) { + var t = this; - n = endAncestor.previousSibling; - while (cnt > 0) { - sibling = n.previousSibling; - xferNode = _traverseFullySelected(n, how); + // Whats the point + if (!e || !n) + return; - if (frag) - frag.insertBefore(xferNode, frag.firstChild); + // Strict XML mode + if (t.settings.strict) + n = n.toLowerCase(); - --cnt; - n = sibling; - } + return this.run(e, function(e) { + var s = t.settings; - // Collapse to just before the endAncestor, which - // is partially selected. - if (how != CLONE) { - t.setEndBefore(endAncestor); - t.collapse(FALSE); - } + switch (n) { + case "style": + if (!is(v, 'string')) { + each(v, function(v, n) { + t.setStyle(e, n, v); + }); - return frag; - }; + return; + } - function _traverseCommonEndContainer(startAncestor, how) { - var frag, startIdx, n, cnt, sibling, xferNode; + // No mce_style for elements with these since they might get resized by the user + if (s.keep_values) { + if (v && !t._isRes(v)) + e.setAttribute('data-mce-style', v, 2); + else + e.removeAttribute('data-mce-style', 2); + } - if (how != DELETE) - frag = doc.createDocumentFragment(); + e.style.cssText = v; + break; - n = _traverseLeftBoundary(startAncestor, how); - if (frag) - frag.appendChild(n); + case "class": + e.className = v || ''; // Fix IE null bug + break; - startIdx = nodeIndex(startAncestor); - ++startIdx; // Because we already traversed it.... + case "src": + case "href": + if (s.keep_values) { + if (s.url_converter) + v = s.url_converter.call(s.url_converter_scope || t, v, n, e); - cnt = t[END_OFFSET] - startIdx; - n = startAncestor.nextSibling; - while (cnt > 0) { - sibling = n.nextSibling; - xferNode = _traverseFullySelected(n, how); + t.setAttrib(e, 'data-mce-' + n, v, 2); + } - if (frag) - frag.appendChild(xferNode); + break; - --cnt; - n = sibling; - } + case "shape": + e.setAttribute('data-mce-style', v); + break; + } - if (how != CLONE) { - t.setStartAfter(startAncestor); - t.collapse(TRUE); - } + if (is(v) && v !== null && v.length !== 0) + e.setAttribute(n, '' + v, 2); + else + e.removeAttribute(n, 2); + }); + }, - return frag; - }; + setAttribs : function(e, o) { + var t = this; - function _traverseCommonAncestors(startAncestor, endAncestor, how) { - var n, frag, commonParent, startOffset, endOffset, cnt, sibling, nextSibling; + return this.run(e, function(e) { + each(o, function(v, n) { + t.setAttrib(e, n, v); + }); + }); + }, - if (how != DELETE) - frag = doc.createDocumentFragment(); + getAttrib : function(e, n, dv) { + var v, t = this, undef; - n = _traverseLeftBoundary(startAncestor, how); - if (frag) - frag.appendChild(n); + e = t.get(e); - commonParent = startAncestor.parentNode; - startOffset = nodeIndex(startAncestor); - endOffset = nodeIndex(endAncestor); - ++startOffset; - - cnt = endOffset - startOffset; - sibling = startAncestor.nextSibling; + if (!e || e.nodeType !== 1) + return dv === undef ? false : dv; - while (cnt > 0) { - nextSibling = sibling.nextSibling; - n = _traverseFullySelected(sibling, how); + if (!is(dv)) + dv = ''; - if (frag) - frag.appendChild(n); + // Try the mce variant for these + if (/^(src|href|style|coords|shape)$/.test(n)) { + v = e.getAttribute("data-mce-" + n); - sibling = nextSibling; - --cnt; + if (v) + return v; } - n = _traverseRightBoundary(endAncestor, how); - - if (frag) - frag.appendChild(n); - - if (how != CLONE) { - t.setStartAfter(startAncestor); - t.collapse(TRUE); + if (isIE && t.props[n]) { + v = e[t.props[n]]; + v = v && v.nodeValue ? v.nodeValue : v; } - return frag; - }; + if (!v) + v = e.getAttribute(n, 2); - function _traverseRightBoundary(root, how) { - var next = _getSelectedNode(t[END_CONTAINER], t[END_OFFSET] - 1), parent, clonedParent, prevSibling, clonedChild, clonedGrandParent, isFullySelected = next != t[END_CONTAINER]; + // Check boolean attribs + if (/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(n)) { + if (e[t.props[n]] === true && v === '') + return n; - if (next == root) - return _traverseNode(next, isFullySelected, FALSE, how); + return v ? n : ''; + } - parent = next.parentNode; - clonedParent = _traverseNode(parent, FALSE, FALSE, how); + // Inner input elements will override attributes on form elements + if (e.nodeName === "FORM" && e.getAttributeNode(n)) + return e.getAttributeNode(n).nodeValue; - while (parent) { - while (next) { - prevSibling = next.previousSibling; - clonedChild = _traverseNode(next, isFullySelected, FALSE, how); + if (n === 'style') { + v = v || e.style.cssText; - if (how != DELETE) - clonedParent.insertBefore(clonedChild, clonedParent.firstChild); + if (v) { + v = t.serializeStyle(t.parseStyle(v), e.nodeName); - isFullySelected = TRUE; - next = prevSibling; + if (t.settings.keep_values && !t._isRes(v)) + e.setAttribute('data-mce-style', v); } + } - if (parent == root) - return clonedParent; - - next = parent.previousSibling; - parent = parent.parentNode; + // Remove Apple and WebKit stuff + if (isWebKit && n === "class" && v) + v = v.replace(/(apple|webkit)\-[a-z\-]+/gi, ''); - clonedGrandParent = _traverseNode(parent, FALSE, FALSE, how); + // Handle IE issues + if (isIE) { + switch (n) { + case 'rowspan': + case 'colspan': + // IE returns 1 as default value + if (v === 1) + v = ''; - if (how != DELETE) - clonedGrandParent.appendChild(clonedParent); + break; - clonedParent = clonedGrandParent; - } - }; + case 'size': + // IE returns +0 as default value for size + if (v === '+0' || v === 20 || v === 0) + v = ''; - function _traverseLeftBoundary(root, how) { - var next = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]), isFullySelected = next != t[START_CONTAINER], parent, clonedParent, nextSibling, clonedChild, clonedGrandParent; + break; - if (next == root) - return _traverseNode(next, isFullySelected, TRUE, how); + case 'width': + case 'height': + case 'vspace': + case 'checked': + case 'disabled': + case 'readonly': + if (v === 0) + v = ''; - parent = next.parentNode; - clonedParent = _traverseNode(parent, FALSE, TRUE, how); + break; - while (parent) { - while (next) { - nextSibling = next.nextSibling; - clonedChild = _traverseNode(next, isFullySelected, TRUE, how); + case 'hspace': + // IE returns -1 as default value + if (v === -1) + v = ''; - if (how != DELETE) - clonedParent.appendChild(clonedChild); + break; - isFullySelected = TRUE; - next = nextSibling; - } + case 'maxlength': + case 'tabindex': + // IE returns default value + if (v === 32768 || v === 2147483647 || v === '32768') + v = ''; - if (parent == root) - return clonedParent; + break; - next = parent.nextSibling; - parent = parent.parentNode; + case 'multiple': + case 'compact': + case 'noshade': + case 'nowrap': + if (v === 65535) + return n; - clonedGrandParent = _traverseNode(parent, FALSE, TRUE, how); + return dv; - if (how != DELETE) - clonedGrandParent.appendChild(clonedParent); + case 'shape': + v = v.toLowerCase(); + break; - clonedParent = clonedGrandParent; + default: + // IE has odd anonymous function for event attributes + if (n.indexOf('on') === 0 && v) + v = tinymce._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/, '$1', '' + v); + } } - }; - function _traverseNode(n, isFullySelected, isLeft, how) { - var txtValue, newNodeValue, oldNodeValue, offset, newNode; + return (v !== undef && v !== null && v !== '') ? '' + v : dv; + }, - if (isFullySelected) - return _traverseFullySelected(n, how); + getPos : function(n, ro) { + var t = this, x = 0, y = 0, e, d = t.doc, r; - if (n.nodeType == 3 /* TEXT_NODE */) { - txtValue = n.nodeValue; + n = t.get(n); + ro = ro || d.body; - if (isLeft) { - offset = t[START_OFFSET]; - newNodeValue = txtValue.substring(offset); - oldNodeValue = txtValue.substring(0, offset); - } else { - offset = t[END_OFFSET]; - newNodeValue = txtValue.substring(0, offset); - oldNodeValue = txtValue.substring(offset); - } + if (n) { + // Use getBoundingClientRect if it exists since it's faster than looping offset nodes + if (n.getBoundingClientRect) { + n = n.getBoundingClientRect(); + e = t.boxModel ? d.documentElement : d.body; - if (how != CLONE) - n.nodeValue = oldNodeValue; + // Add scroll offsets from documentElement or body since IE with the wrong box model will use d.body and so do WebKit + // Also remove the body/documentelement clientTop/clientLeft on IE 6, 7 since they offset the position + x = n.left + (d.documentElement.scrollLeft || d.body.scrollLeft) - e.clientTop; + y = n.top + (d.documentElement.scrollTop || d.body.scrollTop) - e.clientLeft; - if (how == DELETE) - return; + return {x : x, y : y}; + } - newNode = n.cloneNode(FALSE); - newNode.nodeValue = newNodeValue; + r = n; + while (r && r != ro && r.nodeType) { + x += r.offsetLeft || 0; + y += r.offsetTop || 0; + r = r.offsetParent; + } - return newNode; + r = n.parentNode; + while (r && r != ro && r.nodeType) { + x -= r.scrollLeft || 0; + y -= r.scrollTop || 0; + r = r.parentNode; + } } - if (how == DELETE) - return; + return {x : x, y : y}; + }, - return n.cloneNode(FALSE); - }; + parseStyle : function(st) { + return this.styles.parse(st); + }, - function _traverseFullySelected(n, how) { - if (how != DELETE) - return how == CLONE ? n.cloneNode(TRUE) : n; + serializeStyle : function(o, name) { + return this.styles.serialize(o, name); + }, - n.parentNode.removeChild(n); - }; - }; + loadCSS : function(u) { + var t = this, d = t.doc, head; - ns.Range = Range; -})(tinymce.dom); + if (!u) + u = ''; -(function() { - function Selection(selection) { - var t = this, invisibleChar = '\uFEFF', range, lastIERng, dom = selection.dom, TRUE = true, FALSE = false; + head = t.select('head')[0]; - // Returns a W3C DOM compatible range object by using the IE Range API - function getRange() { - var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed; + each(u.split(','), function(u) { + var link; - // If selection is outside the current document just return an empty range - element = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); - if (element.ownerDocument != dom.doc) - return domRange; + if (t.files[u]) + return; - // Handle control selection or text selection of a image - if (ieRange.item || !element.hasChildNodes()) { - domRange.setStart(element.parentNode, dom.nodeIndex(element)); - domRange.setEnd(domRange.startContainer, domRange.startOffset + 1); + t.files[u] = true; + link = t.create('link', {rel : 'stylesheet', href : tinymce._addVer(u)}); - return domRange; - } + // IE 8 has a bug where dynamically loading stylesheets would produce a 1 item remaining bug + // This fix seems to resolve that issue by realcing the document ones a stylesheet finishes loading + // It's ugly but it seems to work fine. + if (isIE && d.documentMode && d.recalc) { + link.onload = function() { + if (d.recalc) + d.recalc(); - collapsed = selection.isCollapsed(); + link.onload = null; + }; + } - function findEndPoint(start) { - var marker, container, offset, nodes, startIndex = 0, endIndex, index, parent, checkRng, position; + head.appendChild(link); + }); + }, - // Setup temp range and collapse it - checkRng = ieRange.duplicate(); - checkRng.collapse(start); + addClass : function(e, c) { + return this.run(e, function(e) { + var o; - // Create marker and insert it at the end of the endpoints parent - marker = dom.create('a'); - parent = checkRng.parentElement(); + if (!c) + return 0; - // If parent doesn't have any children then set the container to that parent and the index to 0 - if (!parent.hasChildNodes()) { - domRange[start ? 'setStart' : 'setEnd'](parent, 0); - return; - } + if (this.hasClass(e, c)) + return e.className; - parent.appendChild(marker); - checkRng.moveToElementText(marker); - position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng); - if (position > 0) { - // The position is after the end of the parent element. - // This is the case where IE puts the caret to the left edge of a table. - domRange[start ? 'setStartAfter' : 'setEndAfter'](parent); - dom.remove(marker); - return; - } + o = this.removeClass(e, c); - // Setup node list and endIndex - nodes = tinymce.grep(parent.childNodes); - endIndex = nodes.length - 1; - // Perform a binary search for the position - while (startIndex <= endIndex) { - index = Math.floor((startIndex + endIndex) / 2); - - // Insert marker and check it's position relative to the selection - parent.insertBefore(marker, nodes[index]); - checkRng.moveToElementText(marker); - position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng); - if (position > 0) { - // Marker is to the right - startIndex = index + 1; - } else if (position < 0) { - // Marker is to the left - endIndex = index - 1; - } else { - // Maker is where we are - found = true; - break; - } - } + return e.className = (o != '' ? (o + ' ') : '') + c; + }); + }, - // Setup container - container = position > 0 || index == 0 ? marker.nextSibling : marker.previousSibling; + removeClass : function(e, c) { + var t = this, re; - // Handle element selection - if (container.nodeType == 1) { - dom.remove(marker); + return t.run(e, function(e) { + var v; - // Find offset and container - offset = dom.nodeIndex(container); - container = container.parentNode; + if (t.hasClass(e, c)) { + if (!re) + re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g"); - // Move the offset if we are setting the end or the position is after an element - if (!start || index > 0) - offset++; - } else { - // Calculate offset within text node - if (position > 0 || index == 0) { - checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange); - offset = checkRng.text.length; - } else { - checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange); - offset = container.nodeValue.length - checkRng.text.length; + v = e.className.replace(re, ' '); + v = tinymce.trim(v != ' ' ? v : ''); + + e.className = v; + + // Empty class attr + if (!v) { + e.removeAttribute('class'); + e.removeAttribute('className'); } - dom.remove(marker); + return v; } - domRange[start ? 'setStart' : 'setEnd'](container, offset); - }; + return e.className; + }); + }, - // Find start point - findEndPoint(true); + hasClass : function(n, c) { + n = this.get(n); - // Find end point if needed - if (!collapsed) - findEndPoint(); + if (!n || !c) + return false; - return domRange; - }; + return (' ' + n.className + ' ').indexOf(' ' + c + ' ') !== -1; + }, - this.addRange = function(rng) { - var ieRng, ctrlRng, startContainer, startOffset, endContainer, endOffset, doc = selection.dom.doc, body = doc.body; + show : function(e) { + return this.setStyle(e, 'display', 'block'); + }, - function setEndPoint(start) { - var container, offset, marker, tmpRng, nodes; + hide : function(e) { + return this.setStyle(e, 'display', 'none'); + }, - marker = dom.create('a'); - container = start ? startContainer : endContainer; - offset = start ? startOffset : endOffset; - tmpRng = ieRng.duplicate(); + isHidden : function(e) { + e = this.get(e); - if (container == doc) { - container = body; - offset = 0; - } + return !e || e.style.display == 'none' || this.getStyle(e, 'display') == 'none'; + }, - if (container.nodeType == 3) { - container.parentNode.insertBefore(marker, container); - tmpRng.moveToElementText(marker); - tmpRng.moveStart('character', offset); - dom.remove(marker); - ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); - } else { - nodes = container.childNodes; + uniqueId : function(p) { + return (!p ? 'mce_' : p) + (this.counter++); + }, - if (nodes.length) { - if (offset >= nodes.length) { - dom.insertAfter(marker, nodes[nodes.length - 1]); - } else { - container.insertBefore(marker, nodes[offset]); - } + setHTML : function(element, html) { + var self = this; - tmpRng.moveToElementText(marker); - } else { - // Empty node selection for example
    |
    - marker = doc.createTextNode(invisibleChar); - container.appendChild(marker); - tmpRng.moveToElementText(marker.parentNode); - tmpRng.collapse(TRUE); + return self.run(element, function(element) { + if (isIE) { + // Remove all child nodes, IE keeps empty text nodes in DOM + while (element.firstChild) + element.removeChild(element.firstChild); + + try { + // IE will remove comments from the beginning + // unless you padd the contents with something + element.innerHTML = '
    ' + html; + element.removeChild(element.firstChild); + } catch (ex) { + // IE sometimes produces an unknown runtime error on innerHTML if it's an block element within a block element for example a div inside a p + // This seems to fix this problem + + // Create new div with HTML contents and a BR infront to keep comments + element = self.create('div'); + element.innerHTML = '
    ' + html; + + // Add all children from div to target + each (element.childNodes, function(node, i) { + // Skip br element + if (i) + element.appendChild(node); + }); } + } else + element.innerHTML = html; - ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); - dom.remove(marker); - } - } + return html; + }); + }, - // Destroy cached range - this.destroy(); + getOuterHTML : function(elm) { + var doc, self = this; - // Setup some shorter versions - startContainer = rng.startContainer; - startOffset = rng.startOffset; - endContainer = rng.endContainer; - endOffset = rng.endOffset; - ieRng = body.createTextRange(); + elm = self.get(elm); - // If single element selection then try making a control selection out of it - if (startContainer == endContainer && startContainer.nodeType == 1 && startOffset == endOffset - 1) { - if (startOffset == endOffset - 1) { - try { - ctrlRng = body.createControlRange(); - ctrlRng.addElement(startContainer.childNodes[startOffset]); - ctrlRng.select(); - ctrlRng.scrollIntoView(); - return; - } catch (ex) { - // Ignore - } - } - } + if (!elm) + return null; - // Set start/end point of selection - setEndPoint(true); - setEndPoint(); + if (elm.nodeType === 1 && self.hasOuterHTML) + return elm.outerHTML; - // Select the new range and scroll it into view - ieRng.select(); - ieRng.scrollIntoView(); - }; + doc = (elm.ownerDocument || self.doc).createElement("body"); + doc.appendChild(elm.cloneNode(true)); - this.getRangeAt = function() { - // Setup new range if the cache is empty - if (!range || !tinymce.dom.RangeUtils.compareRanges(lastIERng, selection.getRng())) { - range = getRange(); + return doc.innerHTML; + }, - // Store away text range for next call - lastIERng = selection.getRng(); - } + setOuterHTML : function(e, h, d) { + var t = this; - // IE will say that the range is equal then produce an invalid argument exception - // if you perform specific operations in a keyup event. For example Ctrl+Del. - // This hack will invalidate the range cache if the exception occurs - try { - range.startContainer.nextSibling; - } catch (ex) { - range = getRange(); - lastIERng = null; - } + function setHTML(e, h, d) { + var n, tp; - // Return cached range - return range; - }; + tp = d.createElement("body"); + tp.innerHTML = h; - this.destroy = function() { - // Destroy cached range and last IE range to avoid memory leaks - lastIERng = range = null; - }; - }; + n = tp.lastChild; + while (n) { + t.insertAfter(n.cloneNode(true), e); + n = n.previousSibling; + } - // Expose the selection object - tinymce.dom.TridentSelection = Selection; -})(); + t.remove(e); + }; + return this.run(e, function(e) { + e = t.get(e); -(function(tinymce) { - // Shorten names - var each = tinymce.each, DOM = tinymce.DOM, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, Event; + // Only set HTML on elements + if (e.nodeType == 1) { + d = d || e.ownerDocument || t.doc; - tinymce.create('tinymce.dom.EventUtils', { - EventUtils : function() { - this.inits = []; - this.events = []; + if (isIE) { + try { + // Try outerHTML for IE it sometimes produces an unknown runtime error + if (isIE && e.nodeType == 1) + e.outerHTML = h; + else + setHTML(e, h, d); + } catch (ex) { + // Fix for unknown runtime error + setHTML(e, h, d); + } + } else + setHTML(e, h, d); + } + }); }, - add : function(o, n, f, s) { - var cb, t = this, el = t.events, r; + decode : Entities.decode, - if (n instanceof Array) { - r = []; + encode : Entities.encodeAllRaw, - each(n, function(n) { - r.push(t.add(o, n, f, s)); - }); + insertAfter : function(node, reference_node) { + reference_node = this.get(reference_node); - return r; - } + return this.run(node, function(node) { + var parent, nextSibling; - // Handle array - if (o && o.hasOwnProperty && o instanceof Array) { - r = []; + parent = reference_node.parentNode; + nextSibling = reference_node.nextSibling; - each(o, function(o) { - o = DOM.get(o); - r.push(t.add(o, n, f, s)); - }); + if (nextSibling) + parent.insertBefore(node, nextSibling); + else + parent.appendChild(node); - return r; - } + return node; + }); + }, - o = DOM.get(o); + isBlock : function(node) { + var type = node.nodeType; - if (!o) - return; + // If it's a node then check the type and use the nodeName + if (type) + return !!(type === 1 && blockElementsMap[node.nodeName]); - // Setup event callback - cb = function(e) { - // Is all events disabled - if (t.disabled) - return; + return !!blockElementsMap[node]; + }, - e = e || window.event; + replace : function(n, o, k) { + var t = this; - // Patch in target, preventDefault and stopPropagation in IE it's W3C valid - if (e && isIE) { - if (!e.target) - e.target = e.srcElement; + if (is(o, 'array')) + n = n.cloneNode(true); - // Patch in preventDefault, stopPropagation methods for W3C compatibility - tinymce.extend(e, t._stoppers); + return t.run(o, function(o) { + if (k) { + each(tinymce.grep(o.childNodes), function(c) { + n.appendChild(c); + }); } - if (!s) - return f(e); + return o.parentNode.replaceChild(n, o); + }); + }, - return f.call(s, e); - }; + rename : function(elm, name) { + var t = this, newElm; - if (n == 'unload') { - tinymce.unloads.unshift({func : cb}); - return cb; - } + if (elm.nodeName != name.toUpperCase()) { + // Rename block element + newElm = t.create(name); - if (n == 'init') { - if (t.domLoaded) - cb(); - else - t.inits.push(cb); + // Copy attribs to new block + each(t.getAttribs(elm), function(attr_node) { + t.setAttrib(newElm, attr_node.nodeName, t.getAttrib(elm, attr_node.nodeName)); + }); - return cb; + // Replace block + t.replace(newElm, elm, 1); } - // Store away listener reference - el.push({ - obj : o, - name : n, - func : f, - cfunc : cb, - scope : s - }); - - t._add(o, n, cb); - - return f; + return newElm || elm; }, - remove : function(o, n, f) { - var t = this, a = t.events, s = false, r; + findCommonAncestor : function(a, b) { + var ps = a, pe; - // Handle array - if (o && o.hasOwnProperty && o instanceof Array) { - r = []; + while (ps) { + pe = b; - each(o, function(o) { - o = DOM.get(o); - r.push(t.remove(o, n, f)); - }); + while (pe && ps != pe) + pe = pe.parentNode; - return r; + if (ps == pe) + break; + + ps = ps.parentNode; } - o = DOM.get(o); + if (!ps && a.ownerDocument) + return a.ownerDocument.documentElement; - each(a, function(e, i) { - if (e.obj == o && e.name == n && (!f || (e.func == f || e.cfunc == f))) { - a.splice(i, 1); - t._remove(o, n, e.cfunc); - s = true; - return false; - } - }); + return ps; + }, + + toHex : function(s) { + var c = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s); + + function hex(s) { + s = parseInt(s).toString(16); + + return s.length > 1 ? s : '0' + s; // 0 -> 00 + }; + + if (c) { + s = '#' + hex(c[1]) + hex(c[2]) + hex(c[3]); + + return s; + } return s; }, - clear : function(o) { - var t = this, a = t.events, i, e; + getClasses : function() { + var t = this, cl = [], i, lo = {}, f = t.settings.class_filter, ov; - if (o) { - o = DOM.get(o); + if (t.classes) + return t.classes; - for (i = a.length - 1; i >= 0; i--) { - e = a[i]; + function addClasses(s) { + // IE style imports + each(s.imports, function(r) { + addClasses(r); + }); - if (e.obj === o) { - t._remove(e.obj, e.name, e.cfunc); - e.obj = e.cfunc = null; - a.splice(i, 1); + each(s.cssRules || s.rules, function(r) { + // Real type or fake it on IE + switch (r.type || 1) { + // Rule + case 1: + if (r.selectorText) { + each(r.selectorText.split(','), function(v) { + v = v.replace(/^\s*|\s*$|^\s\./g, ""); + + // Is internal or it doesn't contain a class + if (/\.mce/.test(v) || !/\.[\w\-]+$/.test(v)) + return; + + // Remove everything but class name + ov = v; + v = tinymce._replace(/.*\.([a-z0-9_\-]+).*/i, '$1', v); + + // Filter classes + if (f && !(v = f(v, ov))) + return; + + if (!lo[v]) { + cl.push({'class' : v}); + lo[v] = 1; + } + }); + } + break; + + // Import + case 3: + addClasses(r.styleSheet); + break; } - } + }); + }; + + try { + each(t.doc.styleSheets, addClasses); + } catch (ex) { + // Ignore } + + if (cl.length > 0) + t.classes = cl; + + return cl; }, - cancel : function(e) { + run : function(e, f, s) { + var t = this, o; + + if (t.doc && typeof(e) === 'string') + e = t.get(e); + if (!e) return false; - this.stop(e); + s = s || this; + if (!e.nodeType && (e.length || e.length === 0)) { + o = []; - return this.prevent(e); - }, + each(e, function(e, i) { + if (e) { + if (typeof(e) == 'string') + e = t.doc.getElementById(e); - stop : function(e) { - if (e.stopPropagation) - e.stopPropagation(); - else - e.cancelBubble = true; + o.push(f.call(s, e, i)); + } + }); - return false; + return o; + } + + return f.call(s, e); }, - prevent : function(e) { - if (e.preventDefault) - e.preventDefault(); - else - e.returnValue = false; + getAttribs : function(n) { + var o; - return false; - }, + n = this.get(n); - destroy : function() { - var t = this; + if (!n) + return []; - each(t.events, function(e, i) { - t._remove(e.obj, e.name, e.cfunc); - e.obj = e.cfunc = null; - }); + if (isIE) { + o = []; - t.events = []; - t = null; - }, + // Object will throw exception in IE + if (n.nodeName == 'OBJECT') + return n.attributes; - _add : function(o, n, f) { - if (o.attachEvent) - o.attachEvent('on' + n, f); - else if (o.addEventListener) - o.addEventListener(n, f, false); - else - o['on' + n] = f; - }, + // IE doesn't keep the selected attribute if you clone option elements + if (n.nodeName === 'OPTION' && this.getAttrib(n, 'selected')) + o.push({specified : 1, nodeName : 'selected'}); - _remove : function(o, n, f) { - if (o) { - try { - if (o.detachEvent) - o.detachEvent('on' + n, f); - else if (o.removeEventListener) - o.removeEventListener(n, f, false); - else - o['on' + n] = null; - } catch (ex) { - // Might fail with permission denined on IE so we just ignore that - } + // It's crazy that this is faster in IE but it's because it returns all attributes all the time + n.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi, '').replace(/[\w:\-]+/gi, function(a) { + o.push({specified : 1, nodeName : a}); + }); + + return o; } + + return n.attributes; }, - _pageInit : function(win) { - var t = this; + isEmpty : function(node, elements) { + var self = this, i, attributes, type, walker, name; - // Keep it from running more than once - if (t.domLoaded) - return; + node = node.firstChild; + if (node) { + walker = new tinymce.dom.TreeWalker(node); + elements = elements || self.schema ? self.schema.getNonEmptyElements() : null; - t.domLoaded = true; + do { + type = node.nodeType; - each(t.inits, function(c) { - c(); - }); + if (type === 1) { + // Ignore bogus elements + if (node.getAttribute('data-mce-bogus')) + continue; - t.inits = []; - }, + // Keep empty elements like + if (elements && elements[node.nodeName.toLowerCase()]) + return false; - _wait : function(win) { - var t = this, doc = win.document; + // Keep elements with data-bookmark attributes or name attribute like
    + attributes = self.getAttribs(node); + i = node.attributes.length; + while (i--) { + name = node.attributes[i].nodeName; + if (name === "name" || name === 'data-mce-bookmark') + return false; + } + } - // No need since the document is already loaded - if (win.tinyMCE_GZ && tinyMCE_GZ.loaded) { - t.domLoaded = 1; - return; + // Keep non whitespace text nodes + if ((type === 3 && !whiteSpaceRegExp.test(node.nodeValue))) + return false; + } while (node = walker.next()); } - // Use IE method - if (doc.attachEvent) { - doc.attachEvent("onreadystatechange", function() { - if (doc.readyState === "complete") { - doc.detachEvent("onreadystatechange", arguments.callee); - t._pageInit(win); + return true; + }, + + destroy : function(s) { + var t = this; + + if (t.events) + t.events.destroy(); + + t.win = t.doc = t.root = t.events = null; + + // Manual destroy then remove unload handler + if (!s) + tinymce.removeUnload(t.destroy); + }, + + createRng : function() { + var d = this.doc; + + return d.createRange ? d.createRange() : new tinymce.dom.Range(this); + }, + + nodeIndex : function(node, normalized) { + var idx = 0, lastNodeType, lastNode, nodeType; + + if (node) { + for (lastNodeType = node.nodeType, node = node.previousSibling, lastNode = node; node; node = node.previousSibling) { + nodeType = node.nodeType; + + // Normalize text nodes + if (normalized && nodeType == 3) { + if (nodeType == lastNodeType || !node.nodeValue.length) + continue; } - }); + idx++; + lastNodeType = nodeType; + } + } - if (doc.documentElement.doScroll && win == win.top) { - (function() { - if (t.domLoaded) + return idx; + }, + + split : function(pe, e, re) { + var t = this, r = t.createRng(), bef, aft, pa; + + // W3C valid browsers tend to leave empty nodes to the left/right side of the contents, this makes sense + // but we don't want that in our code since it serves no purpose for the end user + // For example if this is chopped: + //

    text 1CHOPtext 2

    + // would produce: + //

    text 1

    CHOP

    text 2

    + // this function will then trim of empty edges and produce: + //

    text 1

    CHOP

    text 2

    + function trim(node) { + var i, children = node.childNodes, type = node.nodeType; + + if (type == 1 && node.getAttribute('data-mce-type') == 'bookmark') + return; + + for (i = children.length - 1; i >= 0; i--) + trim(children[i]); + + if (type != 9) { + // Keep non whitespace text nodes + if (type == 3 && node.nodeValue.length > 0) { + // If parent element isn't a block or there isn't any useful contents for example "

    " + if (!t.isBlock(node.parentNode) || tinymce.trim(node.nodeValue).length > 0) return; + } else if (type == 1) { + // If the only child is a bookmark then move it up + children = node.childNodes; + if (children.length == 1 && children[0] && children[0].nodeType == 1 && children[0].getAttribute('data-mce-type') == 'bookmark') + node.parentNode.insertBefore(children[0], node); - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - doc.documentElement.doScroll("left"); - } catch (ex) { - setTimeout(arguments.callee, 0); + // Keep non empty elements or img, hr etc + if (children.length || /^(br|hr|input|img)$/i.test(node.nodeName)) return; - } + } - t._pageInit(win); - })(); + t.remove(node); } - } else if (doc.addEventListener) { - t._add(win, 'DOMContentLoaded', function() { - t._pageInit(win); - }); + + return node; + }; + + if (pe && e) { + // Get before chunk + r.setStart(pe.parentNode, t.nodeIndex(pe)); + r.setEnd(e.parentNode, t.nodeIndex(e)); + bef = r.extractContents(); + + // Get after chunk + r = t.createRng(); + r.setStart(e.parentNode, t.nodeIndex(e) + 1); + r.setEnd(pe.parentNode, t.nodeIndex(pe) + 1); + aft = r.extractContents(); + + // Insert before chunk + pa = pe.parentNode; + pa.insertBefore(trim(bef), pe); + + // Insert middle chunk + if (re) + pa.replaceChild(re, e); + else + pa.insertBefore(e, pe); + + // Insert after chunk + pa.insertBefore(trim(aft), pe); + t.remove(pe); + + return re || e; } + }, - t._add(win, 'load', function() { - t._pageInit(win); - }); + bind : function(target, name, func, scope) { + var t = this; + + if (!t.events) + t.events = new tinymce.dom.EventUtils(); + + return t.events.add(target, name, func, scope || this); + }, + + unbind : function(target, name, func) { + var t = this; + + if (!t.events) + t.events = new tinymce.dom.EventUtils(); + + return t.events.remove(target, name, func); + }, + + + _findSib : function(node, selector, name) { + var t = this, f = selector; + + if (node) { + // If expression make a function of it using is + if (is(f, 'string')) { + f = function(node) { + return t.is(node, selector); + }; + } + + // Loop all siblings + for (node = node[name]; node; node = node[name]) { + if (f(node)) + return node; + } + } + + return null; }, - _stoppers : { - preventDefault : function() { - this.returnValue = false; - }, + _isRes : function(c) { + // Is live resizble element + return /^(top|left|bottom|right|width|height)/i.test(c) || /;\s*(top|left|bottom|right|width|height)/i.test(c); + } + + /* + walk : function(n, f, s) { + var d = this.doc, w; + + if (d.createTreeWalker) { + w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); + + while ((n = w.nextNode()) != null) + f.call(s || this, n); + } else + tinymce.walk(n, f, 'childNodes', s); + } + */ + + /* + toRGB : function(s) { + var c = /^\s*?#([0-9A-F]{2})([0-9A-F]{1,2})([0-9A-F]{2})?\s*?$/.exec(s); + + if (c) { + // #FFF -> #FFFFFF + if (!is(c[3])) + c[3] = c[2] = c[1]; + + return "rgb(" + parseInt(c[1], 16) + "," + parseInt(c[2], 16) + "," + parseInt(c[3], 16) + ")"; + } + + return s; + } + */ + }); + + tinymce.DOM = new tinymce.dom.DOMUtils(document, {process_html : 0}); +})(tinymce); + +(function(ns) { + // Range constructor + function Range(dom) { + var t = this, + doc = dom.doc, + EXTRACT = 0, + CLONE = 1, + DELETE = 2, + TRUE = true, + FALSE = false, + START_OFFSET = 'startOffset', + START_CONTAINER = 'startContainer', + END_CONTAINER = 'endContainer', + END_OFFSET = 'endOffset', + extend = tinymce.extend, + nodeIndex = dom.nodeIndex; + + extend(t, { + // Inital states + startContainer : doc, + startOffset : 0, + endContainer : doc, + endOffset : 0, + collapsed : TRUE, + commonAncestorContainer : doc, + + // Range constants + START_TO_START : 0, + START_TO_END : 1, + END_TO_END : 2, + END_TO_START : 3, + + // Public methods + setStart : setStart, + setEnd : setEnd, + setStartBefore : setStartBefore, + setStartAfter : setStartAfter, + setEndBefore : setEndBefore, + setEndAfter : setEndAfter, + collapse : collapse, + selectNode : selectNode, + selectNodeContents : selectNodeContents, + compareBoundaryPoints : compareBoundaryPoints, + deleteContents : deleteContents, + extractContents : extractContents, + cloneContents : cloneContents, + insertNode : insertNode, + surroundContents : surroundContents, + cloneRange : cloneRange + }); + + function setStart(n, o) { + _setEndPoint(TRUE, n, o); + }; + + function setEnd(n, o) { + _setEndPoint(FALSE, n, o); + }; + + function setStartBefore(n) { + setStart(n.parentNode, nodeIndex(n)); + }; + + function setStartAfter(n) { + setStart(n.parentNode, nodeIndex(n) + 1); + }; + + function setEndBefore(n) { + setEnd(n.parentNode, nodeIndex(n)); + }; + + function setEndAfter(n) { + setEnd(n.parentNode, nodeIndex(n) + 1); + }; + + function collapse(ts) { + if (ts) { + t[END_CONTAINER] = t[START_CONTAINER]; + t[END_OFFSET] = t[START_OFFSET]; + } else { + t[START_CONTAINER] = t[END_CONTAINER]; + t[START_OFFSET] = t[END_OFFSET]; + } + + t.collapsed = TRUE; + }; + + function selectNode(n) { + setStartBefore(n); + setEndAfter(n); + }; + + function selectNodeContents(n) { + setStart(n, 0); + setEnd(n, n.nodeType === 1 ? n.childNodes.length : n.nodeValue.length); + }; + + function compareBoundaryPoints(h, r) { + var sc = t[START_CONTAINER], so = t[START_OFFSET], ec = t[END_CONTAINER], eo = t[END_OFFSET], + rsc = r.startContainer, rso = r.startOffset, rec = r.endContainer, reo = r.endOffset; + + // Check START_TO_START + if (h === 0) + return _compareBoundaryPoints(sc, so, rsc, rso); + + // Check START_TO_END + if (h === 1) + return _compareBoundaryPoints(ec, eo, rsc, rso); + + // Check END_TO_END + if (h === 2) + return _compareBoundaryPoints(ec, eo, rec, reo); + + // Check END_TO_START + if (h === 3) + return _compareBoundaryPoints(sc, so, rec, reo); + }; + + function deleteContents() { + _traverse(DELETE); + }; + + function extractContents() { + return _traverse(EXTRACT); + }; + + function cloneContents() { + return _traverse(CLONE); + }; + + function insertNode(n) { + var startContainer = this[START_CONTAINER], + startOffset = this[START_OFFSET], nn, o; + + // Node is TEXT_NODE or CDATA + if ((startContainer.nodeType === 3 || startContainer.nodeType === 4) && startContainer.nodeValue) { + if (!startOffset) { + // At the start of text + startContainer.parentNode.insertBefore(n, startContainer); + } else if (startOffset >= startContainer.nodeValue.length) { + // At the end of text + dom.insertAfter(n, startContainer); + } else { + // Middle, need to split + nn = startContainer.splitText(startOffset); + startContainer.parentNode.insertBefore(n, nn); + } + } else { + // Insert element node + if (startContainer.childNodes.length > 0) + o = startContainer.childNodes[startOffset]; + + if (o) + startContainer.insertBefore(n, o); + else + startContainer.appendChild(n); + } + }; + + function surroundContents(n) { + var f = t.extractContents(); + + t.insertNode(n); + n.appendChild(f); + t.selectNode(n); + }; + + function cloneRange() { + return extend(new Range(dom), { + startContainer : t[START_CONTAINER], + startOffset : t[START_OFFSET], + endContainer : t[END_CONTAINER], + endOffset : t[END_OFFSET], + collapsed : t.collapsed, + commonAncestorContainer : t.commonAncestorContainer + }); + }; + + // Private methods + + function _getSelectedNode(container, offset) { + var child; + + if (container.nodeType == 3 /* TEXT_NODE */) + return container; + + if (offset < 0) + return container; + + child = container.firstChild; + while (child && offset > 0) { + --offset; + child = child.nextSibling; + } + + if (child) + return child; + + return container; + }; + + function _isCollapsed() { + return (t[START_CONTAINER] == t[END_CONTAINER] && t[START_OFFSET] == t[END_OFFSET]); + }; + + function _compareBoundaryPoints(containerA, offsetA, containerB, offsetB) { + var c, offsetC, n, cmnRoot, childA, childB; + + // In the first case the boundary-points have the same container. A is before B + // if its offset is less than the offset of B, A is equal to B if its offset is + // equal to the offset of B, and A is after B if its offset is greater than the + // offset of B. + if (containerA == containerB) { + if (offsetA == offsetB) + return 0; // equal + + if (offsetA < offsetB) + return -1; // before + + return 1; // after + } + + // In the second case a child node C of the container of A is an ancestor + // container of B. In this case, A is before B if the offset of A is less than or + // equal to the index of the child node C and A is after B otherwise. + c = containerB; + while (c && c.parentNode != containerA) + c = c.parentNode; + + if (c) { + offsetC = 0; + n = containerA.firstChild; + + while (n != c && offsetC < offsetA) { + offsetC++; + n = n.nextSibling; + } + + if (offsetA <= offsetC) + return -1; // before + + return 1; // after + } + + // In the third case a child node C of the container of B is an ancestor container + // of A. In this case, A is before B if the index of the child node C is less than + // the offset of B and A is after B otherwise. + c = containerA; + while (c && c.parentNode != containerB) { + c = c.parentNode; + } + + if (c) { + offsetC = 0; + n = containerB.firstChild; + + while (n != c && offsetC < offsetB) { + offsetC++; + n = n.nextSibling; + } + + if (offsetC < offsetB) + return -1; // before + + return 1; // after + } + + // In the fourth case, none of three other cases hold: the containers of A and B + // are siblings or descendants of sibling nodes. In this case, A is before B if + // the container of A is before the container of B in a pre-order traversal of the + // Ranges' context tree and A is after B otherwise. + cmnRoot = dom.findCommonAncestor(containerA, containerB); + childA = containerA; + + while (childA && childA.parentNode != cmnRoot) + childA = childA.parentNode; + + if (!childA) + childA = cmnRoot; + + childB = containerB; + while (childB && childB.parentNode != cmnRoot) + childB = childB.parentNode; + + if (!childB) + childB = cmnRoot; + + if (childA == childB) + return 0; // equal + + n = cmnRoot.firstChild; + while (n) { + if (n == childA) + return -1; // before + + if (n == childB) + return 1; // after + + n = n.nextSibling; + } + }; + + function _setEndPoint(st, n, o) { + var ec, sc; + + if (st) { + t[START_CONTAINER] = n; + t[START_OFFSET] = o; + } else { + t[END_CONTAINER] = n; + t[END_OFFSET] = o; + } + + // If one boundary-point of a Range is set to have a root container + // other than the current one for the Range, the Range is collapsed to + // the new position. This enforces the restriction that both boundary- + // points of a Range must have the same root container. + ec = t[END_CONTAINER]; + while (ec.parentNode) + ec = ec.parentNode; + + sc = t[START_CONTAINER]; + while (sc.parentNode) + sc = sc.parentNode; + + if (sc == ec) { + // The start position of a Range is guaranteed to never be after the + // end position. To enforce this restriction, if the start is set to + // be at a position after the end, the Range is collapsed to that + // position. + if (_compareBoundaryPoints(t[START_CONTAINER], t[START_OFFSET], t[END_CONTAINER], t[END_OFFSET]) > 0) + t.collapse(st); + } else + t.collapse(st); + + t.collapsed = _isCollapsed(); + t.commonAncestorContainer = dom.findCommonAncestor(t[START_CONTAINER], t[END_CONTAINER]); + }; + + function _traverse(how) { + var c, endContainerDepth = 0, startContainerDepth = 0, p, depthDiff, startNode, endNode, sp, ep; + + if (t[START_CONTAINER] == t[END_CONTAINER]) + return _traverseSameContainer(how); + + for (c = t[END_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { + if (p == t[START_CONTAINER]) + return _traverseCommonStartContainer(c, how); + + ++endContainerDepth; + } + + for (c = t[START_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { + if (p == t[END_CONTAINER]) + return _traverseCommonEndContainer(c, how); + + ++startContainerDepth; + } + + depthDiff = startContainerDepth - endContainerDepth; + + startNode = t[START_CONTAINER]; + while (depthDiff > 0) { + startNode = startNode.parentNode; + depthDiff--; + } + + endNode = t[END_CONTAINER]; + while (depthDiff < 0) { + endNode = endNode.parentNode; + depthDiff++; + } + + // ascend the ancestor hierarchy until we have a common parent. + for (sp = startNode.parentNode, ep = endNode.parentNode; sp != ep; sp = sp.parentNode, ep = ep.parentNode) { + startNode = sp; + endNode = ep; + } + + return _traverseCommonAncestors(startNode, endNode, how); + }; + + function _traverseSameContainer(how) { + var frag, s, sub, n, cnt, sibling, xferNode; + + if (how != DELETE) + frag = doc.createDocumentFragment(); + + // If selection is empty, just return the fragment + if (t[START_OFFSET] == t[END_OFFSET]) + return frag; + + // Text node needs special case handling + if (t[START_CONTAINER].nodeType == 3 /* TEXT_NODE */) { + // get the substring + s = t[START_CONTAINER].nodeValue; + sub = s.substring(t[START_OFFSET], t[END_OFFSET]); + + // set the original text node to its new value + if (how != CLONE) { + t[START_CONTAINER].deleteData(t[START_OFFSET], t[END_OFFSET] - t[START_OFFSET]); + + // Nothing is partially selected, so collapse to start point + t.collapse(TRUE); + } + + if (how == DELETE) + return; + + frag.appendChild(doc.createTextNode(sub)); + return frag; + } + + // Copy nodes between the start/end offsets. + n = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]); + cnt = t[END_OFFSET] - t[START_OFFSET]; + + while (cnt > 0) { + sibling = n.nextSibling; + xferNode = _traverseFullySelected(n, how); + + if (frag) + frag.appendChild( xferNode ); + + --cnt; + n = sibling; + } + + // Nothing is partially selected, so collapse to start point + if (how != CLONE) + t.collapse(TRUE); + + return frag; + }; + + function _traverseCommonStartContainer(endAncestor, how) { + var frag, n, endIdx, cnt, sibling, xferNode; + + if (how != DELETE) + frag = doc.createDocumentFragment(); + + n = _traverseRightBoundary(endAncestor, how); + + if (frag) + frag.appendChild(n); + + endIdx = nodeIndex(endAncestor); + cnt = endIdx - t[START_OFFSET]; + + if (cnt <= 0) { + // Collapse to just before the endAncestor, which + // is partially selected. + if (how != CLONE) { + t.setEndBefore(endAncestor); + t.collapse(FALSE); + } + + return frag; + } + + n = endAncestor.previousSibling; + while (cnt > 0) { + sibling = n.previousSibling; + xferNode = _traverseFullySelected(n, how); + + if (frag) + frag.insertBefore(xferNode, frag.firstChild); + + --cnt; + n = sibling; + } + + // Collapse to just before the endAncestor, which + // is partially selected. + if (how != CLONE) { + t.setEndBefore(endAncestor); + t.collapse(FALSE); + } + + return frag; + }; + + function _traverseCommonEndContainer(startAncestor, how) { + var frag, startIdx, n, cnt, sibling, xferNode; + + if (how != DELETE) + frag = doc.createDocumentFragment(); + + n = _traverseLeftBoundary(startAncestor, how); + if (frag) + frag.appendChild(n); + + startIdx = nodeIndex(startAncestor); + ++startIdx; // Because we already traversed it + + cnt = t[END_OFFSET] - startIdx; + n = startAncestor.nextSibling; + while (cnt > 0) { + sibling = n.nextSibling; + xferNode = _traverseFullySelected(n, how); + + if (frag) + frag.appendChild(xferNode); + + --cnt; + n = sibling; + } + + if (how != CLONE) { + t.setStartAfter(startAncestor); + t.collapse(TRUE); + } + + return frag; + }; + + function _traverseCommonAncestors(startAncestor, endAncestor, how) { + var n, frag, commonParent, startOffset, endOffset, cnt, sibling, nextSibling; + + if (how != DELETE) + frag = doc.createDocumentFragment(); + + n = _traverseLeftBoundary(startAncestor, how); + if (frag) + frag.appendChild(n); + + commonParent = startAncestor.parentNode; + startOffset = nodeIndex(startAncestor); + endOffset = nodeIndex(endAncestor); + ++startOffset; + + cnt = endOffset - startOffset; + sibling = startAncestor.nextSibling; + + while (cnt > 0) { + nextSibling = sibling.nextSibling; + n = _traverseFullySelected(sibling, how); + + if (frag) + frag.appendChild(n); + + sibling = nextSibling; + --cnt; + } + + n = _traverseRightBoundary(endAncestor, how); + + if (frag) + frag.appendChild(n); + + if (how != CLONE) { + t.setStartAfter(startAncestor); + t.collapse(TRUE); + } + + return frag; + }; + + function _traverseRightBoundary(root, how) { + var next = _getSelectedNode(t[END_CONTAINER], t[END_OFFSET] - 1), parent, clonedParent, prevSibling, clonedChild, clonedGrandParent, isFullySelected = next != t[END_CONTAINER]; + + if (next == root) + return _traverseNode(next, isFullySelected, FALSE, how); + + parent = next.parentNode; + clonedParent = _traverseNode(parent, FALSE, FALSE, how); + + while (parent) { + while (next) { + prevSibling = next.previousSibling; + clonedChild = _traverseNode(next, isFullySelected, FALSE, how); + + if (how != DELETE) + clonedParent.insertBefore(clonedChild, clonedParent.firstChild); + + isFullySelected = TRUE; + next = prevSibling; + } + + if (parent == root) + return clonedParent; + + next = parent.previousSibling; + parent = parent.parentNode; + + clonedGrandParent = _traverseNode(parent, FALSE, FALSE, how); + + if (how != DELETE) + clonedGrandParent.appendChild(clonedParent); + + clonedParent = clonedGrandParent; + } + }; + + function _traverseLeftBoundary(root, how) { + var next = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]), isFullySelected = next != t[START_CONTAINER], parent, clonedParent, nextSibling, clonedChild, clonedGrandParent; + + if (next == root) + return _traverseNode(next, isFullySelected, TRUE, how); + + parent = next.parentNode; + clonedParent = _traverseNode(parent, FALSE, TRUE, how); + + while (parent) { + while (next) { + nextSibling = next.nextSibling; + clonedChild = _traverseNode(next, isFullySelected, TRUE, how); + + if (how != DELETE) + clonedParent.appendChild(clonedChild); + + isFullySelected = TRUE; + next = nextSibling; + } + + if (parent == root) + return clonedParent; + + next = parent.nextSibling; + parent = parent.parentNode; + + clonedGrandParent = _traverseNode(parent, FALSE, TRUE, how); + + if (how != DELETE) + clonedGrandParent.appendChild(clonedParent); + + clonedParent = clonedGrandParent; + } + }; + + function _traverseNode(n, isFullySelected, isLeft, how) { + var txtValue, newNodeValue, oldNodeValue, offset, newNode; + + if (isFullySelected) + return _traverseFullySelected(n, how); + + if (n.nodeType == 3 /* TEXT_NODE */) { + txtValue = n.nodeValue; + + if (isLeft) { + offset = t[START_OFFSET]; + newNodeValue = txtValue.substring(offset); + oldNodeValue = txtValue.substring(0, offset); + } else { + offset = t[END_OFFSET]; + newNodeValue = txtValue.substring(0, offset); + oldNodeValue = txtValue.substring(offset); + } + + if (how != CLONE) + n.nodeValue = oldNodeValue; + + if (how == DELETE) + return; + + newNode = n.cloneNode(FALSE); + newNode.nodeValue = newNodeValue; + + return newNode; + } + + if (how == DELETE) + return; + + return n.cloneNode(FALSE); + }; + + function _traverseFullySelected(n, how) { + if (how != DELETE) + return how == CLONE ? n.cloneNode(TRUE) : n; + + n.parentNode.removeChild(n); + }; + }; + + ns.Range = Range; +})(tinymce.dom); + +(function() { + function Selection(selection) { + var self = this, dom = selection.dom, TRUE = true, FALSE = false; + + function getPosition(rng, start) { + var checkRng, startIndex = 0, endIndex, inside, + children, child, offset, index, position = -1, parent; - stopPropagation : function() { - this.cancelBubble = true; + // Setup test range, collapse it and get the parent + checkRng = rng.duplicate(); + checkRng.collapse(start); + parent = checkRng.parentElement(); + + // Check if the selection is within the right document + if (parent.ownerDocument !== selection.dom.doc) + return; + + // IE will report non editable elements as it's parent so look for an editable one + while (parent.contentEditable === "false") { + parent = parent.parentNode; } - } - }); - Event = tinymce.dom.Event = new tinymce.dom.EventUtils(); + // If parent doesn't have any children then return that we are inside the element + if (!parent.hasChildNodes()) { + return {node : parent, inside : 1}; + } - // Dispatch DOM content loaded event for IE and Safari - Event._wait(window); + // Setup node list and endIndex + children = parent.children; + endIndex = children.length - 1; - tinymce.addUnload(function() { - Event.destroy(); - }); -})(tinymce); + // Perform a binary search for the position + while (startIndex <= endIndex) { + index = Math.floor((startIndex + endIndex) / 2); -(function(tinymce) { - tinymce.dom.Element = function(id, settings) { - var t = this, dom, el; + // Move selection to node and compare the ranges + child = children[index]; + checkRng.moveToElementText(child); + position = checkRng.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', rng); - t.settings = settings = settings || {}; - t.id = id; - t.dom = dom = settings.dom || tinymce.DOM; + // Before/after or an exact match + if (position > 0) { + endIndex = index - 1; + } else if (position < 0) { + startIndex = index + 1; + } else { + return {node : child}; + } + } - // Only IE leaks DOM references, this is a lot faster - if (!tinymce.isIE) - el = dom.get(t.id); + // Check if child position is before or we didn't find a position + if (position < 0) { + // No element child was found use the parent element and the offset inside that + if (!child) { + checkRng.moveToElementText(parent); + checkRng.collapse(true); + child = parent; + inside = true; + } else + checkRng.collapse(false); - tinymce.each( - ('getPos,getRect,getParent,add,setStyle,getStyle,setStyles,' + - 'setAttrib,setAttribs,getAttrib,addClass,removeClass,' + - 'hasClass,getOuterHTML,setOuterHTML,remove,show,hide,' + - 'isHidden,setHTML,get').split(/,/) - , function(k) { - t[k] = function() { - var a = [id], i; + checkRng.setEndPoint(start ? 'EndToStart' : 'EndToEnd', rng); - for (i = 0; i < arguments.length; i++) - a.push(arguments[i]); + // Fix for edge case:
    ..
    ab|c
    + if (checkRng.compareEndPoints(start ? 'StartToStart' : 'StartToEnd', rng) > 0) { + checkRng = rng.duplicate(); + checkRng.collapse(start); - a = dom[k].apply(dom, a); - t.update(k); + offset = -1; + while (parent == checkRng.parentElement()) { + if (checkRng.move('character', -1) == 0) + break; - return a; - }; - }); + offset++; + } + } - tinymce.extend(t, { - on : function(n, f, s) { - return tinymce.dom.Event.add(t.id, n, f, s); - }, + offset = offset || checkRng.text.replace('\r\n', ' ').length; + } else { + // Child position is after the selection endpoint + checkRng.collapse(true); + checkRng.setEndPoint(start ? 'StartToStart' : 'StartToEnd', rng); - getXY : function() { - return { - x : parseInt(t.getStyle('left')), - y : parseInt(t.getStyle('top')) - }; - }, + // Get the length of the text to find where the endpoint is relative to it's container + offset = checkRng.text.replace('\r\n', ' ').length; + } - getSize : function() { - var n = dom.get(t.id); + return {node : child, position : position, offset : offset, inside : inside}; + }; - return { - w : parseInt(t.getStyle('width') || n.clientWidth), - h : parseInt(t.getStyle('height') || n.clientHeight) - }; - }, + // Returns a W3C DOM compatible range object by using the IE Range API + function getRange() { + var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed, tmpRange, element2, bookmark, fail; - moveTo : function(x, y) { - t.setStyles({left : x, top : y}); - }, + // If selection is outside the current document just return an empty range + element = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); + if (element.ownerDocument != dom.doc) + return domRange; - moveBy : function(x, y) { - var p = t.getXY(); + collapsed = selection.isCollapsed(); - t.moveTo(p.x + x, p.y + y); - }, + // Handle control selection + if (ieRange.item) { + domRange.setStart(element.parentNode, dom.nodeIndex(element)); + domRange.setEnd(domRange.startContainer, domRange.startOffset + 1); - resizeTo : function(w, h) { - t.setStyles({width : w, height : h}); - }, + return domRange; + } - resizeBy : function(w, h) { - var s = t.getSize(); + function findEndPoint(start) { + var endPoint = getPosition(ieRange, start), container, offset, textNodeOffset = 0, sibling, undef, nodeValue; - t.resizeTo(s.w + w, s.h + h); - }, + container = endPoint.node; + offset = endPoint.offset; - update : function(k) { - var b; + if (endPoint.inside && !container.hasChildNodes()) { + domRange[start ? 'setStart' : 'setEnd'](container, 0); + return; + } - if (tinymce.isIE6 && settings.blocker) { - k = k || ''; + if (offset === undef) { + domRange[start ? 'setStartBefore' : 'setEndAfter'](container); + return; + } - // Ignore getters - if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0) - return; + if (endPoint.position < 0) { + sibling = endPoint.inside ? container.firstChild : container.nextSibling; - // Remove blocker on remove - if (k == 'remove') { - dom.remove(t.blocker); + if (!sibling) { + domRange[start ? 'setStartAfter' : 'setEndAfter'](container); return; } - if (!t.blocker) { - t.blocker = dom.uniqueId(); - b = dom.add(settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'}); - dom.setStyle(b, 'opacity', 0); - } else - b = dom.get(t.blocker); - - dom.setStyles(b, { - left : t.getStyle('left', 1), - top : t.getStyle('top', 1), - width : t.getStyle('width', 1), - height : t.getStyle('height', 1), - display : t.getStyle('display', 1), - zIndex : parseInt(t.getStyle('zIndex', 1) || 0) - 1 - }); - } - } - }); - }; -})(tinymce); - -(function(tinymce) { - function trimNl(s) { - return s.replace(/[\n\r]+/g, ''); - }; + if (!offset) { + if (sibling.nodeType == 3) + domRange[start ? 'setStart' : 'setEnd'](sibling, 0); + else + domRange[start ? 'setStartBefore' : 'setEndBefore'](sibling); - // Shorten names - var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each; + return; + } - tinymce.create('tinymce.dom.Selection', { - Selection : function(dom, win, serializer) { - var t = this; + // Find the text node and offset + while (sibling) { + nodeValue = sibling.nodeValue; + textNodeOffset += nodeValue.length; - t.dom = dom; - t.win = win; - t.serializer = serializer; + // We are at or passed the position we where looking for + if (textNodeOffset >= offset) { + container = sibling; + textNodeOffset -= offset; + textNodeOffset = nodeValue.length - textNodeOffset; + break; + } - // Add events - each([ - 'onBeforeSetContent', - 'onBeforeGetContent', - 'onSetContent', - 'onGetContent' - ], function(e) { - t[e] = new tinymce.util.Dispatcher(t); - }); + sibling = sibling.nextSibling; + } + } else { + // Find the text node and offset + sibling = container.previousSibling; - // No W3C Range support - if (!t.win.getSelection) - t.tridentSel = new tinymce.dom.TridentSelection(t); + if (!sibling) + return domRange[start ? 'setStartBefore' : 'setEndBefore'](container); - if (tinymce.isIE && dom.boxModel) - this._fixIESelection(); + // If there isn't any text to loop then use the first position + if (!offset) { + if (container.nodeType == 3) + domRange[start ? 'setStart' : 'setEnd'](sibling, container.nodeValue.length); + else + domRange[start ? 'setStartAfter' : 'setEndAfter'](sibling); - // Prevent leaks - tinymce.addUnload(t.destroy, t); - }, + return; + } - getContent : function(s) { - var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n; + while (sibling) { + textNodeOffset += sibling.nodeValue.length; - s = s || {}; - wb = wa = ''; - s.get = true; - s.format = s.format || 'html'; - t.onBeforeGetContent.dispatch(t, s); + // We are at or passed the position we where looking for + if (textNodeOffset >= offset) { + container = sibling; + textNodeOffset -= offset; + break; + } - if (s.format == 'text') - return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : '')); + sibling = sibling.previousSibling; + } + } - if (r.cloneContents) { - n = r.cloneContents(); + domRange[start ? 'setStart' : 'setEnd'](container, textNodeOffset); + }; - if (n) - e.appendChild(n); - } else if (is(r.item) || is(r.htmlText)) - e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText; - else - e.innerHTML = r.toString(); + try { + // Find start point + findEndPoint(true); - // Keep whitespace before and after - if (/^\s/.test(e.innerHTML)) - wb = ' '; + // Find end point if needed + if (!collapsed) + findEndPoint(); + } catch (ex) { + // IE has a nasty bug where text nodes might throw "invalid argument" when you + // access the nodeValue or other properties of text nodes. This seems to happend when + // text nodes are split into two nodes by a delete/backspace call. So lets detect it and try to fix it. + if (ex.number == -2147024809) { + // Get the current selection + bookmark = self.getBookmark(2); + + // Get start element + tmpRange = ieRange.duplicate(); + tmpRange.collapse(true); + element = tmpRange.parentElement(); + + // Get end element + if (!collapsed) { + tmpRange = ieRange.duplicate(); + tmpRange.collapse(false); + element2 = tmpRange.parentElement(); + element2.innerHTML = element2.innerHTML; + } - if (/\s+$/.test(e.innerHTML)) - wa = ' '; + // Remove the broken elements + element.innerHTML = element.innerHTML; - s.getInner = true; + // Restore the selection + self.moveToBookmark(bookmark); - s.content = t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa; - t.onGetContent.dispatch(t, s); + // Since the range has moved we need to re-get it + ieRange = selection.getRng(); - return s.content; - }, + // Find start point + findEndPoint(true); - setContent : function(h, s) { - var t = this, r = t.getRng(), c, d = t.win.document; + // Find end point if needed + if (!collapsed) + findEndPoint(); + } else + throw ex; // Throw other errors + } - s = s || {format : 'html'}; - s.set = true; - h = s.content = t.dom.processHTML(h); + return domRange; + }; - // Dispatch before set content event - t.onBeforeSetContent.dispatch(t, s); - h = s.content; + this.getBookmark = function(type) { + var rng = selection.getRng(), start, end, bookmark = {}; - if (r.insertNode) { - // Make caret marker since insertNode places the caret in the beginning of text after insert - h += '_'; + function getIndexes(node) { + var node, parent, root, children, i, indexes = []; - // Delete and insert new node - - if (r.startContainer == d && r.endContainer == d) { - // WebKit will fail if the body is empty since the range is then invalid and it can't insert contents - d.body.innerHTML = h; - } else { - r.deleteContents(); - if (d.body.childNodes.length == 0) { - d.body.innerHTML = h; - } else { - // createContextualFragment doesn't exists in IE 9 DOMRanges - if (r.createContextualFragment) { - r.insertNode(r.createContextualFragment(h)); - } else { - // Fake createContextualFragment call in IE 9 - var frag = d.createDocumentFragment(), temp = d.createElement('div'); + parent = node.parentNode; + root = dom.getRoot().parentNode; - frag.appendChild(temp); - temp.outerHTML = h; + while (parent != root) { + children = parent.children; - r.insertNode(frag); + i = children.length; + while (i--) { + if (node === children[i]) { + indexes.push(i); + break; } } + + node = parent; + parent = parent.parentNode; } - // Move to caret marker - c = t.dom.get('__caret'); - // Make sure we wrap it compleatly, Opera fails with a simple select call - r = d.createRange(); - r.setStartBefore(c); - r.setEndBefore(c); - t.setRng(r); + return indexes; + }; - // Remove the caret position - t.dom.remove('__caret'); - } else { - if (r.item) { - // Delete content and get caret text selection - d.execCommand('Delete', false, null); - r = t.getRng(); - } + function getBookmarkEndPoint(start) { + var position; - r.pasteHTML(h); - } + position = getPosition(rng, start); + if (position) { + return { + position : position.position, + offset : position.offset, + indexes : getIndexes(position.node), + inside : position.inside + }; + } + }; - // Dispatch set content event - t.onSetContent.dispatch(t, s); - }, + // Non ubstructive bookmark + if (type === 2) { + // Handle text selection + if (!rng.item) { + bookmark.start = getBookmarkEndPoint(true); - getStart : function() { - var rng = this.getRng(), startElement, parentElement, checkRng, node; + if (!selection.isCollapsed()) + bookmark.end = getBookmarkEndPoint(); + } else + bookmark.start = {ctrl : true, indexes : getIndexes(rng.item(0))}; + } - if (rng.duplicate || rng.item) { - // Control selection, return first item - if (rng.item) - return rng.item(0); + return bookmark; + }; - // Get start element - checkRng = rng.duplicate(); - checkRng.collapse(1); - startElement = checkRng.parentElement(); + this.moveToBookmark = function(bookmark) { + var rng, body = dom.doc.body; - // Check if range parent is inside the start element, then return the inner parent element - // This will fix issues when a single element is selected, IE would otherwise return the wrong start element - parentElement = node = rng.parentElement(); - while (node = node.parentNode) { - if (node == startElement) { - startElement = parentElement; - break; + function resolveIndexes(indexes) { + var node, i, idx, children; + + node = dom.getRoot(); + for (i = indexes.length - 1; i >= 0; i--) { + children = node.children; + idx = indexes[i]; + + if (idx <= children.length - 1) { + node = children[idx]; } } - // If start element is body element try to move to the first child if it exists - if (startElement && startElement.nodeName == 'BODY') - return startElement.firstChild || startElement; + return node; + }; + + function setBookmarkEndPoint(start) { + var endPoint = bookmark[start ? 'start' : 'end'], moveLeft, moveRng, undef; - return startElement; - } else { - startElement = rng.startContainer; + if (endPoint) { + moveLeft = endPoint.position > 0; - if (startElement.nodeType == 1 && startElement.hasChildNodes()) - startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)]; + moveRng = body.createTextRange(); + moveRng.moveToElementText(resolveIndexes(endPoint.indexes)); - if (startElement && startElement.nodeType == 3) - return startElement.parentNode; + offset = endPoint.offset; + if (offset !== undef) { + moveRng.collapse(endPoint.inside || moveLeft); + moveRng.moveStart('character', moveLeft ? -offset : offset); + } else + moveRng.collapse(start); - return startElement; + rng.setEndPoint(start ? 'StartToStart' : 'EndToStart', moveRng); + + if (start) + rng.collapse(true); + } + }; + + if (bookmark.start) { + if (bookmark.start.ctrl) { + rng = body.createControlRange(); + rng.addElement(resolveIndexes(bookmark.start.indexes)); + rng.select(); + } else { + rng = body.createTextRange(); + setBookmarkEndPoint(true); + setBookmarkEndPoint(); + rng.select(); + } } - }, + }; - getEnd : function() { - var t = this, r = t.getRng(), e, eo; + this.addRange = function(rng) { + var ieRng, ctrlRng, startContainer, startOffset, endContainer, endOffset, doc = selection.dom.doc, body = doc.body; - if (r.duplicate || r.item) { - if (r.item) - return r.item(0); + function setEndPoint(start) { + var container, offset, marker, tmpRng, nodes; - r = r.duplicate(); - r.collapse(0); - e = r.parentElement(); + marker = dom.create('a'); + container = start ? startContainer : endContainer; + offset = start ? startOffset : endOffset; + tmpRng = ieRng.duplicate(); - if (e && e.nodeName == 'BODY') - return e.lastChild || e; + if (container == doc || container == doc.documentElement) { + container = body; + offset = 0; + } - return e; - } else { - e = r.endContainer; - eo = r.endOffset; + if (container.nodeType == 3) { + container.parentNode.insertBefore(marker, container); + tmpRng.moveToElementText(marker); + tmpRng.moveStart('character', offset); + dom.remove(marker); + ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); + } else { + nodes = container.childNodes; - if (e.nodeType == 1 && e.hasChildNodes()) - e = e.childNodes[eo > 0 ? eo - 1 : eo]; + if (nodes.length) { + if (offset >= nodes.length) { + dom.insertAfter(marker, nodes[nodes.length - 1]); + } else { + container.insertBefore(marker, nodes[offset]); + } - if (e && e.nodeType == 3) - return e.parentNode; + tmpRng.moveToElementText(marker); + } else { + // Empty node selection for example
    |
    + marker = doc.createTextNode('\uFEFF'); + container.appendChild(marker); + tmpRng.moveToElementText(marker.parentNode); + tmpRng.collapse(TRUE); + } - return e; + ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); + dom.remove(marker); + } } - }, - getBookmark : function(type, normalized) { - var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles; + // Setup some shorter versions + startContainer = rng.startContainer; + startOffset = rng.startOffset; + endContainer = rng.endContainer; + endOffset = rng.endOffset; + ieRng = body.createTextRange(); - function findIndex(name, element) { - var index = 0; + // If single element selection then try making a control selection out of it + if (startContainer == endContainer && startContainer.nodeType == 1 && startOffset == endOffset - 1) { + if (startOffset == endOffset - 1) { + try { + ctrlRng = body.createControlRange(); + ctrlRng.addElement(startContainer.childNodes[startOffset]); + ctrlRng.select(); + return; + } catch (ex) { + // Ignore + } + } + } - each(dom.select(name), function(node, i) { - if (node == element) - index = i; - }); + // Set start/end point of selection + setEndPoint(true); + setEndPoint(); - return index; - }; + // Select the new range and scroll it into view + ieRng.select(); + }; - if (type == 2) { - function getLocation() { - var rng = t.getRng(true), root = dom.getRoot(), bookmark = {}; + // Expose range method + this.getRangeAt = getRange; + }; - function getPoint(rng, start) { - var container = rng[start ? 'startContainer' : 'endContainer'], - offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0; + // Expose the selection object + tinymce.dom.TridentSelection = Selection; +})(); - if (container.nodeType == 3) { - if (normalized) { - for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling) - offset += node.nodeValue.length; - } - point.push(offset); - } else { - childNodes = container.childNodes; +(function(tinymce) { + // Shorten names + var each = tinymce.each, DOM = tinymce.DOM, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, Event; - if (offset >= childNodes.length && childNodes.length) { - after = 1; - offset = Math.max(0, childNodes.length - 1); - } + tinymce.create('tinymce.dom.EventUtils', { + EventUtils : function() { + this.inits = []; + this.events = []; + }, - point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after); - } + add : function(o, n, f, s) { + var cb, t = this, el = t.events, r; - for (; container && container != root; container = container.parentNode) - point.push(t.dom.nodeIndex(container, normalized)); + if (n instanceof Array) { + r = []; - return point; - }; + each(n, function(n) { + r.push(t.add(o, n, f, s)); + }); - bookmark.start = getPoint(rng, true); + return r; + } - if (!t.isCollapsed()) - bookmark.end = getPoint(rng); + // Handle array + if (o && o.hasOwnProperty && o instanceof Array) { + r = []; - return bookmark; - }; + each(o, function(o) { + o = DOM.get(o); + r.push(t.add(o, n, f, s)); + }); - return getLocation(); + return r; } - // Handle simple range - if (type) - return {rng : t.getRng()}; + o = DOM.get(o); - rng = t.getRng(); - id = dom.uniqueId(); - collapsed = tinyMCE.activeEditor.selection.isCollapsed(); - styles = 'overflow:hidden;line-height:0px'; + if (!o) + return; - // Explorer method - if (rng.duplicate || rng.item) { - // Text selection - if (!rng.item) { - rng2 = rng.duplicate(); + // Setup event callback + cb = function(e) { + // Is all events disabled + if (t.disabled) + return; - // Insert start marker - rng.collapse(); - rng.pasteHTML('' + chr + ''); + e = e || window.event; - // Insert end marker - if (!collapsed) { - rng2.collapse(false); - rng2.pasteHTML('' + chr + ''); - } - } else { - // Control selection - element = rng.item(0); - name = element.nodeName; + // Patch in target, preventDefault and stopPropagation in IE it's W3C valid + if (e && isIE) { + if (!e.target) + e.target = e.srcElement; - return {name : name, index : findIndex(name, element)}; + // Patch in preventDefault, stopPropagation methods for W3C compatibility + tinymce.extend(e, t._stoppers); } - } else { - element = t.getNode(); - name = element.nodeName; - if (name == 'IMG') - return {name : name, index : findIndex(name, element)}; - // W3C method - rng2 = rng.cloneRange(); + if (!s) + return f(e); - // Insert end marker - if (!collapsed) { - rng2.collapse(false); - rng2.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_end', style : styles}, chr)); - } + return f.call(s, e); + }; - rng.collapse(true); - rng.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_start', style : styles}, chr)); + if (n == 'unload') { + tinymce.unloads.unshift({func : cb}); + return cb; } - t.moveToBookmark({id : id, keep : 1}); - - return {id : id}; - }, - - moveToBookmark : function(bookmark) { - var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset; + if (n == 'init') { + if (t.domLoaded) + cb(); + else + t.inits.push(cb); - // Clear selection cache - if (t.tridentSel) - t.tridentSel.destroy(); + return cb; + } - if (bookmark) { - if (bookmark.start) { - rng = dom.createRng(); - root = dom.getRoot(); + // Store away listener reference + el.push({ + obj : o, + name : n, + func : f, + cfunc : cb, + scope : s + }); - function setEndPoint(start) { - var point = bookmark[start ? 'start' : 'end'], i, node, offset, children; + t._add(o, n, cb); - if (point) { - // Find container node - for (node = root, i = point.length - 1; i >= 1; i--) { - children = node.childNodes; + return f; + }, - if (children.length) - node = children[point[i]]; - } + remove : function(o, n, f) { + var t = this, a = t.events, s = false, r; - // Set offset within container node - if (start) - rng.setStart(node, point[0]); - else - rng.setEnd(node, point[0]); - } - }; + // Handle array + if (o && o.hasOwnProperty && o instanceof Array) { + r = []; - setEndPoint(true); - setEndPoint(); + each(o, function(o) { + o = DOM.get(o); + r.push(t.remove(o, n, f)); + }); - t.setRng(rng); - } else if (bookmark.id) { - function restoreEndPoint(suffix) { - var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep; + return r; + } - if (marker) { - node = marker.parentNode; + o = DOM.get(o); - if (suffix == 'start') { - if (!keep) { - idx = dom.nodeIndex(marker); - } else { - node = marker.firstChild; - idx = 1; - } + each(a, function(e, i) { + if (e.obj == o && e.name == n && (!f || (e.func == f || e.cfunc == f))) { + a.splice(i, 1); + t._remove(o, n, e.cfunc); + s = true; + return false; + } + }); - startContainer = endContainer = node; - startOffset = endOffset = idx; - } else { - if (!keep) { - idx = dom.nodeIndex(marker); - } else { - node = marker.firstChild; - idx = 1; - } + return s; + }, - endContainer = node; - endOffset = idx; - } + clear : function(o) { + var t = this, a = t.events, i, e; - if (!keep) { - prev = marker.previousSibling; - next = marker.nextSibling; + if (o) { + o = DOM.get(o); - // Remove all marker text nodes - each(tinymce.grep(marker.childNodes), function(node) { - if (node.nodeType == 3) - node.nodeValue = node.nodeValue.replace(/\uFEFF/g, ''); - }); + for (i = a.length - 1; i >= 0; i--) { + e = a[i]; - // Remove marker but keep children if for example contents where inserted into the marker - // Also remove duplicated instances of the marker for example by a split operation or by WebKit auto split on paste feature - while (marker = dom.get(bookmark.id + '_' + suffix)) - dom.remove(marker, 1); + if (e.obj === o) { + t._remove(e.obj, e.name, e.cfunc); + e.obj = e.cfunc = null; + a.splice(i, 1); + } + } + } + }, - // If siblings are text nodes then merge them unless it's Opera since it some how removes the node - // and we are sniffing since adding a lot of detection code for a browser with 3% of the market isn't worth the effort. Sorry, Opera but it's just a fact - if (prev && next && prev.nodeType == next.nodeType && prev.nodeType == 3 && !tinymce.isOpera) { - idx = prev.nodeValue.length; - prev.appendData(next.nodeValue); - dom.remove(next); + cancel : function(e) { + if (!e) + return false; - if (suffix == 'start') { - startContainer = endContainer = prev; - startOffset = endOffset = idx; - } else { - endContainer = prev; - endOffset = idx; - } - } - } - } - }; + this.stop(e); - function addBogus(node) { - // Adds a bogus BR element for empty block elements - // on non IE browsers just to have a place to put the caret - if (!isIE && dom.isBlock(node) && !node.innerHTML) - node.innerHTML = '
    '; + return this.prevent(e); + }, - return node; - }; + stop : function(e) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.cancelBubble = true; - // Restore start/end points - restoreEndPoint('start'); - restoreEndPoint('end'); + return false; + }, - if (startContainer) { - rng = dom.createRng(); - rng.setStart(addBogus(startContainer), startOffset); - rng.setEnd(addBogus(endContainer), endOffset); - t.setRng(rng); - } - } else if (bookmark.name) { - t.select(dom.select(bookmark.name)[bookmark.index]); - } else if (bookmark.rng) - t.setRng(bookmark.rng); - } + prevent : function(e) { + if (e.preventDefault) + e.preventDefault(); + else + e.returnValue = false; + + return false; }, - select : function(node, content) { - var t = this, dom = t.dom, rng = dom.createRng(), idx; + destroy : function() { + var t = this; - idx = dom.nodeIndex(node); - rng.setStart(node.parentNode, idx); - rng.setEnd(node.parentNode, idx + 1); + each(t.events, function(e, i) { + t._remove(e.obj, e.name, e.cfunc); + e.obj = e.cfunc = null; + }); - // Find first/last text node or BR element - if (content) { - function setPoint(node, start) { - var walker = new tinymce.dom.TreeWalker(node, node); + t.events = []; + t = null; + }, - do { - // Text node - if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { - if (start) - rng.setStart(node, 0); - else - rng.setEnd(node, node.nodeValue.length); + _add : function(o, n, f) { + if (o.attachEvent) + o.attachEvent('on' + n, f); + else if (o.addEventListener) + o.addEventListener(n, f, false); + else + o['on' + n] = f; + }, - return; - } + _remove : function(o, n, f) { + if (o) { + try { + if (o.detachEvent) + o.detachEvent('on' + n, f); + else if (o.removeEventListener) + o.removeEventListener(n, f, false); + else + o['on' + n] = null; + } catch (ex) { + // Might fail with permission denined on IE so we just ignore that + } + } + }, - // BR element - if (node.nodeName == 'BR') { - if (start) - rng.setStartBefore(node); - else - rng.setEndBefore(node); + _pageInit : function(win) { + var t = this; - return; - } - } while (node = (start ? walker.next() : walker.prev())); - }; + // Keep it from running more than once + if (t.domLoaded) + return; - setPoint(node, 1); - setPoint(node); - } + t.domLoaded = true; - t.setRng(rng); + each(t.inits, function(c) { + c(); + }); - return node; + t.inits = []; }, - isCollapsed : function() { - var t = this, r = t.getRng(), s = t.getSel(); + _wait : function(win) { + var t = this, doc = win.document; - if (!r || r.item) - return false; + // No need since the document is already loaded + if (win.tinyMCE_GZ && tinyMCE_GZ.loaded) { + t.domLoaded = 1; + return; + } - if (r.compareEndPoints) - return r.compareEndPoints('StartToEnd', r) === 0; + // Use IE method + if (doc.attachEvent) { + doc.attachEvent("onreadystatechange", function() { + if (doc.readyState === "complete") { + doc.detachEvent("onreadystatechange", arguments.callee); + t._pageInit(win); + } + }); - return !s || r.collapsed; - }, + if (doc.documentElement.doScroll && win == win.top) { + (function() { + if (t.domLoaded) + return; - collapse : function(b) { - var t = this, r = t.getRng(), n; + try { + // If IE is used, use the trick by Diego Perini licensed under MIT by request to the author. + // http://javascript.nwbox.com/IEContentLoaded/ + doc.documentElement.doScroll("left"); + } catch (ex) { + setTimeout(arguments.callee, 0); + return; + } - // Control range on IE - if (r.item) { - n = r.item(0); - r = this.win.document.body.createTextRange(); - r.moveToElementText(n); + t._pageInit(win); + })(); + } + } else if (doc.addEventListener) { + t._add(win, 'DOMContentLoaded', function() { + t._pageInit(win); + }); } - r.collapse(!!b); - t.setRng(r); + t._add(win, 'load', function() { + t._pageInit(win); + }); }, - getSel : function() { - var t = this, w = this.win; + _stoppers : { + preventDefault : function() { + this.returnValue = false; + }, - return w.getSelection ? w.getSelection() : w.document.selection; - }, + stopPropagation : function() { + this.cancelBubble = true; + } + } + }); - getRng : function(w3c) { - var t = this, s, r, elm, doc = t.win.document; + Event = tinymce.dom.Event = new tinymce.dom.EventUtils(); - // Found tridentSel object then we need to use that one - if (w3c && t.tridentSel) - return t.tridentSel.getRangeAt(0); + // Dispatch DOM content loaded event for IE and Safari + Event._wait(window); - try { - if (s = t.getSel()) - r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : doc.createRange()); - } catch (ex) { - // IE throws unspecified error here if TinyMCE is placed in a frame/iframe - } + tinymce.addUnload(function() { + Event.destroy(); + }); +})(tinymce); - // We have W3C ranges and it's IE then fake control selection since IE9 doesn't handle that correctly yet - if (tinymce.isIE && r.setStart && doc.selection.createRange().item) { - elm = doc.selection.createRange().item(0); - r = doc.createRange(); - r.setStartBefore(elm); - r.setEndAfter(elm); - } +(function(tinymce) { + tinymce.dom.Element = function(id, settings) { + var t = this, dom, el; - // No range found then create an empty one - // This can occur when the editor is placed in a hidden container element on Gecko - // Or on IE when there was an exception - if (!r) - r = doc.createRange ? doc.createRange() : doc.body.createTextRange(); + t.settings = settings = settings || {}; + t.id = id; + t.dom = dom = settings.dom || tinymce.DOM; - if (t.selectedRange && t.explicitRange) { - if (r.compareBoundaryPoints(r.START_TO_START, t.selectedRange) === 0 && r.compareBoundaryPoints(r.END_TO_END, t.selectedRange) === 0) { - // Safari, Opera and Chrome only ever select text which causes the range to change. - // This lets us use the originally set range if the selection hasn't been changed by the user. - r = t.explicitRange; - } else { - t.selectedRange = null; - t.explicitRange = null; - } - } - return r; - }, + // Only IE leaks DOM references, this is a lot faster + if (!tinymce.isIE) + el = dom.get(t.id); - setRng : function(r) { - var s, t = this; - - if (!t.tridentSel) { - s = t.getSel(); + tinymce.each( + ('getPos,getRect,getParent,add,setStyle,getStyle,setStyles,' + + 'setAttrib,setAttribs,getAttrib,addClass,removeClass,' + + 'hasClass,getOuterHTML,setOuterHTML,remove,show,hide,' + + 'isHidden,setHTML,get').split(/,/) + , function(k) { + t[k] = function() { + var a = [id], i; - if (s) { - t.explicitRange = r; - s.removeAllRanges(); - s.addRange(r); - t.selectedRange = s.getRangeAt(0); - } - } else { - // Is W3C Range - if (r.cloneRange) { - t.tridentSel.addRange(r); - return; - } + for (i = 0; i < arguments.length; i++) + a.push(arguments[i]); - // Is IE specific range - try { - r.select(); - } catch (ex) { - // Needed for some odd IE bug #1843306 - } - } - }, + a = dom[k].apply(dom, a); + t.update(k); - setNode : function(n) { - var t = this; + return a; + }; + }); - t.setContent(t.dom.getOuterHTML(n)); + tinymce.extend(t, { + on : function(n, f, s) { + return tinymce.dom.Event.add(t.id, n, f, s); + }, - return n; - }, + getXY : function() { + return { + x : parseInt(t.getStyle('left')), + y : parseInt(t.getStyle('top')) + }; + }, - getNode : function() { - var t = this, rng = t.getRng(), sel = t.getSel(), elm; + getSize : function() { + var n = dom.get(t.id); - if (rng.setStart) { - // Range maybe lost after the editor is made visible again - if (!rng) - return t.dom.getRoot(); + return { + w : parseInt(t.getStyle('width') || n.clientWidth), + h : parseInt(t.getStyle('height') || n.clientHeight) + }; + }, - elm = rng.commonAncestorContainer; + moveTo : function(x, y) { + t.setStyles({left : x, top : y}); + }, - // Handle selection a image or other control like element such as anchors - if (!rng.collapsed) { - if (rng.startContainer == rng.endContainer) { - if (rng.startOffset - rng.endOffset < 2) { - if (rng.startContainer.hasChildNodes()) - elm = rng.startContainer.childNodes[rng.startOffset]; - } - } + moveBy : function(x, y) { + var p = t.getXY(); - // If the anchor node is a element instead of a text node then return this element - if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) - return sel.anchorNode.childNodes[sel.anchorOffset]; - } + t.moveTo(p.x + x, p.y + y); + }, - if (elm && elm.nodeType == 3) - return elm.parentNode; + resizeTo : function(w, h) { + t.setStyles({width : w, height : h}); + }, - return elm; - } + resizeBy : function(w, h) { + var s = t.getSize(); - return rng.item ? rng.item(0) : rng.parentElement(); - }, + t.resizeTo(s.w + w, s.h + h); + }, - getSelectedBlocks : function(st, en) { - var t = this, dom = t.dom, sb, eb, n, bl = []; + update : function(k) { + var b; - sb = dom.getParent(st || t.getStart(), dom.isBlock); - eb = dom.getParent(en || t.getEnd(), dom.isBlock); + if (tinymce.isIE6 && settings.blocker) { + k = k || ''; - if (sb) - bl.push(sb); + // Ignore getters + if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0) + return; - if (sb && eb && sb != eb) { - n = sb; + // Remove blocker on remove + if (k == 'remove') { + dom.remove(t.blocker); + return; + } - while ((n = n.nextSibling) && n != eb) { - if (dom.isBlock(n)) - bl.push(n); + if (!t.blocker) { + t.blocker = dom.uniqueId(); + b = dom.add(settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'}); + dom.setStyle(b, 'opacity', 0); + } else + b = dom.get(t.blocker); + + dom.setStyles(b, { + left : t.getStyle('left', 1), + top : t.getStyle('top', 1), + width : t.getStyle('width', 1), + height : t.getStyle('height', 1), + display : t.getStyle('display', 1), + zIndex : parseInt(t.getStyle('zIndex', 1) || 0) - 1 + }); } } + }); + }; +})(tinymce); - if (eb && sb != eb) - bl.push(eb); +(function(tinymce) { + function trimNl(s) { + return s.replace(/[\n\r]+/g, ''); + }; - return bl; - }, + // Shorten names + var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each; - destroy : function(s) { + tinymce.create('tinymce.dom.Selection', { + Selection : function(dom, win, serializer) { var t = this; - t.win = null; - - if (t.tridentSel) - t.tridentSel.destroy(); - - // Manual destroy then remove unload handler - if (!s) - tinymce.removeUnload(t.destroy); - }, + t.dom = dom; + t.win = win; + t.serializer = serializer; - // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode - _fixIESelection : function() { - var dom = this.dom, doc = dom.doc, body = doc.body, started, startRng; + // Add events + each([ + 'onBeforeSetContent', - // Make HTML element unselectable since we are going to handle selection by hand - doc.documentElement.unselectable = true; + 'onBeforeGetContent', - // Return range from point or null if it failed - function rngFromPoint(x, y) { - var rng = body.createTextRange(); + 'onSetContent', - try { - rng.moveToPoint(x, y); - } catch (ex) { - // IE sometimes throws and exception, so lets just ignore it - rng = null; - } + 'onGetContent' + ], function(e) { + t[e] = new tinymce.util.Dispatcher(t); + }); - return rng; - }; + // No W3C Range support + if (!t.win.getSelection) + t.tridentSel = new tinymce.dom.TridentSelection(t); - // Fires while the selection is changing - function selectionChange(e) { - var pointRng; + if (tinymce.isIE && dom.boxModel) + this._fixIESelection(); - // Check if the button is down or not - if (e.button) { - // Create range from mouse position - pointRng = rngFromPoint(e.x, e.y); + // Prevent leaks + tinymce.addUnload(t.destroy, t); + }, - if (pointRng) { - // Check if pointRange is before/after selection then change the endPoint - if (pointRng.compareEndPoints('StartToStart', startRng) > 0) - pointRng.setEndPoint('StartToStart', startRng); - else - pointRng.setEndPoint('EndToEnd', startRng); + setCursorLocation: function(node, offset) { + var t = this; var r = t.dom.createRng(); + r.setStart(node, offset); + r.setEnd(node, offset); + t.setRng(r); + t.collapse(false); + }, + getContent : function(s) { + var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n; - pointRng.select(); - } - } else - endSelection(); - } + s = s || {}; + wb = wa = ''; + s.get = true; + s.format = s.format || 'html'; + s.forced_root_block = ''; + t.onBeforeGetContent.dispatch(t, s); - // Removes listeners - function endSelection() { - dom.unbind(doc, 'mouseup', endSelection); - dom.unbind(doc, 'mousemove', selectionChange); - started = 0; - }; + if (s.format == 'text') + return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : '')); - // Detect when user selects outside BODY - dom.bind(doc, 'mousedown', function(e) { - if (e.target.nodeName === 'HTML') { - if (started) - endSelection(); + if (r.cloneContents) { + n = r.cloneContents(); - started = 1; + if (n) + e.appendChild(n); + } else if (is(r.item) || is(r.htmlText)) + e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText; + else + e.innerHTML = r.toString(); - // Setup start position - startRng = rngFromPoint(e.x, e.y); - if (startRng) { - // Listen for selection change events - dom.bind(doc, 'mouseup', endSelection); - dom.bind(doc, 'mousemove', selectionChange); + // Keep whitespace before and after + if (/^\s/.test(e.innerHTML)) + wb = ' '; - dom.win.focus(); - startRng.select(); - } - } - }); - } - }); -})(tinymce); + if (/\s+$/.test(e.innerHTML)) + wa = ' '; -(function(tinymce) { - tinymce.create('tinymce.dom.XMLWriter', { - node : null, - - XMLWriter : function(s) { - // Get XML document - function getXML() { - var i = document.implementation; - - if (!i || !i.createDocument) { - // Try IE objects - try {return new ActiveXObject('MSXML2.DOMDocument');} catch (ex) {} - try {return new ActiveXObject('Microsoft.XmlDom');} catch (ex) {} - } else - return i.createDocument('', '', null); - }; + s.getInner = true; - this.doc = getXML(); - - // Since Opera and WebKit doesn't escape > into > we need to do it our self to normalize the output for all browsers - this.valid = tinymce.isOpera || tinymce.isWebKit; + s.content = t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa; + t.onGetContent.dispatch(t, s); - this.reset(); + return s.content; }, - reset : function() { - var t = this, d = t.doc; + setContent : function(content, args) { + var self = this, rng = self.getRng(), caretNode, doc = self.win.document, frag, temp; - if (d.firstChild) - d.removeChild(d.firstChild); + args = args || {format : 'html'}; + args.set = true; + content = args.content = content; - t.node = d.appendChild(d.createElement("html")); - }, + // Dispatch before set content event + if (!args.no_events) + self.onBeforeSetContent.dispatch(self, args); - writeStartElement : function(n) { - var t = this; + content = args.content; - t.node = t.node.appendChild(t.doc.createElement(n)); - }, + if (rng.insertNode) { + // Make caret marker since insertNode places the caret in the beginning of text after insert + content += '_'; - writeAttribute : function(n, v) { - if (this.valid) - v = v.replace(/>/g, '%MCGT%'); + // Delete and insert new node + if (rng.startContainer == doc && rng.endContainer == doc) { + // WebKit will fail if the body is empty since the range is then invalid and it can't insert contents + doc.body.innerHTML = content; + } else { + rng.deleteContents(); - this.node.setAttribute(n, v); - }, + if (doc.body.childNodes.length == 0) { + doc.body.innerHTML = content; + } else { + // createContextualFragment doesn't exists in IE 9 DOMRanges + if (rng.createContextualFragment) { + rng.insertNode(rng.createContextualFragment(content)); + } else { + // Fake createContextualFragment call in IE 9 + frag = doc.createDocumentFragment(); + temp = doc.createElement('div'); - writeEndElement : function() { - this.node = this.node.parentNode; - }, + frag.appendChild(temp); + temp.outerHTML = content; - writeFullEndElement : function() { - var t = this, n = t.node; + rng.insertNode(frag); + } + } + } - n.appendChild(t.doc.createTextNode("")); - t.node = n.parentNode; - }, + // Move to caret marker + caretNode = self.dom.get('__caret'); - writeText : function(v) { - if (this.valid) - v = v.replace(/>/g, '%MCGT%'); + // Make sure we wrap it compleatly, Opera fails with a simple select call + rng = doc.createRange(); + rng.setStartBefore(caretNode); + rng.setEndBefore(caretNode); + self.setRng(rng); - this.node.appendChild(this.doc.createTextNode(v)); - }, + // Remove the caret position + self.dom.remove('__caret'); - writeCDATA : function(v) { - this.node.appendChild(this.doc.createCDATASection(v)); - }, + try { + self.setRng(rng); + } catch (ex) { + // Might fail on Opera for some odd reason + } + } else { + if (rng.item) { + // Delete content and get caret text selection + doc.execCommand('Delete', false, null); + rng = self.getRng(); + } - writeComment : function(v) { - // Fix for bug #2035694 - if (tinymce.isIE) - v = v.replace(/^\-|\-$/g, ' '); + rng.pasteHTML(content); + } - this.node.appendChild(this.doc.createComment(v.replace(/\-\-/g, ' '))); + // Dispatch set content event + if (!args.no_events) + self.onSetContent.dispatch(self, args); }, - getContent : function() { - var h; + getStart : function() { + var rng = this.getRng(), startElement, parentElement, checkRng, node; - h = this.doc.xml || new XMLSerializer().serializeToString(this.doc); - h = h.replace(/<\?[^?]+\?>|]*>|<\/html>||]+>/g, ''); - h = h.replace(/ ?\/>/g, ' />'); + if (rng.duplicate || rng.item) { + // Control selection, return first item + if (rng.item) + return rng.item(0); - if (this.valid) - h = h.replace(/\%MCGT%/g, '>'); + // Get start element + checkRng = rng.duplicate(); + checkRng.collapse(1); + startElement = checkRng.parentElement(); - return h; - } - }); -})(tinymce); + // Check if range parent is inside the start element, then return the inner parent element + // This will fix issues when a single element is selected, IE would otherwise return the wrong start element + parentElement = node = rng.parentElement(); + while (node = node.parentNode) { + if (node == startElement) { + startElement = parentElement; + break; + } + } -(function(tinymce) { - var attrsCharsRegExp = /[&\"<>]/g, textCharsRegExp = /[<>&]/g, encodedChars = {'&' : '&', '"' : '"', '<' : '<', '>' : '>'}; - - tinymce.create('tinymce.dom.StringWriter', { - str : null, - tags : null, - count : 0, - settings : null, - indent : null, - - StringWriter : function(s) { - this.settings = tinymce.extend({ - indent_char : ' ', - indentation : 0 - }, s); + return startElement; + } else { + startElement = rng.startContainer; - this.reset(); - }, + if (startElement.nodeType == 1 && startElement.hasChildNodes()) + startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)]; - reset : function() { - this.indent = ''; - this.str = ""; - this.tags = []; - this.count = 0; - }, + if (startElement && startElement.nodeType == 3) + return startElement.parentNode; - writeStartElement : function(n) { - this._writeAttributesEnd(); - this.writeRaw('<' + n); - this.tags.push(n); - this.inAttr = true; - this.count++; - this.elementCount = this.count; - this.attrs = {}; + return startElement; + } }, - writeAttribute : function(n, v) { - var t = this; + getEnd : function() { + var t = this, r = t.getRng(), e, eo; - if (!t.attrs[n]) { - t.writeRaw(" " + t.encode(n, true) + '="' + t.encode(v, true) + '"'); - t.attrs[n] = v; - } - }, + if (r.duplicate || r.item) { + if (r.item) + return r.item(0); - writeEndElement : function() { - var n; + r = r.duplicate(); + r.collapse(0); + e = r.parentElement(); - if (this.tags.length > 0) { - n = this.tags.pop(); + if (e && e.nodeName == 'BODY') + return e.lastChild || e; - if (this._writeAttributesEnd(1)) - this.writeRaw(''); + return e; + } else { + e = r.endContainer; + eo = r.endOffset; - if (this.settings.indentation > 0) - this.writeRaw('\n'); - } - }, + if (e.nodeType == 1 && e.hasChildNodes()) + e = e.childNodes[eo > 0 ? eo - 1 : eo]; - writeFullEndElement : function() { - if (this.tags.length > 0) { - this._writeAttributesEnd(); - this.writeRaw(''); + if (e && e.nodeType == 3) + return e.parentNode; - if (this.settings.indentation > 0) - this.writeRaw('\n'); + return e; } }, - writeText : function(v) { - this._writeAttributesEnd(); - this.writeRaw(this.encode(v)); - this.count++; - }, + getBookmark : function(type, normalized) { + var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles; - writeCDATA : function(v) { - this._writeAttributesEnd(); - this.writeRaw(''); - this.count++; - }, + function findIndex(name, element) { + var index = 0; - writeComment : function(v) { - this._writeAttributesEnd(); - this.writeRaw(''); - this.count++; - }, + each(dom.select(name), function(node, i) { + if (node == element) + index = i; + }); - writeRaw : function(v) { - this.str += v; - }, + return index; + }; - encode : function(s, attr) { - return s.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(v) { - return encodedChars[v]; - }); - }, + if (type == 2) { + function getLocation() { + var rng = t.getRng(true), root = dom.getRoot(), bookmark = {}; - getContent : function() { - return this.str; - }, + function getPoint(rng, start) { + var container = rng[start ? 'startContainer' : 'endContainer'], + offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0; - _writeAttributesEnd : function(s) { - if (!this.inAttr) - return; + if (container.nodeType == 3) { + if (normalized) { + for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling) + offset += node.nodeValue.length; + } + + point.push(offset); + } else { + childNodes = container.childNodes; - this.inAttr = false; + if (offset >= childNodes.length && childNodes.length) { + after = 1; + offset = Math.max(0, childNodes.length - 1); + } - if (s && this.elementCount == this.count) { - this.writeRaw(' />'); - return false; - } + point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after); + } - this.writeRaw('>'); + for (; container && container != root; container = container.parentNode) + point.push(t.dom.nodeIndex(container, normalized)); - return true; - } - }); -})(tinymce); + return point; + }; -(function(tinymce) { - // Shorten names - var extend = tinymce.extend, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher, isIE = tinymce.isIE, isGecko = tinymce.isGecko; + bookmark.start = getPoint(rng, true); - function wildcardToRE(s) { - return s.replace(/([?+*])/g, '.$1'); - }; + if (!t.isCollapsed()) + bookmark.end = getPoint(rng); - tinymce.create('tinymce.dom.Serializer', { - Serializer : function(s) { - var t = this; + return bookmark; + }; - t.key = 0; - t.onPreProcess = new Dispatcher(t); - t.onPostProcess = new Dispatcher(t); + if (t.tridentSel) + return t.tridentSel.getBookmark(type); - try { - t.writer = new tinymce.dom.XMLWriter(); - } catch (ex) { - // IE might throw exception if ActiveX is disabled so we then switch to the slightly slower StringWriter - t.writer = new tinymce.dom.StringWriter(); + return getLocation(); } - // IE9 broke the XML attributes order so it can't be used anymore - if (tinymce.isIE && document.documentMode > 8) { - t.writer = new tinymce.dom.StringWriter(); - } + // Handle simple range + if (type) + return {rng : t.getRng()}; - // Default settings - t.settings = s = extend({ - dom : tinymce.DOM, - valid_nodes : 0, - node_filter : 0, - attr_filter : 0, - invalid_attrs : /^(_mce_|_moz_|sizset|sizcache)/, - closed : /^(br|hr|input|meta|img|link|param|area)$/, - entity_encoding : 'named', - entities : '160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro', - valid_elements : '*[*]', - extended_valid_elements : 0, - invalid_elements : 0, - fix_table_elements : 1, - fix_list_elements : true, - fix_content_duplication : true, - convert_fonts_to_spans : false, - font_size_classes : 0, - apply_source_formatting : 0, - indent_mode : 'simple', - indent_char : '\t', - indent_levels : 1, - remove_linebreaks : 1, - remove_redundant_brs : 1, - element_format : 'xhtml' - }, s); + rng = t.getRng(); + id = dom.uniqueId(); + collapsed = tinyMCE.activeEditor.selection.isCollapsed(); + styles = 'overflow:hidden;line-height:0px'; - t.dom = s.dom; - t.schema = s.schema; + // Explorer method + if (rng.duplicate || rng.item) { + // Text selection + if (!rng.item) { + rng2 = rng.duplicate(); + + try { + // Insert start marker + rng.collapse(); + rng.pasteHTML('' + chr + ''); + + // Insert end marker + if (!collapsed) { + rng2.collapse(false); + + // Detect the empty space after block elements in IE and move the end back one character

    ] becomes

    ]

    + rng.moveToElementText(rng2.parentElement()); + if (rng.compareEndPoints('StartToEnd', rng2) == 0) + rng2.move('character', -1); + + rng2.pasteHTML('' + chr + ''); + } + } catch (ex) { + // IE might throw unspecified error so lets ignore it + return null; + } + } else { + // Control selection + element = rng.item(0); + name = element.nodeName; + + return {name : name, index : findIndex(name, element)}; + } + } else { + element = t.getNode(); + name = element.nodeName; + if (name == 'IMG') + return {name : name, index : findIndex(name, element)}; - // Use raw entities if no entities are defined - if (s.entity_encoding == 'named' && !s.entities) - s.entity_encoding = 'raw'; + // W3C method + rng2 = rng.cloneRange(); - if (s.remove_redundant_brs) { - t.onPostProcess.add(function(se, o) { - // Remove single BR at end of block elements since they get rendered - o.content = o.content.replace(/(
    \s*)+<\/(p|h[1-6]|div|li)>/gi, function(a, b, c) { - // Check if it's a single element - if (/^
    \s*<\//.test(a)) - return ''; + // Insert end marker + if (!collapsed) { + rng2.collapse(false); + rng2.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_end', style : styles}, chr)); + } - return a; - }); - }); + rng.collapse(true); + rng.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_start', style : styles}, chr)); } - // Remove XHTML element endings i.e. produce crap :) XHTML is better - if (s.element_format == 'html') { - t.onPostProcess.add(function(se, o) { - o.content = o.content.replace(/<([^>]+) \/>/g, '<$1>'); - }); - } + t.moveToBookmark({id : id, keep : 1}); - if (s.fix_list_elements) { - t.onPreProcess.add(function(se, o) { - var nl, x, a = ['ol', 'ul'], i, n, p, r = /^(OL|UL)$/, np; + return {id : id}; + }, - function prevNode(e, n) { - var a = n.split(','), i; + moveToBookmark : function(bookmark) { + var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset; - while ((e = e.previousSibling) != null) { - for (i=0; i= 1; i--) { + children = node.childNodes; - if (r.test(p.nodeName)) { - np = prevNode(n, 'LI'); + if (point[i] > children.length - 1) + return; - if (!np) { - np = t.dom.create('li'); - np.innerHTML = ' '; - np.appendChild(n); - p.insertBefore(np, p.firstChild); - } else - np.appendChild(n); + node = children[point[i]]; } - } - } - }); - } - if (s.fix_table_elements) { - t.onPreProcess.add(function(se, o) { - each(t.dom.select('p table', o.node).reverse(), function(n) { - var parent = t.dom.getParent(n.parentNode, 'table,p'); + // Move text offset to best suitable location + if (node.nodeType === 3) + offset = Math.min(point[0], node.nodeValue.length); - if (parent.nodeName != 'TABLE') { - try { - t.dom.split(parent, n); - } catch (ex) { - // IE can sometimes fire an unknown runtime error so we just ignore it - } - } - }); - }); - } - }, + // Move element offset to best suitable location + if (node.nodeType === 1) + offset = Math.min(point[0], node.childNodes.length); - setEntities : function(s) { - var t = this, a, i, l = {}, v; + // Set offset within container node + if (start) + rng.setStart(node, offset); + else + rng.setEnd(node, offset); + } - // No need to setup more than once - if (t.entityLookup) - return; + return true; + }; - // Build regex and lookup array - a = s.split(','); - for (i = 0; i < a.length; i += 2) { - v = a[i]; + if (t.tridentSel) + return t.tridentSel.moveToBookmark(bookmark); - // Don't add default & " etc. - if (v == 34 || v == 38 || v == 60 || v == 62) - continue; + if (setEndPoint(true) && setEndPoint()) { + t.setRng(rng); + } + } else if (bookmark.id) { + function restoreEndPoint(suffix) { + var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep; - l[String.fromCharCode(a[i])] = a[i + 1]; + if (marker) { + node = marker.parentNode; - v = parseInt(a[i]).toString(16); - } + if (suffix == 'start') { + if (!keep) { + idx = dom.nodeIndex(marker); + } else { + node = marker.firstChild; + idx = 1; + } - t.entityLookup = l; - }, + startContainer = endContainer = node; + startOffset = endOffset = idx; + } else { + if (!keep) { + idx = dom.nodeIndex(marker); + } else { + node = marker.firstChild; + idx = 1; + } - setRules : function(s) { - var t = this; + endContainer = node; + endOffset = idx; + } - t._setup(); - t.rules = {}; - t.wildRules = []; - t.validElements = {}; + if (!keep) { + prev = marker.previousSibling; + next = marker.nextSibling; - return t.addRules(s); - }, + // Remove all marker text nodes + each(tinymce.grep(marker.childNodes), function(node) { + if (node.nodeType == 3) + node.nodeValue = node.nodeValue.replace(/\uFEFF/g, ''); + }); - addRules : function(s) { - var t = this, dr; + // Remove marker but keep children if for example contents where inserted into the marker + // Also remove duplicated instances of the marker for example by a split operation or by WebKit auto split on paste feature + while (marker = dom.get(bookmark.id + '_' + suffix)) + dom.remove(marker, 1); - if (!s) - return; + // If siblings are text nodes then merge them unless it's Opera since it some how removes the node + // and we are sniffing since adding a lot of detection code for a browser with 3% of the market isn't worth the effort. Sorry, Opera but it's just a fact + if (prev && next && prev.nodeType == next.nodeType && prev.nodeType == 3 && !tinymce.isOpera) { + idx = prev.nodeValue.length; + prev.appendData(next.nodeValue); + dom.remove(next); - t._setup(); + if (suffix == 'start') { + startContainer = endContainer = prev; + startOffset = endOffset = idx; + } else { + endContainer = prev; + endOffset = idx; + } + } + } + } + }; - each(s.split(','), function(s) { - var p = s.split(/\[|\]/), tn = p[0].split('/'), ra, at, wat, va = []; + function addBogus(node) { + // Adds a bogus BR element for empty block elements or just a space on IE since it renders BR elements incorrectly + if (dom.isBlock(node) && !node.innerHTML) + node.innerHTML = !isIE ? '
    ' : ' '; - // Extend with default rules - if (dr) - at = tinymce.extend([], dr.attribs); + return node; + }; - // Parse attributes - if (p.length > 1) { - each(p[1].split('|'), function(s) { - var ar = {}, i; + // Restore start/end points + restoreEndPoint('start'); + restoreEndPoint('end'); - at = at || []; + if (startContainer) { + rng = dom.createRng(); + rng.setStart(addBogus(startContainer), startOffset); + rng.setEnd(addBogus(endContainer), endOffset); + t.setRng(rng); + } + } else if (bookmark.name) { + t.select(dom.select(bookmark.name)[bookmark.index]); + } else if (bookmark.rng) + t.setRng(bookmark.rng); + } + }, - // Parse attribute rule - s = s.replace(/::/g, '~'); - s = /^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(s); - s[2] = s[2].replace(/~/g, ':'); + select : function(node, content) { + var t = this, dom = t.dom, rng = dom.createRng(), idx; - // Add required attributes - if (s[1] == '!') { - ra = ra || []; - ra.push(s[2]); - } + if (node) { + idx = dom.nodeIndex(node); + rng.setStart(node.parentNode, idx); + rng.setEnd(node.parentNode, idx + 1); + + // Find first/last text node or BR element + if (content) { + function setPoint(node, start) { + var walker = new tinymce.dom.TreeWalker(node, node); + + do { + // Text node + if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { + if (start) + rng.setStart(node, 0); + else + rng.setEnd(node, node.nodeValue.length); - // Remove inherited attributes - if (s[1] == '-') { - for (i = 0; i 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : doc.createRange()); + } catch (ex) { + // IE throws unspecified error here if TinyMCE is placed in a frame/iframe + } - s += '(' + wildcardToRE(v) + ')'; - }); - ru.validAttribsRE = new RegExp('^' + s.toLowerCase() + '$'); - ru.wildAttribs = wat; - } - }); - }); + // We have W3C ranges and it's IE then fake control selection since IE9 doesn't handle that correctly yet + if (tinymce.isIE && r && r.setStart && doc.selection.createRange().item) { + elm = doc.selection.createRange().item(0); + r = doc.createRange(); + r.setStartBefore(elm); + r.setEndAfter(elm); + } - // Build valid elements regexp - s = ''; - each(t.validElements, function(v, k) { - if (s) - s += '|'; + // No range found then create an empty one + // This can occur when the editor is placed in a hidden container element on Gecko + // Or on IE when there was an exception + if (!r) + r = doc.createRange ? doc.createRange() : doc.body.createTextRange(); - if (k != '@') - s += k; - }); - t.validElementsRE = new RegExp('^(' + wildcardToRE(s.toLowerCase()) + ')$'); + if (t.selectedRange && t.explicitRange) { + if (r.compareBoundaryPoints(r.START_TO_START, t.selectedRange) === 0 && r.compareBoundaryPoints(r.END_TO_END, t.selectedRange) === 0) { + // Safari, Opera and Chrome only ever select text which causes the range to change. + // This lets us use the originally set range if the selection hasn't been changed by the user. + r = t.explicitRange; + } else { + t.selectedRange = null; + t.explicitRange = null; + } + } - //console.debug(t.validElementsRE.toString()); - //console.dir(t.rules); - //console.dir(t.wildRules); + return r; }, - findRule : function(n) { - var t = this, rl = t.rules, i, r; + setRng : function(r) { + var s, t = this; + + if (!t.tridentSel) { + s = t.getSel(); - t._setup(); + if (s) { + t.explicitRange = r; - // Exact match - r = rl[n]; - if (r) - return r; + try { + s.removeAllRanges(); + } catch (ex) { + // IE9 might throw errors here don't know why + } - // Try wildcards - rl = t.wildRules; - for (i = 0; i < rl.length; i++) { - if (rl[i].nameRE.test(n)) - return rl[i]; - } + s.addRange(r); + t.selectedRange = s.getRangeAt(0); + } + } else { + // Is W3C Range + if (r.cloneRange) { + t.tridentSel.addRange(r); + return; + } - return null; + // Is IE specific range + try { + r.select(); + } catch (ex) { + // Needed for some odd IE bug #1843306 + } + } }, - findAttribRule : function(ru, n) { - var i, wa = ru.wildAttribs; + setNode : function(n) { + var t = this; - for (i = 0; i < wa.length; i++) { - if (wa[i].nameRE.test(n)) - return wa[i]; - } + t.setContent(t.dom.getOuterHTML(n)); - return null; + return n; }, - serialize : function(n, o) { - var h, t = this, doc, oldDoc, impl, selected; - - t._setup(); - o = o || {}; - o.format = o.format || 'html'; - t.processObj = o; - - // IE looses the selected attribute on option elements so we need to store it - // See: http://support.microsoft.com/kb/829907 - if (isIE) { - selected = []; - each(n.getElementsByTagName('option'), function(n) { - var v = t.dom.getAttrib(n, 'selected'); + getNode : function() { + var t = this, rng = t.getRng(), sel = t.getSel(), elm, start = rng.startContainer, end = rng.endContainer; - selected.push(v ? v : null); - }); - } + // Range maybe lost after the editor is made visible again + if (!rng) + return t.dom.getRoot(); - n = n.cloneNode(true); + if (rng.setStart) { + elm = rng.commonAncestorContainer; - // IE looses the selected attribute on option elements so we need to restore it - if (isIE) { - each(n.getElementsByTagName('option'), function(n, i) { - t.dom.setAttrib(n, 'selected', selected[i]); - }); - } + // Handle selection a image or other control like element such as anchors + if (!rng.collapsed) { + if (rng.startContainer == rng.endContainer) { + if (rng.endOffset - rng.startOffset < 2) { + if (rng.startContainer.hasChildNodes()) + elm = rng.startContainer.childNodes[rng.startOffset]; + } + } - // Nodes needs to be attached to something in WebKit/Opera - // Older builds of Opera crashes if you attach the node to an document created dynamically - // and since we can't feature detect a crash we need to sniff the acutal build number - // This fix will make DOM ranges and make Sizzle happy! - impl = n.ownerDocument.implementation; - if (impl.createHTMLDocument) { - // Create an empty HTML document - doc = impl.createHTMLDocument(""); + // If the anchor node is a element instead of a text node then return this element + //if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) + // return sel.anchorNode.childNodes[sel.anchorOffset]; + + // Handle cases where the selection is immediately wrapped around a node and return that node instead of it's parent. + // This happens when you double click an underlined word in FireFox. + if (start.nodeType === 3 && end.nodeType === 3) { + function skipEmptyTextNodes(n, forwards) { + var orig = n; + while (n && n.nodeType === 3 && n.length === 0) { + n = forwards ? n.nextSibling : n.previousSibling; + } + return n || orig; + } + if (start.length === rng.startOffset) { + start = skipEmptyTextNodes(start.nextSibling, true); + } else { + start = start.parentNode; + } + if (rng.endOffset === 0) { + end = skipEmptyTextNodes(end.previousSibling, false); + } else { + end = end.parentNode; + } - // Add the element or it's children if it's a body element to the new document - each(n.nodeName == 'BODY' ? n.childNodes : [n], function(node) { - doc.body.appendChild(doc.importNode(node, true)); - }); + if (start && start === end) + return start; + } + } - // Grab first child or body element for serialization - if (n.nodeName != 'BODY') - n = doc.body.firstChild; - else - n = doc.body; + if (elm && elm.nodeType == 3) + return elm.parentNode; - // set the new document in DOMUtils so createElement etc works - oldDoc = t.dom.doc; - t.dom.doc = doc; + return elm; } - t.key = '' + (parseInt(t.key) + 1); + return rng.item ? rng.item(0) : rng.parentElement(); + }, - // Pre process - if (!o.no_events) { - o.node = n; - t.onPreProcess.dispatch(t, o); - } + getSelectedBlocks : function(st, en) { + var t = this, dom = t.dom, sb, eb, n, bl = []; - // Serialize HTML DOM into a string - t.writer.reset(); - t._info = o; - t._serializeNode(n, o.getInner); + sb = dom.getParent(st || t.getStart(), dom.isBlock); + eb = dom.getParent(en || t.getEnd(), dom.isBlock); - // Post process - o.content = t.writer.getContent(); + if (sb) + bl.push(sb); - // Restore the old document if it was changed - if (oldDoc) - t.dom.doc = oldDoc; + if (sb && eb && sb != eb) { + n = sb; - if (!o.no_events) - t.onPostProcess.dispatch(t, o); + while ((n = n.nextSibling) && n != eb) { + if (dom.isBlock(n)) + bl.push(n); + } + } - t._postProcess(o); - o.node = null; + if (eb && sb != eb) + bl.push(eb); - return tinymce.trim(o.content); + return bl; }, - // Internal functions + normalize : function() { + var self = this, rng, normalized; - _postProcess : function(o) { - var t = this, s = t.settings, h = o.content, sc = [], p; - - if (o.format == 'html') { - // Protect some elements - p = t._protect({ - content : h, - patterns : [ - {pattern : /(]*>)(.*?)(<\/script>)/g}, - {pattern : /(]*>)(.*?)(<\/noscript>)/g}, - {pattern : /(]*>)(.*?)(<\/style>)/g}, - {pattern : /(]*>)(.*?)(<\/pre>)/g, encode : 1}, - {pattern : /()/g} - ] - }); + // Normalize only on non IE browsers for now + if (tinymce.isIE) + return; - h = p.content; + function normalizeEndPoint(start) { + var container, offset, walker, dom = self.dom, body = dom.getRoot(), node; - // Entity encode - if (s.entity_encoding !== 'raw') - h = t._encode(h); + container = rng[(start ? 'start' : 'end') + 'Container']; + offset = rng[(start ? 'start' : 'end') + 'Offset']; - // Use BR instead of   padded P elements inside editor and use

     

    outside editor -/* if (o.set) - h = h.replace(/

    \s+( | |\u00a0|
    )\s+<\/p>/g, '


    '); - else - h = h.replace(/

    \s+( | |\u00a0|
    )\s+<\/p>/g, '

    $1

    ');*/ + // If the container is a document move it to the body element + if (container.nodeType === 9) { + container = container.body; + offset = 0; + } - // Since Gecko and Safari keeps whitespace in the DOM we need to - // remove it inorder to match other browsers. But I think Gecko and Safari is right. - // This process is only done when getting contents out from the editor. - if (!o.set) { - // We need to replace paragraph whitespace with an nbsp before indentation to keep the \u00a0 char - h = tinymce._replace(/

    \s+<\/p>|]+)>\s+<\/p>/g, s.entity_encoding == 'numeric' ? ' 

    ' : ' 

    ', h); + // If the container is body try move it into the closest text node or position + // TODO: Add more logic here to handle element selection cases + if (container === body) { + // Resolve the index + if (container.hasChildNodes()) { + container = container.childNodes[Math.min(!start && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1)]; + offset = 0; - if (s.remove_linebreaks) { - h = h.replace(/\r?\n|\r/g, ' '); - h = tinymce._replace(/(<[^>]+>)\s+/g, '$1 ', h); - h = tinymce._replace(/\s+(<\/[^>]+>)/g, ' $1', h); - h = tinymce._replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g, '<$1 $2>', h); // Trim block start - h = tinymce._replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g, '<$1>', h); // Trim block start - h = tinymce._replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g, '', h); // Trim block end - } + // Walk the DOM to find a text node to place the caret at or a BR + node = container; + walker = new tinymce.dom.TreeWalker(container, body); + do { + // Found a text node use that position + if (node.nodeType === 3) { + offset = start ? 0 : node.nodeValue.length - 1; + container = node; + break; + } + + // Found a BR element that we can place the caret before + if (node.nodeName === 'BR') { + offset = dom.nodeIndex(node); + container = node.parentNode; + break; + } + } while (node = (start ? walker.next() : walker.prev())); - // Simple indentation - if (s.apply_source_formatting && s.indent_mode == 'simple') { - // Add line breaks before and after block elements - h = tinymce._replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g, '\n<$1$2$3>\n', h); - h = tinymce._replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g, '\n<$1$2>', h); - h = tinymce._replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g, '\n', h); - h = h.replace(/\n\n/g, '\n'); + normalized = true; } } - h = t._unprotect(h, p); + // Set endpoint if it was normalized + if (normalized) + rng['set' + (start ? 'Start' : 'End')](container, offset); + }; - // Restore CDATA sections - h = tinymce._replace(//g, '', h); + rng = self.getRng(); - // Restore the \u00a0 character if raw mode is enabled - if (s.entity_encoding == 'raw') - h = tinymce._replace(/

     <\/p>|]+)> <\/p>/g, '\u00a0

    ', h); + // Normalize the end points + normalizeEndPoint(true); + + if (rng.collapsed) + normalizeEndPoint(); - // Restore noscript elements - h = h.replace(/]+|)>([\s\S]*?)<\/noscript>/g, function(v, attribs, text) { - return '' + t.dom.decode(text.replace(//g, '')) + ''; - }); + // Set the selection if it was normalized + if (normalized) { + //console.log(self.dom.dumpRng(rng)); + self.setRng(rng); } - - o.content = h; }, - _serializeNode : function(n, inner) { - var t = this, s = t.settings, w = t.writer, hc, el, cn, i, l, a, at, no, v, nn, ru, ar, iv, closed, keep, type, scopeName; - - if (!s.node_filter || s.node_filter(n)) { - switch (n.nodeType) { - case 1: // Element - if (n.hasAttribute ? n.hasAttribute('_mce_bogus') : n.getAttribute('_mce_bogus')) - return; - - iv = keep = false; - hc = n.hasChildNodes(); - nn = n.getAttribute('_mce_name') || n.nodeName.toLowerCase(); - - // Get internal type - type = n.getAttribute('_mce_type'); - if (type) { - if (!t._info.cleanup) { - iv = true; - return; - } else - keep = 1; - } - - // Add correct prefix on IE - if (isIE) { - scopeName = n.scopeName; - if (scopeName && scopeName !== 'HTML' && scopeName !== 'html') - nn = scopeName + ':' + nn; - } - - // Remove mce prefix on IE needed for the abbr element - if (nn.indexOf('mce:') === 0) - nn = nn.substring(4); + destroy : function(s) { + var t = this; - // Check if valid - if (!keep) { - if (!t.validElementsRE || !t.validElementsRE.test(nn) || (t.invalidElementsRE && t.invalidElementsRE.test(nn)) || inner) { - iv = true; - break; - } - } + t.win = null; - if (isIE) { - // Fix IE content duplication (DOM can have multiple copies of the same node) - if (s.fix_content_duplication) { - if (n._mce_serialized == t.key) - return; + // Manual destroy then remove unload handler + if (!s) + tinymce.removeUnload(t.destroy); + }, - n._mce_serialized = t.key; - } + // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode + _fixIESelection : function() { + var dom = this.dom, doc = dom.doc, body = doc.body, started, startRng, htmlElm; - // IE sometimes adds a / infront of the node name - if (nn.charAt(0) == '/') - nn = nn.substring(1); - } else if (isGecko) { - // Ignore br elements - if (n.nodeName === 'BR' && n.getAttribute('type') == '_moz') - return; - } + // Make HTML element unselectable since we are going to handle selection by hand + doc.documentElement.unselectable = true; - // Check if valid child - if (s.validate_children) { - if (t.elementName && !t.schema.isValid(t.elementName, nn)) { - iv = true; - break; - } + // Return range from point or null if it failed + function rngFromPoint(x, y) { + var rng = body.createTextRange(); - t.elementName = nn; - } + try { + rng.moveToPoint(x, y); + } catch (ex) { + // IE sometimes throws and exception, so lets just ignore it + rng = null; + } - ru = t.findRule(nn); - - // No valid rule for this element could be found then skip it - if (!ru) { - iv = true; - break; - } + return rng; + }; - nn = ru.name || nn; - closed = s.closed.test(nn); + // Fires while the selection is changing + function selectionChange(e) { + var pointRng; - // Skip empty nodes or empty node name in IE - if ((!hc && ru.noEmpty) || (isIE && !nn)) { - iv = true; - break; - } + // Check if the button is down or not + if (e.button) { + // Create range from mouse position + pointRng = rngFromPoint(e.x, e.y); - // Check required - if (ru.requiredAttribs) { - a = ru.requiredAttribs; + if (pointRng) { + // Check if pointRange is before/after selection then change the endPoint + if (pointRng.compareEndPoints('StartToStart', startRng) > 0) + pointRng.setEndPoint('StartToStart', startRng); + else + pointRng.setEndPoint('EndToEnd', startRng); - for (i = a.length - 1; i >= 0; i--) { - if (this.dom.getAttrib(n, a[i]) !== '') - break; - } + pointRng.select(); + } + } else + endSelection(); + } - // None of the required was there - if (i == -1) { - iv = true; - break; - } - } + // Removes listeners + function endSelection() { + var rng = doc.selection.createRange(); - w.writeStartElement(nn); + // If the range is collapsed then use the last start range + if (startRng && !rng.item && rng.compareEndPoints('StartToEnd', rng) === 0) + startRng.select(); - // Add ordered attributes - if (ru.attribs) { - for (i=0, at = ru.attribs, l = at.length; i-1; i--) { - no = at[i]; + // Detect vertical scrollbar, since IE will fire a mousedown on the scrollbar and have target set as HTML + htmlElm = doc.documentElement; + if (htmlElm.scrollHeight > htmlElm.clientHeight) + return; - if (no.specified) { - a = no.nodeName.toLowerCase(); + started = 1; + // Setup start position + startRng = rngFromPoint(e.x, e.y); + if (startRng) { + // Listen for selection change events + dom.bind(doc, 'mouseup', endSelection); + dom.bind(doc, 'mousemove', selectionChange); - if (s.invalid_attrs.test(a) || !ru.validAttribsRE.test(a)) - continue; + dom.win.focus(); + startRng.select(); + } + } + }); + } + }); +})(tinymce); - ar = t.findAttribRule(ru, a); - v = t._getAttrib(n, ar, a); +(function(tinymce) { + tinymce.dom.Serializer = function(settings, dom, schema) { + var onPreProcess, onPostProcess, isIE = tinymce.isIE, each = tinymce.each, htmlParser; - if (v !== null) - w.writeAttribute(a, v); - } - } - } + // Support the old apply_source_formatting option + if (!settings.apply_source_formatting) + settings.indent = false; - // Keep type attribute - if (type && keep) - w.writeAttribute('_mce_type', type); + settings.remove_trailing_brs = true; - // Write text from script - if (nn === 'script' && tinymce.trim(n.innerHTML)) { - w.writeText('// '); // Padd it with a comment so it will parse on older browsers - w.writeCDATA(n.innerHTML.replace(/|<\[CDATA\[|\]\]>/g, '')); // Remove comments and cdata stuctures - hc = false; - break; - } + // Default DOM and Schema if they are undefined + dom = dom || tinymce.DOM; + schema = schema || new tinymce.html.Schema(settings); + settings.entity_encoding = settings.entity_encoding || 'named'; - // Padd empty nodes with a   - if (ru.padd) { - // If it has only one bogus child, padd it anyway workaround for

  • ..
    ab|c + if (checkRng.compareEndPoints(start ? 'StartToStart' : 'StartToEnd', rng) > 0) { + checkRng = rng.duplicate(); + checkRng.collapse(start); + + offset = -1; + while (parent == checkRng.parentElement()) { + if (checkRng.move('character', -1) == 0) + break; + + offset++; + } + } + + offset = offset || checkRng.text.replace('\r\n', ' ').length; + } else { + // Child position is after the selection endpoint + checkRng.collapse(true); + checkRng.setEndPoint(start ? 'StartToStart' : 'StartToEnd', rng); + + // Get the length of the text to find where the endpoint is relative to it's container + offset = checkRng.text.replace('\r\n', ' ').length; + } + + return {node : child, position : position, offset : offset, inside : inside}; + }; + + // Returns a W3C DOM compatible range object by using the IE Range API + function getRange() { + var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed, tmpRange, element2, bookmark, fail; + + // If selection is outside the current document just return an empty range + element = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); + if (element.ownerDocument != dom.doc) + return domRange; + + collapsed = selection.isCollapsed(); + + // Handle control selection + if (ieRange.item) { + domRange.setStart(element.parentNode, dom.nodeIndex(element)); + domRange.setEnd(domRange.startContainer, domRange.startOffset + 1); + + return domRange; + } + + function findEndPoint(start) { + var endPoint = getPosition(ieRange, start), container, offset, textNodeOffset = 0, sibling, undef, nodeValue; + + container = endPoint.node; + offset = endPoint.offset; + + if (endPoint.inside && !container.hasChildNodes()) { + domRange[start ? 'setStart' : 'setEnd'](container, 0); + return; + } + + if (offset === undef) { + domRange[start ? 'setStartBefore' : 'setEndAfter'](container); + return; + } + + if (endPoint.position < 0) { + sibling = endPoint.inside ? container.firstChild : container.nextSibling; + + if (!sibling) { + domRange[start ? 'setStartAfter' : 'setEndAfter'](container); + return; + } + + if (!offset) { + if (sibling.nodeType == 3) + domRange[start ? 'setStart' : 'setEnd'](sibling, 0); + else + domRange[start ? 'setStartBefore' : 'setEndBefore'](sibling); + + return; + } + + // Find the text node and offset + while (sibling) { + nodeValue = sibling.nodeValue; + textNodeOffset += nodeValue.length; + + // We are at or passed the position we where looking for + if (textNodeOffset >= offset) { + container = sibling; + textNodeOffset -= offset; + textNodeOffset = nodeValue.length - textNodeOffset; + break; + } + + sibling = sibling.nextSibling; + } + } else { + // Find the text node and offset + sibling = container.previousSibling; + + if (!sibling) + return domRange[start ? 'setStartBefore' : 'setEndBefore'](container); + + // If there isn't any text to loop then use the first position + if (!offset) { + if (container.nodeType == 3) + domRange[start ? 'setStart' : 'setEnd'](sibling, container.nodeValue.length); + else + domRange[start ? 'setStartAfter' : 'setEndAfter'](sibling); + + return; + } + + while (sibling) { + textNodeOffset += sibling.nodeValue.length; - r.insertNode(frag); + // We are at or passed the position we where looking for + if (textNodeOffset >= offset) { + container = sibling; + textNodeOffset -= offset; + break; } + + sibling = sibling.previousSibling; } } - // Move to caret marker - c = t.dom.get('__caret'); - // Make sure we wrap it compleatly, Opera fails with a simple select call - r = d.createRange(); - r.setStartBefore(c); - r.setEndBefore(c); - t.setRng(r); + domRange[start ? 'setStart' : 'setEnd'](container, textNodeOffset); + }; + + try { + // Find start point + findEndPoint(true); + + // Find end point if needed + if (!collapsed) + findEndPoint(); + } catch (ex) { + // IE has a nasty bug where text nodes might throw "invalid argument" when you + // access the nodeValue or other properties of text nodes. This seems to happend when + // text nodes are split into two nodes by a delete/backspace call. So lets detect it and try to fix it. + if (ex.number == -2147024809) { + // Get the current selection + bookmark = self.getBookmark(2); + + // Get start element + tmpRange = ieRange.duplicate(); + tmpRange.collapse(true); + element = tmpRange.parentElement(); + + // Get end element + if (!collapsed) { + tmpRange = ieRange.duplicate(); + tmpRange.collapse(false); + element2 = tmpRange.parentElement(); + element2.innerHTML = element2.innerHTML; + } + + // Remove the broken elements + element.innerHTML = element.innerHTML; + + // Restore the selection + self.moveToBookmark(bookmark); + + // Since the range has moved we need to re-get it + ieRange = selection.getRng(); + + // Find start point + findEndPoint(true); + + // Find end point if needed + if (!collapsed) + findEndPoint(); + } else + throw ex; // Throw other errors + } + + return domRange; + }; + + this.getBookmark = function(type) { + var rng = selection.getRng(), start, end, bookmark = {}; + + function getIndexes(node) { + var node, parent, root, children, i, indexes = []; + + parent = node.parentNode; + root = dom.getRoot().parentNode; + + while (parent != root) { + children = parent.children; + + i = children.length; + while (i--) { + if (node === children[i]) { + indexes.push(i); + break; + } + } + + node = parent; + parent = parent.parentNode; + } + + return indexes; + }; + + function getBookmarkEndPoint(start) { + var position; + + position = getPosition(rng, start); + if (position) { + return { + position : position.position, + offset : position.offset, + indexes : getIndexes(position.node), + inside : position.inside + }; + } + }; + + // Non ubstructive bookmark + if (type === 2) { + // Handle text selection + if (!rng.item) { + bookmark.start = getBookmarkEndPoint(true); + + if (!selection.isCollapsed()) + bookmark.end = getBookmarkEndPoint(); + } else + bookmark.start = {ctrl : true, indexes : getIndexes(rng.item(0))}; + } + + return bookmark; + }; + + this.moveToBookmark = function(bookmark) { + var rng, body = dom.doc.body; + + function resolveIndexes(indexes) { + var node, i, idx, children; + + node = dom.getRoot(); + for (i = indexes.length - 1; i >= 0; i--) { + children = node.children; + idx = indexes[i]; + + if (idx <= children.length - 1) { + node = children[idx]; + } + } + + return node; + }; + + function setBookmarkEndPoint(start) { + var endPoint = bookmark[start ? 'start' : 'end'], moveLeft, moveRng, undef; + + if (endPoint) { + moveLeft = endPoint.position > 0; + + moveRng = body.createTextRange(); + moveRng.moveToElementText(resolveIndexes(endPoint.indexes)); + + offset = endPoint.offset; + if (offset !== undef) { + moveRng.collapse(endPoint.inside || moveLeft); + moveRng.moveStart('character', moveLeft ? -offset : offset); + } else + moveRng.collapse(start); + + rng.setEndPoint(start ? 'StartToStart' : 'EndToStart', moveRng); + + if (start) + rng.collapse(true); + } + }; + + if (bookmark.start) { + if (bookmark.start.ctrl) { + rng = body.createControlRange(); + rng.addElement(resolveIndexes(bookmark.start.indexes)); + rng.select(); + } else { + rng = body.createTextRange(); + setBookmarkEndPoint(true); + setBookmarkEndPoint(); + rng.select(); + } + } + }; + + this.addRange = function(rng) { + var ieRng, ctrlRng, startContainer, startOffset, endContainer, endOffset, doc = selection.dom.doc, body = doc.body; + + function setEndPoint(start) { + var container, offset, marker, tmpRng, nodes; + + marker = dom.create('a'); + container = start ? startContainer : endContainer; + offset = start ? startOffset : endOffset; + tmpRng = ieRng.duplicate(); + + if (container == doc || container == doc.documentElement) { + container = body; + offset = 0; + } + + if (container.nodeType == 3) { + container.parentNode.insertBefore(marker, container); + tmpRng.moveToElementText(marker); + tmpRng.moveStart('character', offset); + dom.remove(marker); + ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); + } else { + nodes = container.childNodes; + + if (nodes.length) { + if (offset >= nodes.length) { + dom.insertAfter(marker, nodes[nodes.length - 1]); + } else { + container.insertBefore(marker, nodes[offset]); + } + + tmpRng.moveToElementText(marker); + } else { + // Empty node selection for example
    |
    + marker = doc.createTextNode('\uFEFF'); + container.appendChild(marker); + tmpRng.moveToElementText(marker.parentNode); + tmpRng.collapse(TRUE); + } + + ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); + dom.remove(marker); + } + } + + // Setup some shorter versions + startContainer = rng.startContainer; + startOffset = rng.startOffset; + endContainer = rng.endContainer; + endOffset = rng.endOffset; + ieRng = body.createTextRange(); + + // If single element selection then try making a control selection out of it + if (startContainer == endContainer && startContainer.nodeType == 1 && startOffset == endOffset - 1) { + if (startOffset == endOffset - 1) { + try { + ctrlRng = body.createControlRange(); + ctrlRng.addElement(startContainer.childNodes[startOffset]); + ctrlRng.select(); + return; + } catch (ex) { + // Ignore + } + } + } + + // Set start/end point of selection + setEndPoint(true); + setEndPoint(); + + // Select the new range and scroll it into view + ieRng.select(); + }; + + // Expose range method + this.getRangeAt = getRange; + }; + + // Expose the selection object + tinymce.dom.TridentSelection = Selection; +})(); + + +/* + * Sizzle CSS Selector Engine - v1.0 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function(){ + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function(selector, context, results, seed) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var parts = [], m, set, checkSet, extra, prune = true, contextXML = Sizzle.isXML(context), + soFar = selector, ret, cur, pop, i; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec(""); + m = chunker.exec(soFar); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray(set); + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function(results){ + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort(sortOrder); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[i-1] ) { + results.splice(i--, 1); + } + } + } + } + + return results; +}; + +Sizzle.matches = function(expr, set){ + return Sizzle(expr, null, null, set); +}; + +Sizzle.find = function(expr, context, isXML){ + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var type = Expr.order[i], match; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice(1,1); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace(/\\/g, ""); + set = Expr.find[ type ]( match, context, isXML ); + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = context.getElementsByTagName("*"); + } + + return {set: set, expr: expr}; +}; + +Sizzle.filter = function(expr, set, inplace, not){ + var old = expr, result = [], curLoop = set, match, anyFound, + isXMLFilter = set && set[0] && Sizzle.isXML(set[0]); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var filter = Expr.filter[ type ], found, item, left = match[1]; + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + } else { + curLoop[i] = false; + } + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + leftMatch: {}, + attrMap: { + "class": "className", + "for": "htmlFor" + }, + attrHandle: { + href: function(elem){ + return elem.getAttribute("href"); + } + }, + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !/\W/.test(part), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + ">": function(checkSet, part){ + var isPartStr = typeof part === "string", + elem, i = 0, l = checkSet.length; + + if ( isPartStr && !/\W/.test(part) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + "": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck, nodeCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); + }, + "~": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck, nodeCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); + } + }, + find: { + ID: function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? [m] : []; + } + }, + NAME: function(match, context){ + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], results = context.getElementsByName(match[1]); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + TAG: function(match, context){ + return context.getElementsByTagName(match[1]); + } + }, + preFilter: { + CLASS: function(match, curLoop, inplace, result, not, isXML){ + match = " " + match[1].replace(/\\/g, "") + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + ID: function(match){ + return match[1].replace(/\\/g, ""); + }, + TAG: function(match, curLoop){ + return match[1].toLowerCase(); + }, + CHILD: function(match){ + if ( match[1] === "nth" ) { + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + ATTR: function(match, curLoop, inplace, result, not, isXML){ + var name = match[1].replace(/\\/g, ""); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + PSEUDO: function(match, curLoop, inplace, result, not){ + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + if ( !inplace ) { + result.push.apply( result, ret ); + } + return false; + } + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + POS: function(match){ + match.unshift( true ); + return match; + } + }, + filters: { + enabled: function(elem){ + return elem.disabled === false && elem.type !== "hidden"; + }, + disabled: function(elem){ + return elem.disabled === true; + }, + checked: function(elem){ + return elem.checked === true; + }, + selected: function(elem){ + // Accessing this property makes selected-by-default + // options in Safari work properly + elem.parentNode.selectedIndex; + return elem.selected === true; + }, + parent: function(elem){ + return !!elem.firstChild; + }, + empty: function(elem){ + return !elem.firstChild; + }, + has: function(elem, i, match){ + return !!Sizzle( match[3], elem ).length; + }, + header: function(elem){ + return (/h\d/i).test( elem.nodeName ); + }, + text: function(elem){ + return "text" === elem.type; + }, + radio: function(elem){ + return "radio" === elem.type; + }, + checkbox: function(elem){ + return "checkbox" === elem.type; + }, + file: function(elem){ + return "file" === elem.type; + }, + password: function(elem){ + return "password" === elem.type; + }, + submit: function(elem){ + return "submit" === elem.type; + }, + image: function(elem){ + return "image" === elem.type; + }, + reset: function(elem){ + return "reset" === elem.type; + }, + button: function(elem){ + return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + }, + input: function(elem){ + return (/input|select|textarea|button/i).test(elem.nodeName); + } + }, + setFilters: { + first: function(elem, i){ + return i === 0; + }, + last: function(elem, i, match, array){ + return i === array.length - 1; + }, + even: function(elem, i){ + return i % 2 === 0; + }, + odd: function(elem, i){ + return i % 2 === 1; + }, + lt: function(elem, i, match){ + return i < match[3] - 0; + }, + gt: function(elem, i, match){ + return i > match[3] - 0; + }, + nth: function(elem, i, match){ + return match[3] - 0 === i; + }, + eq: function(elem, i, match){ + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function(elem, match, i, array){ + var name = match[1], filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + } else { + Sizzle.error( "Syntax error, unrecognized expression: " + name ); + } + }, + CHILD: function(elem, match){ + var type = match[1], node = elem; + switch (type) { + case 'only': + case 'first': + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + if ( type === "first" ) { + return true; + } + node = elem; + case 'last': + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + return true; + case 'nth': + var first = match[2], last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + if ( first === 0 ) { + return diff === 0; + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + ID: function(elem, match){ + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + TAG: function(elem, match){ + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + CLASS: function(elem, match){ + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + ATTR: function(elem, match){ + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + POS: function(elem, match, i, array){ + var name = match[2], filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function(array, results) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch(e){ + makeArray = function(array, results) { + var ret = results || [], i = 0; - // Remove the caret position - t.dom.remove('__caret'); + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } } else { - if (r.item) { - // Delete content and get caret text selection - d.execCommand('Delete', false, null); - r = t.getRng(); + for ( ; array[i]; i++ ) { + ret.push( array[i] ); } + } + } + + return ret; + }; +} + +var sortOrder; - r.pasteHTML(h); +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + if ( a == b ) { + hasDuplicate = true; } + return a.compareDocumentPosition ? -1 : 1; + } - // Dispatch set content event - t.onSetContent.dispatch(t, s); - }, + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( "sourceIndex" in document.documentElement ) { + sortOrder = function( a, b ) { + if ( !a.sourceIndex || !b.sourceIndex ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.sourceIndex ? -1 : 1; + } - getStart : function() { - var rng = this.getRng(), startElement, parentElement, checkRng, node; + var ret = a.sourceIndex - b.sourceIndex; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( document.createRange ) { + sortOrder = function( a, b ) { + if ( !a.ownerDocument || !b.ownerDocument ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.ownerDocument ? -1 : 1; + } - if (rng.duplicate || rng.item) { - // Control selection, return first item - if (rng.item) - return rng.item(0); + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} - // Get start element - checkRng = rng.duplicate(); - checkRng.collapse(1); - startElement = checkRng.parentElement(); +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; - // Check if range parent is inside the start element, then return the inner parent element - // This will fix issues when a single element is selected, IE would otherwise return the wrong start element - parentElement = node = rng.parentElement(); - while (node = node.parentNode) { - if (node == startElement) { - startElement = parentElement; - break; - } - } + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; - // If start element is body element try to move to the first child if it exists - if (startElement && startElement.nodeName == 'BODY') - return startElement.firstChild || startElement; + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; - return startElement; - } else { - startElement = rng.startContainer; + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } - if (startElement.nodeType == 1 && startElement.hasChildNodes()) - startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)]; + return ret; +}; - if (startElement && startElement.nodeType == 3) - return startElement.parentNode; +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(); + form.innerHTML = ""; - return startElement; + // Inject it into the root element, check its status, and remove it quickly + var root = document.documentElement; + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } - }, + }; - getEnd : function() { - var t = this, r = t.getRng(), e, eo; + Expr.filter.ID = function(elem, match){ + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } - if (r.duplicate || r.item) { - if (r.item) - return r.item(0); + root.removeChild( form ); + root = form = null; // release memory in IE +})(); - r = r.duplicate(); - r.collapse(0); - e = r.parentElement(); +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") - if (e && e.nodeName == 'BODY') - return e.lastChild || e; + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); - return e; - } else { - e = r.endContainer; - eo = r.endOffset; + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function(match, context){ + var results = context.getElementsByTagName(match[1]); - if (e.nodeType == 1 && e.hasChildNodes()) - e = e.childNodes[eo > 0 ? eo - 1 : eo]; + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; - if (e && e.nodeType == 3) - return e.parentNode; + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } - return e; + results = tmp; } - }, - getBookmark : function(type, normalized) { - var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles; + return results; + }; + } - function findIndex(name, element) { - var index = 0; + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + Expr.attrHandle.href = function(elem){ + return elem.getAttribute("href", 2); + }; + } - each(dom.select(name), function(node, i) { - if (node == element) - index = i; - }); + div = null; // release memory in IE +})(); - return index; - }; +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, div = document.createElement("div"); + div.innerHTML = "

    "; - if (type == 2) { - function getLocation() { - var rng = t.getRng(true), root = dom.getRoot(), bookmark = {}; + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function(query, context, extra, seed){ + context = context || document; - function getPoint(rng, start) { - var container = rng[start ? 'startContainer' : 'endContainer'], - offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0; + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && context.nodeType === 9 && !Sizzle.isXML(context) ) { + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(e){} + } + + return oldSizzle(query, context, extra, seed); + }; - if (container.nodeType == 3) { - if (normalized) { - for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling) - offset += node.nodeValue.length; - } + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } - point.push(offset); - } else { - childNodes = container.childNodes; + div = null; // release memory in IE + })(); +} - if (offset >= childNodes.length && childNodes.length) { - after = 1; - offset = Math.max(0, childNodes.length - 1); - } +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
    "; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } - point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after); - } + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; - for (; container && container != root; container = container.parentNode) - point.push(t.dom.nodeIndex(container, normalized)); + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function(match, context, isXML) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; - return point; - }; + div = null; // release memory in IE +})(); - bookmark.start = getPoint(rng, true); +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + elem = elem[dir]; + var match = false; - if (!t.isCollapsed()) - bookmark.end = getPoint(rng); + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } - return bookmark; - }; + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } - return getLocation(); - } + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } - // Handle simple range - if (type) - return {rng : t.getRng()}; + elem = elem[dir]; + } - rng = t.getRng(); - id = dom.uniqueId(); - collapsed = tinyMCE.activeEditor.selection.isCollapsed(); - styles = 'overflow:hidden;line-height:0px'; + checkSet[i] = match; + } + } +} - // Explorer method - if (rng.duplicate || rng.item) { - // Text selection - if (!rng.item) { - rng2 = rng.duplicate(); +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + elem = elem[dir]; + var match = false; - // Insert start marker - rng.collapse(); - rng.pasteHTML('' + chr + ''); + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } - // Insert end marker - if (!collapsed) { - rng2.collapse(false); - rng2.pasteHTML('' + chr + ''); + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; } - } else { - // Control selection - element = rng.item(0); - name = element.nodeName; + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } - return {name : name, index : findIndex(name, element)}; + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } } - } else { - element = t.getNode(); - name = element.nodeName; - if (name == 'IMG') - return {name : name, index : findIndex(name, element)}; - // W3C method - rng2 = rng.cloneRange(); + elem = elem[dir]; + } - // Insert end marker - if (!collapsed) { - rng2.collapse(false); - rng2.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_end', style : styles}, chr)); - } + checkSet[i] = match; + } + } +} - rng.collapse(true); - rng.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_start', style : styles}, chr)); - } +Sizzle.contains = document.compareDocumentPosition ? function(a, b){ + return !!(a.compareDocumentPosition(b) & 16); +} : function(a, b){ + return a !== b && (a.contains ? a.contains(b) : true); +}; - t.moveToBookmark({id : id, keep : 1}); +Sizzle.isXML = function(elem){ + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; - return {id : id}; - }, +var posProcess = function(selector, context){ + var tmpSet = [], later = "", match, + root = context.nodeType ? [context] : context; - moveToBookmark : function(bookmark) { - var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset; + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } - // Clear selection cache - if (t.tridentSel) - t.tridentSel.destroy(); + selector = Expr.relative[selector] ? selector + "*" : selector; - if (bookmark) { - if (bookmark.start) { - rng = dom.createRng(); - root = dom.getRoot(); + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } - function setEndPoint(start) { - var point = bookmark[start ? 'start' : 'end'], i, node, offset, children; + return Sizzle.filter( later, tmpSet ); +}; - if (point) { - // Find container node - for (node = root, i = point.length - 1; i >= 1; i--) { - children = node.childNodes; +// EXPOSE - if (children.length) - node = children[point[i]]; - } +window.tinymce.dom.Sizzle = Sizzle; - // Set offset within container node - if (start) - rng.setStart(node, point[0]); - else - rng.setEnd(node, point[0]); - } - }; +})(); - setEndPoint(true); - setEndPoint(); - t.setRng(rng); - } else if (bookmark.id) { - function restoreEndPoint(suffix) { - var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep; +(function(tinymce) { + // Shorten names + var each = tinymce.each, DOM = tinymce.DOM, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, Event; - if (marker) { - node = marker.parentNode; + tinymce.create('tinymce.dom.EventUtils', { + EventUtils : function() { + this.inits = []; + this.events = []; + }, - if (suffix == 'start') { - if (!keep) { - idx = dom.nodeIndex(marker); - } else { - node = marker.firstChild; - idx = 1; - } + add : function(o, n, f, s) { + var cb, t = this, el = t.events, r; - startContainer = endContainer = node; - startOffset = endOffset = idx; - } else { - if (!keep) { - idx = dom.nodeIndex(marker); - } else { - node = marker.firstChild; - idx = 1; - } + if (n instanceof Array) { + r = []; - endContainer = node; - endOffset = idx; - } + each(n, function(n) { + r.push(t.add(o, n, f, s)); + }); - if (!keep) { - prev = marker.previousSibling; - next = marker.nextSibling; + return r; + } - // Remove all marker text nodes - each(tinymce.grep(marker.childNodes), function(node) { - if (node.nodeType == 3) - node.nodeValue = node.nodeValue.replace(/\uFEFF/g, ''); - }); + // Handle array + if (o && o.hasOwnProperty && o instanceof Array) { + r = []; - // Remove marker but keep children if for example contents where inserted into the marker - // Also remove duplicated instances of the marker for example by a split operation or by WebKit auto split on paste feature - while (marker = dom.get(bookmark.id + '_' + suffix)) - dom.remove(marker, 1); + each(o, function(o) { + o = DOM.get(o); + r.push(t.add(o, n, f, s)); + }); - // If siblings are text nodes then merge them unless it's Opera since it some how removes the node - // and we are sniffing since adding a lot of detection code for a browser with 3% of the market isn't worth the effort. Sorry, Opera but it's just a fact - if (prev && next && prev.nodeType == next.nodeType && prev.nodeType == 3 && !tinymce.isOpera) { - idx = prev.nodeValue.length; - prev.appendData(next.nodeValue); - dom.remove(next); + return r; + } - if (suffix == 'start') { - startContainer = endContainer = prev; - startOffset = endOffset = idx; - } else { - endContainer = prev; - endOffset = idx; - } - } - } - } - }; + o = DOM.get(o); + + if (!o) + return; + + // Setup event callback + cb = function(e) { + // Is all events disabled + if (t.disabled) + return; + + e = e || window.event; + + // Patch in target, preventDefault and stopPropagation in IE it's W3C valid + if (e && isIE) { + if (!e.target) + e.target = e.srcElement; - function addBogus(node) { - // Adds a bogus BR element for empty block elements - // on non IE browsers just to have a place to put the caret - if (!isIE && dom.isBlock(node) && !node.innerHTML) - node.innerHTML = '
    '; + // Patch in preventDefault, stopPropagation methods for W3C compatibility + tinymce.extend(e, t._stoppers); + } - return node; - }; + if (!s) + return f(e); - // Restore start/end points - restoreEndPoint('start'); - restoreEndPoint('end'); + return f.call(s, e); + }; - if (startContainer) { - rng = dom.createRng(); - rng.setStart(addBogus(startContainer), startOffset); - rng.setEnd(addBogus(endContainer), endOffset); - t.setRng(rng); - } - } else if (bookmark.name) { - t.select(dom.select(bookmark.name)[bookmark.index]); - } else if (bookmark.rng) - t.setRng(bookmark.rng); + if (n == 'unload') { + tinymce.unloads.unshift({func : cb}); + return cb; } - }, - select : function(node, content) { - var t = this, dom = t.dom, rng = dom.createRng(), idx; + if (n == 'init') { + if (t.domLoaded) + cb(); + else + t.inits.push(cb); - idx = dom.nodeIndex(node); - rng.setStart(node.parentNode, idx); - rng.setEnd(node.parentNode, idx + 1); + return cb; + } - // Find first/last text node or BR element - if (content) { - function setPoint(node, start) { - var walker = new tinymce.dom.TreeWalker(node, node); + // Store away listener reference + el.push({ + obj : o, + name : n, + func : f, + cfunc : cb, + scope : s + }); - do { - // Text node - if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { - if (start) - rng.setStart(node, 0); - else - rng.setEnd(node, node.nodeValue.length); + t._add(o, n, cb); - return; - } + return f; + }, - // BR element - if (node.nodeName == 'BR') { - if (start) - rng.setStartBefore(node); - else - rng.setEndBefore(node); + remove : function(o, n, f) { + var t = this, a = t.events, s = false, r; - return; - } - } while (node = (start ? walker.next() : walker.prev())); - }; + // Handle array + if (o && o.hasOwnProperty && o instanceof Array) { + r = []; + + each(o, function(o) { + o = DOM.get(o); + r.push(t.remove(o, n, f)); + }); - setPoint(node, 1); - setPoint(node); + return r; } - t.setRng(rng); + o = DOM.get(o); - return node; + each(a, function(e, i) { + if (e.obj == o && e.name == n && (!f || (e.func == f || e.cfunc == f))) { + a.splice(i, 1); + t._remove(o, n, e.cfunc); + s = true; + return false; + } + }); + + return s; }, - isCollapsed : function() { - var t = this, r = t.getRng(), s = t.getSel(); + clear : function(o) { + var t = this, a = t.events, i, e; - if (!r || r.item) - return false; + if (o) { + o = DOM.get(o); - if (r.compareEndPoints) - return r.compareEndPoints('StartToEnd', r) === 0; + for (i = a.length - 1; i >= 0; i--) { + e = a[i]; - return !s || r.collapsed; + if (e.obj === o) { + t._remove(e.obj, e.name, e.cfunc); + e.obj = e.cfunc = null; + a.splice(i, 1); + } + } + } }, - collapse : function(b) { - var t = this, r = t.getRng(), n; + cancel : function(e) { + if (!e) + return false; - // Control range on IE - if (r.item) { - n = r.item(0); - r = this.win.document.body.createTextRange(); - r.moveToElementText(n); - } + this.stop(e); - r.collapse(!!b); - t.setRng(r); + return this.prevent(e); }, - getSel : function() { - var t = this, w = this.win; + stop : function(e) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.cancelBubble = true; - return w.getSelection ? w.getSelection() : w.document.selection; + return false; }, - getRng : function(w3c) { - var t = this, s, r, elm, doc = t.win.document; + prevent : function(e) { + if (e.preventDefault) + e.preventDefault(); + else + e.returnValue = false; - // Found tridentSel object then we need to use that one - if (w3c && t.tridentSel) - return t.tridentSel.getRangeAt(0); + return false; + }, - try { - if (s = t.getSel()) - r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : doc.createRange()); - } catch (ex) { - // IE throws unspecified error here if TinyMCE is placed in a frame/iframe - } + destroy : function() { + var t = this; - // We have W3C ranges and it's IE then fake control selection since IE9 doesn't handle that correctly yet - if (tinymce.isIE && r.setStart && doc.selection.createRange().item) { - elm = doc.selection.createRange().item(0); - r = doc.createRange(); - r.setStartBefore(elm); - r.setEndAfter(elm); - } + each(t.events, function(e, i) { + t._remove(e.obj, e.name, e.cfunc); + e.obj = e.cfunc = null; + }); - // No range found then create an empty one - // This can occur when the editor is placed in a hidden container element on Gecko - // Or on IE when there was an exception - if (!r) - r = doc.createRange ? doc.createRange() : doc.body.createTextRange(); + t.events = []; + t = null; + }, - if (t.selectedRange && t.explicitRange) { - if (r.compareBoundaryPoints(r.START_TO_START, t.selectedRange) === 0 && r.compareBoundaryPoints(r.END_TO_END, t.selectedRange) === 0) { - // Safari, Opera and Chrome only ever select text which causes the range to change. - // This lets us use the originally set range if the selection hasn't been changed by the user. - r = t.explicitRange; - } else { - t.selectedRange = null; - t.explicitRange = null; + _add : function(o, n, f) { + if (o.attachEvent) + o.attachEvent('on' + n, f); + else if (o.addEventListener) + o.addEventListener(n, f, false); + else + o['on' + n] = f; + }, + + _remove : function(o, n, f) { + if (o) { + try { + if (o.detachEvent) + o.detachEvent('on' + n, f); + else if (o.removeEventListener) + o.removeEventListener(n, f, false); + else + o['on' + n] = null; + } catch (ex) { + // Might fail with permission denined on IE so we just ignore that } } - return r; }, - setRng : function(r) { - var s, t = this; - - if (!t.tridentSel) { - s = t.getSel(); + _pageInit : function(win) { + var t = this; - if (s) { - t.explicitRange = r; - s.removeAllRanges(); - s.addRange(r); - t.selectedRange = s.getRangeAt(0); - } - } else { - // Is W3C Range - if (r.cloneRange) { - t.tridentSel.addRange(r); - return; - } + // Keep it from running more than once + if (t.domLoaded) + return; - // Is IE specific range - try { - r.select(); - } catch (ex) { - // Needed for some odd IE bug #1843306 + t.domLoaded = true; + + each(t.inits, function(c) { + c(); + }); + + t.inits = []; + }, + + _wait : function(win) { + var t = this, doc = win.document; + + // No need since the document is already loaded + if (win.tinyMCE_GZ && tinyMCE_GZ.loaded) { + t.domLoaded = 1; + return; + } + + // Use IE method + if (doc.attachEvent) { + doc.attachEvent("onreadystatechange", function() { + if (doc.readyState === "complete") { + doc.detachEvent("onreadystatechange", arguments.callee); + t._pageInit(win); + } + }); + + if (doc.documentElement.doScroll && win == win.top) { + (function() { + if (t.domLoaded) + return; + + try { + // If IE is used, use the trick by Diego Perini licensed under MIT by request to the author. + // http://javascript.nwbox.com/IEContentLoaded/ + doc.documentElement.doScroll("left"); + } catch (ex) { + setTimeout(arguments.callee, 0); + return; + } + + t._pageInit(win); + })(); } + } else if (doc.addEventListener) { + t._add(win, 'DOMContentLoaded', function() { + t._pageInit(win); + }); } + + t._add(win, 'load', function() { + t._pageInit(win); + }); }, - setNode : function(n) { - var t = this; + _stoppers : { + preventDefault : function() { + this.returnValue = false; + }, - t.setContent(t.dom.getOuterHTML(n)); + stopPropagation : function() { + this.cancelBubble = true; + } + } + }); - return n; - }, + Event = tinymce.dom.Event = new tinymce.dom.EventUtils(); - getNode : function() { - var t = this, rng = t.getRng(), sel = t.getSel(), elm; + // Dispatch DOM content loaded event for IE and Safari + Event._wait(window); - if (rng.setStart) { - // Range maybe lost after the editor is made visible again - if (!rng) - return t.dom.getRoot(); + tinymce.addUnload(function() { + Event.destroy(); + }); +})(tinymce); - elm = rng.commonAncestorContainer; +(function(tinymce) { + tinymce.dom.Element = function(id, settings) { + var t = this, dom, el; - // Handle selection a image or other control like element such as anchors - if (!rng.collapsed) { - if (rng.startContainer == rng.endContainer) { - if (rng.startOffset - rng.endOffset < 2) { - if (rng.startContainer.hasChildNodes()) - elm = rng.startContainer.childNodes[rng.startOffset]; - } - } + t.settings = settings = settings || {}; + t.id = id; + t.dom = dom = settings.dom || tinymce.DOM; - // If the anchor node is a element instead of a text node then return this element - if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) - return sel.anchorNode.childNodes[sel.anchorOffset]; - } + // Only IE leaks DOM references, this is a lot faster + if (!tinymce.isIE) + el = dom.get(t.id); - if (elm && elm.nodeType == 3) - return elm.parentNode; + tinymce.each( + ('getPos,getRect,getParent,add,setStyle,getStyle,setStyles,' + + 'setAttrib,setAttribs,getAttrib,addClass,removeClass,' + + 'hasClass,getOuterHTML,setOuterHTML,remove,show,hide,' + + 'isHidden,setHTML,get').split(/,/) + , function(k) { + t[k] = function() { + var a = [id], i; - return elm; - } + for (i = 0; i < arguments.length; i++) + a.push(arguments[i]); - return rng.item ? rng.item(0) : rng.parentElement(); - }, + a = dom[k].apply(dom, a); + t.update(k); - getSelectedBlocks : function(st, en) { - var t = this, dom = t.dom, sb, eb, n, bl = []; + return a; + }; + }); - sb = dom.getParent(st || t.getStart(), dom.isBlock); - eb = dom.getParent(en || t.getEnd(), dom.isBlock); + tinymce.extend(t, { + on : function(n, f, s) { + return tinymce.dom.Event.add(t.id, n, f, s); + }, - if (sb) - bl.push(sb); + getXY : function() { + return { + x : parseInt(t.getStyle('left')), + y : parseInt(t.getStyle('top')) + }; + }, - if (sb && eb && sb != eb) { - n = sb; + getSize : function() { + var n = dom.get(t.id); - while ((n = n.nextSibling) && n != eb) { - if (dom.isBlock(n)) - bl.push(n); - } - } + return { + w : parseInt(t.getStyle('width') || n.clientWidth), + h : parseInt(t.getStyle('height') || n.clientHeight) + }; + }, - if (eb && sb != eb) - bl.push(eb); + moveTo : function(x, y) { + t.setStyles({left : x, top : y}); + }, - return bl; - }, + moveBy : function(x, y) { + var p = t.getXY(); - destroy : function(s) { - var t = this; + t.moveTo(p.x + x, p.y + y); + }, - t.win = null; + resizeTo : function(w, h) { + t.setStyles({width : w, height : h}); + }, - if (t.tridentSel) - t.tridentSel.destroy(); + resizeBy : function(w, h) { + var s = t.getSize(); - // Manual destroy then remove unload handler - if (!s) - tinymce.removeUnload(t.destroy); - }, + t.resizeTo(s.w + w, s.h + h); + }, - // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode - _fixIESelection : function() { - var dom = this.dom, doc = dom.doc, body = doc.body, started, startRng; + update : function(k) { + var b; - // Make HTML element unselectable since we are going to handle selection by hand - doc.documentElement.unselectable = true; + if (tinymce.isIE6 && settings.blocker) { + k = k || ''; - // Return range from point or null if it failed - function rngFromPoint(x, y) { - var rng = body.createTextRange(); + // Ignore getters + if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0) + return; - try { - rng.moveToPoint(x, y); - } catch (ex) { - // IE sometimes throws and exception, so lets just ignore it - rng = null; - } + // Remove blocker on remove + if (k == 'remove') { + dom.remove(t.blocker); + return; + } - return rng; - }; + if (!t.blocker) { + t.blocker = dom.uniqueId(); + b = dom.add(settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'}); + dom.setStyle(b, 'opacity', 0); + } else + b = dom.get(t.blocker); - // Fires while the selection is changing - function selectionChange(e) { - var pointRng; + dom.setStyles(b, { + left : t.getStyle('left', 1), + top : t.getStyle('top', 1), + width : t.getStyle('width', 1), + height : t.getStyle('height', 1), + display : t.getStyle('display', 1), + zIndex : parseInt(t.getStyle('zIndex', 1) || 0) - 1 + }); + } + } + }); + }; +})(tinymce); - // Check if the button is down or not - if (e.button) { - // Create range from mouse position - pointRng = rngFromPoint(e.x, e.y); +(function(tinymce) { + function trimNl(s) { + return s.replace(/[\n\r]+/g, ''); + }; - if (pointRng) { - // Check if pointRange is before/after selection then change the endPoint - if (pointRng.compareEndPoints('StartToStart', startRng) > 0) - pointRng.setEndPoint('StartToStart', startRng); - else - pointRng.setEndPoint('EndToEnd', startRng); + // Shorten names + var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each; - pointRng.select(); - } - } else - endSelection(); - } + tinymce.create('tinymce.dom.Selection', { + Selection : function(dom, win, serializer) { + var t = this; - // Removes listeners - function endSelection() { - dom.unbind(doc, 'mouseup', endSelection); - dom.unbind(doc, 'mousemove', selectionChange); - started = 0; - }; + t.dom = dom; + t.win = win; + t.serializer = serializer; - // Detect when user selects outside BODY - dom.bind(doc, 'mousedown', function(e) { - if (e.target.nodeName === 'HTML') { - if (started) - endSelection(); + // Add events + each([ + 'onBeforeSetContent', - started = 1; + 'onBeforeGetContent', - // Setup start position - startRng = rngFromPoint(e.x, e.y); - if (startRng) { - // Listen for selection change events - dom.bind(doc, 'mouseup', endSelection); - dom.bind(doc, 'mousemove', selectionChange); + 'onSetContent', - dom.win.focus(); - startRng.select(); - } - } + 'onGetContent' + ], function(e) { + t[e] = new tinymce.util.Dispatcher(t); }); - } - }); -})(tinymce); -(function(tinymce) { - tinymce.create('tinymce.dom.XMLWriter', { - node : null, - - XMLWriter : function(s) { - // Get XML document - function getXML() { - var i = document.implementation; - - if (!i || !i.createDocument) { - // Try IE objects - try {return new ActiveXObject('MSXML2.DOMDocument');} catch (ex) {} - try {return new ActiveXObject('Microsoft.XmlDom');} catch (ex) {} - } else - return i.createDocument('', '', null); - }; + // No W3C Range support + if (!t.win.getSelection) + t.tridentSel = new tinymce.dom.TridentSelection(t); - this.doc = getXML(); - - // Since Opera and WebKit doesn't escape > into > we need to do it our self to normalize the output for all browsers - this.valid = tinymce.isOpera || tinymce.isWebKit; + if (tinymce.isIE && dom.boxModel) + this._fixIESelection(); + + // Prevent leaks + tinymce.addUnload(t.destroy, t); + }, - this.reset(); + setCursorLocation: function(node, offset) { + var t = this; var r = t.dom.createRng(); + r.setStart(node, offset); + r.setEnd(node, offset); + t.setRng(r); + t.collapse(false); }, + getContent : function(s) { + var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n; + + s = s || {}; + wb = wa = ''; + s.get = true; + s.format = s.format || 'html'; + s.forced_root_block = ''; + t.onBeforeGetContent.dispatch(t, s); + + if (s.format == 'text') + return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : '')); - reset : function() { - var t = this, d = t.doc; + if (r.cloneContents) { + n = r.cloneContents(); - if (d.firstChild) - d.removeChild(d.firstChild); + if (n) + e.appendChild(n); + } else if (is(r.item) || is(r.htmlText)) + e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText; + else + e.innerHTML = r.toString(); - t.node = d.appendChild(d.createElement("html")); - }, + // Keep whitespace before and after + if (/^\s/.test(e.innerHTML)) + wb = ' '; - writeStartElement : function(n) { - var t = this; + if (/\s+$/.test(e.innerHTML)) + wa = ' '; - t.node = t.node.appendChild(t.doc.createElement(n)); - }, + s.getInner = true; - writeAttribute : function(n, v) { - if (this.valid) - v = v.replace(/>/g, '%MCGT%'); + s.content = t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa; + t.onGetContent.dispatch(t, s); - this.node.setAttribute(n, v); + return s.content; }, - writeEndElement : function() { - this.node = this.node.parentNode; - }, + setContent : function(content, args) { + var self = this, rng = self.getRng(), caretNode, doc = self.win.document, frag, temp; - writeFullEndElement : function() { - var t = this, n = t.node; + args = args || {format : 'html'}; + args.set = true; + content = args.content = content; - n.appendChild(t.doc.createTextNode("")); - t.node = n.parentNode; - }, + // Dispatch before set content event + if (!args.no_events) + self.onBeforeSetContent.dispatch(self, args); - writeText : function(v) { - if (this.valid) - v = v.replace(/>/g, '%MCGT%'); + content = args.content; - this.node.appendChild(this.doc.createTextNode(v)); - }, + if (rng.insertNode) { + // Make caret marker since insertNode places the caret in the beginning of text after insert + content += '_'; - writeCDATA : function(v) { - this.node.appendChild(this.doc.createCDATASection(v)); - }, + // Delete and insert new node + if (rng.startContainer == doc && rng.endContainer == doc) { + // WebKit will fail if the body is empty since the range is then invalid and it can't insert contents + doc.body.innerHTML = content; + } else { + rng.deleteContents(); - writeComment : function(v) { - // Fix for bug #2035694 - if (tinymce.isIE) - v = v.replace(/^\-|\-$/g, ' '); + if (doc.body.childNodes.length == 0) { + doc.body.innerHTML = content; + } else { + // createContextualFragment doesn't exists in IE 9 DOMRanges + if (rng.createContextualFragment) { + rng.insertNode(rng.createContextualFragment(content)); + } else { + // Fake createContextualFragment call in IE 9 + frag = doc.createDocumentFragment(); + temp = doc.createElement('div'); - this.node.appendChild(this.doc.createComment(v.replace(/\-\-/g, ' '))); - }, + frag.appendChild(temp); + temp.outerHTML = content; - getContent : function() { - var h; + rng.insertNode(frag); + } + } + } - h = this.doc.xml || new XMLSerializer().serializeToString(this.doc); - h = h.replace(/<\?[^?]+\?>|]*>|<\/html>||]+>/g, ''); - h = h.replace(/ ?\/>/g, ' />'); + // Move to caret marker + caretNode = self.dom.get('__caret'); - if (this.valid) - h = h.replace(/\%MCGT%/g, '>'); + // Make sure we wrap it compleatly, Opera fails with a simple select call + rng = doc.createRange(); + rng.setStartBefore(caretNode); + rng.setEndBefore(caretNode); + self.setRng(rng); - return h; - } - }); -})(tinymce); + // Remove the caret position + self.dom.remove('__caret'); -(function(tinymce) { - var attrsCharsRegExp = /[&\"<>]/g, textCharsRegExp = /[<>&]/g, encodedChars = {'&' : '&', '"' : '"', '<' : '<', '>' : '>'}; - - tinymce.create('tinymce.dom.StringWriter', { - str : null, - tags : null, - count : 0, - settings : null, - indent : null, - - StringWriter : function(s) { - this.settings = tinymce.extend({ - indent_char : ' ', - indentation : 0 - }, s); + try { + self.setRng(rng); + } catch (ex) { + // Might fail on Opera for some odd reason + } + } else { + if (rng.item) { + // Delete content and get caret text selection + doc.execCommand('Delete', false, null); + rng = self.getRng(); + } - this.reset(); - }, + rng.pasteHTML(content); + } - reset : function() { - this.indent = ''; - this.str = ""; - this.tags = []; - this.count = 0; + // Dispatch set content event + if (!args.no_events) + self.onSetContent.dispatch(self, args); }, - writeStartElement : function(n) { - this._writeAttributesEnd(); - this.writeRaw('<' + n); - this.tags.push(n); - this.inAttr = true; - this.count++; - this.elementCount = this.count; - this.attrs = {}; - }, + getStart : function() { + var rng = this.getRng(), startElement, parentElement, checkRng, node; - writeAttribute : function(n, v) { - var t = this; + if (rng.duplicate || rng.item) { + // Control selection, return first item + if (rng.item) + return rng.item(0); - if (!t.attrs[n]) { - t.writeRaw(" " + t.encode(n, true) + '="' + t.encode(v, true) + '"'); - t.attrs[n] = v; - } - }, + // Get start element + checkRng = rng.duplicate(); + checkRng.collapse(1); + startElement = checkRng.parentElement(); - writeEndElement : function() { - var n; + // Check if range parent is inside the start element, then return the inner parent element + // This will fix issues when a single element is selected, IE would otherwise return the wrong start element + parentElement = node = rng.parentElement(); + while (node = node.parentNode) { + if (node == startElement) { + startElement = parentElement; + break; + } + } + + return startElement; + } else { + startElement = rng.startContainer; - if (this.tags.length > 0) { - n = this.tags.pop(); + if (startElement.nodeType == 1 && startElement.hasChildNodes()) + startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)]; - if (this._writeAttributesEnd(1)) - this.writeRaw(''); + if (startElement && startElement.nodeType == 3) + return startElement.parentNode; - if (this.settings.indentation > 0) - this.writeRaw('\n'); + return startElement; } }, - writeFullEndElement : function() { - if (this.tags.length > 0) { - this._writeAttributesEnd(); - this.writeRaw(''); + getEnd : function() { + var t = this, r = t.getRng(), e, eo; - if (this.settings.indentation > 0) - this.writeRaw('\n'); - } - }, + if (r.duplicate || r.item) { + if (r.item) + return r.item(0); - writeText : function(v) { - this._writeAttributesEnd(); - this.writeRaw(this.encode(v)); - this.count++; - }, + r = r.duplicate(); + r.collapse(0); + e = r.parentElement(); - writeCDATA : function(v) { - this._writeAttributesEnd(); - this.writeRaw(''); - this.count++; - }, + if (e && e.nodeName == 'BODY') + return e.lastChild || e; - writeComment : function(v) { - this._writeAttributesEnd(); - this.writeRaw(''); - this.count++; - }, + return e; + } else { + e = r.endContainer; + eo = r.endOffset; - writeRaw : function(v) { - this.str += v; - }, + if (e.nodeType == 1 && e.hasChildNodes()) + e = e.childNodes[eo > 0 ? eo - 1 : eo]; - encode : function(s, attr) { - return s.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(v) { - return encodedChars[v]; - }); - }, + if (e && e.nodeType == 3) + return e.parentNode; - getContent : function() { - return this.str; + return e; + } }, - _writeAttributesEnd : function(s) { - if (!this.inAttr) - return; + getBookmark : function(type, normalized) { + var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles; - this.inAttr = false; + function findIndex(name, element) { + var index = 0; - if (s && this.elementCount == this.count) { - this.writeRaw(' />'); - return false; - } + each(dom.select(name), function(node, i) { + if (node == element) + index = i; + }); - this.writeRaw('>'); + return index; + }; - return true; - } - }); -})(tinymce); + if (type == 2) { + function getLocation() { + var rng = t.getRng(true), root = dom.getRoot(), bookmark = {}; -(function(tinymce) { - // Shorten names - var extend = tinymce.extend, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher, isIE = tinymce.isIE, isGecko = tinymce.isGecko; + function getPoint(rng, start) { + var container = rng[start ? 'startContainer' : 'endContainer'], + offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0; - function wildcardToRE(s) { - return s.replace(/([?+*])/g, '.$1'); - }; + if (container.nodeType == 3) { + if (normalized) { + for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling) + offset += node.nodeValue.length; + } - tinymce.create('tinymce.dom.Serializer', { - Serializer : function(s) { - var t = this; + point.push(offset); + } else { + childNodes = container.childNodes; - t.key = 0; - t.onPreProcess = new Dispatcher(t); - t.onPostProcess = new Dispatcher(t); + if (offset >= childNodes.length && childNodes.length) { + after = 1; + offset = Math.max(0, childNodes.length - 1); + } - try { - t.writer = new tinymce.dom.XMLWriter(); - } catch (ex) { - // IE might throw exception if ActiveX is disabled so we then switch to the slightly slower StringWriter - t.writer = new tinymce.dom.StringWriter(); - } + point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after); + } - // IE9 broke the XML attributes order so it can't be used anymore - if (tinymce.isIE && document.documentMode > 8) { - t.writer = new tinymce.dom.StringWriter(); - } + for (; container && container != root; container = container.parentNode) + point.push(t.dom.nodeIndex(container, normalized)); - // Default settings - t.settings = s = extend({ - dom : tinymce.DOM, - valid_nodes : 0, - node_filter : 0, - attr_filter : 0, - invalid_attrs : /^(_mce_|_moz_|sizset|sizcache)/, - closed : /^(br|hr|input|meta|img|link|param|area)$/, - entity_encoding : 'named', - entities : '160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro', - valid_elements : '*[*]', - extended_valid_elements : 0, - invalid_elements : 0, - fix_table_elements : 1, - fix_list_elements : true, - fix_content_duplication : true, - convert_fonts_to_spans : false, - font_size_classes : 0, - apply_source_formatting : 0, - indent_mode : 'simple', - indent_char : '\t', - indent_levels : 1, - remove_linebreaks : 1, - remove_redundant_brs : 1, - element_format : 'xhtml' - }, s); + return point; + }; - t.dom = s.dom; - t.schema = s.schema; + bookmark.start = getPoint(rng, true); - // Use raw entities if no entities are defined - if (s.entity_encoding == 'named' && !s.entities) - s.entity_encoding = 'raw'; + if (!t.isCollapsed()) + bookmark.end = getPoint(rng); - if (s.remove_redundant_brs) { - t.onPostProcess.add(function(se, o) { - // Remove single BR at end of block elements since they get rendered - o.content = o.content.replace(/(
    \s*)+<\/(p|h[1-6]|div|li)>/gi, function(a, b, c) { - // Check if it's a single element - if (/^
    \s*<\//.test(a)) - return ''; + return bookmark; + }; - return a; - }); - }); - } + if (t.tridentSel) + return t.tridentSel.getBookmark(type); - // Remove XHTML element endings i.e. produce crap :) XHTML is better - if (s.element_format == 'html') { - t.onPostProcess.add(function(se, o) { - o.content = o.content.replace(/<([^>]+) \/>/g, '<$1>'); - }); + return getLocation(); } - if (s.fix_list_elements) { - t.onPreProcess.add(function(se, o) { - var nl, x, a = ['ol', 'ul'], i, n, p, r = /^(OL|UL)$/, np; - - function prevNode(e, n) { - var a = n.split(','), i; + // Handle simple range + if (type) + return {rng : t.getRng()}; - while ((e = e.previousSibling) != null) { - for (i=0; i' + chr + ''); - for (i=0; i

    ] becomes

    ]

    + rng.moveToElementText(rng2.parentElement()); + if (rng.compareEndPoints('StartToEnd', rng2) == 0) + rng2.move('character', -1); - if (!np) { - np = t.dom.create('li'); - np.innerHTML = ' '; - np.appendChild(n); - p.insertBefore(np, p.firstChild); - } else - np.appendChild(n); - } + rng2.pasteHTML('' + chr + ''); } + } catch (ex) { + // IE might throw unspecified error so lets ignore it + return null; } - }); - } + } else { + // Control selection + element = rng.item(0); + name = element.nodeName; - if (s.fix_table_elements) { - t.onPreProcess.add(function(se, o) { - each(t.dom.select('p table', o.node).reverse(), function(n) { - var parent = t.dom.getParent(n.parentNode, 'table,p'); + return {name : name, index : findIndex(name, element)}; + } + } else { + element = t.getNode(); + name = element.nodeName; + if (name == 'IMG') + return {name : name, index : findIndex(name, element)}; - if (parent.nodeName != 'TABLE') { - try { - t.dom.split(parent, n); - } catch (ex) { - // IE can sometimes fire an unknown runtime error so we just ignore it - } - } - }); - }); - } - }, + // W3C method + rng2 = rng.cloneRange(); - setEntities : function(s) { - var t = this, a, i, l = {}, v; + // Insert end marker + if (!collapsed) { + rng2.collapse(false); + rng2.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_end', style : styles}, chr)); + } - // No need to setup more than once - if (t.entityLookup) - return; + rng.collapse(true); + rng.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_start', style : styles}, chr)); + } - // Build regex and lookup array - a = s.split(','); - for (i = 0; i < a.length; i += 2) { - v = a[i]; + t.moveToBookmark({id : id, keep : 1}); - // Don't add default & " etc. - if (v == 34 || v == 38 || v == 60 || v == 62) - continue; + return {id : id}; + }, - l[String.fromCharCode(a[i])] = a[i + 1]; + moveToBookmark : function(bookmark) { + var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset; - v = parseInt(a[i]).toString(16); - } + if (bookmark) { + if (bookmark.start) { + rng = dom.createRng(); + root = dom.getRoot(); - t.entityLookup = l; - }, + function setEndPoint(start) { + var point = bookmark[start ? 'start' : 'end'], i, node, offset, children; - setRules : function(s) { - var t = this; + if (point) { + offset = point[0]; - t._setup(); - t.rules = {}; - t.wildRules = []; - t.validElements = {}; + // Find container node + for (node = root, i = point.length - 1; i >= 1; i--) { + children = node.childNodes; - return t.addRules(s); - }, + if (point[i] > children.length - 1) + return; - addRules : function(s) { - var t = this, dr; + node = children[point[i]]; + } - if (!s) - return; + // Move text offset to best suitable location + if (node.nodeType === 3) + offset = Math.min(point[0], node.nodeValue.length); - t._setup(); + // Move element offset to best suitable location + if (node.nodeType === 1) + offset = Math.min(point[0], node.childNodes.length); - each(s.split(','), function(s) { - var p = s.split(/\[|\]/), tn = p[0].split('/'), ra, at, wat, va = []; + // Set offset within container node + if (start) + rng.setStart(node, offset); + else + rng.setEnd(node, offset); + } - // Extend with default rules - if (dr) - at = tinymce.extend([], dr.attribs); + return true; + }; - // Parse attributes - if (p.length > 1) { - each(p[1].split('|'), function(s) { - var ar = {}, i; + if (t.tridentSel) + return t.tridentSel.moveToBookmark(bookmark); - at = at || []; + if (setEndPoint(true) && setEndPoint()) { + t.setRng(rng); + } + } else if (bookmark.id) { + function restoreEndPoint(suffix) { + var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep; - // Parse attribute rule - s = s.replace(/::/g, '~'); - s = /^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(s); - s[2] = s[2].replace(/~/g, ':'); + if (marker) { + node = marker.parentNode; - // Add required attributes - if (s[1] == '!') { - ra = ra || []; - ra.push(s[2]); - } + if (suffix == 'start') { + if (!keep) { + idx = dom.nodeIndex(marker); + } else { + node = marker.firstChild; + idx = 1; + } - // Remove inherited attributes - if (s[1] == '-') { - for (i = 0; i ' : ' '; - // Extend with default rule data - if (dr) { - if (dr.noEmpty) - ru.noEmpty = dr.noEmpty; + return node; + }; - if (dr.fullEnd) - ru.fullEnd = dr.fullEnd; + // Restore start/end points + restoreEndPoint('start'); + restoreEndPoint('end'); - if (dr.padd) - ru.padd = dr.padd; + if (startContainer) { + rng = dom.createRng(); + rng.setStart(addBogus(startContainer), startOffset); + rng.setEnd(addBogus(endContainer), endOffset); + t.setRng(rng); } + } else if (bookmark.name) { + t.select(dom.select(bookmark.name)[bookmark.index]); + } else if (bookmark.rng) + t.setRng(bookmark.rng); + } + }, - // Handle prefixes - switch (pr) { - case '-': - ru.noEmpty = true; - break; + select : function(node, content) { + var t = this, dom = t.dom, rng = dom.createRng(), idx; - case '+': - ru.fullEnd = true; - break; + if (node) { + idx = dom.nodeIndex(node); + rng.setStart(node.parentNode, idx); + rng.setEnd(node.parentNode, idx + 1); + + // Find first/last text node or BR element + if (content) { + function setPoint(node, start) { + var walker = new tinymce.dom.TreeWalker(node, node); + + do { + // Text node + if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { + if (start) + rng.setStart(node, 0); + else + rng.setEnd(node, node.nodeValue.length); - case '#': - ru.padd = true; - break; + return; + } - default: - x = 0; - } + // BR element + if (node.nodeName == 'BR') { + if (start) + rng.setStartBefore(node); + else + rng.setEndBefore(node); - tn[i] = s = s.substring(x); - t.validElements[s] = 1; + return; + } + } while (node = (start ? walker.next() : walker.prev())); + }; - // Add element name or element regex - if (/[*.?]/.test(tn[0])) { - ru.nameRE = new RegExp('^' + wildcardToRE(tn[0]) + '$'); - t.wildRules = t.wildRules || {}; - t.wildRules.push(ru); - } else { - ru.name = tn[0]; + setPoint(node, 1); + setPoint(node); + } - // Store away default rule - if (tn[0] == '@') - dr = ru; + t.setRng(rng); + } - t.rules[s] = ru; - } + return node; + }, - ru.attribs = at; + isCollapsed : function() { + var t = this, r = t.getRng(), s = t.getSel(); - if (ra) - ru.requiredAttribs = ra; + if (!r || r.item) + return false; - if (wat) { - // Build valid attributes regexp - s = ''; - each(va, function(v) { - if (s) - s += '|'; + if (r.compareEndPoints) + return r.compareEndPoints('StartToEnd', r) === 0; - s += '(' + wildcardToRE(v) + ')'; - }); - ru.validAttribsRE = new RegExp('^' + s.toLowerCase() + '$'); - ru.wildAttribs = wat; - } - }); - }); + return !s || r.collapsed; + }, - // Build valid elements regexp - s = ''; - each(t.validElements, function(v, k) { - if (s) - s += '|'; + collapse : function(to_start) { + var self = this, rng = self.getRng(), node; - if (k != '@') - s += k; - }); - t.validElementsRE = new RegExp('^(' + wildcardToRE(s.toLowerCase()) + ')$'); + // Control range on IE + if (rng.item) { + node = rng.item(0); + rng = self.win.document.body.createTextRange(); + rng.moveToElementText(node); + } - //console.debug(t.validElementsRE.toString()); - //console.dir(t.rules); - //console.dir(t.wildRules); + rng.collapse(!!to_start); + self.setRng(rng); }, - findRule : function(n) { - var t = this, rl = t.rules, i, r; + getSel : function() { + var t = this, w = this.win; - t._setup(); + return w.getSelection ? w.getSelection() : w.document.selection; + }, - // Exact match - r = rl[n]; - if (r) - return r; + getRng : function(w3c) { + var t = this, s, r, elm, doc = t.win.document; + + // Found tridentSel object then we need to use that one + if (w3c && t.tridentSel) + return t.tridentSel.getRangeAt(0); - // Try wildcards - rl = t.wildRules; - for (i = 0; i < rl.length; i++) { - if (rl[i].nameRE.test(n)) - return rl[i]; + try { + if (s = t.getSel()) + r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : doc.createRange()); + } catch (ex) { + // IE throws unspecified error here if TinyMCE is placed in a frame/iframe } - return null; - }, + // We have W3C ranges and it's IE then fake control selection since IE9 doesn't handle that correctly yet + if (tinymce.isIE && r && r.setStart && doc.selection.createRange().item) { + elm = doc.selection.createRange().item(0); + r = doc.createRange(); + r.setStartBefore(elm); + r.setEndAfter(elm); + } - findAttribRule : function(ru, n) { - var i, wa = ru.wildAttribs; + // No range found then create an empty one + // This can occur when the editor is placed in a hidden container element on Gecko + // Or on IE when there was an exception + if (!r) + r = doc.createRange ? doc.createRange() : doc.body.createTextRange(); - for (i = 0; i < wa.length; i++) { - if (wa[i].nameRE.test(n)) - return wa[i]; + if (t.selectedRange && t.explicitRange) { + if (r.compareBoundaryPoints(r.START_TO_START, t.selectedRange) === 0 && r.compareBoundaryPoints(r.END_TO_END, t.selectedRange) === 0) { + // Safari, Opera and Chrome only ever select text which causes the range to change. + // This lets us use the originally set range if the selection hasn't been changed by the user. + r = t.explicitRange; + } else { + t.selectedRange = null; + t.explicitRange = null; + } } - return null; + return r; }, - serialize : function(n, o) { - var h, t = this, doc, oldDoc, impl, selected; + setRng : function(r) { + var s, t = this; + + if (!t.tridentSel) { + s = t.getSel(); - t._setup(); - o = o || {}; - o.format = o.format || 'html'; - t.processObj = o; + if (s) { + t.explicitRange = r; - // IE looses the selected attribute on option elements so we need to store it - // See: http://support.microsoft.com/kb/829907 - if (isIE) { - selected = []; - each(n.getElementsByTagName('option'), function(n) { - var v = t.dom.getAttrib(n, 'selected'); + try { + s.removeAllRanges(); + } catch (ex) { + // IE9 might throw errors here don't know why + } - selected.push(v ? v : null); - }); + s.addRange(r); + t.selectedRange = s.getRangeAt(0); + } + } else { + // Is W3C Range + if (r.cloneRange) { + t.tridentSel.addRange(r); + return; + } + + // Is IE specific range + try { + r.select(); + } catch (ex) { + // Needed for some odd IE bug #1843306 + } } + }, - n = n.cloneNode(true); + setNode : function(n) { + var t = this; - // IE looses the selected attribute on option elements so we need to restore it - if (isIE) { - each(n.getElementsByTagName('option'), function(n, i) { - t.dom.setAttrib(n, 'selected', selected[i]); - }); - } + t.setContent(t.dom.getOuterHTML(n)); - // Nodes needs to be attached to something in WebKit/Opera - // Older builds of Opera crashes if you attach the node to an document created dynamically - // and since we can't feature detect a crash we need to sniff the acutal build number - // This fix will make DOM ranges and make Sizzle happy! - impl = n.ownerDocument.implementation; - if (impl.createHTMLDocument) { - // Create an empty HTML document - doc = impl.createHTMLDocument(""); + return n; + }, - // Add the element or it's children if it's a body element to the new document - each(n.nodeName == 'BODY' ? n.childNodes : [n], function(node) { - doc.body.appendChild(doc.importNode(node, true)); - }); + getNode : function() { + var t = this, rng = t.getRng(), sel = t.getSel(), elm, start = rng.startContainer, end = rng.endContainer; - // Grab first child or body element for serialization - if (n.nodeName != 'BODY') - n = doc.body.firstChild; - else - n = doc.body; + // Range maybe lost after the editor is made visible again + if (!rng) + return t.dom.getRoot(); - // set the new document in DOMUtils so createElement etc works - oldDoc = t.dom.doc; - t.dom.doc = doc; - } + if (rng.setStart) { + elm = rng.commonAncestorContainer; - t.key = '' + (parseInt(t.key) + 1); + // Handle selection a image or other control like element such as anchors + if (!rng.collapsed) { + if (rng.startContainer == rng.endContainer) { + if (rng.endOffset - rng.startOffset < 2) { + if (rng.startContainer.hasChildNodes()) + elm = rng.startContainer.childNodes[rng.startOffset]; + } + } - // Pre process - if (!o.no_events) { - o.node = n; - t.onPreProcess.dispatch(t, o); + // If the anchor node is a element instead of a text node then return this element + //if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) + // return sel.anchorNode.childNodes[sel.anchorOffset]; + + // Handle cases where the selection is immediately wrapped around a node and return that node instead of it's parent. + // This happens when you double click an underlined word in FireFox. + if (start.nodeType === 3 && end.nodeType === 3) { + function skipEmptyTextNodes(n, forwards) { + var orig = n; + while (n && n.nodeType === 3 && n.length === 0) { + n = forwards ? n.nextSibling : n.previousSibling; + } + return n || orig; + } + if (start.length === rng.startOffset) { + start = skipEmptyTextNodes(start.nextSibling, true); + } else { + start = start.parentNode; + } + if (rng.endOffset === 0) { + end = skipEmptyTextNodes(end.previousSibling, false); + } else { + end = end.parentNode; + } + + if (start && start === end) + return start; + } + } + + if (elm && elm.nodeType == 3) + return elm.parentNode; + + return elm; } - // Serialize HTML DOM into a string - t.writer.reset(); - t._info = o; - t._serializeNode(n, o.getInner); + return rng.item ? rng.item(0) : rng.parentElement(); + }, + + getSelectedBlocks : function(st, en) { + var t = this, dom = t.dom, sb, eb, n, bl = []; - // Post process - o.content = t.writer.getContent(); + sb = dom.getParent(st || t.getStart(), dom.isBlock); + eb = dom.getParent(en || t.getEnd(), dom.isBlock); - // Restore the old document if it was changed - if (oldDoc) - t.dom.doc = oldDoc; + if (sb) + bl.push(sb); - if (!o.no_events) - t.onPostProcess.dispatch(t, o); + if (sb && eb && sb != eb) { + n = sb; + + while ((n = n.nextSibling) && n != eb) { + if (dom.isBlock(n)) + bl.push(n); + } + } - t._postProcess(o); - o.node = null; + if (eb && sb != eb) + bl.push(eb); - return tinymce.trim(o.content); + return bl; }, - // Internal functions + normalize : function() { + var self = this, rng, normalized; - _postProcess : function(o) { - var t = this, s = t.settings, h = o.content, sc = [], p; - - if (o.format == 'html') { - // Protect some elements - p = t._protect({ - content : h, - patterns : [ - {pattern : /(]*>)(.*?)(<\/script>)/g}, - {pattern : /(]*>)(.*?)(<\/noscript>)/g}, - {pattern : /(]*>)(.*?)(<\/style>)/g}, - {pattern : /(]*>)(.*?)(<\/pre>)/g, encode : 1}, - {pattern : /()/g} - ] - }); + // Normalize only on non IE browsers for now + if (tinymce.isIE) + return; - h = p.content; + function normalizeEndPoint(start) { + var container, offset, walker, dom = self.dom, body = dom.getRoot(), node; - // Entity encode - if (s.entity_encoding !== 'raw') - h = t._encode(h); + container = rng[(start ? 'start' : 'end') + 'Container']; + offset = rng[(start ? 'start' : 'end') + 'Offset']; - // Use BR instead of   padded P elements inside editor and use

     

    outside editor -/* if (o.set) - h = h.replace(/

    \s+( | |\u00a0|
    )\s+<\/p>/g, '


    '); - else - h = h.replace(/

    \s+( | |\u00a0|
    )\s+<\/p>/g, '

    $1

    ');*/ + // If the container is a document move it to the body element + if (container.nodeType === 9) { + container = container.body; + offset = 0; + } - // Since Gecko and Safari keeps whitespace in the DOM we need to - // remove it inorder to match other browsers. But I think Gecko and Safari is right. - // This process is only done when getting contents out from the editor. - if (!o.set) { - // We need to replace paragraph whitespace with an nbsp before indentation to keep the \u00a0 char - h = tinymce._replace(/

    \s+<\/p>|]+)>\s+<\/p>/g, s.entity_encoding == 'numeric' ? ' 

    ' : ' 

    ', h); + // If the container is body try move it into the closest text node or position + // TODO: Add more logic here to handle element selection cases + if (container === body) { + // Resolve the index + if (container.hasChildNodes()) { + container = container.childNodes[Math.min(!start && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1)]; + offset = 0; - if (s.remove_linebreaks) { - h = h.replace(/\r?\n|\r/g, ' '); - h = tinymce._replace(/(<[^>]+>)\s+/g, '$1 ', h); - h = tinymce._replace(/\s+(<\/[^>]+>)/g, ' $1', h); - h = tinymce._replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g, '<$1 $2>', h); // Trim block start - h = tinymce._replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g, '<$1>', h); // Trim block start - h = tinymce._replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g, '', h); // Trim block end - } + // Walk the DOM to find a text node to place the caret at or a BR + node = container; + walker = new tinymce.dom.TreeWalker(container, body); + do { + // Found a text node use that position + if (node.nodeType === 3) { + offset = start ? 0 : node.nodeValue.length - 1; + container = node; + break; + } + + // Found a BR element that we can place the caret before + if (node.nodeName === 'BR') { + offset = dom.nodeIndex(node); + container = node.parentNode; + break; + } + } while (node = (start ? walker.next() : walker.prev())); - // Simple indentation - if (s.apply_source_formatting && s.indent_mode == 'simple') { - // Add line breaks before and after block elements - h = tinymce._replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g, '\n<$1$2$3>\n', h); - h = tinymce._replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g, '\n<$1$2>', h); - h = tinymce._replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g, '\n', h); - h = h.replace(/\n\n/g, '\n'); + normalized = true; } } - h = t._unprotect(h, p); + // Set endpoint if it was normalized + if (normalized) + rng['set' + (start ? 'Start' : 'End')](container, offset); + }; - // Restore CDATA sections - h = tinymce._replace(//g, '', h); + rng = self.getRng(); - // Restore the \u00a0 character if raw mode is enabled - if (s.entity_encoding == 'raw') - h = tinymce._replace(/

     <\/p>|]+)> <\/p>/g, '\u00a0

    ', h); + // Normalize the end points + normalizeEndPoint(true); + + if (rng.collapsed) + normalizeEndPoint(); - // Restore noscript elements - h = h.replace(/]+|)>([\s\S]*?)<\/noscript>/g, function(v, attribs, text) { - return '' + t.dom.decode(text.replace(//g, '')) + ''; - }); + // Set the selection if it was normalized + if (normalized) { + //console.log(self.dom.dumpRng(rng)); + self.setRng(rng); } - - o.content = h; }, - _serializeNode : function(n, inner) { - var t = this, s = t.settings, w = t.writer, hc, el, cn, i, l, a, at, no, v, nn, ru, ar, iv, closed, keep, type, scopeName; - - if (!s.node_filter || s.node_filter(n)) { - switch (n.nodeType) { - case 1: // Element - if (n.hasAttribute ? n.hasAttribute('_mce_bogus') : n.getAttribute('_mce_bogus')) - return; - - iv = keep = false; - hc = n.hasChildNodes(); - nn = n.getAttribute('_mce_name') || n.nodeName.toLowerCase(); - - // Get internal type - type = n.getAttribute('_mce_type'); - if (type) { - if (!t._info.cleanup) { - iv = true; - return; - } else - keep = 1; - } - - // Add correct prefix on IE - if (isIE) { - scopeName = n.scopeName; - if (scopeName && scopeName !== 'HTML' && scopeName !== 'html') - nn = scopeName + ':' + nn; - } - - // Remove mce prefix on IE needed for the abbr element - if (nn.indexOf('mce:') === 0) - nn = nn.substring(4); + destroy : function(s) { + var t = this; - // Check if valid - if (!keep) { - if (!t.validElementsRE || !t.validElementsRE.test(nn) || (t.invalidElementsRE && t.invalidElementsRE.test(nn)) || inner) { - iv = true; - break; - } - } + t.win = null; - if (isIE) { - // Fix IE content duplication (DOM can have multiple copies of the same node) - if (s.fix_content_duplication) { - if (n._mce_serialized == t.key) - return; + // Manual destroy then remove unload handler + if (!s) + tinymce.removeUnload(t.destroy); + }, - n._mce_serialized = t.key; - } + // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode + _fixIESelection : function() { + var dom = this.dom, doc = dom.doc, body = doc.body, started, startRng, htmlElm; - // IE sometimes adds a / infront of the node name - if (nn.charAt(0) == '/') - nn = nn.substring(1); - } else if (isGecko) { - // Ignore br elements - if (n.nodeName === 'BR' && n.getAttribute('type') == '_moz') - return; - } + // Make HTML element unselectable since we are going to handle selection by hand + doc.documentElement.unselectable = true; - // Check if valid child - if (s.validate_children) { - if (t.elementName && !t.schema.isValid(t.elementName, nn)) { - iv = true; - break; - } + // Return range from point or null if it failed + function rngFromPoint(x, y) { + var rng = body.createTextRange(); - t.elementName = nn; - } + try { + rng.moveToPoint(x, y); + } catch (ex) { + // IE sometimes throws and exception, so lets just ignore it + rng = null; + } - ru = t.findRule(nn); - - // No valid rule for this element could be found then skip it - if (!ru) { - iv = true; - break; - } + return rng; + }; - nn = ru.name || nn; - closed = s.closed.test(nn); + // Fires while the selection is changing + function selectionChange(e) { + var pointRng; - // Skip empty nodes or empty node name in IE - if ((!hc && ru.noEmpty) || (isIE && !nn)) { - iv = true; - break; - } + // Check if the button is down or not + if (e.button) { + // Create range from mouse position + pointRng = rngFromPoint(e.x, e.y); - // Check required - if (ru.requiredAttribs) { - a = ru.requiredAttribs; + if (pointRng) { + // Check if pointRange is before/after selection then change the endPoint + if (pointRng.compareEndPoints('StartToStart', startRng) > 0) + pointRng.setEndPoint('StartToStart', startRng); + else + pointRng.setEndPoint('EndToEnd', startRng); - for (i = a.length - 1; i >= 0; i--) { - if (this.dom.getAttrib(n, a[i]) !== '') - break; - } + pointRng.select(); + } + } else + endSelection(); + } - // None of the required was there - if (i == -1) { - iv = true; - break; - } - } + // Removes listeners + function endSelection() { + var rng = doc.selection.createRange(); - w.writeStartElement(nn); + // If the range is collapsed then use the last start range + if (startRng && !rng.item && rng.compareEndPoints('StartToEnd', rng) === 0) + startRng.select(); - // Add ordered attributes - if (ru.attribs) { - for (i=0, at = ru.attribs, l = at.length; i-1; i--) { - no = at[i]; + // Detect vertical scrollbar, since IE will fire a mousedown on the scrollbar and have target set as HTML + htmlElm = doc.documentElement; + if (htmlElm.scrollHeight > htmlElm.clientHeight) + return; - if (no.specified) { - a = no.nodeName.toLowerCase(); + started = 1; + // Setup start position + startRng = rngFromPoint(e.x, e.y); + if (startRng) { + // Listen for selection change events + dom.bind(doc, 'mouseup', endSelection); + dom.bind(doc, 'mousemove', selectionChange); - if (s.invalid_attrs.test(a) || !ru.validAttribsRE.test(a)) - continue; + dom.win.focus(); + startRng.select(); + } + } + }); + } + }); +})(tinymce); - ar = t.findAttribRule(ru, a); - v = t._getAttrib(n, ar, a); +(function(tinymce) { + tinymce.dom.Serializer = function(settings, dom, schema) { + var onPreProcess, onPostProcess, isIE = tinymce.isIE, each = tinymce.each, htmlParser; - if (v !== null) - w.writeAttribute(a, v); - } - } - } + // Support the old apply_source_formatting option + if (!settings.apply_source_formatting) + settings.indent = false; - // Keep type attribute - if (type && keep) - w.writeAttribute('_mce_type', type); + settings.remove_trailing_brs = true; - // Write text from script - if (nn === 'script' && tinymce.trim(n.innerHTML)) { - w.writeText('// '); // Padd it with a comment so it will parse on older browsers - w.writeCDATA(n.innerHTML.replace(/|<\[CDATA\[|\]\]>/g, '')); // Remove comments and cdata stuctures - hc = false; - break; - } + // Default DOM and Schema if they are undefined + dom = dom || tinymce.DOM; + schema = schema || new tinymce.html.Schema(settings); + settings.entity_encoding = settings.entity_encoding || 'named'; - // Padd empty nodes with a   - if (ru.padd) { - // If it has only one bogus child, padd it anyway workaround for

    - - - - - - - - -
    1abc
    34
    -

    textabcspan

    -
    - - diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/index.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/index.html index 6c480a2edf..e27af3e53a 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/index.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/index.html @@ -3,53 +3,118 @@ TinyMCE Unit Tests + @@ -57,14 +122,10 @@

    TinyMCE Unit Tests

    - - - - - -
    -
    +
    + +
    Run on minified code JSRobot tests
    +
    diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jquery_plugin.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jquery_plugin.html index a1562af649..9314861db3 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jquery_plugin.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jquery_plugin.html @@ -2,12 +2,13 @@ jQuery Plugin tests + '); - equals(ser.serialize(DOM.get('test')).replace(/\r/g, ''), ''); - - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')).replace(/\r/g, ''), ''); - - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')).replace(/\r/g, ''), ''); - - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')).replace(/\r/g, ''), ''); - - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')).replace(/\r/g, ''), ''); - - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')).replace(/\r/g, ''), ''); - - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')).replace(/\r/g, ''), ''); - - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')).replace(/\r/g, ''), ''); - - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')).replace(/\r/g, ''), ''); - - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')), ''); - - ser.setRules('noscript[test]'); - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')), ''); - - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')), ''); - - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')), ''); - - ser.setRules('map[id|name],area[shape|coords|href|target|alt]'); - DOM.setHTML('test', 'Sun'); - equals(ser.serialize(DOM.get('test')), 'Sun'); - - DOM.setHTML('test', '123]]>abc'); - equals(ser.serialize(DOM.get('test')), '123]]>abc'); - - DOM.setHTML('test', '123]]>abc'); - equals(ser.serialize(DOM.get('test')).replace(/\r/g, ''), '123]]>abc'); - - ser.setRules('ul,li,br'); - DOM.setHTML('test', '
    • test
    • test
    • test
    '); - equals(ser.serialize(DOM.get('test')), '
    • test
    • test
    • test
    '); - - ser.setRules('input[type|value|name|id|maxlength|size|tabindex]'); - DOM.setHTML('test', ''); - equals(ser.serialize(DOM.get('test')), ''); - - DOM.remove('test'); - }); -})(); - -(function() { - var Dispatcher = tinymce.util.Dispatcher; - - test('tinymce.util.Dispatcher - dispatcher', 5, function() { - var ev, v, f; - - ev = new Dispatcher(); - ev.add(function(a, b, c) { - v = a + b + c; - }); - ev.dispatch(1, 2, 3); - equals(v, 6); - - ev = new Dispatcher(); - v = 0; - f = ev.add(function(a, b, c) { - v = a + b + c; - }); - ev.remove(f); - ev.dispatch(1, 2, 3); - equals(v, 0); - - ev = new Dispatcher({test : 1}); - v = 0; - f = ev.add(function(a, b, c) { - v = a + b + c + this.test; - }); - ev.dispatch(1, 2, 3); - equals(v, 7); - - ev = new Dispatcher(); - v = 0; - f = ev.add(function(a, b, c) { - v = a + b + c + this.test; - }, {test : 1}); - ev.dispatch(1, 2, 3); - equals(v, 7); - - ev = new Dispatcher(); - v = ''; - f = ev.add(function(a, b, c) { - v += 'b'; - }, {test : 1}); - f = ev.addToTop(function(a, b, c) { - v += 'a'; - }, {test : 1}); - ev.dispatch(); - equals(v, 'ab'); - }); -})(); - -(function() { - var Cookie = tinymce.util.Cookie; - - test('tinymce.util.Cookie - cookie', 4, function() { - var f = document.location.protocol == 'file:'; - - Cookie.set('test', 'test123'); - equals(Cookie.get('test'), 'test123', null, f); - - Cookie.set('test', 'test1234'); - equals(Cookie.get('test'), 'test1234', null, f); - - Cookie.setHash('test', {a : 1, b : 2}); - ok(Cookie.getHash('test') ? Cookie.getHash('test').b == 2 : null, null, f); - - Cookie.setHash('test', {a : 1, b : 3}); - ok(Cookie.getHash('test') ? Cookie.getHash('test').b == 3 : null, null, f); - }); -})(); - -(function() { - var JSON = tinymce.util.JSON; - - test('tinymce.util.JSON - serialize', 1, function() { - equals(JSON.serialize({arr1 : [1, 2, 3, [1, 2, 3]], bool1 : true, float1: 3.14, int1 : 123, null1 : null, obj1 : {key1 : "val1", key2 : "val2"}, str1 : 'abc\u00C5123'}), '{"arr1":[1,2,3,[1,2,3]],"bool1":true,"float1":3.14,"int1":123,"null1":null,"obj1":{"key1":"val1","key2":"val2"},"str1":"abc\\u00c5123"}'); - }); - - test('tinymce.util.JSON - parse', 1, function() { - equals(JSON.parse('{"arr1":[1,2,3,[1,2,3]],"bool1":true,"float1":3.14,"int1":123,"null1":null,"obj1":{"key1":"val1","key2":"val2"},"str1":"abc\\u00c5123"}').str1, 'abc\u00c5123'); - }); -})(); - -(function() { - var URI = tinymce.util.URI; - - test('tinymce.util.URI - parseFullURLs', 2, function() { - equals(new URI('http://abc:123@www.site.com:8080/path/dir/file.ext?key1=val1&key2=val2#hash').getURI(), 'http://abc:123@www.site.com:8080/path/dir/file.ext?key1=val1&key2=val2#hash'); - ok(new URI('http://a2bc:123@www.site.com:8080/path/dir/file.ext?key1=val1&key2=val2#hash').getURI() != 'http://abc:123@www.site.com:8080/path/dir/file.ext?key1=val1&key2=val2#hash'); - }); - - test('tinymce.util.URI - relativeURLs', 26, function() { - equals(new URI('http://www.site.com/dir1/dir2/file.html').toRelative('http://www.site.com/dir1/dir3/file.html'), '../dir3/file.html'); - equals(new URI('http://www.site.com/dir1/dir2/file.html').toRelative('http://www.site.com/dir3/dir4/file.html'), '../../dir3/dir4/file.html'); - equals(new URI('http://www.site.com/dir1/').toRelative('http://www.site.com/dir1/dir3/file.htm'), 'dir3/file.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('http://www.site2.com/dir1/dir3/file.htm'), 'http://www.site2.com/dir1/dir3/file.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('http://www.site.com:8080/dir1/dir3/file.htm'), 'http://www.site.com:8080/dir1/dir3/file.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('https://www.site.com/dir1/dir3/file.htm'), 'https://www.site.com/dir1/dir3/file.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('/file.htm'), '../../file.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('/file.htm?id=1#a'), '../../file.htm?id=1#a'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('mailto:test@test.com'), 'mailto:test@test.com'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('news:test'), 'news:test'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('javascript:void(0);'), 'javascript:void(0);'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('about:blank'), 'about:blank'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('#test'), '#test'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('test.htm'), 'test.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('http://www.site.com/dir1/dir2/test.htm'), 'test.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('dir2/test.htm'), 'dir2/test.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('../dir2/test.htm'), 'test.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('../dir3/'), '../dir3/'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('../../../../../../test.htm'), '../../test.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('//www.site.com/test.htm'), '../../test.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('@@tinymce'), '@@tinymce'); // Zope 3 URL - equals(new URI('http://www.site.com/dir1/dir2/').toRelative('../@@tinymce'), '../@@tinymce'); // Zope 3 URL - equals(new URI('http://www.site.com/').toRelative('dir2/test.htm'), 'dir2/test.htm'); - equals(new URI('http://www.site.com/').toRelative('./'), './'); - equals(new URI('http://www.site.com/test/').toRelative('../'), '../'); - equals(new URI('http://www.site.com/test/test/').toRelative('../'), '../'); - }); - - test('tinymce.util.URI - absoluteURLs', 17, function() { - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('../dir3'), 'http://www.site.com/dir1/dir3'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('../dir3', 1), '/dir1/dir3'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('../../../../dir3'), 'http://www.site.com/dir3'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('../abc/def/../../abc/../dir3/file.htm'), 'http://www.site.com/dir1/dir3/file.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('http://www.site.com/dir2/dir3'), 'http://www.site.com/dir2/dir3'); - equals(new URI('http://www.site2.com/dir1/dir2/').toAbsolute('http://www.site2.com/dir2/dir3'), 'http://www.site2.com/dir2/dir3'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('mailto:test@test.com'), 'mailto:test@test.com'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('news:test'), 'news:test'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('javascript:void(0);'), 'javascript:void(0);'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('about:blank'), 'about:blank'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('#test'), '#test'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('test.htm'), 'http://www.site.com/dir1/dir2/test.htm'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('../@@tinymce'), 'http://www.site.com/dir1/@@tinymce'); // Zope 3 URL - equals(new URI('http://www.site.com/dir1/dir2/').getURI(), 'http://www.site.com/dir1/dir2/'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('/dir1/dir1/'), 'http://www.site.com/dir1/dir1/'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('https://www.site.com/dir1/dir2/', true), 'https://www.site.com/dir1/dir2/'); - equals(new URI('http://www.site.com/dir1/dir2/').toAbsolute('http://www.site.com/dir1/dir2/', true), '/dir1/dir2/'); - }); - - test('tinymce.util.URI - strangeURLs', 3, function() { - equals(new URI('//www.site.com').getURI(), '//www.site.com'); - equals(new URI('mailto:test@test.com').getURI(), 'mailto:test@test.com'); - equals(new URI('news:somegroup').getURI(), 'news:somegroup'); - }); -})(); - -/* -(function() { - var Parser = tinymce.xml.Parser; - - test('tinymce.util.Parser - parser', 3, function() { - var f = document.location.protocol == 'file:', p, d; - - p = new Parser({async : false}); - p.load('test.xml', function(d) { - equals(d.getElementsByTagName('tag').length, 1); - }); - - p = new Parser({async : false}); - p.load('test.xml', function(d) { - equals(tinymce.trim(p.getText(d.getElementsByTagName('tag')[0])), 'ÅÄÖ'); - }); - - p = new Parser({async : false}); - d = p.loadXML('ÅÄÖ'); - equals(tinymce.trim(p.getText(d.getElementsByTagName('tag')[0])), 'ÅÄÖ'); - }); -})(); -*/ - tinymce.dom.Event.add(window, 'load', function() { // IE6 chokes if you stress it window.setTimeout(function() { diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/autolink/actions.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/autolink/actions.js new file mode 100644 index 0000000000..2dca8b8a73 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/autolink/actions.js @@ -0,0 +1,48 @@ +function fakeTypeAURL(url) { + return function(callback) { + // type the URL and then press the space bar + tinyMCE.execCommand('mceInsertContent', false, url); + window.robot.type(32, false, callback, editor.selection.getNode()); + }; +} + +function fakeTypeAnEclipsedURL(url) { + return function(callback) { + // type the URL and then type ')' + tinyMCE.execCommand('mceInsertContent', false, '(' + url); + window.robot.typeSymbol(")", function() { + window.robot.type(32, false, callback, editor.selection.getNode()); + }, editor.selection.getNode()); + }; +} + +function fakeTypeANewlineURL(url) { + return function(callback) { + // type the URL and then press the enter key + tinyMCE.execCommand('mceInsertContent', false, url); + window.robot.type('\n', false, callback, editor.selection.getNode()); + }; +} + +createAction('Typing HTTP URL', fakeTypeAURL('http://www.ephox.com')); +createAction('Typing HTTPS URL', fakeTypeAURL('https://www.ephox.com')); +createAction('Typing SSH URL', fakeTypeAURL('ssh://www.ephox.com')); +createAction('Typing FTP URL', fakeTypeAURL('ftp://www.ephox.com')); +createAction('Typing WWW URL', fakeTypeAURL('www.ephox.com')); +createAction('Typing Eclipsed HTTP URL', fakeTypeAnEclipsedURL('http://www.ephox.com')); +createAction('Typing Eclipsed HTTPS URL', fakeTypeAnEclipsedURL('https://www.ephox.com')); +createAction('Typing Eclipsed SSH URL', fakeTypeAnEclipsedURL('ssh://www.ephox.com')); +createAction('Typing Eclipsed FTP URL', fakeTypeAnEclipsedURL('ftp://www.ephox.com')); +createAction('Typing Eclipsed WWW URL', fakeTypeAnEclipsedURL('www.ephox.com')); +createAction('Typing HTTP URL And Newline', fakeTypeANewlineURL('http://www.ephox.com')); +createAction('Typing HTTPS URL And Newline', fakeTypeANewlineURL('https://www.ephox.com')); +createAction('Typing SSH URL And Newline', fakeTypeANewlineURL('ssh://www.ephox.com')); +createAction('Typing FTP URL And Newline', fakeTypeANewlineURL('ftp://www.ephox.com')); +createAction('Typing WWW URL And Newline', fakeTypeANewlineURL('www.ephox.com')); +createAction('Applying OL', 'InsertOrderedList'); +createAction('Applying UL', 'InsertUnorderedList'); +createAction('Indenting', 'Indent'); +createAction('Outdenting', 'Outdent'); +createAction('Typing Enter', fakeKeyPressAction('\n')); +createAction('Typing Tab', fakeKeyPressAction('\t')); +createAction('Typing Shift Tab', fakeKeyPressAction('\t', true)); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/dsl/dsl.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/dsl/dsl.js new file mode 100644 index 0000000000..99eca59cf3 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/dsl/dsl.js @@ -0,0 +1,138 @@ +var editor; + +function getFunctionName(func) { + if (func.name && func.name != "") { + return func.name; + } else if (typeof func == "function" || typeof func == "object") { + var fName = ("" + func).match(/function\s*([\w\$]+)\s*\(/); + if (fName !== null && fName != "") { + return fName[1]; + } else { + for (var v in window) { + if (window[v] === func) { + func.name = v; + return v; + } + } + } + } +} + +function assertState(expected, message) { + var content = editor.getContent().replace(/[\n\r]/g, ''); + if (expected && expected.replace) expected = expected.replace(/[\n\r]/g, ''); + // Safari reports "function", while Firefox and IE report "object" + if (typeof expected == "function" || typeof expected == "object") { + if (expected.test(content)) + equals(content, content, message); + else + equals(content, expected.toString(), message); + } else { + equals(content, expected, message); + } +} + +tinymce.create('dsl.Queue', { + Queue: function() { + this.queue = []; + }, + + add: function(task) { + this.queue.push(task); + }, + + next: function() { + if (this.queue.length > 0) { + var task = this.queue.shift(); + task(); + return true; + } else { + QUnit.start(); + return false; + } + }, + + done: function() { + expect(this.queue.length); + this.next(); + } +}); + +tinymce.create('dsl.Action', { + Action: function(name, action) { + this.name = name; + this.a = this.curryPreposition('a'); + this.inA = this.curryPreposition('in a'); + this.to = this.curryPreposition('to'); + if (tinymce.is(action, 'string')) { + this.action = function(callback) { + editor.execCommand(action); + callback(); + }; + } else { + this.action = action; + } + }, + + curryPreposition: function(preposition) { + return function(state) { + return this.go(state, preposition); + }; + }, + + go: function(state, preposition) { + var message = this.name + " " + preposition + " " + getFunctionName(state); + var action = this.action; + var actionPerformed = false; + function defer(callback) { + return function() { + var args = arguments; + queue.add(function() { + if (actionPerformed) { + callback.apply(undefined, args); + queue.next(); + return; + } + editor.focus(); + state(); + action(function() { + actionPerformed = true; + callback.apply(undefined, args); + queue.next(); + }); + }); + return this; + }; + } + + var dslState = { + gives: defer(function(expected) { + assertState(expected, message); + }), + + enablesState: defer(function(state) { + ok(editor.queryCommandState(state), message + " enables " + state + " command"); + }), + + disablesState: defer(function(state) { + ok(!editor.queryCommandState(state), message + " disables " + state + " command"); + }) + }; + dslState.andGives = dslState.gives; + return dslState; + } +}); + + +// Action Utilities +function fakeKeyPressAction(keyCode, shiftKey) { + return function(callback) { + setTimeout(function() { + window.robot.type(keyCode, shiftKey, callback, editor.selection.getNode()); + }, 1); + }; +} + +function createAction(name, action) { + window[name.replace(/\s+/g, '')] = new dsl.Action(name, action); +} \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/dsl/states.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/dsl/states.js new file mode 100644 index 0000000000..988e9fd711 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/dsl/states.js @@ -0,0 +1,175 @@ +function createState(content, startSelector, startOffset, endSelector, endOffset) { + return function() { + editor.setContent(content); + setSelection(startSelector, startOffset, endSelector, endOffset); + }; +} + +/** Collapsed Selection States **/ +function EmptyParagraph() { + var body = editor.getBody(); + while (body.firstChild) { + editor.dom.remove(body.firstChild); + } + var p = body.ownerDocument.createElement('p'); + p.appendChild(body.ownerDocument.createTextNode('')); + body.appendChild(p, body); + setSelection(p.firstChild, 0); +} + +function EmptyHeading() { + EmptyParagraph(); + editor.dom.rename(editor.getBody().firstChild, 'h1'); + setSelection(editor.getBody().firstChild.firstChild, 0); +} + +function TextAfterUL() { + editor.setContent('
    • Item
    Test'); + setSelection(editor.dom.getRoot().lastChild, 2); +} + +function TextAfterOL() { + editor.setContent('
    1. Item
    Test'); + setSelection(editor.dom.getRoot().lastChild, 2); +} + +EmptyContent = createState('', 'body', 0); +PlainText = createState('Test', 'body', 0); +NonEmptyParagraph = createState('

    Test

    ', 'p', 0); +ParagraphWithMarginLeft = createState('

    Test

    ', 'p', 0); +ParagraphWithPaddingLeft = createState('

    Test

    ', 'p', 0); +ParagraphWithMarginAndPaddingLeft = createState('

    Test

    ', 'p', 0); + +CenteredListItem = createState('
    • Item1
    • Item2
    ', 'li:nth-child(1)', 2); +ItemInCenteredList = createState('
    • Item1
    • Item2
    ', 'li:nth-child(1)', 2); +RightAlignedListItem = createState('
    • Item1
    • Item2
    ', 'li:nth-child(1)', 2); +ItemInRightAlignedList = createState('
    • Item1
    • Item2
    ', 'li:nth-child(1)', 2); + +ParagraphBetweenOrderedLists = createState('
    1. Item1

    Test

    1. Item2
    ', 'p', 2); +ParagraphBetweenUnorderedLists = createState('
    • Item1

    Test

    • Item2
    ', 'p', 2); +ParagraphBetweenMixedLists = createState('
    1. Item1

    Test

    • Item2
    ', 'p', 2); + +NonEmptyHeading = createState('

    Test

    ', 'h1', 0); +TableCellWithoutBrs = createState('
    Test 
    ', 'td', 4); +TableCellWithoutBrs2 = createState('
    Test 
    ', 'td', 0); +TableCellWithBrsFirstLine = createState('
    Test
    Line 2
     
    ', 'td', 1); +TableCellWithBrsFirstLine2 = createState('
    Test
    Line 2
     
    ', 'td', 0); +TableCellWithBrsMiddleLine = createState('
    Test
    Line 2
    Line 3
     
    ', 'td br:nth-child(1)', 'afterNextCharacter'); +TableCellWithBrsLastLine = createState('
    Test
    Line 2
     
    ', 'td br:nth-child(1)', 'afterNextCharacter'); +TableCellWithAdjacentBrsFirstLine = createState('
    Test

    Line 2
     
    ', 'td', 1); + +HeadingInOrderedList = createState('
    1. Test

    ', 'h2', '2'); +HeadingInUnorderedList = createState('
    • Test

    ', 'h2', '2'); +HeadingInOrderedListBeforeParagraph = createState('
    1. Test

    Content
    After

    ', 'h2', '2'); + +DefinitionListDescription = createState('
    Term
    Description
    ', 'dd', 2); +DefinitionListTerm = createState('
    Term
    Description
    ', 'dt', 2); +EndOfParagraphBeforeOL = createState('

    Test

    1. Item
    ', 'p', 4); +EndOfParagraphBeforeOLWithListType = createState('

    Test

    1. Item
    ', 'p', 4); +EndOfParagraphBeforeUL = createState('

    Test

    • Item
    ', 'p', 4); +StartOfParagraphAfterOL = createState('
    1. Item

    Test

    ', 'p', 1); +StartOfParagraphAfterUL = createState('
    • Item

    Test

    ', 'p', 1); +StartOfParagraphAfterOLWithListType = createState('
    1. Item

    Test

    ', 'p', 1); +EmptyOrderedListItem = createState('
    1. Before
    2.  
    3. After
    ', 'li:nth-child(2)', 0); +EmptyUnorderedListItem = createState('
    • Before
    •  
    • After
    ', 'li:nth-child(2)', 0); +NonEmptyOrderedListItem = createState('
    1. Before
    2. Test
    3. After
    ', 'li:nth-child(2)', 0); +NonEmptyUnorderedListItem = createState('
    • Before
    • Test
    • After
    ', 'li:nth-child(2)', 0); +NestedEmptyOrderedListItem = createState('
    1. Before
      1.  
    2. After
    ', 'li ol li', 0); +NestedEmptyUnorderedListItem = createState('
    • Before
      •  
    • After
    ', 'li ul li', 0); +NestedNonEmptyOrderedListItem = createState('
    1. Before
      1. Test
    2. After
    ', 'li ol li', 0); +NestedNonEmptyUnorderedListItem = createState('
    • Before
      • Test
    • After
    ', 'li ul li', 0); +NestedOrderedListWithMultipleItems = createState('
    1. Before
      1. Item1
      2. Item2
    ', 'li ol li', 0); +NestedUnorderedListWithMultipleItems = createState('
    • Before
      • Item1
      • Item2
    ', 'li ul li', 0); +OrderedLowerAlphaListItem = createState('
    1. Item 1
    2. Item 2
    ', 'li:nth-child(2)', 0); +UnorderedSquareListItem = createState('
    • Item 1
    • Item 2
    ', 'li:nth-child(2)', 0); + +OrderedListItemWithNestedChild = createState('
    1. Item1
      1. Nested
    ', 'li:nth-child(1)', 2); +UnorderedListItemWithNestedChild = createState('
    • Item1
      • Nested
    ', 'li:nth-child(1)', 2); + +OrderedListWithAdjacentNestedLists = createState('
      1. Item 1
    1. Item 2
      1. Item 3
    ', 'li:nth-child(2)', 4); +UnorderedListWithAdjacentNestedLists = createState('
      • Item 1
    • Item 2
      • Item 3
    ', 'li:nth-child(2)', 4); + +OrderedListItemWithMargin = createState('
    1. Test
    ', 'li', 0); +UnorderedListItemWithMargin = createState('
    • Test
    ', 'li', 0); + +OrderedListItemWithNestedAlphaList = createState('
    1. Item
      1. Nested
    ', 'li', 2); + +/** Collapsed DIV Tests **/ +OrderedListItemInsideDiv = createState('
      \n
    1. Item1
    2. Item2
    ', 'li:nth-child(1)', 2); +UnorderedListItemInsideDiv = createState('
      \n
    • Item1
    • Item2
    ', 'li:nth-child(1)', 2); + +ParagraphInDiv = createState('

    Item

    ', 'p', 2); +TextInDiv = createState('
    Item
    ', 'div', 2); +TextWithBrsInDivFirstLine = createState('
    Item1
    Item2
    ', 'div', 2); +TextWithBrsInDivMiddleLine = createState('
    Item1
    Item2
    Item3
    ', 'br:nth-child(1)', 'afterNextCharacter'); +TextWithBrsInDivLastLine = createState('
    Item1
    Item2
    ', 'br:nth-child(1)', 'afterNextCharacter'); +TextWithBrsInFormattingInDiv = function() { + var rng; + editor.setContent('
    Before
    Item1
    Item2
    Item3
    '); + rng = editor.dom.createRng(); + rng.setStart(editor.dom.select('div')[0].childNodes[1], 0); + rng.setEnd(editor.dom.select('div')[0], 6); + editor.selection.setRng(rng); +}; +TextWithBrInsideFormatting = function() { + var rng; + editor.setContent('
    Before
    Item1
    Item2
    Item3
    '); + rng = editor.dom.createRng(); + rng.setStart(editor.dom.select('span')[0].childNodes[0], 2); + rng.setEnd(editor.dom.select('div')[0], 4); + editor.selection.setRng(rng); +}; + +/** Expanded Selection States **/ +SingleParagraphSelection = createState('

    This is a test

    ', 'p', 5, 'p', 7); +MultipleParagraphSelection = createState('

    This is a test

    Second paragraph

    ', 'p:nth-child(1)', 5, 'p:nth-child(2)', 6); +SingleHeadingSelection = createState('

    This is a test

    ', 'h1', 5, 'h1', 7); +MultipleHeadingSelection = createState('

    This is a test

    Second paragraph

    ', 'h1:nth-child(1)', 5, 'h1:nth-child(2)', 6); +SingleBlockSelection = createState('
    This is a test
    ', 'div', 5, 'div', 7); +MultipleBlockSelection = createState('
    This is a test
    Second paragraph
    ', 'div:nth-child(1)', 5, 'div:nth-child(2)', 6); + +SingleBlockWithBrSelection = createState('
    Item1
    Item2
    ', 'div', 3, 'br', 'afterNextCharacter'); +MultipleBlockWithBrSelection = createState('
    Item1
    Item2
    Item3
    ', 'div:nth-child(1)', 2, 'div:nth-child(2)', 3); +MultipleBlockWithBrPartialSelection = createState('
    Item1
    Item2
    Item3
    Item4
    ', 'div:nth-child(1)', 2, 'div:nth-child(2)', 3); +MultipleBlockWithBrPartialSelectionAtEnd = createState('
    Item1
    Item2
    Item3
    Item4
    ', 'div:nth-child(1) br', 'afterNextCharacter', 'div:nth-child(2) br', 'afterNextCharacter'); + +CellWithoutBrSelection = createState('
    Cell 1
    ', 'td', 1, 'td', 1); //selection is a single point so it will avoid table selection bugs in ie9. +CellWithBrSingleLineSelection = createState('
    Cell 1
    Line 2
    ', 'td', 1, 'td', 4); +CellWithBrMultipleLineSelection = createState('
    Cell 1
    Line 2
    ', 'td', 1, 'td', 4); + +TableCellWithTextAfterUL = createState('
    • Existing
    Line1
    Line2
    Line3
    Line4
    ', '#start', 1, '#end', 'afterNextCharacter'); + +ParagraphToHeadingSelection = createState('

    This is a test

    Second paragraph

    ', 'p', 5, 'h1', 6); +ParagraphToBlockSelection = createState('

    This is a test

    Second paragraph
    ', 'p', 5, 'div', 6); +HeadingToParagraphSelection = createState('

    This is a test

    Second paragraph

    ', 'h1', 5, 'p', 6); +BlockToParagraphSelection = createState('
    This is a test

    Second paragraph

    ', 'div', 5, 'p', 6); +MultipleParagraphAndHeadingSelection = createState('

    This is a test

    Second paragraph

    Third paragraph
    ', 'p', 5, 'div', 5); +ThreeBoldDivsWithBrSelection = createState('
    One
    Two
    Three
    ', 'div:nth-child(1) strong', 2, 'div:nth-child(3) strong', 2); + +SingleLiOlSelection = createState('
    1. Item 1
    ', 'li', 1, 'li', 4); +MultiLiOlSelection = createState('
    1. Item 1
    2. Item 2
    ', 'li:nth-child(1)', 1, 'li:nth-child(2)', 4); +SingleLiUlSelection = createState('
    • Item 1
    ', 'li', 1, 'li', 4); +MultiLiUlSelection = createState('
    • Item 1
    • Item 2
    ', 'li:nth-child(1)', 1, 'li:nth-child(2)', 4); +MultiNestedLiUlSelection = createState('
      • Item 1
      • Item 2
    ', 'li li:nth-child(1)', 1, 'li li:nth-child(2)', 4); +MultiNestedLiOlSelection = createState('
      1. Item 1
      2. Item 2
    ', 'li li:nth-child(1)', 1, 'li li:nth-child(2)', 4); + +IndentedOlInOlCorrectSelection = createState('
    1. Item 1
      1. Indented
    ', 'li', 1, 'li li', 4); +IndentedUlInUlCorrectSelection = createState('
    • Item 1
      • Indented
    ', 'li', 1, 'li li', 4); +IndentedOlInOlIncorrectSelection = createState('
    1. Item 1
      1. Indented
    ', 'li', 1, 'ol ol li', 4); +IndentedUlInUlIncorrectSelection = createState('
    • Item 1
      • Indented
    ', 'li', 1, 'ul ul li', 4); + +IndentedOlInUlCorrectSelection = createState('
    • Item 1
      1. Indented
    ', 'li', 1, 'li li', 4); +IndentedUlInOlCorrectSelection = createState('
    1. Item 1
      • Indented
    ', 'li', 1, 'li li', 4); +IndentedOlInUlIncorrectSelection = createState('
    • Item 1
      1. Indented
    ', 'li', 1, 'ul ol li', 4); +IndentedUlInOlIncorrectSelection = createState('
    1. Item 1
      • Indented
    ', 'li', 1, 'ol ul li', 4); + +// TODO: Paragraph/heading to list combinations. +ParagraphBeforeOlSelection = createState('

    Before

    1. Item 1
    ', 'p', 3, 'li', 4); +ParagraphBeforeUlSelection = createState('

    Before

    • Item 1
    ', 'p', 3, 'li', 4); +ParagraphAfterOlSelection = createState('
    1. Item 1

    After

    ', 'li', 4, 'p', 3); +ParagraphAfterUlSelection = createState('
    • Item 1

    After

    ', 'li', 4, 'p', 3); +ParagraphBeforeAndAfterOlSelection = createState('

    Before

    1. Item 1

    After

    ', 'p', 4, '#after', 3); +ParagraphBeforeAndAfterUlSelection = createState('

    Before

    • Item 1

    After

    ', 'p', 4, '#after', 3); + +SelectionEndingAtBr = createState('

    Item
    After

    ', 'p', 2, 'br', 'after'); +SelectionStartingAtBr = createState('

    Before
    Item

    ', 'p', 'after', 'br', 'afterNextCharacter'); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/lists/actions.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/lists/actions.js new file mode 100644 index 0000000000..c71e227a32 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/lists/actions.js @@ -0,0 +1,7 @@ +createAction('Applying OL', 'InsertOrderedList'); +createAction('Applying UL', 'InsertUnorderedList'); +createAction('Indenting', 'Indent'); +createAction('Outdenting', 'Outdent'); +createAction('Typing Enter', fakeKeyPressAction('\n')); +createAction('Typing Tab', fakeKeyPressAction('\t')); +createAction('Typing Shift Tab', fakeKeyPressAction('\t', true)); \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/tiny_mce_loader.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/tiny_mce_loader.js new file mode 100644 index 0000000000..f20dfe8e20 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/tiny_mce_loader.js @@ -0,0 +1,7 @@ +(function() { + if (document.location.search.indexOf('min=true') > 0) { + document.write(''); + } else { + document.write(''); + } +})(); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/tinymce.dom.DOMUtils.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/tinymce.dom.DOMUtils.js new file mode 100644 index 0000000000..64b1b6de60 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/tinymce.dom.DOMUtils.js @@ -0,0 +1,634 @@ +(function() { + var DOM = new tinymce.dom.DOMUtils(document, {keep_values : true}); + + test('parseStyle', 11, function() { + var dom; + + DOM.add(document.body, 'div', {id : 'test'}); + + dom = new tinymce.dom.DOMUtils(document, {hex_colors : true, keep_values : true, url_converter : function(u, n, e) { + return 'X' + u + 'Y'; + }}); + + equals( + dom.serializeStyle(dom.parseStyle('border: 1px solid red; color: green')), + 'border: 1px solid red; color: green;' + ); + + equals( + dom.serializeStyle(dom.parseStyle('border: 1px solid rgb(0, 255, 255); color: green')), + 'border: 1px solid #00ffff; color: green;' + ); + + equals( + dom.serializeStyle(dom.parseStyle('border-top: 1px solid red; border-left: 1px solid red; border-bottom: 1px solid red; border-right: 1px solid red;')), + 'border: 1px solid red;' + ); + + equals( + dom.serializeStyle(dom.parseStyle('border-width: 1pt 1pt 1pt 1pt; border-style: none none none none; border-color: black black black black;')), + 'border: 1pt none black;' + ); + + equals( + dom.serializeStyle(dom.parseStyle('border-width: 1pt 4pt 2pt 3pt; border-style: solid dashed dotted none; border-color: black red green blue;')), + 'border-width: 1pt 4pt 2pt 3pt; border-style: solid dashed dotted none; border-color: black red green blue;' + ); + + equals( + dom.serializeStyle(dom.parseStyle('background: transparent url(test.gif);')), + 'background: transparent url(\'Xtest.gifY\');' + ); + + equals( + dom.serializeStyle(dom.parseStyle('background: transparent url(http://www.site.com/test.gif?a=1&b=2);')), + 'background: transparent url(\'Xhttp://www.site.com/test.gif?a=1&b=2Y\');' + ); + + dom.setHTML('test', ''); + equals(dom.getAttrib('test2', 'style'), 'margin: 1px;'); + + dom.setHTML('test', ''); + equals(dom.getAttrib('test2', 'style'), 'background-image: url(\'Xtest.gifY\');'); + + dom.get('test').innerHTML = ''; + equals(dom.getAttrib('test2', 'style'), tinymce.isIE && !window.getSelection ? 'border: #00ff00 1px solid;' : 'border: 1px solid #00ff00;'); // IE has a separate output + + dom.get('test').innerHTML = ''; + equals(dom.getAttrib('test2', 'style'), 'background-image: url(\'Xhttp://www.site.com/test.gifY\');'); + + DOM.remove('test'); + }); + + test('addClass', 10, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.get('test').className = ''; + DOM.addClass('test', 'abc'); + equals(DOM.get('test').className, 'abc'); + + DOM.get('test').className = ''; + equals(DOM.addClass('test', 'abc'), 'abc'); + equals(DOM.addClass(null, 'abc'), false); + + DOM.addClass('test', '123'); + equals(DOM.get('test').className, 'abc 123'); + + DOM.get('test').innerHTML = ''; + DOM.addClass(DOM.select('span', 'test'), 'abc'); + equals(DOM.get('test2').className, 'abc'); + equals(DOM.get('test3').className, 'abc'); + equals(DOM.get('test4').className, 'abc'); + DOM.get('test').innerHTML = ''; + + DOM.get('test').innerHTML = ''; + DOM.addClass(['test2', 'test3', 'test4'], 'abc'); + equals(DOM.get('test2').className, 'abc'); + equals(DOM.get('test3').className, 'abc'); + equals(DOM.get('test4').className, 'abc'); + DOM.get('test').innerHTML = ''; + + DOM.remove('test'); + }); + + test('removeClass', 4, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.get('test').className = 'abc 123 xyz'; + DOM.removeClass('test', '123'); + equals(DOM.get('test').className, 'abc xyz'); + + DOM.get('test').innerHTML = ''; + DOM.removeClass(DOM.select('span', 'test'), 'test1'); + equals(DOM.get('test2').className, ''); + equals(DOM.get('test3').className, 'test test'); + equals(DOM.get('test4').className, 'test'); + DOM.get('test').innerHTML = ''; + + DOM.remove('test'); + }); + + test('hasClass', 7, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.get('test').className = 'abc 123 xyz'; + ok(DOM.hasClass('test', 'abc')); + ok(DOM.hasClass('test', '123')); + ok(DOM.hasClass('test', 'xyz')); + ok(!DOM.hasClass('test', 'aaa')); + + DOM.get('test').className = 'abc'; + ok(DOM.hasClass('test', 'abc')); + + DOM.get('test').className = 'aaa abc'; + ok(DOM.hasClass('test', 'abc')); + + DOM.get('test').className = 'abc aaa'; + ok(DOM.hasClass('test', 'abc')); + + DOM.remove('test'); + }); + + test('add', 5, function() { + var e; + + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.add('test', 'span', {'class' : 'abc 123'}, 'content abc'); + e = DOM.get('test').getElementsByTagName('span')[0]; + equals(e.className, 'abc 123'); + equals(e.innerHTML.toLowerCase(), 'content abc'); + DOM.remove(e); + + DOM.add('test', 'span', {'class' : 'abc 123'}); + e = DOM.get('test').getElementsByTagName('span')[0]; + equals(e.className, 'abc 123'); + DOM.remove(e); + + DOM.add('test', 'span'); + e = DOM.get('test').getElementsByTagName('span')[0]; + equals(e.nodeName, 'SPAN'); + DOM.remove(e); + + DOM.get('test').innerHTML = ''; + DOM.add(['test2', 'test3', 'test4'], 'span', {'class' : 'abc 123'}); + equals(DOM.select('span', 'test').length, 6); + + DOM.remove('test'); + }); + + test('create', 3, function() { + var e; + + e = DOM.create('span', {'class' : 'abc 123'}, 'content abc'); + + equals(e.nodeName, 'SPAN'); + equals(e.className, 'abc 123'); + equals(e.innerHTML.toLowerCase(), 'content abc'); + }); + + test('createHTML', 4, function() { + equals(DOM.createHTML('span', {'id' : 'id1', 'class' : 'abc 123'}, 'content abc'), 'content abc'); + equals(DOM.createHTML('span', {'id' : 'id1', 'class' : 'abc 123'}), ''); + equals(DOM.createHTML('span'), ''); + equals(DOM.createHTML('span', null, 'content abc'), 'content abc'); + }); + + test('uniqueId', 3, function() { + DOM.counter = 0; + + equals(DOM.uniqueId(), 'mce_0'); + equals(DOM.uniqueId(), 'mce_1'); + equals(DOM.uniqueId(), 'mce_2'); + }); + + test('showHide', 10, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.show('test'); + equals(DOM.get('test').style.display, 'block'); + ok(!DOM.isHidden('test')); + + DOM.hide('test'); + equals(DOM.get('test').style.display, 'none'); + ok(DOM.isHidden('test')); + + DOM.get('test').innerHTML = ''; + DOM.hide(['test2', 'test3', 'test4'], 'test'); + equals(DOM.get('test2').style.display, 'none'); + equals(DOM.get('test3').style.display, 'none'); + equals(DOM.get('test4').style.display, 'none'); + + DOM.get('test').innerHTML = ''; + DOM.show(['test2', 'test3', 'test4'], 'test'); + equals(DOM.get('test2').style.display, 'block'); + equals(DOM.get('test3').style.display, 'block'); + equals(DOM.get('test4').style.display, 'block'); + + // Cleanup + DOM.setAttrib('test', 'style', ''); + + DOM.remove('test'); + }); + + test('select', 4, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.setHTML('test', '
    test 1
    test 2
    test 3
    test 4
    '); + equals(DOM.select('div', 'test').length, 4); + ok(DOM.select('div', 'test').reverse); + + DOM.setHTML('test', '
    test 1
    test 2
    test 3
    test 4
    ') + equals(DOM.select('div.test2', 'test').length, 2); + + DOM.setHTML('test', '
    test 1
    test 2
    test 3
    test 4
    ') + equals(DOM.select('div div', 'test').length, 1, null, tinymce.isWebKit); // Issue: http://bugs.webkit.org/show_bug.cgi?id=17461 + //alert(DOM.select('div div', 'test').length +","+DOM.get('test').querySelectorAll('div div').length); + + DOM.remove('test'); + }); + + test('is', 3, function() { + DOM.add(document.body, 'div', {id : 'test'}); + DOM.setHTML('test', '
    test 1
    '); + + ok(DOM.is(DOM.get('textX'), 'div')); + ok(DOM.is(DOM.get('textX'), 'div#textX.test')); + ok(!DOM.is(DOM.get('textX'), 'div#textX2')); + + DOM.remove('test'); + }); + + test('encode', 1, function() { + equals(DOM.encode('abc<>"&\'\u00e5\u00e4\u00f6'), 'abc<>"&'\u00e5\u00e4\u00f6'); + }); + + test('setGetAttrib', 14, function() { + var dom; + + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.setAttrib('test', 'class', 'test 123'); + equals(DOM.getAttrib('test', 'class'), 'test 123'); + + DOM.setAttrib('test', 'src', 'url'); + equals(DOM.getAttrib('test', 'src'), 'url'); + equals(DOM.getAttrib('test', 'data-mce-src'), 'url'); + equals(DOM.getAttrib('test', 'abc'), ''); + + DOM.setAttribs('test', {'class' : '123', title : 'abc'}); + equals(DOM.getAttrib('test', 'class'), '123'); + equals(DOM.getAttrib('test', 'title'), 'abc'); + + dom = new tinymce.dom.DOMUtils(document, {keep_values : true, url_converter : function(u, n, e) { + return '&<>"' + u + '&<>"' + n; + }}); + + dom.setAttribs('test', {src : '123', href : 'abc'}); + equals(DOM.getAttrib('test', 'src'), '&<>"123&<>"src'); + equals(DOM.getAttrib('test', 'href'), '&<>"abc&<>"href'); + + DOM.get('test').innerHTML = ''; + DOM.setAttribs(['test2', 'test3', 'test4'], {test1 : "1", test2 : "2"}); + equals(DOM.getAttrib('test2', 'test1'), '1'); + equals(DOM.getAttrib('test3', 'test2'), '2'); + equals(DOM.getAttrib('test4', 'test1'), '1'); + + equals(DOM.getAttrib(document, 'test'), false); + equals(DOM.getAttrib(document, 'test', ''), ''); + equals(DOM.getAttrib(document, 'test', 'x'), 'x'); + + DOM.remove('test'); + }); + + test('getAttribs', 2, function() { + var dom; + + function check(obj, val) { + var count = 0; + + val = val.split(','); + + tinymce.each(obj, function(o) { + if (tinymce.inArray(val, o.nodeName.toLowerCase()) != -1 && o.specified) + count++; + }); + + return count == obj.length; + }; + + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.get('test').innerHTML = ''; + ok(check(DOM.getAttribs('test2'), 'id,class')); + + DOM.get('test').innerHTML = '
    '; + ok(check(DOM.getAttribs('test2'), 'id,type,name,value,disabled,readonly,checked'), 'Expected attributed: type,name,disabled,readonly,checked'); + + DOM.remove('test'); + }); + + test('setGetStyles', 7, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.setStyle('test', 'font-size', '20px'); + equals(DOM.getStyle('test', 'font-size'), '20px', null, tinymce.isWebKit); + + DOM.setStyle('test', 'fontSize', '21px'); + equals(DOM.getStyle('test', 'fontSize'), '21px', null, tinymce.isWebKit); + + DOM.setStyles('test', {fontSize : '22px', display : 'inline'}); + equals(DOM.getStyle('test', 'fontSize'), '22px', null, tinymce.isWebKit); + equals(DOM.getStyle('test', 'display'), 'inline', null, tinymce.isWebKit); + + DOM.get('test').innerHTML = ''; + DOM.setStyles(['test2', 'test3', 'test4'], {fontSize : "22px"}); + equals(DOM.getStyle('test2', 'fontSize'), '22px'); + equals(DOM.getStyle('test3', 'fontSize'), '22px'); + equals(DOM.getStyle('test4', 'fontSize'), '22px'); + + DOM.setAttrib('test', 'style', ''); + + DOM.remove('test'); + }); + + test('getPos', 2, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.setStyles('test', {position : 'absolute', left : 100, top : 110}); + equals(DOM.getPos('test').x, 100); + equals(DOM.getPos('test').y, 110); + + DOM.setAttrib('test', 'style', ''); + + DOM.remove('test'); + }); + + test('getParent', 6, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.get('test').innerHTML = '
    ababcc
    '; + + equals(DOM.getParent('test2', function(n) {return n.nodeName == 'SPAN';}).nodeName, 'SPAN'); + equals(DOM.getParent('test2', function(n) {return n.nodeName == 'BODY';}).nodeName, 'BODY'); + equals(DOM.getParent('test2', function(n) {return n.nodeName == 'BODY';}, document.body), null); + equals(DOM.getParent('test2', function(n) {return false;}), null); + equals(DOM.getParent('test2', 'SPAN').nodeName, 'SPAN'); + equals(DOM.getParent('test2', 'body', DOM.get('test')), null); + + DOM.get('test').innerHTML = ''; + + DOM.remove('test'); + }); + + test('getParents', 4, function() { + DOM.add(document.body, 'div', {id : 'test'}); + DOM.get('test').innerHTML = '
    ababcc
    '; + + equals(DOM.getParents('test2', function(n) {return n.nodeName == 'SPAN';}).length, 2); + equals(DOM.getParents('test2', 'span').length, 2); + equals(DOM.getParents('test2', 'span.test').length, 1); + equals(DOM.getParents('test2', 'body', DOM.get('test')).length, 0); + + DOM.remove('test'); + }); + + test('is', 2, function() { + DOM.add(document.body, 'div', {id : 'test'}); + DOM.get('test').innerHTML = '
    ababcc
    '; + + ok(DOM.is(DOM.select('span', 'test'), 'span')); + ok(DOM.is(DOM.select('#test2', 'test'), '#test2')); + + DOM.remove('test'); + }); + + test('getViewPort', 4, function() { + var wp; + + wp = DOM.getViewPort(); + equals(wp.x, 0); + equals(wp.y, 0); + ok(wp.w > 0); + ok(wp.h > 0); + }); + + test('getRect', 5, function() { + var r; + + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.setStyles('test', {position : 'absolute', left : 100, top : 110, width : 320, height : 240}); + r = DOM.getRect('test'); + equals(r.x, 100); + equals(r.y, 110); + equals(r.w, 320); + equals(r.h, 240); + + DOM.setAttrib('test', 'style', ''); + + DOM.get('test').innerHTML = '
    '; + r = DOM.getRect('test2'); + equals(r.w, 160); + + DOM.remove('test'); + }); + + test('getSize', 2, function() { + var r; + + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.get('test').innerHTML = '
    '; + r = DOM.getSize('test2'); + equals(r.w, 160); + + DOM.get('test').innerHTML = '
    '; + r = DOM.getSize('test2'); + equals(r.w, 100); + + DOM.remove('test'); + }); + + test('getNext', 5, function() { + var r; + + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.get('test').innerHTML = 'ABC'; + equals(DOM.getNext(DOM.get('test').firstChild, '*').nodeName, 'SPAN'); + equals(DOM.getNext(DOM.get('test').firstChild, 'em').nodeName, 'EM'); + equals(DOM.getNext(DOM.get('test').firstChild, 'div'), null); + equals(DOM.getNext(null, 'div'), null); + equals(DOM.getNext(DOM.get('test').firstChild, function(n) {return n.nodeName == 'EM'}).nodeName, 'EM'); + + DOM.remove('test'); + }); + + test('getPrev', 5, function() { + var r; + + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.get('test').innerHTML = 'ABC'; + equals(DOM.getPrev(DOM.get('test').lastChild, '*').nodeName, 'SPAN'); + equals(DOM.getPrev(DOM.get('test').lastChild, 'strong').nodeName, 'STRONG'); + equals(DOM.getPrev(DOM.get('test').lastChild, 'div'), null); + equals(DOM.getPrev(null, 'div'), null); + equals(DOM.getPrev(DOM.get('test').lastChild, function(n) {return n.nodeName == 'STRONG'}).nodeName, 'STRONG'); + + DOM.remove('test'); + }); + + test('loadCSS', 1, function() { + var c = 0; + + DOM.loadCSS('css/unit.css?a=1,css/unit.css?a=2,css/unit.css?a=3'); + + tinymce.each(document.getElementsByTagName('link'), function(n) { + if (n.href.indexOf('unit.css?a=') != -1) + c++; + }); + + equals(c, 3, null, tinymce.isOpera); + }); + + test('insertAfter', 2, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.setHTML('test', ''); + DOM.insertAfter(DOM.create('br'), 'test2'); + equals(DOM.get('test2').nextSibling.nodeName, 'BR'); + + DOM.setHTML('test', 'testtest'); + DOM.insertAfter(DOM.create('br'), 'test2'); + equals(DOM.get('test2').nextSibling.nodeName, 'BR'); + + DOM.remove('test'); + }); + + test('isBlock', 4, function() { + ok(DOM.isBlock(DOM.create('div'))); + ok(DOM.isBlock('DIV')); + ok(!DOM.isBlock('SPAN')); + ok(DOM.isBlock('div')); + }); + + test('remove', 3, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.setHTML('test', 'testtest2'); + DOM.remove('test2', 1); + equals(DOM.get('test').innerHTML.toLowerCase(), 'testtest2'); + + DOM.setHTML('test', 'testtest2'); + equals(DOM.remove('test2').nodeName, 'SPAN'); + + DOM.get('test').innerHTML = ''; + DOM.remove(['test2', 'test4']); + equals(DOM.select('span', 'test').length, 1); + + DOM.remove('test'); + }); + + test('replace', 2, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.setHTML('test', 'testtest2'); + DOM.replace(DOM.create('div', {id : 'test2'}), 'test2', 1); + equals(DOM.get('test2').innerHTML.toLowerCase(), 'testtest2'); + + DOM.setHTML('test', 'testtest2'); + DOM.replace(DOM.create('div', {id : 'test2'}), 'test2'); + equals(DOM.get('test2').innerHTML, ''); + + DOM.remove('test'); + }); + + test('toHex', 5, function() { + equals(DOM.toHex('rgb(0, 255, 255)'), '#00ffff'); + equals(DOM.toHex('rgb(255, 0, 0)'), '#ff0000'); + equals(DOM.toHex('rgb(0, 0, 255)'), '#0000ff'); + equals(DOM.toHex('rgb ( 0 , 0 , 255 ) '), '#0000ff'); + equals(DOM.toHex(' RGB ( 0 , 0 , 255 ) '), '#0000ff'); + }); + + test('getOuterHTML', 4, function() { + DOM.add(document.body, 'div', {id : 'test'}); + + DOM.setHTML('test', 'testtest2'); + equals(DOM.getOuterHTML('test2').toLowerCase().replace(/\"/g, ''), 'testtest2'); + + DOM.setHTML('test', 'testtest2'); + DOM.setOuterHTML('test2', '
    123
    '); + equals(tinymce.trim(DOM.getOuterHTML('test2') || '').toLowerCase().replace(/\"/g, ''), '
    123
    '); + + DOM.setHTML('test', 'testtest2'); + DOM.setOuterHTML('test2', '
    123
    abc
    '); + equals(tinymce.trim(DOM.get('test').innerHTML).toLowerCase().replace(/>\s+<').replace(/\"/g, ''), '
    123
    abc
    '); + + DOM.setHTML('test', 'test'); + equals(tinymce.trim(DOM.getOuterHTML(DOM.get('test').firstChild)), 'test'); + + DOM.remove('test'); + }); + + test('encodeDecode', 2, function() { + equals(DOM.encode('\u00e5\u00e4\u00f6&<>"'), '\u00e5\u00e4\u00f6&<>"'); + equals(DOM.decode('åäö&<>"'), '\u00e5\u00e4\u00f6&<>"'); + }); + + test('split', 1, function() { + var point, parent; + + DOM.add(document.body, 'div', {id : 'test'}, '

    text1innertext2

    '); + + parent = DOM.select('p', DOM.get('test'))[0]; + point = DOM.select('span', DOM.get('test'))[0]; + + DOM.split(parent, point); + equals(DOM.get('test').innerHTML.toLowerCase().replace(/\s+/g, ''), '

    text1

    inner

    text2

    '); + + DOM.remove('test'); + }); + + test('nodeIndex', 5, function() { + DOM.add(document.body, 'div', {id : 'test'}, 'abcabcabc'); + + equals(DOM.nodeIndex(DOM.get('test').childNodes[0]), 0, 'Index of first child.'); + equals(DOM.nodeIndex(DOM.get('test').childNodes[1]), 1, 'Index of second child.'); + equals(DOM.nodeIndex(DOM.get('test').childNodes[2]), 2, 'Index of third child.'); + + DOM.get('test').insertBefore(DOM.doc.createTextNode('a'), DOM.get('test').firstChild); + DOM.get('test').insertBefore(DOM.doc.createTextNode('b'), DOM.get('test').firstChild); + + equals(DOM.nodeIndex(DOM.get('test').lastChild), 4, 'Index of last child with fragmented DOM.'); + equals(DOM.nodeIndex(DOM.get('test').lastChild, true), 2, 'Normalized index of last child with fragmented DOM.'); + + DOM.remove('test'); + }); + + test('isEmpty', 12, function() { + DOM.schema = new tinymce.html.Schema(); // A schema will be added when used within a editor instance + DOM.add(document.body, 'div', {id : 'test'}, ''); + + ok(DOM.isEmpty(DOM.get('test')), 'No children'); + + DOM.setHTML('test', '
    '); + ok(!DOM.isEmpty(DOM.get('test')), 'Br child'); + + DOM.setHTML('test', 'text'); + ok(!DOM.isEmpty(DOM.get('test')), 'Text child'); + + DOM.setHTML('test', 'text'); + ok(!DOM.isEmpty(DOM.get('test')), 'Text child in span'); + + DOM.setHTML('test', ''); + ok(DOM.isEmpty(DOM.get('test')), 'Empty span child'); + + DOM.setHTML('test', '
    '); + ok(DOM.isEmpty(DOM.get('test')), 'Empty complex HTML'); + + DOM.setHTML('test', '
    X
    '); + ok(!DOM.isEmpty(DOM.get('test')), 'Non empty complex HTML'); + + DOM.setHTML('test', '
    '); + ok(DOM.isEmpty(DOM.get('test')), 'Non empty complex HTML with space'); + + DOM.setHTML('test', '
    '); + ok(!DOM.isEmpty(DOM.get('test')), 'Non empty complex HTML with achor name'); + + DOM.setHTML('test', ''); + ok(!DOM.isEmpty(DOM.get('test')), 'Non empty html with img element'); + + DOM.setHTML('test', ''); + ok(!DOM.isEmpty(DOM.get('test')), 'Span with bookmark attribute.'); + + DOM.setHTML('test', ''); + ok(DOM.isEmpty(DOM.get('test')), 'Span with data-mce attribute.'); + + DOM.remove('test'); + }); + + DOM.remove('test'); +})(); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/utils.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/utils.js index fec913715b..10d75c295b 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/utils.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/js/utils.js @@ -1,14 +1,141 @@ function fontFace(face) { if (tinymce.isOpera) { - return '"' + face + '"'; + return "'" + face + "'"; } else { return face; } } +function findContainer(selector) { + var container; + if (tinymce.is(selector, 'string')) { + container = editor.dom.select(selector)[0]; + } else { + container = selector; + } + if (container.firstChild) { + container = container.firstChild; + } + return container; +} + +function setSelection(startSelector, startOffset, endSelector, endOffset) { + if (!endSelector) { + endSelector = startSelector; + endOffset = startOffset; + } + var startContainer = findContainer(startSelector); + var endContainer = findContainer(endSelector); + var rng = editor.dom.createRng(); + + function setRange(container, offset, start) { + if (offset === 'after') { + if (start) { + rng.setStartAfter(container); + } else { + rng.setEndAfter(container); + } + return; + } else if (offset === 'afterNextCharacter') { + container = container.nextSibling; + offset = 1; + } + if (start) { + rng.setStart(container, offset); + } else { + rng.setEnd(container, offset); + } + } + setRange(startContainer, startOffset, true); + setRange(endContainer, endOffset, false); + editor.selection.setRng(rng); +} + +function initWhenTinyAndRobotAreReady() { + var readyCount = 0; + function checkLoaded() { + readyCount++; + if (readyCount > 2) { + ok(false, "Critical error: Received too many onload events."); + } else if (readyCount === 2) { + QUnit.start(); + } + } + window.robot.onload(checkLoaded); + tinymce.onAddEditor.add(function(tinymce, ed) { + ed.onInit.add(function() { + checkLoaded(); + }); + }); +} + function trimContent(content) { - if (tinymce.isOpera) - return content.replace(/^

     <\/p>/, '').replace(/

     <\/p>$/, ''); + return content.replace(/^

     <\/p>\n?/, '').replace(/\n?

     <\/p>$/, ''); +} + +/** + * Fakes a key event. + * + * @param {Element/String} e DOM element object or element id to send fake event to. + * @param {String} na Event name to fake like "keydown". + * @param {Object} o Optional object with data to send with the event like keyCode and charCode. + */ +function fakeKeyEvent(e, na, o) { + var ev; + + o = tinymce.extend({ + keyCode : 13, + charCode : 0 + }, o); + + e = tinymce.DOM.get(e); + + if (e.fireEvent) { + ev = document.createEventObject(); + tinymce.extend(ev, o); + e.fireEvent('on' + na, ev); + return; + } + + if (document.createEvent) { + try { + // Fails in Safari + ev = document.createEvent('KeyEvents'); + ev.initKeyEvent(na, true, true, window, false, false, false, false, o.keyCode, o.charCode); + } catch (ex) { + ev = document.createEvent('Events'); + ev.initEvent(na, true, true); + + ev.keyCode = o.keyCode; + ev.charCode = o.charCode; + } + } else { + ev = document.createEvent('UIEvents'); + + if (ev.initUIEvent) + ev.initUIEvent(na, true, true, window, 1); + + ev.keyCode = o.keyCode; + ev.charCode = o.charCode; + } + + e.dispatchEvent(ev); +} + +function normalizeRng(rng) { + if (rng.startContainer.nodeType == 3) { + if (rng.startOffset == 0) + rng.setStartBefore(rng.startContainer); + else if (rng.startOffset >= rng.startContainer.nodeValue.length - 1) + rng.setStartAfter(rng.startContainer); + } + + if (rng.endContainer.nodeType == 3) { + if (rng.endOffset == 0) + rng.setEndBefore(rng.endContainer); + else if (rng.endOffset >= rng.endContainer.nodeValue.length - 1) + rng.setEndAfter(rng.endContainer); + } - return content; + return rng; } diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/json_rpc_error.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/json_rpc_error.js new file mode 100644 index 0000000000..be02a23562 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/json_rpc_error.js @@ -0,0 +1 @@ +{"result": null, "error": {"message":"General failure","code":42}, "id": 1} \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/json_rpc_ok.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/json_rpc_ok.js new file mode 100644 index 0000000000..2bc6bdd0f2 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/json_rpc_ok.js @@ -0,0 +1 @@ +{"result": "Hello JSON-RPC", "error": null, "id": 1} \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/JSRobot.LICENSE b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/JSRobot.LICENSE new file mode 100644 index 0000000000..7a4a3ea242 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/JSRobot.LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/JSRobot.jar b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/JSRobot.jar new file mode 100644 index 0000000000000000000000000000000000000000..03bf550a5b995fdb98a87743d7200c0a0fd74201 GIT binary patch literal 10804 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 literal 0 HcmV?d00001 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/robot.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/robot.js new file mode 100644 index 0000000000..b836454c5f --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/jsrobot/robot.js @@ -0,0 +1,258 @@ +/* + Copyright 2010 Ephox Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +(function() { + if (window.robot) { + // Don't load if there's already a version of robot loaded. + return; + } + + window.robot = { + + onload: function(userCallback) { + if (this.ready) { + userCallback(); + } else { + this.userCallback = userCallback; + } + }, + + init: function(useDocumentWrite) { + var jarUrl = "JSRobot.jar"; + var scripts = document.getElementsByTagName('script'); + for (var i = 0; i < scripts.length; i++) { + var src = scripts[i].src; + var regex = /^(.*\/?)robot.js(\?|$)/; + if (src && regex.test(src)) { + jarUrl = regex.exec(src)[1] + "JSRobot.jar"; + } + } + var appletTag = ''; + if (useDocumentWrite) { + document.write(appletTag); + } else { + var div = document.createElement('div'); + document.body.appendChild(div); + div.innerHTML = appletTag; + } + this.appletInstance = document.getElementById('robotApplet'); + }, + + callback: function() { + if (window.robotUsesSymbols){ + this.initSymbols(); + } + if (this.userCallback) { + setTimeout(this.userCallback, 100); + } + return "Callback received."; + }, + + initSymbols: function(){ + var input = document.createElement("input"); + document.body.appendChild(input); + input.focus(); + var t = this; + function loadSymbolsFromInput(){ + t.symbols = input.value; + t.ready = true; + document.body.removeChild(input); + } + + this.appletAction(input, loadSymbolsFromInput, function() { + return this.getApplet().typeSymbolsAboveNumberKeys(); + }); + }, + + type: function(key, shiftKey, callback, focusElement) { + var keycode = this.getKeycode(key); + shiftKey = !!shiftKey; + this.appletAction(focusElement, callback, function() { + return this.getApplet().typeKey(keycode, shiftKey); + }); + }, + + typeSymbol: function(symbol, callback, focusElement) { + if (!window.robotUsesSymbols) { + alert("need to define the attribute\nwindow.robotUsesSymbols\nbefore using the typeSymbol function."); + } + var t = this; + + var symbolNumber = t.symbols.search("\\"+symbol); + if (symbolNumber <0) { + throw new Error("The symbol "+ symbol + " could not be located on your keyboard. Unable to press key"); + } + return t.type(symbolNumber+48, true, callback, focusElement); + }, + + forwardDelete: function(callback, focusElement) { + this.type(0x7F, false, callback, focusElement); + }, + + cut: function(callback, focusElement) { + this.typeAsShortcut('x', callback, focusElement, 'cut'); + }, + + copy: function(callback, focusElement) { + this.typeAsShortcut('c', callback, focusElement, 'copy'); + }, + + paste: function(callback, focusElement) { + this.typeAsShortcut('v', callback, focusElement, 'paste'); + }, + + pasteText: function(content, callback, focusElement) { + var actionResult = this.getApplet().setClipboard(content); + if (actionResult) { + throw { message: "JSRobot error: " + actionResult }; + } + this.paste(callback, focusElement); + }, + + typeAsShortcut: function(key, callback, focusElement, event) { + var keycode = this.getKeycode(key); + this.appletAction(focusElement, callback, function() { + return this.getApplet().typeAsShortcut(keycode); + }, event); + }, + + getKeycode: function(key) { + if (key.toUpperCase && key.charCodeAt) { + if (/^[a-zA-Z\n\b\t]$/.test(key)) { + return key.toUpperCase().charCodeAt(0); + } else { + throw { message: 'Invalid character to type. Must be a-z or A-Z, otherwise use the key code directly.' }; + } + } + return key; + }, + + captureScreenShot: function() { + return this.getApplet().captureScreenShot(); + }, + + setScreenShotDirectory: function(dir) { + this.getApplet().setScreenShotDirectory(dir); + }, + + getApplet: function() { + return this.appletInstance; + }, + + appletAction: function(focusElement, continueCallback, action, event) { + var actionResult, listenerActivated = false, listenerType = event || 'keyup', timeout, curEl, toFocus = [], t = this; + + // Make sure the focus change has taken effect. + var afterFocused = function() { + timeout = setTimeout(function() { + if (listenerActivated) return false; + doListeners(false); + if (continueCallback) { + setTimeout(continueCallback, 0); + } + }, 10000); + actionResult = action.apply(t); + if (actionResult) { + throw { message: "JSRobot error: " + actionResult }; + } + if (!focusElement && continueCallback) { + setTimeout(continueCallback, 100); + } + }; + + var listener = function() { + if (listenerActivated) return; + listenerActivated = true; + clearTimeout(timeout); + doListeners(false); + if (continueCallback) { + setTimeout(continueCallback, 100); + } + }; + var doListeners = function(add) { + // Listen as high up in the hierarchy as possible to give us the best chance of getting the event before any JS listeners cancel it. + var target = focusElement.defaultView || focusElement.ownerDocument || focusElement; + if (focusElement.addEventListener) { + target[add ? 'addEventListener' : 'removeEventListener'](listenerType, listener, true); + } else { + focusElement[add ? 'attachEvent' : 'detachEvent']('on' + listenerType, listener); + target[add ? 'attachEvent' : 'detachEvent']('on' + listenerType, listener); + } + }; + + if (!focusElement) { + focusElement = document.activeElement; + while (focusElement && (focusElement.contentDocument || focusElement.contentWindow)) { + if (focusElement.contentDocument) { + focusElement = focusElement.contentDocument.activeElement; + } else { + focusElement = focusElement.contentWindow.document.activeElement; + } + } + } + if (navigator.userAgent.indexOf('MSIE') < 0) { + curEl = focusElement; + while (curEl) { + if (curEl.frameElement) { + toFocus.push(curEl); + toFocus.push(curEl.frameElement); + curEl = curEl.frameElement; + } else if (curEl.parent && curEl.parent !== curEl) { + toFocus.push(curEl.parent); + curEl = curEl.parent; + } else if (curEl.defaultView) { + toFocus.push(curEl.defaultView); + curEl = curEl.defaultView; + } else if (curEl.ownerDocument) { + toFocus.push(curEl.ownerDocument.body); + curEl = curEl.ownerDocument; + } else { + curEl = null; + } + } + } + + var focused = []; + var focusNext = function() { + if (toFocus.length > 0) { + curEl = toFocus.pop(); + focused.push(curEl); + if (curEl.focus) curEl.focus(); + setTimeout(focusNext, 0); + } else { + doListeners(true); + focusElement.focus(); + + setTimeout(afterFocused, 0); + } + }; + if (focusElement) { + focusNext(); + } else { + afterFocused(); + } + } + }; + + function robotOnload() { + window.robot.init(); + } + if (document.addEventListener) { + window.addEventListener('load', robotOnload, true); + } else { + // If you don't init straight away on IE, it gets the applet context wrong. + window.robot.init(true); + } +})(); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_applying.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_applying.html new file mode 100644 index 0000000000..ab7d4564b3 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_applying.html @@ -0,0 +1,338 @@ + + + +Applying and Unapplying List Tests + + + + + + + + + + + +

    Applying and Unapplying List Tests

    +

    +
    +

    +
      +
      + +
      +

      + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_forced_brs.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_forced_brs.html new file mode 100644 index 0000000000..33963a42d3 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_forced_brs.html @@ -0,0 +1,112 @@ + + + +Forced BRs List Tests + + + + + + + + + + + +

      Forced BRs List Tests

      +

      +
      +

      +
        +
        + +
        +

        + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_general.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_general.html new file mode 100644 index 0000000000..b14b8878aa --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_general.html @@ -0,0 +1,135 @@ + + + +List General Tests + + + + + + + + + +

        List General Tests

        +

        +
        +

        +
          +
          + +
          + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_indenting.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_indenting.html new file mode 100644 index 0000000000..19952ce71b --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/lists_indenting.html @@ -0,0 +1,224 @@ + + + +List Indenting and Outdenting Tests + + + + + + + + + + + +

          List Indenting and Outdenting Tests

          +

          +
          +

          +
            +
            + +
            +

            + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/main.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/main.html deleted file mode 100644 index 21f8037ffc..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/main.html +++ /dev/null @@ -1,8 +0,0 @@ - - - -Main - - - - \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/media.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/media.html index 70872aad41..f00d6d95d6 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/media.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/media.html @@ -2,10 +2,11 @@ Unit tests for Media Plugin + - + @@ -13,7 +14,7 @@ // General options mode : "textareas", theme : "advanced", - plugins : "safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,spellchecker,imagemanager,filemanager,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,inlinepopups", + plugins : "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,spellchecker,imagemanager,filemanager,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,inlinepopups", // Theme options theme_advanced_buttons1 : "spellchecker,save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect", @@ -25,9 +26,6 @@ theme_advanced_statusbar_location : "bottom", theme_advanced_resizing : true, - // Example content CSS (should be your site CSS) - content_css : "examples/content.css", - // Drop lists for link/image/media/template dialogs template_external_list_url : "examples/lists/template_list.js", external_link_list_url : "lists/link_list.js", diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/paste.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/paste.html index 1f2a6486c7..3c08c76884 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/paste.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/paste.html @@ -2,11 +2,12 @@ Unit tests for the Paste plugin + - + + + - - -

            Performance tests

            - - - - -

            Basic text area

            - -
            -
            -

            All plugins enabled

            - -
            -
            - - +

            Performance tests

            +

            Runs:

            +
              + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_chain.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_chain.html new file mode 100644 index 0000000000..32872eeef7 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_chain.html @@ -0,0 +1,61 @@ + + + +Basic editor functionality tests + + + + + + + + + +

              Plugin Dependency Functional tests

              +

              +
              +

              +
                + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_chain_legacy.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_chain_legacy.html new file mode 100644 index 0000000000..185ebf4581 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_chain_legacy.html @@ -0,0 +1,61 @@ + + + +Plugin Dependency Functional tests + + + + + + + + + +

                Plugin Dependency Functional tests

                +

                +
                +

                +
                  + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_init_call_order.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_init_call_order.html new file mode 100644 index 0000000000..20d646149e --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_init_call_order.html @@ -0,0 +1,71 @@ + + + +Basic editor functionality tests + + + + + + + + + +

                  Plugin Dependency Functional tests

                  +

                  +
                  +

                  +
                    + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_simple.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_simple.html new file mode 100644 index 0000000000..8ad98e82a3 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_simple.html @@ -0,0 +1,53 @@ + + + +Basic editor functionality tests + + + + + + + + + +

                    Plugin Dependency Functional tests

                    +

                    +
                    +

                    +
                      + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_specific_location.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_specific_location.html new file mode 100644 index 0000000000..337433e38e --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/plugin_dependency_specific_location.html @@ -0,0 +1,60 @@ + + + +Basic editor functionality tests + + + + + + + + + +

                      Plugin Dependency Functional tests

                      +

                      +
                      +

                      +
                        + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/qunit/QUnit.LICENSE b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/qunit/QUnit.LICENSE new file mode 100644 index 0000000000..1f718d9f29 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/qunit/QUnit.LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2010 John Resig, http://jquery.com/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/qunit/runner.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/qunit/runner.js index 2031009b8e..a44ca5584c 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/qunit/runner.js +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/qunit/runner.js @@ -1,19 +1,34 @@ (function() { - var iframe, logElement, initSettings, index, testFailures, testTotal, testLog; + var iframe, logElement, initSettings, index, testFailures, testTotal, testLog, currentTest; + + function log(message, display) { + var div; + + if (display) { + div = document.createElement('div'); + div.appendChild(document.createTextNode(message)); + logElement.appendChild(div); + } - function log(message, failures) { - var div = document.createElement('div'); + testLog += message + '\n'; + } - div.className = failures > 0 ? 'fail' : 'pass'; - div.appendChild(document.createTextNode(message)); + function runNext() { + do { + currentTest = QUnitRunner.tests[index++]; - logElement.appendChild(div); + if (!currentTest || (initSettings.jsrobot_tests || !currentTest.jsrobot)) + break; + } while (currentTest); - testLog += (failures > 0 ? '[FAILED] ' : '') + message + '\n'; - } + // We are done + if (index > QUnitRunner.tests.length) + return false; - function runNext() { - iframe.src = QUnitRunner.tests[index++].url; + document.getElementById(currentTest.id + '_status').innerHTML = '(Running)'; + iframe.src = currentTest.url + "?min=" + initSettings.min_tests; + + return true; } function parseQuery(query) { @@ -39,26 +54,41 @@ window.QUnitRunner = { init: function(settings) { - var self = this, suites = settings.suites, i, y, html = '', tests; + var self = this, suites, c, i, y, html = '', tests; this.tests = []; - for (i = 0; i < suites.length; i++) { - html += '

                        ' + suites[i].title + '

                          '; - tests = suites[i].tests; - - for (y = 0; y < tests.length; y++) { - html += '
                        • ' + tests[y].title + '
                        • '; + for (c = 0; c < settings.columns.length; c++) { + suites = settings.columns[c]; + html += '
                          '; + for (i = 0; i < suites.length; i++) { + html += '

                          ' + suites[i].title + '

                            '; + tests = suites[i].tests; + + for (y = 0; y < tests.length; y++) { + tests[y].id = 'test_' + c + '_' + i + '_' + y; + tests[y].suite = suites[i]; + html += '
                          1. ' + tests[y].title + '
                          2. '; + } + + html += '
                          '; + + this.tests = this.tests.concat(tests); } - - html += '
                        '; - - this.tests = this.tests.concat(tests); + html += ''; } + html += '
                        '; + initSettings = settings; this.query = parseQuery(document.location.search.substr(1)); window.onload = function() { + if (document.location.search.indexOf('min=true') > 0) + document.getElementById('min').checked = true; + + if (document.location.search.indexOf('jsrobot=false') > 0) + document.getElementById('jsrobot').checked = false; + document.getElementById('menu').innerHTML = html; if (self.query.id) { @@ -68,21 +98,40 @@ }, run: function() { + var i, y, c; + + // Reset status states + for (c = 0; c < initSettings.columns.length; c++) { + suites = initSettings.columns[c]; + + for (i = 0; i < suites.length; i++) { + for (y = 0; y < suites[i].tests.length; y++) { + document.getElementById(suites[i].tests[y].id).className = ''; + } + } + } + // Add iframe if (!iframe) { iframe = document.createElement('iframe'); iframe.style.position = 'absolute'; - iframe.style.left = '-5000px'; - iframe.style.top = '-5000px'; - iframe.style.width = '1000px'; - iframe.style.height = '1000px'; + iframe.style.right = '0px'; + iframe.style.top = '0px'; + iframe.style.width = '800px'; + iframe.style.height = '100%'; + iframe.style.background = '#fff'; + iframe.style.borderLeft = '1px solid gray'; document.body.appendChild(iframe); } + // Get min/jsrobot status + initSettings.min_tests = document.getElementById('min').checked; + initSettings.jsrobot_tests = document.getElementById('jsrobot').checked; + // Reset log logElement = document.getElementById('log'); testLog = logElement.innerHTML = ''; - log("Started running all unit tests."); + document.getElementById('total_status').className = ''; // Run tests in iframe index = testFailures = testTotal = 0; @@ -93,13 +142,21 @@ testFailures += failures; testTotal += total; - log(title + ". Tests: " + total + ", Failed: " + failures, failures); + document.getElementById(currentTest.id).className = failures > 0 ? 'fail' : 'pass'; + document.getElementById(currentTest.id + '_status').innerHTML = '(' + failures + ', ' + (total - failures) + ', ' + total + ')'; + + if (testFailures > 0) + document.getElementById('total_status').className = 'fail'; - if (index < this.tests.length) { - runNext(); - } else { - log("Finished running all tests. Total: " + testTotal + ", Failed: " + testFailures); + log((failures > 0 ? "[FAILED]" : "[PASSED]") + " " + currentTest.suite.title + " - " + currentTest.title + ". Tests: " + total + ", Failed: " + failures); + if (!runNext()) { + log("Finished running all tests. Total: " + testTotal + ", Failed: " + testFailures, true); + document.getElementById('total_status').className = testFailures > 0 ? 'fail' : 'pass'; + if (iframe) { + document.body.removeChild(iframe); + iframe = null; + } // Post results if (this.query.id) { this.postResults(this.query.id, testTotal, testFailures, testLog); diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/remove.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/remove.html new file mode 100644 index 0000000000..4fb6542ba9 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/remove.html @@ -0,0 +1,174 @@ + + + +Removing content tests + + + + + + + + + +

                        Removing content tests

                        +

                        +
                        +

                        +
                          +
                          + +
                          + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/removeformat.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/removeformat.html index 7488d66df9..eca793d473 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/removeformat.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/removeformat.html @@ -2,13 +2,14 @@ Full featured example - + + - - - - - -

                          Unit tests for tinymce.dom.Selection

                          -

                          -
                          -

                          -
                            - - - - diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/config.ini b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/config.ini deleted file mode 100644 index 3e4280e1dc..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/config.ini +++ /dev/null @@ -1,27 +0,0 @@ -; [Dojo 1.0.2] -; file = "dojo.js" -; function = "dojo.query" - -; [JQuery 1.2.3] -; file = "jquery.js" -; function = "$" - -; [MooTools 1.2beta2] -; file = "mootools.js" -; function = "$$" - - [TinyMCE Sizzle] - file = "../../../../jscripts/tiny_mce/tiny_mce_dev.js" - function = "tinymce.DOM.sizzleSelect" - - [TinyMCE Core] - file = "../../../../jscripts/tiny_mce/tiny_mce_dev.js" - function = "tinymce.DOM.select" - -; just add a framework here following the conventions to add another framework. -; the function parameter is to choose the right css selector function name -; the include parameter is to include the right javascript file - -; [myframework] -; file = "myFramework.js" -; function = "getElements" \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/footer.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/footer.html deleted file mode 100644 index 6e0f7c2659..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/footer.html +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/header.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/header.html deleted file mode 100644 index 928f606f0a..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/header.html +++ /dev/null @@ -1,6 +0,0 @@ -

                            SlickSpeed

                            -

                            speed/validity selectors test for frameworks.

                            -

                            Every framework runs in his own iFrame, thus no conflicts can happen. Tests are run selector by selector, with an interval to prevent the browser from freeezing.

                            -

                            Tests are run in a neutral environment, no library or framework is included in the main javascript test, to avoid favoritism.

                            - -

                            Tests are run against a local copy of this document.

                            \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/index.php b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/index.php deleted file mode 100644 index 411cc2f59c..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/index.php +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/instructions.txt b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/instructions.txt deleted file mode 100644 index af04d3562a..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/instructions.txt +++ /dev/null @@ -1,4 +0,0 @@ -1) edit config.ini and fill in your framework list. -2) edit selectors.list and edit your selectors list. -3) edit style.css, header.html and footer.html if you wish. -4) edit template.html if you want to change the selectors html file. It DOES NOT accept the full document, just elements. \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/logo.png b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/logo.png deleted file mode 100644 index 44923856e271e52b59393eee3510894ce9ad0769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5829 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 PO9PbU)#bj+ehT>?DAE$k diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/selectors.list b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/selectors.list deleted file mode 100644 index ed5ae07707..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/selectors.list +++ /dev/null @@ -1,40 +0,0 @@ -body -div -body div -div p -div > p -div + p -div ~ p -div[class^=exa][class$=mple] -div p a -div, p, a -.note -div.example -ul .tocline2 -div.example, div.note -#title -h1#title -div #title -ul.toc li.tocline2 -ul.toc > li.tocline2 -h1#title + div > p -h1[id]:contains(Selectors) -a[href][lang][class] -div[class] -div[class=example] -div[class^=exa] -div[class$=mple] -div[class*=e] -div[class|=dialog] -div[class!=made_up] -div[class~=example] -div:not(.example) -p:contains(selectors) -p:nth-child(even) -p:nth-child(2n) -p:nth-child(odd) -p:nth-child(2n+1) -p:nth-child(n) -p:only-child -p:last-child -p:first-child \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/style.css b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/style.css deleted file mode 100644 index 5dc81c323d..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/style.css +++ /dev/null @@ -1,181 +0,0 @@ -body { - font: 11px "Lucida Grande", "Trebuchet MS", Verdana, sans-serif; - color: #41464D; - margin: 0; - padding: 0; - background: #F3F1F1; -} - -/*main rules*/ - -a:link, a:visited { - color: #528CE0; -} - -a:hover, a:active { - color: #C65F5E; -} - -p { - font-size: 13px; - margin: 0; - padding: 3px 0; -} - -iframe { - height: 1px; - width: 1px; - visibility: hidden; -} - -span.clr { - display: block; - clear: both; -} - -/*header*/ - -h1 { - font-family: Georgia; - margin: 0; - padding: 0; - background: url(logo.png) no-repeat top left; - height: 69px; - width: 280px; -} - -h1 span { - display: none; -} - -h2 { - margin: 0; - padding: 10px 0; - font-size: 15px; -} - -#container { - padding: 30px; -} - -/*controls*/ - -#controls a:link, #controls a:visited { - display: block; - float: right; - background: #D0C8C8; - padding: 7px 10px; - font-size: 13px; - font-weight: bold; - margin-left: 10px; - text-align: center; - text-decoration: none; - border: 3px solid #fff; - color: #41464D; - text-shadow: 2px 2px 1px #B9ACAC; -} - -#controls a:hover, #controls a:active { - text-shadow: none; - background: #F3F1F1; - color: #528CE0; -} - -/*table*/ - -table { - border-collapse: collapse; - width: 100%; - min-width: 800px; - margin: 0; - padding: 0; -} - -#legend td { - padding: 15px; -} - -td, th { - background: #C8CBD0; - padding: 5px 8px; - margin: 0; - width: 150px; - font-weight: bold; - border: 3px solid #fff; -} - -th { - font-weight: bold; - background: #D0C8C8; - color: #8A7575; -} - -th.framework { - font-size: 15px; - text-shadow: 2px 2px 1px #B9ACAC; -} - -td.test, td.empty, th { - text-align: right; -} - -td.normal { - color: #636A75; -} - -td.good { - color: #657528; - background: #CFE773; -} - -td.bad { - color: #B33F3F; - background: #EE9A9A; -} - -span.exception { - color: #DBEAF0; - text-decoration: underline; - cursor: help; -} - -th.selector { - background: #D2E0E6; - color: #528CE0; - text-align: left; -} - -th.score-title, th.selectors-title { - text-align: left; - font-size: 12px; - width: 180px; -} - -td.score { - color: #8A7575; - background: #D0C8C8; - text-align: center; - font-size: 12px; -} - -td.mismatch { - background: #E8C896; - color: #AD7520; -} - -td.exception { - color: #F3F1F1; - background: #41464D; -} - -/*page footer*/ - -div#footer { - padding: 20px 0; -} - -div#footer p { - font-size: 11px; - color: #B9ACAC; -} - diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/index.php b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/index.php deleted file mode 100644 index b535518bb7..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/index.php +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - SlickSpeed Selectors Test - - - - - - - - - -
                            - - - - - - $properties){ - $include = $properties['file']; - $function = $properties['function']; - $time = time(); - echo "\n\n"; - } -?> - - - - - - - $properties){ - echo ""; - } - ?> - - - - - "; - $selector = str_replace('%', '', $selector); - echo ""; - foreach ($frameworks as $framework){ - echo ""; - } - echo ""; - } - ?> - - - - - - 0"; - } - ?> - - - -
                            selectors$framework
                            $selector
                            final time (less is better)
                            - -

                            Legend

                            - - - - - - - - - - - - - - - - - -
                            the fasterthe slowerexception thrown or zero elements founddifferent returned elements
                            - - -
                            - - - \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/slickspeed.js b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/slickspeed.js deleted file mode 100644 index e4616ea4ff..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/slickspeed.js +++ /dev/null @@ -1,147 +0,0 @@ -//base test functions - -function forEach(iterable, fn, bind){ - for (var i = 0, j = iterable.length; i < j; i++) fn.call(bind, iterable[i], i, iterable); -}; - -//test start - -window.onload = function(){ - - var frameworks = {}; - - forEach(document.getElementsByTagName('iframe'), function(iframe){ - frameworks[iframe.name] = { - 'test': window.frames[iframe.name].test, - 'selectors': [] - }; - }); - - var tbody = document.getElementById('tbody'); - var tfoot = document.getElementById('tfoot'); - var lastrow = tfoot.getElementsByTagName('tr')[0]; - - var controls = document.getElementById('controls'); - - var links = controls.getElementsByTagName('a'); - - var start = links[1]; - var stop = links[0]; - - start.onclick = function(){ - testRunner(); - return false; - }; - - stop.onclick = function(){ - clearTimeout(timer); - timer = null; - return false; - }; - - var score = []; - var scores = {}; - - var frxi = 0; - for (var name in frameworks){ - var framework = frameworks[name]; - forEach(window.selectors, function(selector){ - framework.selectors.push(selector); - }); - scores[name] = lastrow.getElementsByTagName('td')[frxi]; - score[name] = 0; - frxi++; - } - - var tests = []; - - forEach(window.selectors, function(selector, i){ - var frxi = 0; - var row = tbody.getElementsByTagName('tr')[i]; - for (var name in frameworks){ - var framework = frameworks[name]; - var cell = row.getElementsByTagName('td')[frxi]; - tests.push({ - 'execute': framework.test, - 'selector': framework.selectors[i], - 'name': name, - 'row': row, - 'cell' : cell - }); - frxi++; - } - }); - - var timer = null; - - var testRunner = function(){ - var test = tests.shift(); - if (!test) return; - var results = test.execute(test.selector); - test.cell.className = 'test'; - test.cell.innerHTML = results.time + ' ms | ' + results.found + ' found'; - test.cell.speed = results.time; - if (results.error){ - test.cell.innerHTML = results.time + ' ms | error returned'; - test.cell.className += ' exception'; - test.cell.found = 0; - test.cell.error = true; - } else { - test.cell.found = results.found; - test.cell.error = false; - } - - score[test.name] += test.cell.speed; - scores[test.name].innerHTML = ' ' + score[test.name] + ' '; - - if (test.cell == test.row.lastChild) colourRow(test.row); - timer = setTimeout(testRunner, 250); - }; - - var colourRow = function(row){ - - var cells = []; - - var tds = row.getElementsByTagName('td'); - forEach(tds, function(td){ - cells.push(td); - }); - - var speeds = []; - - forEach(cells, function(cell, i){ - if (!cell.error) speeds[i] = cell.speed; - //error, so we exclude it from colouring good. does not affect score (it should?). - else speeds[i] = 99999999999999999999999; - }); - - var min = Math.min.apply(this, speeds); - var max = Math.max.apply(this, speeds); - - var found = []; - var mismatch = false; - forEach(cells, function(cell, i){ - found.push(cell.found); - if (!mismatch){ - forEach(found, function(n){ - if (!cell.error && cell.found != undefined && n && cell.found != n){ - mismatch = true; - return; - } - }); - } - if (cell.speed == min) cell.className += ' good'; - else if (cell.speed == max) cell.className += ' bad'; - else cell.className += ' normal'; - }); - - if (mismatch){ - forEach(cells, function(cell, i){ - if (cell.found != undefined) cell.className += ' mismatch'; - }); - } - - }; - - -}; \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/template.php b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/template.php deleted file mode 100644 index e5e11d4c85..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/system/template.php +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/template.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/template.html deleted file mode 100644 index 7f4820df9e..0000000000 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/slickspeed/template.html +++ /dev/null @@ -1,2865 +0,0 @@ -
                            -

                            W3C - -

                            Selectors

                            - -

                            W3C Working Draft 15 December 2005

                            - -
                            - -
                            This version: - -
                            - http://www.w3.org/TR/2005/WD-css3-selectors-20051215 - -
                            Latest version: - -
                            - http://www.w3.org/TR/css3-selectors - -
                            Previous version: - -
                            - http://www.w3.org/TR/2001/CR-css3-selectors-20011113 - -
                            Editors: - -
                            Daniel Glazman (Invited Expert)
                            - -
                            Tantek Çelik (Invited Expert) - -
                            Ian Hickson (Google) - -
                            Peter Linss (former editor, Netscape/AOL) - -
                            John Williams (former editor, Quark, Inc.) - -
                            - -
                            - -
                            - -

                            Abstract

                            - -

                            Selectors are patterns that match against elements in a - tree. Selectors have been optimized for use with HTML and XML, and - are designed to be usable in performance-critical code.

                            - -

                            CSS (Cascading - Style Sheets) is a language for describing the rendering of HTML and XML documents on - screen, on paper, in speech, etc. CSS uses Selectors for binding - style properties to elements in the document. This document - describes extensions to the selectors defined in CSS level 2. These - extended selectors will be used by CSS level 3. - -

                            Selectors define the following function:

                            - -
                            expression ∗ element → boolean
                            - -

                            That is, given an element and a selector, this specification - defines whether that element matches the selector.

                            - -

                            These expressions can also be used, for instance, to select a set - of elements, or a single element from a set of elements, by - evaluating the expression across all the elements in a - subtree. STTS (Simple Tree Transformation Sheets), a - language for transforming XML trees, uses this mechanism. [STTS]

                            - -

                            Status of this document

                            - -

                            This section describes the status of this document at the - time of its publication. Other documents may supersede this - document. A list of current W3C publications and the latest revision - of this technical report can be found in the W3C technical reports index at - http://www.w3.org/TR/.

                            - -

                            This document describes the selectors that already exist in CSS1 and CSS2, and - also proposes new selectors for CSS3 and other languages that may need them.

                            - -

                            The CSS Working Group doesn't expect that all implementations of - CSS3 will have to implement all selectors. Instead, there will - probably be a small number of variants of CSS3, called profiles. For - example, it may be that only a profile for interactive user agents - will include all of the selectors.

                            - -

                            This specification is a last call working draft for the the CSS Working Group - (Style Activity). This - document is a revision of the Candidate - Recommendation dated 2001 November 13, and has incorporated - implementation feedback received in the past few years. It is - expected that this last call will proceed straight to Proposed - Recommendation stage since it is believed that interoperability will - be demonstrable.

                            - -

                            All persons are encouraged to review and implement this - specification and return comments to the (archived) - public mailing list www-style - (see instructions). W3C - Members can also send comments directly to the CSS Working - Group. - The deadline for comments is 14 January 2006.

                            - -

                            This is still a draft document and may be updated, replaced, or - obsoleted by other documents at any time. It is inappropriate to - cite a W3C Working Draft as other than "work in progress". - -

                            This document may be available in translation. - The English version of this specification is the only normative - version. - -

                            - -

                            Table of contents

                            - - - -
                            - -

                            1. Introduction

                            - -

                            1.1. Dependencies

                            - -

                            Some features of this specification are specific to CSS, or have - particular limitations or rules specific to CSS. In this - specification, these have been described in terms of CSS2.1. [CSS21]

                            - -

                            1.2. Terminology

                            - -

                            All of the text of this specification is normative except - examples, notes, and sections explicitly marked as - non-normative.

                            - -

                            1.3. Changes from CSS2

                            - -

                            This section is non-normative.

                            - -

                            The main differences between the selectors in CSS2 and those in - Selectors are: - -

                              - -
                            • the list of basic definitions (selector, group of selectors, - simple selector, etc.) has been changed; in particular, what was - referred to in CSS2 as a simple selector is now called a sequence - of simple selectors, and the term "simple selector" is now used for - the components of this sequence
                            • - -
                            • an optional namespace component is now allowed in type element - selectors, the universal selector and attribute selectors
                            • - -
                            • a new combinator has been introduced
                            • - -
                            • new simple selectors including substring matching attribute - selectors, and new pseudo-classes
                            • - -
                            • new pseudo-elements, and introduction of the "::" convention - for pseudo-elements
                            • - -
                            • the grammar has been rewritten
                            • - -
                            • profiles to be added to specifications integrating Selectors - and defining the set of selectors which is actually supported by - each specification
                            • - -
                            • Selectors are now a CSS3 Module and an independent - specification; other specifications can now refer to this document - independently of CSS
                            • - -
                            • the specification now has its own test suite
                            • - -
                            - -

                            2. Selectors

                            - -

                            This section is non-normative, as it merely summarizes the -following sections.

                            - -

                            A Selector represents a structure. This structure can be used as a -condition (e.g. in a CSS rule) that determines which elements a -selector matches in the document tree, or as a flat description of the -HTML or XML fragment corresponding to that structure.

                            - -

                            Selectors may range from simple element names to rich contextual -representations.

                            - -

                            The following table summarizes the Selector syntax:

                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                            PatternMeaningDescribed in sectionFirst defined in CSS level
                            *any elementUniversal - selector2
                            Ean element of type EType selector1
                            E[foo]an E element with a "foo" attributeAttribute - selectors2
                            E[foo="bar"]an E element whose "foo" attribute value is exactly - equal to "bar"Attribute - selectors2
                            E[foo~="bar"]an E element whose "foo" attribute value is a list of - space-separated values, one of which is exactly equal to "bar"Attribute - selectors2
                            E[foo^="bar"]an E element whose "foo" attribute value begins exactly - with the string "bar"Attribute - selectors3
                            E[foo$="bar"]an E element whose "foo" attribute value ends exactly - with the string "bar"Attribute - selectors3
                            E[foo*="bar"]an E element whose "foo" attribute value contains the - substring "bar"Attribute - selectors3
                            E[hreflang|="en"]an E element whose "hreflang" attribute has a hyphen-separated - list of values beginning (from the left) with "en"Attribute - selectors2
                            E:rootan E element, root of the documentStructural - pseudo-classes3
                            E:nth-child(n)an E element, the n-th child of its parentStructural - pseudo-classes3
                            E:nth-last-child(n)an E element, the n-th child of its parent, counting - from the last oneStructural - pseudo-classes3
                            E:nth-of-type(n)an E element, the n-th sibling of its typeStructural - pseudo-classes3
                            E:nth-last-of-type(n)an E element, the n-th sibling of its type, counting - from the last oneStructural - pseudo-classes3
                            E:first-childan E element, first child of its parentStructural - pseudo-classes2
                            E:last-childan E element, last child of its parentStructural - pseudo-classes3
                            E:first-of-typean E element, first sibling of its typeStructural - pseudo-classes3
                            E:last-of-typean E element, last sibling of its typeStructural - pseudo-classes3
                            E:only-childan E element, only child of its parentStructural - pseudo-classes3
                            E:only-of-typean E element, only sibling of its typeStructural - pseudo-classes3
                            E:emptyan E element that has no children (including text - nodes)Structural - pseudo-classes3
                            E:link
                            E:visited
                            an E element being the source anchor of a hyperlink of - which the target is not yet visited (:link) or already visited - (:visited)The link - pseudo-classes1
                            E:active
                            E:hover
                            E:focus
                            an E element during certain user actionsThe user - action pseudo-classes1 and 2
                            E:targetan E element being the target of the referring URIThe target - pseudo-class3
                            E:lang(fr)an element of type E in language "fr" (the document - language specifies how language is determined)The :lang() - pseudo-class2
                            E:enabled
                            E:disabled
                            a user interface element E which is enabled or - disabledThe UI element states - pseudo-classes3
                            E:checkeda user interface element E which is checked (for instance a radio-button or checkbox)The UI element states - pseudo-classes3
                            E::first-linethe first formatted line of an E elementThe ::first-line - pseudo-element1
                            E::first-letterthe first formatted letter of an E elementThe ::first-letter - pseudo-element1
                            E::selectionthe portion of an E element that is currently - selected/highlighted by the userThe UI element - fragments pseudo-elements3
                            E::beforegenerated content before an E elementThe ::before - pseudo-element2
                            E::aftergenerated content after an E elementThe ::after - pseudo-element2
                            E.warningan E element whose class is -"warning" (the document language specifies how class is determined).Class - selectors1
                            E#myidan E element with ID equal to "myid".ID - selectors1
                            E:not(s)an E element that does not match simple selector sNegation - pseudo-class3
                            E Fan F element descendant of an E elementDescendant - combinator1
                            E > Fan F element child of an E elementChild - combinator2
                            E + Fan F element immediately preceded by an E elementAdjacent sibling combinator2
                            E ~ Fan F element preceded by an E elementGeneral sibling combinator3
                            - -

                            The meaning of each selector is derived from the table above by -prepending "matches" to the contents of each cell in the "Meaning" -column.

                            - -

                            3. Case sensitivity

                            - -

                            The case sensitivity of document language element names, attribute -names, and attribute values in selectors depends on the document -language. For example, in HTML, element names are case-insensitive, -but in XML, they are case-sensitive.

                            - -

                            4. Selector syntax

                            - -

                            A selector is a chain of one -or more sequences of simple selectors -separated by combinators.

                            - -

                            A sequence of simple selectors -is a chain of simple selectors -that are not separated by a combinator. It -always begins with a type selector or a -universal selector. No other type -selector or universal selector is allowed in the sequence.

                            - -

                            A simple selector is either a type selector, universal selector, attribute selector, class selector, ID selector, content selector, or pseudo-class. One pseudo-element may be appended to the last -sequence of simple selectors.

                            - -

                            Combinators are: white space, "greater-than -sign" (U+003E, >), "plus sign" (U+002B, -+) and "tilde" (U+007E, ~). White -space may appear between a combinator and the simple selectors around -it. Only the characters "space" (U+0020), "tab" -(U+0009), "line feed" (U+000A), "carriage return" (U+000D), and "form -feed" (U+000C) can occur in white space. Other space-like characters, -such as "em-space" (U+2003) and "ideographic space" (U+3000), are -never part of white space.

                            - -

                            The elements of a document tree that are represented by a selector -are the subjects of the selector. A -selector consisting of a single sequence of simple selectors -represents any element satisfying its requirements. Prepending another -sequence of simple selectors and a combinator to a sequence imposes -additional matching constraints, so the subjects of a selector are -always a subset of the elements represented by the last sequence of -simple selectors.

                            - -

                            An empty selector, containing no sequence of simple selectors and -no pseudo-element, is an invalid -selector.

                            - -

                            5. Groups of selectors

                            - -

                            When several selectors share the same declarations, they may be -grouped into a comma-separated list. (A comma is U+002C.)

                            - -
                            -

                            CSS examples:

                            -

                            In this example, we condense three rules with identical -declarations into one. Thus,

                            -
                            h1 { font-family: sans-serif }
                            -h2 { font-family: sans-serif }
                            -h3 { font-family: sans-serif }
                            -

                            is equivalent to:

                            -
                            h1, h2, h3 { font-family: sans-serif }
                            -
                            - -

                            Warning: the equivalence is true in this example -because all the selectors are valid selectors. If just one of these -selectors were invalid, the entire group of selectors would be -invalid. This would invalidate the rule for all three heading -elements, whereas in the former case only one of the three individual -heading rules would be invalidated.

                            - - -

                            6. Simple selectors

                            - -

                            6.1. Type selector

                            - -

                            A type selector is the name of a document language -element type. A type selector represents an instance of the element -type in the document tree.

                            - -
                            -

                            Example:

                            -

                            The following selector represents an h1 element in the document tree:

                            -
                            h1
                            -
                            - - -

                            6.1.1. Type selectors and namespaces

                            - -

                            Type selectors allow an optional namespace ([XMLNAMES]) component. A namespace prefix -that has been previously declared may be prepended to the element name -separated by the namespace separator "vertical bar" -(U+007C, |).

                            - -

                            The namespace component may be left empty to indicate that the -selector is only to represent elements with no declared namespace.

                            - -

                            An asterisk may be used for the namespace prefix, indicating that -the selector represents elements in any namespace (including elements -with no namespace).

                            - -

                            Element type selectors that have no namespace component (no -namespace separator), represent elements without regard to the -element's namespace (equivalent to "*|") unless a default -namespace has been declared. If a default namespace has been declared, -the selector will represent only elements in the default -namespace.

                            - -

                            A type selector containing a namespace prefix that has not been -previously declared is an invalid selector. -The mechanism for declaring a namespace prefix is left up to the -language implementing Selectors. In CSS, such a mechanism is defined -in the General Syntax module.

                            - -

                            In a namespace-aware client, element type selectors will only match -against the local part -of the element's qualified -name. See below for notes about matching -behaviors in down-level clients.

                            - -

                            In summary:

                            - -
                            -
                            ns|E
                            -
                            elements with name E in namespace ns
                            -
                            *|E
                            -
                            elements with name E in any namespace, including those without any - declared namespace
                            -
                            |E
                            -
                            elements with name E without any declared namespace
                            -
                            E
                            -
                            if no default namespace has been specified, this is equivalent to *|E. - Otherwise it is equivalent to ns|E where ns is the default namespace.
                            -
                            - -
                            -

                            CSS examples:

                            - -
                            @namespace foo url(http://www.example.com);
                            - foo|h1 { color: blue }
                            - foo|* { color: yellow }
                            - |h1 { color: red }
                            - *|h1 { color: green }
                            - h1 { color: green }
                            - -

                            The first rule will match only h1 elements in the - "http://www.example.com" namespace.

                            - -

                            The second rule will match all elements in the - "http://www.example.com" namespace.

                            - -

                            The third rule will match only h1 elements without - any declared namespace.

                            - -

                            The fourth rule will match h1 elements in any - namespace (including those without any declared namespace).

                            - -

                            The last rule is equivalent to the fourth rule because no default - namespace has been defined.

                            - -
                            - -

                            6.2. Universal selector

                            - -

                            The universal selector, written "asterisk" -(*), represents the qualified name of any element -type. It represents any single element in the document tree in any -namespace (including those without any declared namespace) if no -default namespace has been specified. If a default namespace has been -specified, see Universal selector and -Namespaces below.

                            - -

                            If the universal selector is not the only component of a sequence -of simple selectors, the * may be omitted.

                            - -
                            -

                            Examples:

                            -
                              -
                            • *[hreflang|=en] and [hreflang|=en] are equivalent,
                            • -
                            • *.warning and .warning are equivalent,
                            • -
                            • *#myid and #myid are equivalent.
                            • -
                            -
                            - -

                            Note: it is recommended that the -*, representing the universal selector, not be -omitted.

                            - -

                            6.2.1. Universal selector and namespaces

                            - -

                            The universal selector allows an optional namespace component. It -is used as follows:

                            - -
                            -
                            ns|*
                            -
                            all elements in namespace ns
                            -
                            *|*
                            -
                            all elements
                            -
                            |*
                            -
                            all elements without any declared namespace
                            -
                            *
                            -
                            if no default namespace has been specified, this is equivalent to *|*. - Otherwise it is equivalent to ns|* where ns is the default namespace.
                            -
                            - -

                            A universal selector containing a namespace prefix that has not -been previously declared is an invalid -selector. The mechanism for declaring a namespace prefix is left up -to the language implementing Selectors. In CSS, such a mechanism is -defined in the General Syntax module.

                            - - -

                            6.3. Attribute selectors

                            - -

                            Selectors allow the representation of an element's attributes. When -a selector is used as an expression to match against an element, -attribute selectors must be considered to match an element if that -element has an attribute that matches the attribute represented by the -attribute selector.

                            - -

                            6.3.1. Attribute presence and values -selectors

                            - -

                            CSS2 introduced four attribute selectors:

                            - -
                            -
                            [att] -
                            Represents an element with the att attribute, whatever the value of - the attribute.
                            -
                            [att=val]
                            -
                            Represents an element with the att attribute whose value is exactly - "val".
                            -
                            [att~=val]
                            -
                            Represents an element with the att attribute whose value is a whitespace-separated list of words, one of - which is exactly "val". If "val" contains whitespace, it will never - represent anything (since the words are separated by - spaces).
                            -
                            [att|=val] -
                            Represents an element with the att attribute, its value either - being exactly "val" or beginning with "val" immediately followed by - "-" (U+002D). This is primarily intended to allow language subcode - matches (e.g., the hreflang attribute on the - link element in HTML) as described in RFC 3066 ([RFC3066]). For lang (or - xml:lang) language subcode matching, please see the :lang pseudo-class.
                            -
                            - -

                            Attribute values must be identifiers or strings. The -case-sensitivity of attribute names and values in selectors depends on -the document language.

                            - -
                            - -

                            Examples:

                            - -

                            The following attribute selector represents an h1 - element that carries the title attribute, whatever its - value:

                            - -
                            h1[title]
                            - -

                            In the following example, the selector represents a - span element whose class attribute has - exactly the value "example":

                            - -
                            span[class="example"]
                            - -

                            Multiple attribute selectors can be used to represent several - attributes of an element, or several conditions on the same - attribute. Here, the selector represents a span element - whose hello attribute has exactly the value "Cleveland" - and whose goodbye attribute has exactly the value - "Columbus":

                            - -
                            span[hello="Cleveland"][goodbye="Columbus"]
                            - -

                            The following selectors illustrate the differences between "=" - and "~=". The first selector will represent, for example, the value - "copyright copyleft copyeditor" on a rel attribute. The - second selector will only represent an a element with - an href attribute having the exact value - "http://www.w3.org/".

                            - -
                            a[rel~="copyright"]
                            -a[href="http://www.w3.org/"]
                            - -

                            The following selector represents a link element - whose hreflang attribute is exactly "fr".

                            - -
                            link[hreflang=fr]
                            - -

                            The following selector represents a link element for - which the values of the hreflang attribute begins with - "en", including "en", "en-US", and "en-cockney":

                            - -
                            link[hreflang|="en"]
                            - -

                            Similarly, the following selectors represents a - DIALOGUE element whenever it has one of two different - values for an attribute character:

                            - -
                            DIALOGUE[character=romeo]
                            -DIALOGUE[character=juliet]
                            - -
                            - -

                            6.3.2. Substring matching attribute -selectors

                            - -

                            Three additional attribute selectors are provided for matching -substrings in the value of an attribute:

                            - -
                            -
                            [att^=val]
                            -
                            Represents an element with the att attribute whose value begins - with the prefix "val".
                            -
                            [att$=val] -
                            Represents an element with the att attribute whose value ends with - the suffix "val".
                            -
                            [att*=val] -
                            Represents an element with the att attribute whose value contains - at least one instance of the substring "val".
                            -
                            - -

                            Attribute values must be identifiers or strings. The -case-sensitivity of attribute names in selectors depends on the -document language.

                            - -
                            -

                            Examples:

                            -

                            The following selector represents an HTML object, referencing an - image:

                            -
                            object[type^="image/"]
                            -

                            The following selector represents an HTML anchor a with an - href attribute whose value ends with ".html".

                            -
                            a[href$=".html"]
                            -

                            The following selector represents an HTML paragraph with a title - attribute whose value contains the substring "hello"

                            -
                            p[title*="hello"]
                            -
                            - -

                            6.3.3. Attribute selectors and namespaces

                            - -

                            Attribute selectors allow an optional namespace component to the -attribute name. A namespace prefix that has been previously declared -may be prepended to the attribute name separated by the namespace -separator "vertical bar" (|). In keeping with -the Namespaces in the XML recommendation, default namespaces do not -apply to attributes, therefore attribute selectors without a namespace -component apply only to attributes that have no declared namespace -(equivalent to "|attr"). An asterisk may be used for the -namespace prefix indicating that the selector is to match all -attribute names without regard to the attribute's namespace. - -

                            An attribute selector with an attribute name containing a namespace -prefix that has not been previously declared is an invalid selector. The mechanism for declaring -a namespace prefix is left up to the language implementing Selectors. -In CSS, such a mechanism is defined in the General Syntax module. - -

                            -

                            CSS examples:

                            -
                            @namespace foo "http://www.example.com";
                            -[foo|att=val] { color: blue }
                            -[*|att] { color: yellow }
                            -[|att] { color: green }
                            -[att] { color: green }
                            - -

                            The first rule will match only elements with the attribute - att in the "http://www.example.com" namespace with the - value "val".

                            - -

                            The second rule will match only elements with the attribute - att regardless of the namespace of the attribute - (including no declared namespace).

                            - -

                            The last two rules are equivalent and will match only elements - with the attribute att where the attribute is not - declared to be in a namespace.

                            - -
                            - -

                            6.3.4. Default attribute values in DTDs

                            - -

                            Attribute selectors represent explicitly set attribute values in -the document tree. Default attribute values may be defined in a DTD or -elsewhere, but cannot always be selected by attribute -selectors. Selectors should be designed so that they work even if the -default values are not included in the document tree.

                            - -

                            More precisely, a UA is not required to read an "external -subset" of the DTD but is required to look for default -attribute values in the document's "internal subset." (See [XML10] for definitions of these subsets.)

                            - -

                            A UA that recognizes an XML namespace [XMLNAMES] is not required to use its -knowledge of that namespace to treat default attribute values as if -they were present in the document. (For example, an XHTML UA is not -required to use its built-in knowledge of the XHTML DTD.)

                            - -

                            Note: Typically, implementations -choose to ignore external subsets.

                            - -
                            -

                            Example:

                            - -

                            Consider an element EXAMPLE with an attribute "notation" that has a -default value of "decimal". The DTD fragment might be

                            - -
                            <!ATTLIST EXAMPLE notation (decimal,octal) "decimal">
                            - -

                            If the style sheet contains the rules

                            - -
                            EXAMPLE[notation=decimal] { /*... default property settings ...*/ }
                            -EXAMPLE[notation=octal]   { /*... other settings...*/ }
                            - -

                            the first rule will not match elements whose "notation" attribute -is set by default, i.e. not set explicitly. To catch all cases, the -attribute selector for the default value must be dropped:

                            - -
                            EXAMPLE                   { /*... default property settings ...*/ }
                            -EXAMPLE[notation=octal]   { /*... other settings...*/ }
                            - -

                            Here, because the selector EXAMPLE[notation=octal] is -more specific than the tag -selector alone, the style declarations in the second rule will override -those in the first for elements that have a "notation" attribute value -of "octal". Care has to be taken that all property declarations that -are to apply only to the default case are overridden in the non-default -cases' style rules.

                            - -
                            - -

                            6.4. Class selectors

                            - -

                            Working with HTML, authors may use the period (U+002E, -.) notation as an alternative to the ~= -notation when representing the class attribute. Thus, for -HTML, div.value and div[class~=value] have -the same meaning. The attribute value must immediately follow the -"period" (.).

                            - -

                            UAs may apply selectors using the period (.) notation in XML -documents if the UA has namespace-specific knowledge that allows it to -determine which attribute is the "class" attribute for the -respective namespace. One such example of namespace-specific knowledge -is the prose in the specification for a particular namespace (e.g. SVG -1.0 [SVG] describes the SVG -"class" attribute and how a UA should interpret it, and -similarly MathML 1.01 [MATH] describes the MathML -"class" attribute.)

                            - -
                            -

                            CSS examples:

                            - -

                            We can assign style information to all elements with - class~="pastoral" as follows:

                            - -
                            *.pastoral { color: green }  /* all elements with class~=pastoral */
                            - -

                            or just

                            - -
                            .pastoral { color: green }  /* all elements with class~=pastoral */
                            - -

                            The following assigns style only to H1 elements with - class~="pastoral":

                            - -
                            H1.pastoral { color: green }  /* H1 elements with class~=pastoral */
                            - -

                            Given these rules, the first H1 instance below would not have - green text, while the second would:

                            - -
                            <H1>Not green</H1>
                            -<H1 class="pastoral">Very green</H1>
                            - -
                            - -

                            To represent a subset of "class" values, each value must be preceded -by a ".", in any order.

                            - -
                            - -

                            CSS example:

                            - -

                            The following rule matches any P element whose "class" attribute - has been assigned a list of whitespace-separated values that includes - "pastoral" and "marine":

                            - -
                            p.pastoral.marine { color: green }
                            - -

                            This rule matches when class="pastoral blue aqua - marine" but does not match for class="pastoral - blue".

                            - -
                            - -

                            Note: Because CSS gives considerable -power to the "class" attribute, authors could conceivably design their -own "document language" based on elements with almost no associated -presentation (such as DIV and SPAN in HTML) and assigning style -information through the "class" attribute. Authors should avoid this -practice since the structural elements of a document language often -have recognized and accepted meanings and author-defined classes may -not.

                            - -

                            Note: If an element has multiple -class attributes, their values must be concatenated with spaces -between the values before searching for the class. As of this time the -working group is not aware of any manner in which this situation can -be reached, however, so this behavior is explicitly non-normative in -this specification.

                            - -

                            6.5. ID selectors

                            - -

                            Document languages may contain attributes that are declared to be -of type ID. What makes attributes of type ID special is that no two -such attributes can have the same value in a document, regardless of -the type of the elements that carry them; whatever the document -language, an ID typed attribute can be used to uniquely identify its -element. In HTML all ID attributes are named "id"; XML applications -may name ID attributes differently, but the same restriction -applies.

                            - -

                            An ID-typed attribute of a document language allows authors to -assign an identifier to one element instance in the document tree. W3C -ID selectors represent an element instance based on its identifier. An -ID selector contains a "number sign" (U+0023, -#) immediately followed by the ID value, which must be an -identifier.

                            - -

                            Selectors does not specify how a UA knows the ID-typed attribute of -an element. The UA may, e.g., read a document's DTD, have the -information hard-coded or ask the user. - -

                            -

                            Examples:

                            -

                            The following ID selector represents an h1 element - whose ID-typed attribute has the value "chapter1":

                            -
                            h1#chapter1
                            -

                            The following ID selector represents any element whose ID-typed - attribute has the value "chapter1":

                            -
                            #chapter1
                            -

                            The following selector represents any element whose ID-typed - attribute has the value "z98y".

                            -
                            *#z98y
                            -
                            - -

                            Note. In XML 1.0 [XML10], the information about which attribute -contains an element's IDs is contained in a DTD or a schema. When -parsing XML, UAs do not always read the DTD, and thus may not know -what the ID of an element is (though a UA may have namespace-specific -knowledge that allows it to determine which attribute is the ID -attribute for that namespace). If a style sheet designer knows or -suspects that a UA may not know what the ID of an element is, he -should use normal attribute selectors instead: -[name=p371] instead of #p371. Elements in -XML 1.0 documents without a DTD do not have IDs at all.

                            - -

                            If an element has multiple ID attributes, all of them must be -treated as IDs for that element for the purposes of the ID -selector. Such a situation could be reached using mixtures of xml:id, -DOM3 Core, XML DTDs, and namespace-specific knowledge.

                            - -

                            6.6. Pseudo-classes

                            - -

                            The pseudo-class concept is introduced to permit selection based on -information that lies outside of the document tree or that cannot be -expressed using the other simple selectors.

                            - -

                            A pseudo-class always consists of a "colon" -(:) followed by the name of the pseudo-class and -optionally by a value between parentheses.

                            - -

                            Pseudo-classes are allowed in all sequences of simple selectors -contained in a selector. Pseudo-classes are allowed anywhere in -sequences of simple selectors, after the leading type selector or -universal selector (possibly omitted). Pseudo-class names are -case-insensitive. Some pseudo-classes are mutually exclusive, while -others can be applied simultaneously to the same -element. Pseudo-classes may be dynamic, in the sense that an element -may acquire or lose a pseudo-class while a user interacts with the -document.

                            - - -

                            6.6.1. Dynamic pseudo-classes

                            - -

                            Dynamic pseudo-classes classify elements on characteristics other -than their name, attributes, or content, in principle characteristics -that cannot be deduced from the document tree.

                            - -

                            Dynamic pseudo-classes do not appear in the document source or -document tree.

                            - - -
                            The link pseudo-classes: :link and :visited
                            - -

                            User agents commonly display unvisited links differently from -previously visited ones. Selectors -provides the pseudo-classes :link and -:visited to distinguish them:

                            - -
                              -
                            • The :link pseudo-class applies to links that have - not yet been visited.
                            • -
                            • The :visited pseudo-class applies once the link has - been visited by the user.
                            • -
                            - -

                            After some amount of time, user agents may choose to return a -visited link to the (unvisited) ':link' state.

                            - -

                            The two states are mutually exclusive.

                            - -
                            - -

                            Example:

                            - -

                            The following selector represents links carrying class - external and already visited:

                            - -
                            a.external:visited
                            - -
                            - -

                            Note: It is possible for style sheet -authors to abuse the :link and :visited pseudo-classes to determine -which sites a user has visited without the user's consent. - -

                            UAs may therefore treat all links as unvisited links, or implement -other measures to preserve the user's privacy while rendering visited -and unvisited links differently.

                            - -
                            The user action pseudo-classes -:hover, :active, and :focus
                            - -

                            Interactive user agents sometimes change the rendering in response -to user actions. Selectors provides -three pseudo-classes for the selection of an element the user is -acting on.

                            - -
                              - -
                            • The :hover pseudo-class applies while the user - designates an element with a pointing device, but does not activate - it. For example, a visual user agent could apply this pseudo-class - when the cursor (mouse pointer) hovers over a box generated by the - element. User agents not that do not support interactive - media do not have to support this pseudo-class. Some conforming - user agents that support interactive - media may not be able to support this pseudo-class (e.g., a pen - device that does not detect hovering).
                            • - -
                            • The :active pseudo-class applies while an element - is being activated by the user. For example, between the times the - user presses the mouse button and releases it.
                            • - -
                            • The :focus pseudo-class applies while an element - has the focus (accepts keyboard or mouse events, or other forms of - input).
                            • - -
                            - -

                            There may be document language or implementation specific limits on -which elements can become :active or acquire -:focus.

                            - -

                            These pseudo-classes are not mutually exclusive. An element may -match several pseudo-classes at the same time.

                            - -

                            Selectors doesn't define if the parent of an element that is -':active' or ':hover' is also in that state.

                            - -
                            -

                            Examples:

                            -
                            a:link    /* unvisited links */
                            -a:visited /* visited links */
                            -a:hover   /* user hovers */
                            -a:active  /* active links */
                            -

                            An example of combining dynamic pseudo-classes:

                            -
                            a:focus
                            -a:focus:hover
                            -

                            The last selector matches a elements that are in - the pseudo-class :focus and in the pseudo-class :hover.

                            -
                            - -

                            Note: An element can be both ':visited' -and ':active' (or ':link' and ':active').

                            - -

                            6.6.2. The target pseudo-class :target

                            - -

                            Some URIs refer to a location within a resource. This kind of URI -ends with a "number sign" (#) followed by an anchor -identifier (called the fragment identifier).

                            - -

                            URIs with fragment identifiers link to a certain element within the -document, known as the target element. For instance, here is a URI -pointing to an anchor named section_2 in an HTML -document:

                            - -
                            http://example.com/html/top.html#section_2
                            - -

                            A target element can be represented by the :target -pseudo-class. If the document's URI has no fragment identifier, then -the document has no target element.

                            - -
                            -

                            Example:

                            -
                            p.note:target
                            -

                            This selector represents a p element of class - note that is the target element of the referring - URI.

                            -
                            - -
                            -

                            CSS example:

                            -

                            Here, the :target pseudo-class is used to make the - target element red and place an image before it, if there is one:

                            -
                            *:target { color : red }
                            -*:target::before { content : url(target.png) }
                            -
                            - -

                            6.6.3. The language pseudo-class :lang

                            - -

                            If the document language specifies how the human language of an -element is determined, it is possible to write selectors that -represent an element based on its language. For example, in HTML [HTML4], the language is determined by a -combination of the lang attribute, the meta -element, and possibly by information from the protocol (such as HTTP -headers). XML uses an attribute called xml:lang, and -there may be other document language-specific methods for determining -the language.

                            - -

                            The pseudo-class :lang(C) represents an element that -is in language C. Whether an element is represented by a -:lang() selector is based solely on the identifier C -being either equal to, or a hyphen-separated substring of, the -element's language value, in the same way as if performed by the '|=' operator in attribute -selectors. The identifier C does not have to be a valid language -name.

                            - -

                            C must not be empty. (If it is, the selector is invalid.)

                            - -

                            Note: It is recommended that -documents and protocols indicate language using codes from RFC 3066 [RFC3066] or its successor, and by means of -"xml:lang" attributes in the case of XML-based documents [XML10]. See -"FAQ: Two-letter or three-letter language codes."

                            - -
                            -

                            Examples:

                            -

                            The two following selectors represent an HTML document that is in - Belgian, French, or German. The two next selectors represent - q quotations in an arbitrary element in Belgian, French, - or German.

                            -
                            html:lang(fr-be)
                            -html:lang(de)
                            -:lang(fr-be) > q
                            -:lang(de) > q
                            -
                            - -

                            6.6.4. The UI element states pseudo-classes

                            - -
                            The :enabled and :disabled pseudo-classes
                            - -

                            The :enabled pseudo-class allows authors to customize -the look of user interface elements that are enabled — which the -user can select or activate in some fashion (e.g. clicking on a button -with a mouse). There is a need for such a pseudo-class because there -is no way to programmatically specify the default appearance of say, -an enabled input element without also specifying what it -would look like when it was disabled.

                            - -

                            Similar to :enabled, :disabled allows the -author to specify precisely how a disabled or inactive user interface -element should look.

                            - -

                            Most elements will be neither enabled nor disabled. An element is -enabled if the user can either activate it or transfer the focus to -it. An element is disabled if it could be enabled, but the user cannot -presently activate it or transfer focus to it.

                            - - -
                            The :checked pseudo-class
                            - -

                            Radio and checkbox elements can be toggled by the user. Some menu -items are "checked" when the user selects them. When such elements are -toggled "on" the :checked pseudo-class applies. The -:checked pseudo-class initially applies to such elements -that have the HTML4 selected and checked -attributes as described in Section -17.2.1 of HTML4, but of course the user can toggle "off" such -elements in which case the :checked pseudo-class would no -longer apply. While the :checked pseudo-class is dynamic -in nature, and is altered by user action, since it can also be based -on the presence of the semantic HTML4 selected and -checked attributes, it applies to all media. - - -

                            The :indeterminate pseudo-class
                            - -
                            - -

                            Radio and checkbox elements can be toggled by the user, but are -sometimes in an indeterminate state, neither checked nor unchecked. -This can be due to an element attribute, or DOM manipulation.

                            - -

                            A future version of this specification may introduce an -:indeterminate pseudo-class that applies to such elements. -

                            - -
                            - - -

                            6.6.5. Structural pseudo-classes

                            - -

                            Selectors introduces the concept of structural -pseudo-classes to permit selection based on extra information that lies in -the document tree but cannot be represented by other simple selectors or -combinators. - -

                            Note that standalone pieces of PCDATA (text nodes in the DOM) are -not counted when calculating the position of an element in the list of -children of its parent. When calculating the position of an element in -the list of children of its parent, the index numbering starts at 1. - - -

                            :root pseudo-class
                            - -

                            The :root pseudo-class represents an element that is -the root of the document. In HTML 4, this is always the -HTML element. - - -

                            :nth-child() pseudo-class
                            - -

                            The -:nth-child(an+b) -pseudo-class notation represents an element that has -an+b-1 siblings -before it in the document tree, for a given positive -integer or zero value of n, and has a parent element. In -other words, this matches the bth child of an element after -all the children have been split into groups of a elements -each. For example, this allows the selectors to address every other -row in a table, and could be used to alternate the color -of paragraph text in a cycle of four. The a and -b values must be zero, negative integers or positive -integers. The index of the first child of an element is 1. - -

                            In addition to this, :nth-child() can take -'odd' and 'even' as arguments instead. -'odd' has the same signification as 2n+1, -and 'even' has the same signification as 2n. - - -

                            -

                            Examples:

                            -
                            tr:nth-child(2n+1) /* represents every odd row of an HTML table */
                            -tr:nth-child(odd)  /* same */
                            -tr:nth-child(2n)   /* represents every even row of an HTML table */
                            -tr:nth-child(even) /* same */
                            -
                            -/* Alternate paragraph colours in CSS */
                            -p:nth-child(4n+1) { color: navy; }
                            -p:nth-child(4n+2) { color: green; }
                            -p:nth-child(4n+3) { color: maroon; }
                            -p:nth-child(4n+4) { color: purple; }
                            -
                            - -

                            When a=0, no repeating is used, so for example -:nth-child(0n+5) matches only the fifth child. When -a=0, the an part need not be -included, so the syntax simplifies to -:nth-child(b) and the last example simplifies -to :nth-child(5). - -

                            -

                            Examples:

                            -
                            foo:nth-child(0n+1)   /* represents an element foo, first child of its parent element */
                            -foo:nth-child(1)      /* same */
                            -
                            - -

                            When a=1, the number may be omitted from the rule. - -

                            -

                            Examples:

                            -

                            The following selectors are therefore equivalent:

                            -
                            bar:nth-child(1n+0)   /* represents all bar elements, specificity (0,1,1) */
                            -bar:nth-child(n+0)    /* same */
                            -bar:nth-child(n)      /* same */
                            -bar                   /* same but lower specificity (0,0,1) */
                            -
                            - -

                            If b=0, then every ath element is picked. In -such a case, the b part may be omitted. - -

                            -

                            Examples:

                            -
                            tr:nth-child(2n+0) /* represents every even row of an HTML table */
                            -tr:nth-child(2n) /* same */
                            -
                            - -

                            If both a and b are equal to zero, the -pseudo-class represents no element in the document tree.

                            - -

                            The value a can be negative, but only the positive -values of an+b, for -n≥0, may represent an element in the document -tree.

                            - -
                            -

                            Example:

                            -
                            html|tr:nth-child(-n+6)  /* represents the 6 first rows of XHTML tables */
                            -
                            - -

                            When the value b is negative, the "+" character in the -expression must be removed (it is effectively replaced by the "-" -character indicating the negative value of b).

                            - -
                            -

                            Examples:

                            -
                            :nth-child(10n-1)  /* represents the 9th, 19th, 29th, etc, element */
                            -:nth-child(10n+9)  /* Same */
                            -:nth-child(10n+-1) /* Syntactically invalid, and would be ignored */
                            -
                            - - -
                            :nth-last-child() pseudo-class
                            - -

                            The :nth-last-child(an+b) -pseudo-class notation represents an element that has -an+b-1 siblings -after it in the document tree, for a given positive -integer or zero value of n, and has a parent element. See -:nth-child() pseudo-class for the syntax of its argument. -It also accepts the 'even' and 'odd' values -as arguments. - - -

                            -

                            Examples:

                            -
                            tr:nth-last-child(-n+2)    /* represents the two last rows of an HTML table */
                            -
                            -foo:nth-last-child(odd)    /* represents all odd foo elements in their parent element,
                            -                              counting from the last one */
                            -
                            - - -
                            :nth-of-type() pseudo-class
                            - -

                            The :nth-of-type(an+b) -pseudo-class notation represents an element that has -an+b-1 siblings with the same -element name before it in the document tree, for a -given zero or positive integer value of n, and has a -parent element. In other words, this matches the bth child -of that type after all the children of that type have been split into -groups of a elements each. See :nth-child() pseudo-class -for the syntax of its argument. It also accepts the -'even' and 'odd' values. - - -

                            -

                            CSS example:

                            -

                            This allows an author to alternate the position of floated images:

                            -
                            img:nth-of-type(2n+1) { float: right; }
                            -img:nth-of-type(2n) { float: left; }
                            -
                            - - -
                            :nth-last-of-type() pseudo-class
                            - -

                            The :nth-last-of-type(an+b) -pseudo-class notation represents an element that has -an+b-1 siblings with the same -element name after it in the document tree, for a -given zero or positive integer value of n, and has a -parent element. See :nth-child() pseudo-class for the -syntax of its argument. It also accepts the 'even' and 'odd' values. - - -

                            -

                            Example:

                            -

                            To represent all h2 children of an XHTML - body except the first and last, one could use the - following selector:

                            -
                            body > h2:nth-of-type(n+2):nth-last-of-type(n+2)
                            -

                            In this case, one could also use :not(), although the - selector ends up being just as long:

                            -
                            body > h2:not(:first-of-type):not(:last-of-type)
                            -
                            - - -
                            :first-child pseudo-class
                            - -

                            Same as :nth-child(1). The :first-child pseudo-class -represents an element that is the first child of some other element. - - -

                            -

                            Examples:

                            -

                            The following selector represents a p element that is - the first child of a div element:

                            -
                            div > p:first-child
                            -

                            This selector can represent the p inside the - div of the following fragment:

                            -
                            <p> The last P before the note.</p>
                            -<div class="note">
                            -   <p> The first P inside the note.</p>
                            -</div>
                            but cannot represent the second p in the following -fragment: -
                            <p> The last P before the note.</p>
                            -<div class="note">
                            -   <h2> Note </h2>
                            -   <p> The first P inside the note.</p>
                            -</div>
                            -

                            The following two selectors are usually equivalent:

                            -
                            * > a:first-child /* a is first child of any element */
                            -a:first-child /* Same (assuming a is not the root element) */
                            -
                            - -
                            :last-child pseudo-class
                            - -

                            Same as :nth-last-child(1). The :last-child pseudo-class -represents an element that is the last child of some other element. - -

                            -

                            Example:

                            -

                            The following selector represents a list item li that - is the last child of an ordered list ol. -

                            ol > li:last-child
                            -
                            - -
                            :first-of-type pseudo-class
                            - -

                            Same as :nth-of-type(1). The :first-of-type pseudo-class -represents an element that is the first sibling of its type in the list of -children of its parent element. - -

                            -

                            Example:

                            -

                            The following selector represents a definition title -dt inside a definition list dl, this -dt being the first of its type in the list of children of -its parent element.

                            -
                            dl dt:first-of-type
                            -

                            It is a valid description for the first two dt -elements in the following example but not for the third one:

                            -
                            <dl>
                            - <dt>gigogne</dt>
                            - <dd>
                            -  <dl>
                            -   <dt>fusée</dt>
                            -   <dd>multistage rocket</dd>
                            -   <dt>table</dt>
                            -   <dd>nest of tables</dd>
                            -  </dl>
                            - </dd>
                            -</dl>
                            -
                            - -
                            :last-of-type pseudo-class
                            - -

                            Same as :nth-last-of-type(1). The -:last-of-type pseudo-class represents an element that is -the last sibling of its type in the list of children of its parent -element.

                            - -
                            -

                            Example:

                            -

                            The following selector represents the last data cell - td of a table row.

                            -
                            tr > td:last-of-type
                            -
                            - -
                            :only-child pseudo-class
                            - -

                            Represents an element that has a parent element and whose parent -element has no other element children. Same as -:first-child:last-child or -:nth-child(1):nth-last-child(1), but with a lower -specificity.

                            - -
                            :only-of-type pseudo-class
                            - -

                            Represents an element that has a parent element and whose parent -element has no other element children with the same element name. Same -as :first-of-type:last-of-type or -:nth-of-type(1):nth-last-of-type(1), but with a lower -specificity.

                            - - -
                            :empty pseudo-class
                            - -

                            The :empty pseudo-class represents an element that has -no children at all. In terms of the DOM, only element nodes and text -nodes (including CDATA nodes and entity references) whose data has a -non-zero length must be considered as affecting emptiness; comments, -PIs, and other nodes must not affect whether an element is considered -empty or not.

                            - -
                            -

                            Examples:

                            -

                            p:empty is a valid representation of the following fragment:

                            -
                            <p></p>
                            -

                            foo:empty is not a valid representation for the - following fragments:

                            -
                            <foo>bar</foo>
                            -
                            <foo><bar>bla</bar></foo>
                            -
                            <foo>this is not <bar>:empty</bar></foo>
                            -
                            - -

                            6.6.6. Blank

                            - -

                            This section intentionally left blank.

                            - - -

                            6.6.7. The negation pseudo-class

                            - -

                            The negation pseudo-class, :not(X), is a -functional notation taking a simple -selector (excluding the negation pseudo-class itself and -pseudo-elements) as an argument. It represents an element that is not -represented by the argument. - - - -

                            -

                            Examples:

                            -

                            The following CSS selector matches all button - elements in an HTML document that are not disabled.

                            -
                            button:not([DISABLED])
                            -

                            The following selector represents all but FOO - elements.

                            -
                            *:not(FOO)
                            -

                            The following group of selectors represents all HTML elements - except links.

                            -
                            html|*:not(:link):not(:visited)
                            -
                            - -

                            Default namespace declarations do not affect the argument of the -negation pseudo-class unless the argument is a universal selector or a -type selector.

                            - -
                            -

                            Examples:

                            -

                            Assuming that the default namespace is bound to - "http://example.com/", the following selector represents all - elements that are not in that namespace:

                            -
                            *|*:not(*)
                            -

                            The following CSS selector matches any element being hovered, - regardless of its namespace. In particular, it is not limited to - only matching elements in the default namespace that are not being - hovered, and elements not in the default namespace don't match the - rule when they are being hovered.

                            -
                            *|*:not(:hover)
                            -
                            - -

                            Note: the :not() pseudo allows -useless selectors to be written. For instance :not(*|*), -which represents no element at all, or foo:not(bar), -which is equivalent to foo but with a higher -specificity.

                            - -

                            7. Pseudo-elements

                            - -

                            Pseudo-elements create abstractions about the document tree beyond -those specified by the document language. For instance, document -languages do not offer mechanisms to access the first letter or first -line of an element's content. Pseudo-elements allow designers to refer -to this otherwise inaccessible information. Pseudo-elements may also -provide designers a way to refer to content that does not exist in the -source document (e.g., the ::before and -::after pseudo-elements give access to generated -content).

                            - -

                            A pseudo-element is made of two colons (::) followed -by the name of the pseudo-element.

                            - -

                            This :: notation is introduced by the current document -in order to establish a discrimination between pseudo-classes and -pseudo-elements. For compatibility with existing style sheets, user -agents must also accept the previous one-colon notation for -pseudo-elements introduced in CSS levels 1 and 2 (namely, -:first-line, :first-letter, -:before and :after). This compatibility is -not allowed for the new pseudo-elements introduced in CSS level 3.

                            - -

                            Only one pseudo-element may appear per selector, and if present it -must appear after the sequence of simple selectors that represents the -subjects of the selector. A -future version of this specification may allow multiple -pesudo-elements per selector.

                            - -

                            7.1. The ::first-line pseudo-element

                            - -

                            The ::first-line pseudo-element describes the contents -of the first formatted line of an element. - -

                            -

                            CSS example:

                            -
                            p::first-line { text-transform: uppercase }
                            -

                            The above rule means "change the letters of the first line of every -paragraph to uppercase".

                            -
                            - -

                            The selector p::first-line does not match any real -HTML element. It does match a pseudo-element that conforming user -agents will insert at the beginning of every paragraph.

                            - -

                            Note that the length of the first line depends on a number of -factors, including the width of the page, the font size, etc. Thus, -an ordinary HTML paragraph such as:

                            - -
                            -<P>This is a somewhat long HTML 
                            -paragraph that will be broken into several 
                            -lines. The first line will be identified
                            -by a fictional tag sequence. The other lines 
                            -will be treated as ordinary lines in the 
                            -paragraph.</P>
                            -
                            - -

                            the lines of which happen to be broken as follows: - -

                            -THIS IS A SOMEWHAT LONG HTML PARAGRAPH THAT
                            -will be broken into several lines. The first
                            -line will be identified by a fictional tag 
                            -sequence. The other lines will be treated as 
                            -ordinary lines in the paragraph.
                            -
                            - -

                            This paragraph might be "rewritten" by user agents to include the -fictional tag sequence for ::first-line. This -fictional tag sequence helps to show how properties are inherited.

                            - -
                            -<P><P::first-line> This is a somewhat long HTML 
                            -paragraph that </P::first-line> will be broken into several
                            -lines. The first line will be identified 
                            -by a fictional tag sequence. The other lines 
                            -will be treated as ordinary lines in the 
                            -paragraph.</P>
                            -
                            - -

                            If a pseudo-element breaks up a real element, the desired effect -can often be described by a fictional tag sequence that closes and -then re-opens the element. Thus, if we mark up the previous paragraph -with a span element:

                            - -
                            -<P><SPAN class="test"> This is a somewhat long HTML
                            -paragraph that will be broken into several
                            -lines.</SPAN> The first line will be identified
                            -by a fictional tag sequence. The other lines 
                            -will be treated as ordinary lines in the 
                            -paragraph.</P>
                            -
                            - -

                            the user agent could simulate start and end tags for -span when inserting the fictional tag sequence for -::first-line. - -

                            -<P><P::first-line><SPAN class="test"> This is a
                            -somewhat long HTML
                            -paragraph that will </SPAN></P::first-line><SPAN class="test"> be
                            -broken into several
                            -lines.</SPAN> The first line will be identified
                            -by a fictional tag sequence. The other lines
                            -will be treated as ordinary lines in the 
                            -paragraph.</P>
                            -
                            - -

                            In CSS, the ::first-line pseudo-element can only be -attached to a block-level element, an inline-block, a table-caption, -or a table-cell.

                            - -

                            The "first formatted line" of an -element may occur inside a -block-level descendant in the same flow (i.e., a block-level -descendant that is not positioned and not a float). E.g., the first -line of the div in <DIV><P>This -line...</P></DIV> is the first line of the p (assuming -that both p and div are block-level). - -

                            The first line of a table-cell or inline-block cannot be the first -formatted line of an ancestor element. Thus, in <DIV><P -STYLE="display: inline-block">Hello<BR>Goodbye</P> -etcetera</DIV> the first formatted line of the -div is not the line "Hello". - -

                            Note that the first line of the p in this -fragment: <p><br>First... doesn't contain any -letters (assuming the default style for br in HTML -4). The word "First" is not on the first formatted line. - -

                            A UA should act as if the fictional start tags of the -::first-line pseudo-elements were nested just inside the -innermost enclosing block-level element. (Since CSS1 and CSS2 were -silent on this case, authors should not rely on this behavior.) Here -is an example. The fictional tag sequence for

                            - -
                            -<DIV>
                            -  <P>First paragraph</P>
                            -  <P>Second paragraph</P>
                            -</DIV>
                            -
                            - -

                            is

                            - -
                            -<DIV>
                            -  <P><DIV::first-line><P::first-line>First paragraph</P::first-line></DIV::first-line></P>
                            -  <P><P::first-line>Second paragraph</P::first-line></P>
                            -</DIV>
                            -
                            - -

                            The ::first-line pseudo-element is similar to an -inline-level element, but with certain restrictions. In CSS, the -following properties apply to a ::first-line -pseudo-element: font properties, color property, background -properties, 'word-spacing', 'letter-spacing', 'text-decoration', -'vertical-align', 'text-transform', 'line-height'. UAs may apply other -properties as well.

                            - - -

                            7.2. The ::first-letter pseudo-element

                            - -

                            The ::first-letter pseudo-element represents the first -letter of the first line of a block, if it is not preceded by any -other content (such as images or inline tables) on its line. The -::first-letter pseudo-element may be used for "initial caps" and "drop -caps", which are common typographical effects. This type of initial -letter is similar to an inline-level element if its 'float' property -is 'none'; otherwise, it is similar to a floated element.

                            - -

                            In CSS, these are the properties that apply to ::first-letter -pseudo-elements: font properties, 'text-decoration', 'text-transform', -'letter-spacing', 'word-spacing' (when appropriate), 'line-height', -'float', 'vertical-align' (only if 'float' is 'none'), margin -properties, padding properties, border properties, color property, -background properties. UAs may apply other properties as well. To -allow UAs to render a typographically correct drop cap or initial cap, -the UA may choose a line-height, width and height based on the shape -of the letter, unlike for normal elements.

                            - -
                            -

                            Example:

                            -

                            This example shows a possible rendering of an initial cap. Note -that the 'line-height' that is inherited by the ::first-letter -pseudo-element is 1.1, but the UA in this example has computed the -height of the first letter differently, so that it doesn't cause any -unnecessary space between the first two lines. Also note that the -fictional start tag of the first letter is inside the span, and thus -the font weight of the first letter is normal, not bold as the span: -

                            -p { line-height: 1.1 }
                            -p::first-letter { font-size: 3em; font-weight: normal }
                            -span { font-weight: bold }
                            -...
                            -<p><span>Het hemelsche</span> gerecht heeft zich ten lange lesten<br>
                            -Erbarremt over my en mijn benaeuwde vesten<br>
                            -En arme burgery, en op mijn volcx gebed<br>
                            -En dagelix geschrey de bange stad ontzet.
                            -
                            -
                            -

                            Image illustrating the ::first-letter pseudo-element -

                            -
                            - -
                            -

                            The following CSS will make a drop cap initial letter span about two lines:

                            - -
                            -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
                            -<HTML>
                            - <HEAD>
                            -  <TITLE>Drop cap initial letter</TITLE>
                            -  <STYLE type="text/css">
                            -   P               { font-size: 12pt; line-height: 1.2 }
                            -   P::first-letter { font-size: 200%; font-weight: bold; float: left }
                            -   SPAN            { text-transform: uppercase }
                            -  </STYLE>
                            - </HEAD>
                            - <BODY>
                            -  <P><SPAN>The first</SPAN> few words of an article
                            -    in The Economist.</P>
                            - </BODY>
                            -</HTML>
                            -
                            - -

                            This example might be formatted as follows:

                            - -
                            -

                            Image illustrating the combined effect of the ::first-letter and ::first-line pseudo-elements

                            -
                            - -

                            The fictional tag sequence is:

                            - -
                            -<P>
                            -<SPAN>
                            -<P::first-letter>
                            -T
                            -</P::first-letter>he first
                            -</SPAN> 
                            -few words of an article in the Economist.
                            -</P>
                            -
                            - -

                            Note that the ::first-letter pseudo-element tags abut -the content (i.e., the initial character), while the ::first-line -pseudo-element start tag is inserted right after the start tag of the -block element.

                            - -

                            In order to achieve traditional drop caps formatting, user agents -may approximate font sizes, for example to align baselines. Also, the -glyph outline may be taken into account when formatting.

                            - -

                            Punctuation (i.e, characters defined in Unicode in the "open" (Ps), -"close" (Pe), "initial" (Pi). "final" (Pf) and "other" (Po) -punctuation classes), that precedes or follows the first letter should -be included. [UNICODE]

                            - -
                            -

                            Quotes that precede the
-first letter should be included.

                            -
                            - -

                            The ::first-letter also applies if the first letter is -in fact a digit, e.g., the "6" in "67 million dollars is a lot of -money."

                            - -

                            In CSS, the ::first-letter pseudo-element applies to -block, list-item, table-cell, table-caption, and inline-block -elements. A future version of this specification -may allow this pesudo-element to apply to more element -types.

                            - -

                            The ::first-letter pseudo-element can be used with all -such elements that contain text, or that have a descendant in the same -flow that contains text. A UA should act as if the fictional start tag -of the ::first-letter pseudo-element is just before the first text of -the element, even if that first text is in a descendant.

                            - -
                            -

                            Example:

                            -

                            The fictional tag sequence for this HTMLfragment: -

                            <div>
                            -<p>The first text.
                            -

                            is: -

                            <div>
                            -<p><div::first-letter><p::first-letter>T</...></...>he first text.
                            -
                            - -

                            The first letter of a table-cell or inline-block cannot be the -first letter of an ancestor element. Thus, in <DIV><P -STYLE="display: inline-block">Hello<BR>Goodbye</P> -etcetera</DIV> the first letter of the div is not the -letter "H". In fact, the div doesn't have a first letter. - -

                            The first letter must occur on the first formatted line. For example, in -this fragment: <p><br>First... the first line -doesn't contain any letters and ::first-letter doesn't -match anything (assuming the default style for br in HTML -4). In particular, it does not match the "F" of "First." - -

                            In CSS, if an element is a list item ('display: list-item'), the -::first-letter applies to the first letter in the -principal box after the marker. UAs may ignore -::first-letter on list items with 'list-style-position: -inside'. If an element has ::before or -::after content, the ::first-letter applies -to the first letter of the element including that content. - -

                            -

                            Example:

                            -

                            After the rule 'p::before {content: "Note: "}', the selector -'p::first-letter' matches the "N" of "Note".

                            -
                            - -

                            Some languages may have specific rules about how to treat certain -letter combinations. In Dutch, for example, if the letter combination -"ij" appears at the beginning of a word, both letters should be -considered within the ::first-letter pseudo-element. - -

                            If the letters that would form the ::first-letter are not in the -same element, such as "'T" in <p>'<em>T..., the UA -may create a ::first-letter pseudo-element from one of the elements, -both elements, or simply not create a pseudo-element.

                            - -

                            Similarly, if the first letter(s) of the block are not at the start -of the line (for example due to bidirectional reordering), then the UA -need not create the pseudo-element(s). - -

                            -

                            Example:

                            -

                            The following example illustrates -how overlapping pseudo-elements may interact. The first letter of -each P element will be green with a font size of '24pt'. The rest of -the first formatted line will be 'blue' while the rest of the -paragraph will be 'red'.

                            - -
                            p { color: red; font-size: 12pt }
                            -p::first-letter { color: green; font-size: 200% }
                            -p::first-line { color: blue }
                            -
                            -<P>Some text that ends up on two lines</P>
                            - -

                            Assuming that a line break will occur before the word "ends", the -fictional tag -sequence for this fragment might be:

                            - -
                            <P>
                            -<P::first-line>
                            -<P::first-letter> 
                            -S 
                            -</P::first-letter>ome text that 
                            -</P::first-line> 
                            -ends up on two lines 
                            -</P>
                            - -

                            Note that the ::first-letter element is inside the ::first-line -element. Properties set on ::first-line are inherited by -::first-letter, but are overridden if the same property is set on -::first-letter.

                            -
                            - - -

                            7.3. The ::selection pseudo-element

                            - -

                            The ::selection pseudo-element applies to the portion -of a document that has been highlighted by the user. This also -applies, for example, to selected text within an editable text -field. This pseudo-element should not be confused with the :checked pseudo-class (which used to be -named :selected) - -

                            Although the ::selection pseudo-element is dynamic in -nature, and is altered by user action, it is reasonable to expect that -when a UA re-renders to a static medium (such as a printed page, see -[CSS21]) which was originally rendered to a -dynamic medium (like screen), the UA may wish to transfer the current -::selection state to that other medium, and have all the -appropriate formatting and rendering take effect as well. This is not -required — UAs may omit the ::selection -pseudo-element for static media. - -

                            These are the CSS properties that apply to ::selection -pseudo-elements: color, background, cursor (optional), outline -(optional). The computed value of the 'background-image' property on -::selection may be ignored. - - -

                            7.4. The ::before and ::after pseudo-elements

                            - -

                            The ::before and ::after pseudo-elements -can be used to describe generated content before or after an element's -content. They are explained in CSS 2.1 [CSS21].

                            - -

                            When the ::first-letter and ::first-line -pseudo-elements are combined with ::before and -::after, they apply to the first letter or line of the -element including the inserted text.

                            - -

                            8. Combinators

                            - -

                            8.1. Descendant combinator

                            - -

                            At times, authors may want selectors to describe an element that is -the descendant of another element in the document tree (e.g., "an -EM element that is contained within an H1 -element"). Descendant combinators express such a relationship. A -descendant combinator is white space that -separates two sequences of simple selectors. A selector of the form -"A B" represents an element B that is an -arbitrary descendant of some ancestor element A. - -

                            -

                            Examples:

                            -

                            For example, consider the following selector:

                            -
                            h1 em
                            -

                            It represents an em element being the descendant of - an h1 element. It is a correct and valid, but partial, - description of the following fragment:

                            -
                            <h1>This <span class="myclass">headline
                            -is <em>very</em> important</span></h1>
                            -

                            The following selector:

                            -
                            div * p
                            -

                            represents a p element that is a grandchild or later - descendant of a div element. Note the whitespace on - either side of the "*" is not part of the universal selector; the - whitespace is a combinator indicating that the DIV must be the - ancestor of some element, and that that element must be an ancestor - of the P.

                            -

                            The following selector, which combines descendant combinators and - attribute selectors, represents an - element that (1) has the href attribute set and (2) is - inside a p that is itself inside a div:

                            -
                            div p *[href]
                            -
                            - -

                            8.2. Child combinators

                            - -

                            A child combinator describes a childhood relationship -between two elements. A child combinator is made of the -"greater-than sign" (>) character and -separates two sequences of simple selectors. - - -

                            -

                            Examples:

                            -

                            The following selector represents a p element that is - child of body:

                            -
                            body > p
                            -

                            The following example combines descendant combinators and child - combinators.

                            -
                            div ol>li p
                            -

                            It represents a p element that is a descendant of an - li element; the li element must be the - child of an ol element; the ol element must - be a descendant of a div. Notice that the optional white - space around the ">" combinator has been left out.

                            -
                            - -

                            For information on selecting the first child of an element, please -see the section on the :first-child pseudo-class -above.

                            - -

                            8.3. Sibling combinators

                            - -

                            There are two different sibling combinators: the adjacent sibling -combinator and the general sibling combinator. In both cases, -non-element nodes (e.g. text between elements) are ignored when -considering adjacency of elements.

                            - -

                            8.3.1. Adjacent sibling combinator

                            - -

                            The adjacent sibling combinator is made of the "plus -sign" (U+002B, +) character that separates two -sequences of simple selectors. The elements represented by the two -sequences share the same parent in the document tree and the element -represented by the first sequence immediately precedes the element -represented by the second one.

                            - -
                            -

                            Examples:

                            -

                            The following selector represents a p element - immediately following a math element:

                            -
                            math + p
                            -

                            The following selector is conceptually similar to the one in the - previous example, except that it adds an attribute selector — it - adds a constraint to the h1 element, that it must have - class="opener":

                            -
                            h1.opener + h2
                            -
                            - - -

                            8.3.2. General sibling combinator

                            - -

                            The general sibling combinator is made of the "tilde" -(U+007E, ~) character that separates two sequences of -simple selectors. The elements represented by the two sequences share -the same parent in the document tree and the element represented by -the first sequence precedes (not necessarily immediately) the element -represented by the second one.

                            - -
                            -

                            Example:

                            -
                            h1 ~ pre
                            -

                            represents a pre element following an h1. It - is a correct and valid, but partial, description of:

                            -
                            <h1>Definition of the function a</h1>
                            -<p>Function a(x) has to be applied to all figures in the table.</p>
                            -<pre>function a(x) = 12x/13.5</pre>
                            -
                            - -

                            9. Calculating a selector's specificity

                            - -

                            A selector's specificity is calculated as follows:

                            - -
                              -
                            • count the number of ID selectors in the selector (= a)
                            • -
                            • count the number of class selectors, attributes selectors, and pseudo-classes in the selector (= b)
                            • -
                            • count the number of element names in the selector (= c)
                            • -
                            • ignore pseudo-elements
                            • -
                            - -

                            Selectors inside the negation pseudo-class -are counted like any other, but the negation itself does not count as -a pseudo-class.

                            - -

                            Concatenating the three numbers a-b-c (in a number system with a -large base) gives the specificity.

                            - -
                            -

                            Examples:

                            -
                            *               /* a=0 b=0 c=0 -> specificity =   0 */
                            -LI              /* a=0 b=0 c=1 -> specificity =   1 */
                            -UL LI           /* a=0 b=0 c=2 -> specificity =   2 */
                            -UL OL+LI        /* a=0 b=0 c=3 -> specificity =   3 */
                            -H1 + *[REL=up]  /* a=0 b=1 c=1 -> specificity =  11 */
                            -UL OL LI.red    /* a=0 b=1 c=3 -> specificity =  13 */
                            -LI.red.level    /* a=0 b=2 c=1 -> specificity =  21 */
                            -#x34y           /* a=1 b=0 c=0 -> specificity = 100 */
                            -#s12:not(FOO)   /* a=1 b=0 c=1 -> specificity = 101 */
                            -
                            -
                            - -

                            Note: the specificity of the styles -specified in an HTML style attribute is described in CSS -2.1. [CSS21].

                            - -

                            10. The grammar of Selectors

                            - -

                            10.1. Grammar

                            - -

                            The grammar below defines the syntax of Selectors. It is globally -LL(1) and can be locally LL(2) (but note that most UA's should not use -it directly, since it doesn't express the parsing conventions). The -format of the productions is optimized for human consumption and some -shorthand notations beyond Yacc (see [YACC]) -are used:

                            - -
                              -
                            • *: 0 or more -
                            • +: 1 or more -
                            • ?: 0 or 1 -
                            • |: separates alternatives -
                            • [ ]: grouping
                            • -
                            - -

                            The productions are:

                            - -
                            selectors_group
                            -  : selector [ COMMA S* selector ]*
                            -  ;
                            -
                            -selector
                            -  : simple_selector_sequence [ combinator simple_selector_sequence ]*
                            -  ;
                            -
                            -combinator
                            -  /* combinators can be surrounded by white space */
                            -  : PLUS S* | GREATER S* | TILDE S* | S+
                            -  ;
                            -
                            -simple_selector_sequence
                            -  : [ type_selector | universal ]
                            -    [ HASH | class | attrib | pseudo | negation ]*
                            -  | [ HASH | class | attrib | pseudo | negation ]+
                            -  ;
                            -
                            -type_selector
                            -  : [ namespace_prefix ]? element_name
                            -  ;
                            -
                            -namespace_prefix
                            -  : [ IDENT | '*' ]? '|'
                            -  ;
                            -
                            -element_name
                            -  : IDENT
                            -  ;
                            -
                            -universal
                            -  : [ namespace_prefix ]? '*'
                            -  ;
                            -
                            -class
                            -  : '.' IDENT
                            -  ;
                            -
                            -attrib
                            -  : '[' S* [ namespace_prefix ]? IDENT S*
                            -        [ [ PREFIXMATCH |
                            -            SUFFIXMATCH |
                            -            SUBSTRINGMATCH |
                            -            '=' |
                            -            INCLUDES |
                            -            DASHMATCH ] S* [ IDENT | STRING ] S*
                            -        ]? ']'
                            -  ;
                            -
                            -pseudo
                            -  /* '::' starts a pseudo-element, ':' a pseudo-class */
                            -  /* Exceptions: :first-line, :first-letter, :before and :after. */
                            -  /* Note that pseudo-elements are restricted to one per selector and */
                            -  /* occur only in the last simple_selector_sequence. */
                            -  : ':' ':'? [ IDENT | functional_pseudo ]
                            -  ;
                            -
                            -functional_pseudo
                            -  : FUNCTION S* expression ')'
                            -  ;
                            -
                            -expression
                            -  /* In CSS3, the expressions are identifiers, strings, */
                            -  /* or of the form "an+b" */
                            -  : [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+
                            -  ;
                            -
                            -negation
                            -  : NOT S* negation_arg S* ')'
                            -  ;
                            -
                            -negation_arg
                            -  : type_selector | universal | HASH | class | attrib | pseudo
                            -  ;
                            - - -

                            10.2. Lexical scanner

                            - -

                            The following is the tokenizer, written in Flex (see -[FLEX]) notation. The tokenizer is -case-insensitive.

                            - -

                            The two occurrences of "\377" represent the highest character -number that current versions of Flex can deal with (decimal 255). They -should be read as "\4177777" (decimal 1114111), which is the highest -possible code point in Unicode/ISO-10646. [UNICODE]

                            - -
                            %option case-insensitive
                            -
                            -ident     [-]?{nmstart}{nmchar}*
                            -name      {nmchar}+
                            -nmstart   [_a-z]|{nonascii}|{escape}
                            -nonascii  [^\0-\177]
                            -unicode   \\[0-9a-f]{1,6}(\r\n|[ \n\r\t\f])?
                            -escape    {unicode}|\\[^\n\r\f0-9a-f]
                            -nmchar    [_a-z0-9-]|{nonascii}|{escape}
                            -num       [0-9]+|[0-9]*\.[0-9]+
                            -string    {string1}|{string2}
                            -string1   \"([^\n\r\f\\"]|\\{nl}|{nonascii}|{escape})*\"
                            -string2   \'([^\n\r\f\\']|\\{nl}|{nonascii}|{escape})*\'
                            -invalid   {invalid1}|{invalid2}
                            -invalid1  \"([^\n\r\f\\"]|\\{nl}|{nonascii}|{escape})*
                            -invalid2  \'([^\n\r\f\\']|\\{nl}|{nonascii}|{escape})*
                            -nl        \n|\r\n|\r|\f
                            -w         [ \t\r\n\f]*
                            -
                            -%%
                            -
                            -[ \t\r\n\f]+     return S;
                            -
                            -"~="             return INCLUDES;
                            -"|="             return DASHMATCH;
                            -"^="             return PREFIXMATCH;
                            -"$="             return SUFFIXMATCH;
                            -"*="             return SUBSTRINGMATCH;
                            -{ident}          return IDENT;
                            -{string}         return STRING;
                            -{ident}"("       return FUNCTION;
                            -{num}            return NUMBER;
                            -"#"{name}        return HASH;
                            -{w}"+"           return PLUS;
                            -{w}">"           return GREATER;
                            -{w}","           return COMMA;
                            -{w}"~"           return TILDE;
                            -":not("          return NOT;
                            -@{ident}         return ATKEYWORD;
                            -{invalid}        return INVALID;
                            -{num}%           return PERCENTAGE;
                            -{num}{ident}     return DIMENSION;
                            -"<!--"           return CDO;
                            -"-->"            return CDC;
                            -
                            -"url("{w}{string}{w}")"                           return URI;
                            -"url("{w}([!#$%&*-~]|{nonascii}|{escape})*{w}")"  return URI;
                            -U\+[0-9a-f?]{1,6}(-[0-9a-f]{1,6})?                return UNICODE_RANGE;
                            -
                            -\/\*[^*]*\*+([^/*][^*]*\*+)*\/                    /* ignore comments */
                            -
                            -.                return *yytext;
                            - - - -

                            11. Namespaces and down-level clients

                            - -

                            An important issue is the interaction of CSS selectors with XML -documents in web clients that were produced prior to this -document. Unfortunately, due to the fact that namespaces must be -matched based on the URI which identifies the namespace, not the -namespace prefix, some mechanism is required to identify namespaces in -CSS by their URI as well. Without such a mechanism, it is impossible -to construct a CSS style sheet which will properly match selectors in -all cases against a random set of XML documents. However, given -complete knowledge of the XML document to which a style sheet is to be -applied, and a limited use of namespaces within the XML document, it -is possible to construct a style sheet in which selectors would match -elements and attributes correctly.

                            - -

                            It should be noted that a down-level CSS client will (if it -properly conforms to CSS forward compatible parsing rules) ignore all -@namespace at-rules, as well as all style rules that make -use of namespace qualified element type or attribute selectors. The -syntax of delimiting namespace prefixes in CSS was deliberately chosen -so that down-level CSS clients would ignore the style rules rather -than possibly match them incorrectly.

                            - -

                            The use of default namespaces in CSS makes it possible to write -element type selectors that will function in both namespace aware CSS -clients as well as down-level clients. It should be noted that -down-level clients may incorrectly match selectors against XML -elements in other namespaces.

                            - -

                            The following are scenarios and examples in which it is possible to -construct style sheets which would function properly in web clients -that do not implement this proposal.

                            - -
                              -
                            1. - -

                              The XML document does not use namespaces.

                              - -
                                - -
                              • In this case, it is obviously not necessary to declare or use - namespaces in the style sheet. Standard CSS element type and - attribute selectors will function adequately in a down-level - client.
                              • - -
                              • In a CSS namespace aware client, the default behavior of - element selectors matching without regard to namespace will - function properly against all elements, since no namespaces are - present. However, the use of specific element type selectors that - match only elements that have no namespace ("|name") - will guarantee that selectors will match only XML elements that do - not have a declared namespace.
                              • - -
                              - -
                            2. - -
                            3. - -

                              The XML document defines a single, default namespace used - throughout the document. No namespace prefixes are used in element - names.

                              - -
                                - -
                              • In this case, a down-level client will function as if - namespaces were not used in the XML document at all. Standard CSS - element type and attribute selectors will match against all - elements.
                              • - -
                              - -
                            4. - -
                            5. - -

                              The XML document does not use a default namespace, all - namespace prefixes used are known to the style sheet author, and - there is a direct mapping between namespace prefixes and namespace - URIs. (A given prefix may only be mapped to one namespace URI - throughout the XML document; there may be multiple prefixes mapped - to the same URI).

                              - -
                                - -
                              • In this case, the down-level client will view and match - element type and attribute selectors based on their fully - qualified name, not the local part as outlined in the Type selectors and Namespaces section. CSS - selectors may be declared using an escaped colon "\:" - to describe the fully qualified names, e.g. - "html\:h1" will match - <html:h1>. Selectors using the qualified name - will only match XML elements that use the same prefix. Other - namespace prefixes used in the XML that are mapped to the same URI - will not match as expected unless additional CSS style rules are - declared for them.
                              • - -
                              • Note that selectors declared in this fashion will - only match in down-level clients. A CSS namespace aware - client will match element type and attribute selectors based on - the name's local part. Selectors declared with the fully - qualified name will not match (unless there is no namespace prefix - in the fully qualified name).
                              • - -
                              - -
                            6. - -
                            - -

                            In other scenarios: when the namespace prefixes used in the XML are -not known in advance by the style sheet author; or a combination of -elements with no namespace are used in conjunction with elements using -a default namespace; or the same namespace prefix is mapped to -different namespace URIs within the same document, or in -different documents; it is impossible to construct a CSS style sheet -that will function properly against all elements in those documents, -unless, the style sheet is written using a namespace URI syntax (as -outlined in this document or similar) and the document is processed by -a CSS and XML namespace aware client.

                            - -

                            12. Profiles

                            - -

                            Each specification using Selectors must define the subset of W3C -Selectors it allows and excludes, and describe the local meaning of -all the components of that subset.

                            - -

                            Non normative examples: - -

                            - - - - - - - - - - - - - - - -
                            Selectors profile
                            SpecificationCSS level 1
                            Acceptstype selectors
                            class selectors
                            ID selectors
                            :link, - :visited and :active pseudo-classes
                            descendant combinator -
                            ::first-line and ::first-letter pseudo-elements
                            Excludes - -

                            universal selector
                            attribute selectors
                            :hover and :focus - pseudo-classes
                            :target pseudo-class
                            :lang() pseudo-class
                            all UI - element states pseudo-classes
                            all structural - pseudo-classes
                            negation pseudo-class
                            all - UI element fragments pseudo-elements
                            ::before and ::after - pseudo-elements
                            child combinators
                            sibling combinators - -

                            namespaces

                            Extra constraintsonly one class selector allowed per sequence of simple - selectors


                            - - - - - - - - - - - - - - - -
                            Selectors profile
                            SpecificationCSS level 2
                            Acceptstype selectors
                            universal selector
                            attribute presence and - values selectors
                            class selectors
                            ID selectors
                            :link, :visited, - :active, :hover, :focus, :lang() and :first-child pseudo-classes -
                            descendant combinator
                            child combinator
                            adjacent sibling - combinator
                            ::first-line and ::first-letter pseudo-elements
                            ::before - and ::after pseudo-elements
                            Excludes - -

                            content selectors
                            substring matching attribute - selectors
                            :target pseudo-classes
                            all UI element - states pseudo-classes
                            all structural pseudo-classes other - than :first-child
                            negation pseudo-class
                            all UI element - fragments pseudo-elements
                            general sibling combinators - -

                            namespaces

                            Extra constraintsmore than one class selector per sequence of simple selectors (CSS1 - constraint) allowed
                            - -

                            In CSS, selectors express pattern matching rules that determine which style -rules apply to elements in the document tree. - -

                            The following selector (CSS level 2) will match all anchors a -with attribute name set inside a section 1 header h1: -

                            h1 a[name]
                            - -

                            All CSS declarations attached to such a selector are applied to elements -matching it.

                            - -
                            - - - - - - - - - - - - - - - - -
                            Selectors profile
                            SpecificationSTTS 3
                            Accepts - -

                            type selectors
                            universal selectors
                            attribute selectors
                            class - selectors
                            ID selectors
                            all structural pseudo-classes
                            - all combinators - -

                            namespaces

                            Excludesnon-accepted pseudo-classes
                            pseudo-elements
                            Extra constraintssome selectors and combinators are not allowed in fragment - descriptions on the right side of STTS declarations.
                            - -

                            Selectors can be used in STTS 3 in two different - manners: -

                              -
                            1. a selection mechanism equivalent to CSS selection mechanism: declarations - attached to a given selector are applied to elements matching that selector, -
                            2. fragment descriptions that appear on the right side of declarations. -
                            - -

                            13. Conformance and requirements

                            - -

                            This section defines conformance with the present specification only. - -

                            The inability of a user agent to implement part of this specification due to -the limitations of a particular device (e.g., non interactive user agents will -probably not implement dynamic pseudo-classes because they make no sense without -interactivity) does not imply non-conformance. - -

                            All specifications reusing Selectors must contain a Profile listing the -subset of Selectors it accepts or excludes, and describing the constraints -it adds to the current specification. - -

                            Invalidity is caused by a parsing error, e.g. an unrecognized token or a token -which is not allowed at the current parsing point. - -

                            User agents must observe the rules for handling parsing errors: -

                              -
                            • a simple selector containing an undeclared namespace prefix is invalid
                            • -
                            • a selector containing an invalid simple selector, an invalid combinator - or an invalid token is invalid.
                            • -
                            • a group of selectors containing an invalid selector is invalid.
                            • -
                            - -

                            Specifications reusing Selectors must define how to handle parsing -errors. (In the case of CSS, the entire rule in which the selector is -used is dropped.)

                            - - - -

                            14. Tests

                            - -

                            This specification has a test -suite allowing user agents to verify their basic conformance to -the specification. This test suite does not pretend to be exhaustive -and does not cover all possible combined cases of Selectors.

                            - -

                            15. Acknowledgements

                            - -

                            The CSS working group would like to thank everyone who has sent -comments on this specification over the years.

                            - -

                            The working group would like to extend special thanks to Donna -McManus, Justin Baker, Joel Sklar, and Molly Ives Brower who perfermed -the final editorial review.

                            - -

                            16. References

                            - -
                            - -
                            [CSS1] -
                            Bert Bos, Håkon Wium Lie; "Cascading Style Sheets, level 1", W3C Recommendation, 17 Dec 1996, revised 11 Jan 1999 -
                            (http://www.w3.org/TR/REC-CSS1) - -
                            [CSS21] -
                            Bert Bos, Tantek Çelik, Ian Hickson, Håkon Wium Lie, editors; "Cascading Style Sheets, level 2 revision 1", W3C Working Draft, 13 June 2005 -
                            (http://www.w3.org/TR/CSS21) - -
                            [CWWW] -
                            Martin J. Dürst, François Yergeau, Misha Wolf, Asmus Freytag, Tex Texin, editors; "Character Model for the World Wide Web", W3C Recommendation, 15 February 2005 -
                            (http://www.w3.org/TR/charmod/) - -
                            [FLEX] -
                            "Flex: The Lexical Scanner Generator", Version 2.3.7, ISBN 1882114213 - -
                            [HTML4] -
                            Dave Ragget, Arnaud Le Hors, Ian Jacobs, editors; "HTML 4.01 Specification", W3C Recommendation, 24 December 1999 -
                            (http://www.w3.org/TR/html4/) - -
                            [MATH] -
                            Patrick Ion, Robert Miner, editors; "Mathematical Markup Language (MathML) 1.01", W3C Recommendation, revision of 7 July 1999 -
                            (http://www.w3.org/TR/REC-MathML/) - -
                            [RFC3066] -
                            H. Alvestrand; "Tags for the Identification of Languages", Request for Comments 3066, January 2001 -
                            (http://www.ietf.org/rfc/rfc3066.txt) - -
                            [STTS] -
                            Daniel Glazman; "Simple Tree Transformation Sheets 3", Electricité de France, submission to the W3C, 11 November 1998 -
                            (http://www.w3.org/TR/NOTE-STTS3) - -
                            [SVG] -
                            Jon Ferraiolo, 藤沢 淳, Dean Jackson, editors; "Scalable Vector Graphics (SVG) 1.1 Specification", W3C Recommendation, 14 January 2003 -
                            (http://www.w3.org/TR/SVG/) - -
                            [UNICODE]
                            -
                            The Unicode Standard, Version 4.1, The Unicode Consortium. Boston, MA, Addison-Wesley, March 2005. ISBN 0-321-18578-1, as amended by Unicode 4.0.1 and Unicode 4.1.0. -
                            (http://www.unicode.org/versions/)
                            - -
                            [XML10] -
                            Tim Bray, Jean Paoli, C. M. Sperberg-McQueen, Eve Maler, François Yergeau, editors; "Extensible Markup Language (XML) 1.0 (Third Edition)", W3C Recommendation, 4 February 2004 -
                            (http://www.w3.org/TR/REC-xml/) - -
                            [XMLNAMES] -
                            Tim Bray, Dave Hollander, Andrew Layman, editors; "Namespaces in XML", W3C Recommendation, 14 January 1999 -
                            (http://www.w3.org/TR/REC-xml-names/) - -
                            [YACC] -
                            S. C. Johnson; "YACC — Yet another compiler compiler", Technical Report, Murray Hill, 1975 - -
                            \ No newline at end of file diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/table.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/table.html new file mode 100644 index 0000000000..0fd7b8c95f --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/table.html @@ -0,0 +1,122 @@ + + + +Basic editor functionality tests + + + + + + + + + + +

                            Plugin Dependency Functional tests

                            +

                            +
                            +

                            +
                              + + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.EditorCommands.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.EditorCommands.html new file mode 100644 index 0000000000..7bb2378b32 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.EditorCommands.html @@ -0,0 +1,334 @@ + + + +Unit tests for tinymce.EditorCommands + + + + + + + + + +

                              Unit tests for tinymce.EditorCommands

                              +

                              +
                              +

                              +
                                + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/formatting_apply.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.Formatter_apply.html similarity index 69% rename from TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/formatting_apply.html rename to TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.Formatter_apply.html index 7ba355d8e2..aeb5ab76c6 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/formatting_apply.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.Formatter_apply.html @@ -1,729 +1,971 @@ - - - -Unit tests for apply formatting - - - - - - - - -

                                Unit tests for text formatting

                                -

                                -
                                -

                                -
                                  - - - - + + + +Unit tests for apply formatting + + + + + + + + + +

                                  Unit tests for text formatting

                                  +

                                  +
                                  +

                                  +
                                    + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/formatting_check.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.Formatter_check.html similarity index 96% rename from TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/formatting_check.html rename to TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.Formatter_check.html index b5f57d5b10..0dccbb8a7b 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/formatting_check.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.Formatter_check.html @@ -2,10 +2,11 @@ Unit tests for check formatting + - + - + + + + + + + +

                                    tinymce.UndoManager tests

                                    +

                                    +
                                    +

                                    +
                                      +
                                      + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/api_prototype.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.DOMUtils.html similarity index 58% rename from TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/api_prototype.html rename to TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.DOMUtils.html index b6ca5eded5..b130a3e72a 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/api_prototype.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.DOMUtils.html @@ -1,22 +1,24 @@ -Unit tests for the TinyMCE core API (prototype) +Unit tests for tinymce.dom.DOMUtils + - - - - + -

                                      Unit tests for the TinyMCE core API (prototype)

                                      + + +

                                      Unit tests for tinymce.dom.DOMUtils

                                        +
                                        - \ No newline at end of file + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/api_jquery.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.DOMUtils_jquery.html similarity index 58% rename from TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/api_jquery.html rename to TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.DOMUtils_jquery.html index cc801d91f4..1e787f2f35 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/api_jquery.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.DOMUtils_jquery.html @@ -1,23 +1,25 @@ -Unit tests for the TinyMCE core API (jquery) - +Unit tests for tinymce.dom.DOMUtils + - - + - -

                                        Unit tests for the TinyMCE core API (jquery)

                                        + + +

                                        Unit tests for tinymce.dom.DOMUtils

                                          +
                                          - \ No newline at end of file + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.EventUtils.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.EventUtils.html new file mode 100644 index 0000000000..d827655dba --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.EventUtils.html @@ -0,0 +1,153 @@ + + + +Unit tests for DOM Selection IE implementation + + + + + + + + + +

                                          Unit tests for DOM Selection IE implementation

                                          +

                                          +
                                          +

                                          +
                                            +
                                            + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Range.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Range.html new file mode 100644 index 0000000000..c5b92c5d40 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Range.html @@ -0,0 +1,579 @@ + + + +Unit tests for DOM Range IE implementation + + + + + + + + + +

                                            Unit tests for DOM Range IE implementation

                                            +

                                            +
                                            +

                                            +
                                              +
                                              +

                                              first strong strong second em strong.

                                              +

                                              bar

                                              +

                                              some textem textmore text

                                              + + + + + + + + + +
                                              1abc
                                              34
                                              +

                                              textabcspan

                                              +
                                              + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Selection.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Selection.html new file mode 100644 index 0000000000..198275f1a5 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Selection.html @@ -0,0 +1,650 @@ + + + +Unit tests for tinymce.dom.Selection + + + + + + + + + +

                                              Unit tests for tinymce.dom.Selection

                                              +

                                              +
                                              +

                                              +
                                                + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Serializer.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Serializer.html new file mode 100644 index 0000000000..c9589ae611 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.Serializer.html @@ -0,0 +1,390 @@ + + + +Unit tests for tinymce.dom.Serializer + + + + + + + + + +

                                                Unit tests for tinymce.dom.Serializer

                                                +

                                                +
                                                +

                                                +
                                                  +
                                                  +
                                                  +
                                                  + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/ie_selection.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.TridentSelection.html similarity index 50% rename from TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/ie_selection.html rename to TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.TridentSelection.html index d66a3e0a7c..9bcc74eb77 100644 --- a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/ie_selection.html +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.dom.TridentSelection.html @@ -2,10 +2,11 @@ Unit tests for DOM Selection IE implementation + - + + + + + + + +

                                                  tinymce.html.DomParser tests

                                                  +

                                                  +
                                                  +

                                                  +
                                                    +
                                                    + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Entities.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Entities.html new file mode 100644 index 0000000000..0b0de6742f --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Entities.html @@ -0,0 +1,96 @@ + + + +tinymce.html.Entities tests + + + + + + + + + +

                                                    tinymce.html.Entities tests

                                                    +

                                                    +
                                                    +

                                                    +
                                                      +
                                                      + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Node.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Node.html new file mode 100644 index 0000000000..e01c27c2cb --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Node.html @@ -0,0 +1,461 @@ + + + +tinymce.html.Node tests + + + + + + + + + +

                                                      tinymce.html.Node tests

                                                      +

                                                      +
                                                      +

                                                      +
                                                        +
                                                        + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.SaxParser.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.SaxParser.html new file mode 100644 index 0000000000..94710cbf33 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.SaxParser.html @@ -0,0 +1,532 @@ + + + +tinymce.html.SaxParser tests + + + + + + + + + +

                                                        tinymce.html.SaxParser tests

                                                        +

                                                        +
                                                        +

                                                        +
                                                          +
                                                          + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Schema.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Schema.html new file mode 100644 index 0000000000..b4be871c8b --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Schema.html @@ -0,0 +1,270 @@ + + + +tinymce.html.Schema tests + + + + + + + + + +

                                                          tinymce.html.Schema tests

                                                          +

                                                          +
                                                          +

                                                          +
                                                            +
                                                            + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Serializer.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Serializer.html new file mode 100644 index 0000000000..dbbba7765c --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Serializer.html @@ -0,0 +1,44 @@ + + + +tinymce.html.Serializer tests + + + + + + + + + +

                                                            tinymce.html.Serializer tests

                                                            +

                                                            +
                                                            +

                                                            +
                                                              +
                                                              + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Styles.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Styles.html new file mode 100644 index 0000000000..b1e6373c13 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Styles.html @@ -0,0 +1,110 @@ + + + +tinymce.html.Styles tests + + + + + + + + + +

                                                              tinymce.html.Styles tests

                                                              +

                                                              +
                                                              +

                                                              +
                                                                +
                                                                + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Writer.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Writer.html new file mode 100644 index 0000000000..f3da3d4873 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.html.Writer.html @@ -0,0 +1,172 @@ + + + +tinymce.html.Writer tests + + + + + + + + + +

                                                                tinymce.html.Writer tests

                                                                +

                                                                +
                                                                +

                                                                +
                                                                  +
                                                                  + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.Cookie.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.Cookie.html new file mode 100644 index 0000000000..9d1487c024 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.Cookie.html @@ -0,0 +1,43 @@ + + + +tinymce.util.Cookie tests + + + + + + + + + +

                                                                  tinymce.util.Cookie tests

                                                                  +

                                                                  +
                                                                  +

                                                                  +
                                                                    +
                                                                    + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.Dispatcher.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.Dispatcher.html new file mode 100644 index 0000000000..b661f9e235 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.Dispatcher.html @@ -0,0 +1,74 @@ + + + +tinymce.util.Dispatcher tests + + + + + + + + + +

                                                                    tinymce.util.Dispatcher tests

                                                                    +

                                                                    +
                                                                    +

                                                                    +
                                                                      +
                                                                      + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.JSON.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.JSON.html new file mode 100644 index 0000000000..b03ceacb41 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.JSON.html @@ -0,0 +1,37 @@ + + + +tinymce.util.JSON tests + + + + + + + + + +

                                                                      tinymce.util.JSON tests

                                                                      +

                                                                      +
                                                                      +

                                                                      +
                                                                        +
                                                                        + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.JSONRequest.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.JSONRequest.html new file mode 100644 index 0000000000..e5fa18676b --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.JSONRequest.html @@ -0,0 +1,99 @@ + + + +tinymce.util.JSONRequest tests + + + + + + + + + +

                                                                        tinymce.util.JSONRequest tests

                                                                        +

                                                                        +
                                                                        +

                                                                        +
                                                                          +
                                                                          + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.URI.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.URI.html new file mode 100644 index 0000000000..b4a00d049f --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.URI.html @@ -0,0 +1,88 @@ + + + +tinymce.util.URI tests + + + + + + + + + +

                                                                          tinymce.html.Entities tests

                                                                          +

                                                                          +
                                                                          +

                                                                          +
                                                                            +
                                                                            + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.XHR.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.XHR.html new file mode 100644 index 0000000000..23f028f723 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/tinymce.util.XHR.html @@ -0,0 +1,67 @@ + + + +tinymce.util.XHR tests + + + + + + + + + +

                                                                            tinymce.util.XHR tests

                                                                            +

                                                                            +
                                                                            +

                                                                            +
                                                                              +
                                                                              + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/undo.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/undo.html new file mode 100644 index 0000000000..b657752d6f --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/undo.html @@ -0,0 +1,112 @@ + + + +Undo Tests + + + + + + + + +

                                                                              Undo Tests

                                                                              +

                                                                              +
                                                                              +

                                                                              +
                                                                                +
                                                                                + +
                                                                                + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/wordcount.html b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/wordcount.html new file mode 100644 index 0000000000..ef85dc9004 --- /dev/null +++ b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tests/wordcount.html @@ -0,0 +1,113 @@ + + + +Unit tests for the Wordcount plugin + + + + + + + + + + +

                                                                                Unit tests for the Wordcount plugin

                                                                                +

                                                                                +
                                                                                +

                                                                                +
                                                                                  + +
                                                                                  + Current Count: +
                                                                                  + + + + + diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/js_build_tools.jar b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/js_build_tools.jar index 60b0f9f8e904902ec46cf3720c3679f27ccc1e49..89c109d772c8a71a9a9e75d527b9713215c3a59a 100644 GIT binary patch delta 20413 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 delta 14230 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 X1Ki3cLdFNf2mAGVK=JtgL;n8&J$1Rq diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/svnClientAdapter.jar b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/svnClientAdapter.jar deleted file mode 100644 index 225fb199ef86bb013b41439433f2ea626a9fcae5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205053 zcmbrm1#l$Ek}axMiwBEpJFG}0nbF-ToUW0higa-GCS1{w+>4L`Vqt-5+!!;? z6Zm&)qhbFs6y5ZAee$)XAERGU&hpB*?hH?Y*jGF4e9%n=212XPP%+s1|4Q()%o?dkDMNAh(E~ zX#z@riz-25h_Mr89$jY8{%gnp|1sqMiVo1%9~*nq|E34zUp*YnP3_Gc{+o^{fA8qv zWZ-OU?_h3Y{a>#6cjb`&|6b$ZY;9<1ZfxzSZ=`SQXl(!A2x0u63o*2@veLIUvNX3g z{%-_w{ND+*)wg%}+l~IguP;&m=R@;#_6OL1LHS=0`hSh~hrYAEndN`E$Nz<_FX0yE zj{l7;>i_wDIXRkJ{wE3kG$BgOsv`nq0DxE?004pixhQ@E2S$)PVHVQcnBqp4^|7vYs~*09;Ve!0}^}#&{`|GN+f;L|7{>lGa=kI3;pOfXSMK zVq~@YP7xjoc7qi6vLl~JhGYdn^3wpm0vK6)PFQ7A+t`chg66dSw7vbb|D(s@a$`fP zWVWzU$!FG~$K!&1`_yxW@%hj~mqSSC=$2I=(L~qx9lt%c39g6@Pf$)rkRfqAcS4Rt zunh{)s5CZDA-MLe6ha;}C*RH~lmb{kN-A4pyu?muKkQpJQa%QccJLTOCVc)XS5acg zO=6h$26HxizQZbNAr$MF|LuWOF<%297w4dZ zYxVH008@aM|GU3J_6+Jc+@h7I&1c&Z;TuGRKXmBhE;!b3bU=Pcq3X#l|jF7 zQjIH_KFU(j!E}0ZxP20ZdEIh~Mvr0&{m{O^$CLvTwB6W=vO4@cl$m&5dICY*uV_Dw@1@GmqJnYc#E~a&9qYiXXT$jJ(lNH6@O|4i-()@cJo~ zs$&aKy*Mgn1bl}sqK0rX(KKr74#v=kV8bxgio48lDYPa!jSnACidxSt{eI1qBwm^l zfgQ2bi!b9GwLmT>zD`MYL4z?v?0%Q?O+w!S(N z`ou$~4Yx`3lmhner3-Z_+MiMSukDsMGyJ^LhDc#2DTa&vhXv4YvPG%V88Up#+1-{1 z))d#U&AQ4$P;5#|D|Jhe#=DZDH5Xvr?7AEWPECx_= zpSQ*^#$qGJxQ;s(I5oHWXEbH!!;svOcnAcGtXNC2Y!RtAe3Jc9JR(Wr~{6uauqOJ9Bor>_ZFD_aW^Aj@7ReoU+kF|AJdI}U(1 zY)6SFY$; jO&@T1Pk~0e9 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 z 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¬cv1Y_d3iPDKPIeQFD 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 R6Hx#kob2Gm{+qd<{s$+T*#7_k diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/svnjavahl.jar b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/svnjavahl.jar deleted file mode 100644 index 39963b6129d3203dc839b331f31e0947b9df8c67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86682 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 diff --git a/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/svnkit.jar b/TinyMCEPlugin/pub/System/TinyMCEPlugin/tinymce/tools/ant/svnkit.jar deleted file mode 100644 index a70ae44dde861bcfe917c4883114a33ecaa05be8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1658458 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%0DDw-A6OnIdUo0fOcH_eOHe1=WTwZfQ??j^ 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 z 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 ZO&$&ERCguy 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

                                                                                  T{jX#+(uUR_4=cs7W__ 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

                                                                                  bEDaoKV9C5}DwCG_q@L;G$`fMD>g&^uJe%Rz2!R4(4QG2uR2n1Wbf~lxHCr z5lj@A1PK!OtUHSWsN`u$CWd$pX5gY{)#_SbjeJ{RRIBBdD6E8kYbve1wQXv(t2-Ov zwzsyu8#^0no15C3Uew>Ke9Xzsw#B9=|^0`9(#b-wDw} z|NS)kE{kZqb|jt8KrQuBPDm~LPK#QfniT$0%}_tQ`4;}n2=Y5DR6hxOz9owByDiF} zv4VduiFQ6Qqkrf8Y)k$X>~~n8KX*kx`6?H)m-t(j>?hjqw&1^DpYw$Ft+w(#E7+e- zYCm=5ezc9x@=-kfV{iFWvhcUVg6n%-^zlp=^F5lyKlS_X$*=BLou~dM_x-27;5bVe zgHf0Xj;Rr}HYsE0#$47y9EG%8tnM5ay569$X5E@c63p3&lZhPa85GaYq@J1N_IJ9x zNl-YtltfD=CS9y{8ZP2&^YJ1~9?<49*+Mfb9T4OD%%(#cbZ-wflM~LSFB(rq^$O1i zx4s5G?Fu7s`i8`JbJSVAOcf&8${I>!t3riiAzGv=p)BWNCVphTRJw@oo?vut56GH9 zRX9HNkH-?t3nP4bz?)Ajy#ZB)ttDHRvDj7w$ycNS%VN;1!Qv$mB5@nlQT$jehq7D; zI$){$!+>W%MdRNj1JK_|h6tOy3{J!q6Btc5H0*F!RhKsr*CjEyGCSZZ`!euRO<(9E z-a)Q|75ggOI~D`7XJeLydaYx0E7xZ_&eRe9kudj^CPIsG2`VPu(zX}jLe|xAZuGLb zIE%oB6s?1E!y=MT>}0ZQc^wXl+<5>a#(QpZbxk85RN(kGtfY*&i%o78GZyn;NMbNjDB>{)LHc`6jgBr0m8b{B ze}5T}WN6H`^uM`e=D6UR+(x9wzibb$F1OKWHzZDUQDFr%lMe-p8OwLfMAW{vhr&3D zv~1&VoW+A4bFx}68Z}IJNC`$~Y0zLvXX2$bh#mL|tHnIY8n={|_f~T)VU8H9cbK_% zFVqf?K{*UXd6I7!zdeblBb@0l8TMWhZSz7BOx=ZpqFiJ8pAL&@I1vG1jDgFvozaan zKdEd1f0?obODS&<8V@QoFdUn5J^c+V&mG_(u>hfygOx3dXJncj#vMpls8CRI^-^Ns z{g}fQKeVWeJlTUzF#>^CtgcH%Eimd0&?a1Ihi6ro}RcAnoxG~b=pxd>vvUjXle~Faum*lg`7cSPnX3V^~boiwB;R8Fevdl@qF2uU}VEn8|8tJhZV#x z$;N415`;Z;1r{*kk!G+mf#Vaj0^HF=VZ@FgLshu}-u~1Syo%KE$-z&9(@V>&p+Gr_ zXKNyTq9U_58@&x=iP=An#kx2Nu8kXi&>2R$2=uKF(Gi>kYGB72z9NRpNmLdQpMnet zMg&&FWweTT8(oXlGHLHXc%nhc=hl@D0i9@AEL3LG0nV+u#L6*7T%{D^XQw};i`Z)PiteRy)$grx>k8tTX7bk{s~ux!TYV5wK;h*Xws4sSEvY?; z7DCF2H;^IUc+_dSlulWDgbulI)9YHXRxh{y#A30Z_r&p+0Dwp{XS4n=)&dB*Y8;zq zX?yezVY%#&WU>4;PStj59?=rZs<;vv2Dc%J_asGlA#CLb*K*J9!+EYNNlqi(JihSk zNwDtIAXx}){va&y5k2S>J(l*QRz9%I6UDt}$i2?T8gRlrGIFCeo|mnS1(I# zoDa)f{-ONkH?my*G4{(R7+>8}ZITr`(VBZ(q>%PUTnBD{y;J%-bjMWNyKt@qM4+V> zE@1z`TS&1uWH0#JWzYP(4rPs<5%96c+`>Z`0p`nt;f zc)zyhd}W%$+;BRB$7F7}{6qVxW_+>u3m$`g5Uk~rhQogQj$cYxM)a@>r^i%|K#x|9 zkr}Ja+}QC$^$0*)ak{<~F=RUiK~48GE{Qtuh;K9&6}@@PLdz))=2HAy%{E+Nit8$? zWu2LkoguFzTBQENfnQYVB@P8xs*|WhrgnBP%TjkOdy|wVZr#7nT8)ppy`SqnjILQ9 zn^PHsHd_(rUVU{FW~$y|HW*;+h|7WwJI$dfa%+W;+>aN4+G4N?<6&x*@8H2Hd-|x; za7kavFxJf$gQi&R2}MR$ggb=QfK#d2nV+BUQZ1@B$oc#@0Q|!qRD*lS5YN%`C9ayh zXqoU`v78h{+|E3M=@CCa1@uHE(bM|$oZHlhH~6} zGvoE7y!i!?DL{)!b!lksE$1%y#i3egNWqPWn+8EG=0AXunKe3{)LA^%5buZy_xwg7 zxQN(~xi}bIot2f%UZXvi!l6rU_s(CM{Kd!@w{LRxFqRz-#X#Z{kS#^|cxZ#pxZwEJBnR;RTWSNYFvo+YuiUd#2dph<50t6NWaknZwbRkp5yto;w z8jKeA4F(a2iv_Io-d4)x-Lcy9(0#xiw4JSl>NHZB#u=bsI+7njHZJ2FZ zt~(t~jPs)a(GDyL0f-(Gt#dyBeT8&?=4K=qdH5S!3)O99xP6K|Tml8@Z9^Z7s^sm^`01Up+Y zVJ?c!G2S^$EK7V^P!q0fvSd!@Ri>Q*MqJ5h^FCEYNL=W|(v2^_YF-psX^UMwHe}F) z=CB;9%C1$U5xXGJs*5iNY+)@k4vVnQkWGfX*?p7jhT%3De<(j#DAoe_g!5JVD@V@A z)}m0KIlC~OAYGxirO>)${hWuo&+jI#UBWHJxghEWhtwZ%EW^)Zev(LLIAoY_i@%0c zQru4nW~^wGU+(s1u11@dTF5Qrs@rRxC~}wUeMmm$z|D)i?yL#GYZAp}S$;3h6`E<3 zfPU1MJ8e`vY5gD0-XTbn_}khobXi@tZFkvKUAAr8wr$(CZSyVLwvDgPx&J%(&frFz z8<9E4Nsd737C2>zvHLbcHwY(QeiL22s>2{b3 zi(X^&FJsnX!h~iAWRFf>&~3^%z52l%p+#RLT@%52?B1WGS)YF7&~(atJ0V>})cjf? z_X#Rvg^D1YPU_KI8*=^whJOTSJdXW&! zLI%=c)PoWf&Z5tR1Ou}hnzy2)^^e&wA!ejxMl>4HMKe!Ixu)0_|EwqgiF)bOdm2LBwon+;bwKZmu2vR;7 zUS!ClhS(bP8T?p!?59EytYXw<14g?sY_sE|aNN9g38rPU>9Ceehl zDos&uN3zyLAE`S^yoKa#s(sQ6zV(2SGuQt@G`Pc0JcVm(hM2^sVMhpk653rSz6fSZ zrp>(Fc>{>nl}j;j33PSbeaI?hyXR)Lb%>QZ9>a^Sb<#;>r~Vrj+gydzym_`bL`%Hl z&Nz0G{X?BZgRQ|Km|%#GIS+iX`oi;P1MHa)eaDYDIPQ~1%-7{tG_uTuz~PLb1%*)4 z`|sK%y9q3k5R;-f$#`KwF~n4X7j3(JWxHKkyDe>?2UXx5;Itk$y3CdJRhCEp>C|Cs7^KmGsa?;FTjvkDj5V0l-n`kw|R zJ%)U|NsJ$uR4w?Wl#jpepAzNXEt~vuM$Vp}q?XhC6R+jV62X?bE(k7A&)bBZX zP;uD=t%Rv&O~%tKH6>#dx@Sw^6ar^;j=}A)y&)e2ERcdaDRV2dN*>4QlxDvA1^9#=BQx}d|sU%8nf!e0rTeIi{fy?WE7z_#C{?6TDrYPA_l4SGr|{vIZ- zolqnxZDEW+k~;3jBNAi3L<{@ zZ1UFuPgV6By-_6p0)ptT3@gD0A>so`@CDiI0k8T(q5A>*g84$i(HT8wV>pnG`i$5v z&=o4!*@blbx6-lG5a=`N{s3rz#QG#JzOxUtwGMw~erGf@wwp2A%N$yXh~n_b~t6 z1)rFu1)cOqva!8sr-;$fQM`s+JbN;-0X}W_9LZKwkxf!I98A<;&UE@hEZarMk*V|_ z@y}T^p=Bj@+}tc>d|c(c1#UhDc->*Z*rnBbh{>~jqb5Z=K}SWSAgA>iz><6Q>RkNw zq%)2zJLtqV&p0C(L7FkVp#K+vR^1%30+w*=TD+h*v_;AJmp z%%~Zmm+E+wGTME8vP#|GW}rR|mw9j(04aAkY>t%tOtDUm;L1QU8wf0$VJuf%(aQto zB19g~fCvj@9nT=12mEh0|C6~&FSM_$6F{cep{*lh_oU8PS6pLTP_@@x8&C?BK3H4{|(y*bi(Y=3$ zb2uZK!V0oMIDTn2&`(@k3t8efZ2jW6Ndv5n%fTf$lmsB6T0>WPF(52L%!^++NSZ;S z8KF$2a!Er|(^AvYx;d8bv*%mg<9f=*g-~)e?q+f--E)@bWYf{--~AH()9nP=hw~{q zgc;V(fbI>lPh=$)b~@@z1WO`P#6VzxTZ6tg;_;1vQs>`myIaL}-!AaII)=aFppR^W zWY63~yN_mdOw)Ql>bm(#XXA)7{Tbed>uR^QbFi3Aw;9|iX&>w73Ff6M%zBM%&)3p+ z3xtPq_uEGYj%6k&<-f>E7FcJ7Dssh5Y;~E2pjC-z#z36-A%5;* zg7fhaH(|*VBqIb(kz?#|;d7;y-l*kx3I8rLcR4E!e89Uj0ThP8tw^&HZx?5i8Gd`_ zr3H0R!?J;VN<4E2Gjy>uvl$n;6pzNH5eC!&G;O+4A-9=gVoF?0l0}h&e&qx#+weo& z`3$TE%U^wx&j$L$naG!z$nQoGO^rT(UuD?Dd20Gnj2Wsu*20q+m`)o

                                                                                  1CM{Ea4ds^1KQsC)-*Emz>m7=5Ys*boy&HGAXtGhqZhUo>b1 z0hE()!N_+MY+tS*yh*p7p8|cNNZ(t&0piBN%FSCCH44lxfAtfA;Nq@47Lfrr&&ShNn+%52g7 z&pOb-$pMitXbs}dK$T>DFK#|m@`%ivZ^~)w{`{6#xu8+(?j6Rxh)iY`KgXJAEmqg;p?4Zz*J3Cu##iKszjp(A|LBW+@nk#(f5M91xs8tjd1 zVl|8I{!eHXqQ8jAd+Y83m^$_PsWy4$t|b-2tMF_~zHHeZ%kX9iYx5+ic6<2qRg!J@ zgN!W-T#`|6GYbs0?Y-m0Gt~LX^1vPK!GStj?t4-wAOI)&cs#SEwI*2f`K|1h7*;A< zz)4;Fx}<5cvrMa}9H1^!K`_8Ur;;sg_P}(%q$>Q26e2^w+QN>-N~|%n%7~If|LR{f z!3}QjDqV)^xUfM+c>jXm@B&cJ_sLL1^idXc7kp*p?9NXUVRODyGOiwX(*E&ZJ!jXP z>otb3IR7N$vE-BZyPI|M+|fF~@hi3cmM8JYe!ea=wo`hUaP=!+VVS_#$)+Wd5RZ!TO|(z@~k0~+twqs3~m z!K;2EZJ?=pbS!(of}4N5;A9P;a)e;C(=-^P7~uDyJNBCPgqjpTx>0ls0y*ll#MQ

                                                                                  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�OIIOYFN8JGN>lI#Y30 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

                                                                                  MtnM@k1Oej&d@Mj38_;(-Csx0Dd}rxW{l8jqt2p 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

                                                                                  m*2c-^yL_&YE?TYkWozl*BOnp;ZM0Wxy6+w9u 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

                                                                                  -Et%7&qH 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�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�aJA$M8QxoczUbDJrRb#N0aYPH| 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 eYnRbJ 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

                                                                                  NGHjJKn0gJ;cMA?pV8USlZ;R%!>rU`RgKd9 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 z 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

                                                                                  yAc}zHjQ*K-dJy`ve$hN&zcwEK2AE!ZfTsaBQ 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 K(~8Krv-&^4eq#0j

                                                                                  K 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