| | |
| | | var ua;
|
| | |
|
| | | this.majorVersion = "2";
|
| | | this.minorVersion = "0.8";
|
| | | this.releaseDate = "2006-10-23";
|
| | | this.minorVersion = "1.0";
|
| | | this.releaseDate = "2007-02-13";
|
| | |
|
| | | this.instances = new Array();
|
| | | this.switchClassCache = new Array();
|
| | |
| | | this._def("custom_shortcuts", true);
|
| | | this._def("convert_on_click", false);
|
| | | this._def("content_css", '');
|
| | | this._def("fix_list_elements", false);
|
| | | this._def("fix_list_elements", true);
|
| | | this._def("fix_table_elements", false);
|
| | | this._def("strict_loading_mode", document.contentType == 'application/xhtml+xml');
|
| | | this._def("hidden_tab_class", '');
|
| | | this._def("display_tab_class", '');
|
| | | this._def("gecko_spellcheck", false);
|
| | | this._def("hide_selects_on_submit", true);
|
| | |
|
| | | // Force strict loading mode to false on non Gecko browsers
|
| | | if (this.isMSIE && !this.isOpera)
|
| | |
| | | this.blockElms = 'H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';
|
| | | this.blockRegExp = new RegExp("^(" + this.blockElms + ")$", "i");
|
| | | this.posKeyCodes = new Array(13,45,36,35,33,34,37,38,39,40);
|
| | | this.uniqueURL = 'javascript:TINYMCE_UNIQUEURL();'; // Make unique URL non real URL
|
| | | this.uniqueURL = 'javascript:void(091039730);'; // Make unique URL non real URL
|
| | | this.uniqueTag = '<div id="mceTMPElement" style="display: none">TMP</div>';
|
| | | this.callbacks = new Array('onInit', 'getInfo', 'getEditorTemplate', 'setupContent', 'onChange', 'onPageLoad', 'handleNodeChange', 'initInstance', 'execCommand', 'getControlHTML', 'handleEvent', 'cleanup');
|
| | | this.callbacks = new Array('onInit', 'getInfo', 'getEditorTemplate', 'setupContent', 'onChange', 'onPageLoad', 'handleNodeChange', 'initInstance', 'execCommand', 'getControlHTML', 'handleEvent', 'cleanup', 'removeInstance');
|
| | |
|
| | | // Theme url
|
| | | this.settings['theme_href'] = tinyMCE.baseURL + "/themes/" + theme;
|
| | |
| | | } catch (e) {
|
| | | }
|
| | | }
|
| | |
|
| | | // Setup XML encoding regexps
|
| | | this.xmlEncodeAposRe = new RegExp('[<>&"\']', 'g');
|
| | | this.xmlEncodeRe = new RegExp('[<>&"]', 'g');
|
| | | // this.xmlEncodeEnts = {'&':'&','"':'"',"'":''','<':'<','>':'>'};
|
| | | },
|
| | |
|
| | | _addUnloadEvents : function() {
|
| | |
| | | tinyMCE.undoLevels = n;
|
| | | tinyMCE.undoIndex = n.length;
|
| | |
|
| | | // Dispatch remove instance call
|
| | | tinyMCE.dispatchCallback(ti, 'remove_instance_callback', 'removeInstance', ti);
|
| | |
|
| | | return ti;
|
| | | },
|
| | |
|
| | |
| | | tinyMCE.removeMCEControl(value);
|
| | | return;
|
| | |
|
| | | case "mceToggleEditor":
|
| | | var inst = tinyMCE.getInstanceById(value), pe, te;
|
| | |
|
| | | if (inst) {
|
| | | pe = document.getElementById(inst.editorId + '_parent');
|
| | | te = inst.oldTargetElement;
|
| | |
|
| | | if (typeof(inst.enabled) == 'undefined')
|
| | | inst.enabled = true;
|
| | |
|
| | | inst.enabled = !inst.enabled;
|
| | |
|
| | | if (!inst.enabled) {
|
| | | pe.style.display = 'none';
|
| | | te.value = inst.getHTML();
|
| | | te.style.display = inst.oldTargetDisplay;
|
| | | tinyMCE.dispatchCallback(inst, 'hide_instance_callback', 'hideInstance', inst);
|
| | | } else {
|
| | | pe.style.display = 'block';
|
| | | te.style.display = 'none';
|
| | | inst.setHTML(te.value);
|
| | | inst.useCSS = false;
|
| | | tinyMCE.dispatchCallback(inst, 'show_instance_callback', 'showInstance', inst);
|
| | | }
|
| | | } else
|
| | | tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);
|
| | |
|
| | | return;
|
| | |
|
| | | case "mceResetDesignMode":
|
| | | // Resets the designmode state of the editors in Gecko
|
| | | if (!tinyMCE.isIE) {
|
| | |
| | | content = content.replace(/&/g, '&');
|
| | | }
|
| | |
|
| | | tinyMCE.selectedInstance = inst;
|
| | | inst.switchSettings();
|
| | |
|
| | | // Not loaded correctly hit it again, Mozilla bug #997860
|
| | |
| | | // Fix for bug #957681
|
| | | //inst.getDoc().designMode = inst.getDoc().designMode;
|
| | |
|
| | | // Setup element references
|
| | | var parentElm = inst.targetDoc.getElementById(inst.editorId + '_parent');
|
| | | inst.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;
|
| | |
|
| | | tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual'], inst);
|
| | | tinyMCE.dispatchCallback(inst, 'setupcontent_callback', 'setupContent', editor_id, inst.getBody(), inst.getDoc());
|
| | |
|
| | |
| | |
|
| | | storeAwayURLs : function(s) {
|
| | | // Remove all mce_src, mce_href and replace them with new ones
|
| | | // s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
|
| | | // s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
|
| | | // s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
|
| | | // s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
|
| | |
|
| | | if (!s.match(/(mce_src|mce_href)/gi, s)) {
|
| | | s = s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'src="$1" mce_src="$1"');
|
| | |
| | |
|
| | | return false;
|
| | | });
|
| | | }
|
| | | },
|
| | |
|
| | | removeTinyMCEFormElements : function(form_obj) {
|
| | | var i, elementId;
|
| | |
|
| | | // Skip form element removal
|
| | | if (!tinyMCE.getParam('hide_selects_on_submit'))
|
| | | return;
|
| | |
|
| | | // Check if form is valid
|
| | | if (typeof(form_obj) == "undefined" || form_obj == null)
|
| | | return;
|
| | |
|
| | | // If not a form, find the form
|
| | | if (form_obj.nodeName != "FORM") {
|
| | | if (form_obj.form)
|
| | | form_obj = form_obj.form;
|
| | | else
|
| | | form_obj = tinyMCE.getParentElement(form_obj, "form");
|
| | | }
|
| | |
|
| | | // Still nothing
|
| | | if (form_obj == null)
|
| | | return;
|
| | |
|
| | | // Disable all UI form elements that TinyMCE created
|
| | | for (i=0; i<form_obj.elements.length; i++) {
|
| | | elementId = form_obj.elements[i].name ? form_obj.elements[i].name : form_obj.elements[i].id;
|
| | |
|
| | | if (elementId.indexOf('mce_editor_') == 0)
|
| | | form_obj.elements[i].disabled = true;
|
| | | }
|
| | | },
|
| | |
|
| | |
| | | return;
|
| | |
|
| | | case "submit":
|
| | | tinyMCE.removeTinyMCEFormElements(tinyMCE.isMSIE ? window.event.srcElement : e.target);
|
| | | tinyMCE.triggerSave();
|
| | | tinyMCE.isNotDirty = true;
|
| | | return;
|
| | |
| | | h += '</a></span>';
|
| | | } else {
|
| | | if (tinyMCE.isRealIE)
|
| | | h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';
|
| | | h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';
|
| | | else
|
| | | h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton">';
|
| | | h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton">';
|
| | |
|
| | | h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';
|
| | | h += '<img src="' + img + '" title="{$' + lang + '}" /></a>';
|
| | |
| | | },
|
| | |
|
| | | submitPatch : function() {
|
| | | tinyMCE.removeTinyMCEFormElements(this);
|
| | | tinyMCE.triggerSave();
|
| | | tinyMCE.isNotDirty = true;
|
| | | this.mceOldSubmit();
|
| | |
| | | },
|
| | |
|
| | | triggerNodeChange : function(focus, setup_content) {
|
| | | var elm, inst, editorId, undoIndex = -1, undoLevels = -1, doc, anySelection = false, st;
|
| | |
|
| | | if (tinyMCE.selectedInstance) {
|
| | | var inst = tinyMCE.selectedInstance;
|
| | | var editorId = inst.editorId;
|
| | | var elm = (typeof(setup_content) != "undefined" && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();
|
| | | var undoIndex = -1, doc;
|
| | | var undoLevels = -1;
|
| | | var anySelection = false;
|
| | | var selectedText = inst.selection.getSelectedText();
|
| | | inst = tinyMCE.selectedInstance;
|
| | | elm = (typeof(setup_content) != "undefined" && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();
|
| | |
|
| | | /* if (elm == inst.lastTriggerEl)
|
| | | return;
|
| | |
|
| | | inst.lastTriggerEl = elm;*/
|
| | |
|
| | | editorId = inst.editorId;
|
| | | st = inst.selection.getSelectedText();
|
| | |
|
| | | if (tinyMCE.settings.auto_resize)
|
| | | inst.resizeToContent();
|
| | |
| | | inst.switchSettings();
|
| | |
|
| | | if (tinyMCE.selectedElement)
|
| | | anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (selectedText && selectedText.length > 0);
|
| | | anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (st && st.length > 0);
|
| | |
|
| | | if (tinyMCE.settings['custom_undo_redo']) {
|
| | | undoIndex = inst.undoRedo.undoIndex;
|
| | |
| | |
|
| | | openWindow : function(template, args) {
|
| | | var html, width, height, x, y, resizable, scrollbars, url;
|
| | |
|
| | | args = !args ? {} : args;
|
| | |
|
| | | args['mce_template_file'] = template['file'];
|
| | | args['mce_width'] = template['width'];
|
| | |
| | | },
|
| | |
|
| | | getCSSClasses : function(editor_id, doc) {
|
| | | var output = new Array();
|
| | | var inst = tinyMCE.getInstanceById(editor_id);
|
| | |
|
| | | // Is cached, use that
|
| | | if (typeof(tinyMCE.cssClasses) != "undefined")
|
| | | return tinyMCE.cssClasses;
|
| | | if (inst && inst.cssClasses.length > 0)
|
| | | return inst.cssClasses;
|
| | |
|
| | | if (typeof(editor_id) == "undefined" && typeof(doc) == "undefined") {
|
| | | var instance;
|
| | |
| | | var cssClass = rule.substring(rule.indexOf('.') + 1);
|
| | | var addClass = true;
|
| | |
|
| | | for (var p=0; p<output.length && addClass; p++) {
|
| | | if (output[p] == cssClass)
|
| | | for (var p=0; p<inst.cssClasses.length && addClass; p++) {
|
| | | if (inst.cssClasses[p] == cssClass)
|
| | | addClass = false;
|
| | | }
|
| | |
|
| | | if (addClass)
|
| | | output[output.length] = cssClass;
|
| | | inst.cssClasses[inst.cssClasses.length] = cssClass;
|
| | | }
|
| | | }
|
| | | }
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | // Cache em
|
| | | if (output.length > 0)
|
| | | tinyMCE.cssClasses = output;
|
| | |
|
| | | return output;
|
| | | return inst.cssClasses;
|
| | | },
|
| | |
|
| | | regexpReplace : function(in_str, reg_exp, replace_str, opts) {
|
| | |
| | | },
|
| | |
|
| | | getControlHTML : function(c) {
|
| | | var i, l, n, o, v;
|
| | | var i, l, n, o, v, rtl = tinyMCE.getLang('lang_dir') == 'rtl';
|
| | |
|
| | | l = tinyMCE.plugins;
|
| | | for (n in l) {
|
| | | o = l[n];
|
| | |
|
| | | if (o.getControlHTML && (v = o.getControlHTML(c)) != '')
|
| | | if (o.getControlHTML && (v = o.getControlHTML(c)) != '') {
|
| | | if (rtl)
|
| | | return '<span dir="rtl">' + tinyMCE.replaceVar(v, "pluginurl", o.baseURL) + '</span>';
|
| | |
|
| | | return tinyMCE.replaceVar(v, "pluginurl", o.baseURL);
|
| | | }
|
| | | }
|
| | |
|
| | | o = tinyMCE.themes[tinyMCE.settings['theme']];
|
| | | if (o.getControlHTML && (v = o.getControlHTML(c)) != '')
|
| | | if (o.getControlHTML && (v = o.getControlHTML(c)) != '') {
|
| | | if (rtl)
|
| | | return '<span dir="rtl">' + v + '</span>';
|
| | |
|
| | | return v;
|
| | | }
|
| | |
|
| | | return '';
|
| | | },
|
| | |
|
| | | evalFunc : function(f, idx, a, o) {
|
| | | var s = '(', i;
|
| | | o = !o ? window : o;
|
| | | f = typeof(f) == 'function' ? f : o[f];
|
| | |
|
| | | for (i=idx; i<a.length; i++) {
|
| | | s += 'a[' + i + ']';
|
| | |
|
| | | if (i < a.length-1)
|
| | | s += ',';
|
| | | }
|
| | |
|
| | | s += ');';
|
| | |
|
| | | return o ? eval("o." + f + s) : eval("f" + s);
|
| | | return f.apply(o, Array.prototype.slice.call(a, idx));
|
| | | },
|
| | |
|
| | | dispatchCallback : function(i, p, n) {
|
| | |
| | |
|
| | | l = tinyMCE.getParam(p, '');
|
| | |
|
| | | if (l != '' && (v = tinyMCE.evalFunc(typeof(l) == "function" ? l : eval(l), 3, a)) == s && m > 0)
|
| | | if (l != '' && (v = tinyMCE.evalFunc(l, 3, a)) == s && m > 0)
|
| | | return true;
|
| | |
|
| | | if (ins != null) {
|
| | |
| | | return false;
|
| | | },
|
| | |
|
| | | xmlEncode : function(s) {
|
| | | return s ? ('' + s).replace(new RegExp('[<>&"\']', 'g'), function (c, b) {
|
| | | xmlEncode : function(s, skip_apos) {
|
| | | return s ? ('' + s).replace(!skip_apos ? this.xmlEncodeAposRe : this.xmlEncodeRe, function (c, b) {
|
| | | switch (c) {
|
| | | case '&':
|
| | | return '&';
|
| | |
| | | this.hasMouseMoved = false;
|
| | | this.foreColor = this.backColor = "#999999";
|
| | | this.data = {};
|
| | | this.cssClasses = [];
|
| | |
|
| | | this.cleanup.init({
|
| | | valid_elements : s.valid_elements,
|
| | |
| | | entities : s.entities,
|
| | | entity_encoding : s.entity_encoding,
|
| | | debug : s.cleanup_debug,
|
| | | url_converter : 'TinyMCE_Cleanup.prototype._urlConverter',
|
| | | indent : s.apply_source_formatting,
|
| | | invalid_elements : s.invalid_elements,
|
| | | verify_html : s.verify_html,
|
| | | fix_content_duplication : s.fix_content_duplication
|
| | | fix_content_duplication : s.fix_content_duplication,
|
| | | convert_fonts_to_spans : s.convert_fonts_to_spans
|
| | | });
|
| | |
|
| | | // Wrap old theme
|
| | |
| | | },
|
| | |
|
| | | handleShortcut : function(e) {
|
| | | var i, s = this.shortcuts, o;
|
| | | var i, s, o;
|
| | |
|
| | | // Normal key press, then ignore it
|
| | | if (!e.altKey && !e.ctrlKey)
|
| | | return false;
|
| | |
|
| | | s = this.shortcuts;
|
| | |
|
| | | for (i=0; i<s.length; i++) {
|
| | | o = s[i];
|
| | |
| | | //debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);
|
| | | this.contentDocument = doc; // <-- Strange, unless this is applied Mozilla 1.3 breaks
|
| | |
|
| | | if (tinyMCE.execCommandCallback(this, 'execcommand_callback', 'execCommand', this.editorId, this.getBody(), command, user_interface, value))
|
| | | return;
|
| | | // Don't dispatch key commands
|
| | | if (!/mceStartTyping|mceEndTyping/.test(command)) {
|
| | | if (tinyMCE.execCommandCallback(this, 'execcommand_callback', 'execCommand', this.editorId, this.getBody(), command, user_interface, value))
|
| | | return;
|
| | | }
|
| | |
|
| | | // Fix align on images
|
| | | if (focusElm && focusElm.nodeName == "IMG") {
|
| | |
| | |
|
| | | return true;
|
| | |
|
| | | case "FormatBlock":
|
| | | if (!this.cleanup.isValid(value))
|
| | | return true;
|
| | |
|
| | | this.getDoc().execCommand(command, user_interface, value);
|
| | | tinyMCE.triggerNodeChange();
|
| | | break;
|
| | |
|
| | | case "InsertUnorderedList":
|
| | | case "InsertOrderedList":
|
| | | this.getDoc().execCommand(command, user_interface, value);
|
| | |
| | | if (elm)
|
| | | this.execCommand("mceRemoveNode", false, elm);
|
| | | } else {
|
| | | if (!this.cleanup.isValid(value))
|
| | | return true;
|
| | |
|
| | | if (tinyMCE.isGecko && new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>', 'gi').test(value))
|
| | | value = value.replace(/[^a-z]/gi, '');
|
| | |
|
| | |
| | |
|
| | | break;
|
| | |
|
| | | case "mceSetStyleInfo":
|
| | | case "SetStyleInfo":
|
| | | var rng = this.getRng();
|
| | | var sel = this.getSel();
|
| | |
| | | break;
|
| | |
|
| | | case "mceSetCSSClass":
|
| | | this.execCommand("SetStyleInfo", false, {command : "setattrib", name : "class", value : value});
|
| | | this.execCommand("mceSetStyleInfo", false, {command : "setattrib", name : "class", value : value});
|
| | | break;
|
| | |
|
| | | case "mceInsertRawHTML":
|
| | |
| | | }
|
| | | break;
|
| | |
|
| | | case "RemoveFormat":
|
| | | case "removeformat":
|
| | | var text = this.selection.getSelectedText();
|
| | |
|
| | |
| | | // Do nothing
|
| | | }
|
| | |
|
| | | this.execCommand("SetStyleInfo", false, {command : "removeformat"});
|
| | | this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});
|
| | | } else {
|
| | | this.getDoc().execCommand(command, user_interface, value);
|
| | |
|
| | | this.execCommand("SetStyleInfo", false, {command : "removeformat"});
|
| | | this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});
|
| | | }
|
| | |
|
| | | // Remove class
|
| | |
| | | hc = '<textarea wrap="off" id="' + form_element_name + '" name="' + form_element_name + '" cols="100" rows="15"></textarea>';
|
| | | } else {
|
| | | hc = '<input type="hidden" id="' + form_element_name + '" name="' + form_element_name + '" />';
|
| | | this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');
|
| | | this.oldTargetElement.style.display = "none";
|
| | | }
|
| | |
|
| | |
| | | // Just hide the textarea element
|
| | | this.oldTargetElement = replace_element;
|
| | |
|
| | | if (!tinyMCE.settings['debug'])
|
| | | if (!tinyMCE.settings['debug']) {
|
| | | this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');
|
| | | this.oldTargetElement.style.display = "none";
|
| | | }
|
| | |
|
| | | // Output HTML and set editable
|
| | | if (tinyMCE.isGecko) {
|
| | |
| | | // it seems that the document.frames isn't initialized yet?
|
| | | if (tinyMCE.isIE)
|
| | | window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\"" + this.editorId + "\"]);", 1);
|
| | |
|
| | | // Setup element references
|
| | | var parentElm = this.targetDoc.getElementById(this.editorId + '_parent');
|
| | | this.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;
|
| | |
|
| | | tinyMCE.setupContent(this.editorId, true);
|
| | |
|
| | |
| | | if (tinyMCE.getParam("force_hex_style_colors"))
|
| | | val = tinyMCE.convertRGBToHex(val, true);
|
| | |
|
| | | val = val.replace(/\"/g, '\'');
|
| | |
|
| | | if (val != "url('')")
|
| | | str += key.toLowerCase() + ": " + val + "; ";
|
| | | }
|
| | |
| | | TinyMCE_Engine.prototype.convertSpansToFonts = function(doc) {
|
| | | var sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');
|
| | |
|
| | | var h = doc.body.innerHTML;
|
| | | /*var h = doc.body.innerHTML;
|
| | | h = h.replace(/<span/gi, '<font');
|
| | | h = h.replace(/<\/span/gi, '</font');
|
| | | tinyMCE.setInnerHTML(doc.body, h);
|
| | | tinyMCE.setInnerHTML(doc.body, h);*/
|
| | |
|
| | | var s = doc.getElementsByTagName("font");
|
| | | var s = tinyMCE.selectElements(doc, 'span,font');
|
| | | for (var i=0; i<s.length; i++) {
|
| | | var size = tinyMCE.trim(s[i].style.fontSize).toLowerCase();
|
| | | var fSize = 0;
|
| | |
| | | TinyMCE_Engine.prototype.convertFontsToSpans = function(doc) {
|
| | | var sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');
|
| | |
|
| | | var h = doc.body.innerHTML;
|
| | | /* var h = doc.body.innerHTML;
|
| | | h = h.replace(/<font/gi, '<span');
|
| | | h = h.replace(/<\/font/gi, '</span');
|
| | | tinyMCE.setInnerHTML(doc.body, h);
|
| | | tinyMCE.setInnerHTML(doc.body, h);*/
|
| | |
|
| | | var fsClasses = tinyMCE.getParam('font_size_classes');
|
| | | if (fsClasses != '')
|
| | |
| | | else
|
| | | fsClasses = null;
|
| | |
|
| | | var s = doc.getElementsByTagName("span");
|
| | | var s = tinyMCE.selectElements(doc, 'span,font');
|
| | | for (var i=0; i<s.length; i++) {
|
| | | var fSize, fFace, fColor;
|
| | |
|
| | |
| | | for (i=0; i<nl.length; i++) {
|
| | | n = nl[i];
|
| | |
|
| | | if ((p = tinyMCE.getParentElement(n, 'p,div,h1,h2,h3,h4,h5,h6')) != null) {
|
| | | if ((p = tinyMCE.getParentElement(n, 'p,h1,h2,h3,h4,h5,h6')) != null) {
|
| | | np = p.cloneNode(false);
|
| | | np.removeAttribute('id');
|
| | |
|
| | |
| | |
|
| | | this.fillStr = s.entity_encoding == "named" ? " " : " ";
|
| | | this.idCount = 0;
|
| | | this.xmlEncodeRe = new RegExp('[\u007F-\uFFFF<>&"]', 'g');
|
| | | this.xmlEncodeAposRe = new RegExp('[\u007F-\uFFFF<>&"\']', 'g');
|
| | | },
|
| | |
|
| | | addRuleStr : function(s) {
|
| | |
| | |
|
| | | isValid : function(n) {
|
| | | this._setupRules(); // Will initialize cleanup rules
|
| | |
|
| | | // Empty is true since it removes formatting
|
| | | if (!n)
|
| | | return true;
|
| | |
|
| | | // Clean the name up a bit
|
| | | n = n.replace(/[^a-z0-9]+/gi, '').toUpperCase();
|
| | |
| | | _convertToXML : function(n, xn) {
|
| | | var xd, el, i, l, cn, at, no, hc = false;
|
| | |
|
| | | if (this._isDuplicate(n))
|
| | | if (tinyMCE.isRealIE && this._isDuplicate(n))
|
| | | return;
|
| | |
|
| | | xd = this.xmlDoc;
|
| | |
| | | },
|
| | |
|
| | | serializeNodeAsHTML : function(n, inn) {
|
| | | var en, no, h = '', i, l, t, st, r, cn, va = false, f = false, at, hc, cr;
|
| | | var en, no, h = '', i, l, t, st, r, cn, va = false, f = false, at, hc, cr, nn;
|
| | |
|
| | | this._setupRules(); // Will initialize cleanup rules
|
| | |
|
| | | if (this._isDuplicate(n))
|
| | | if (tinyMCE.isRealIE && this._isDuplicate(n))
|
| | | return '';
|
| | |
|
| | | // Skip non valid child elements
|
| | |
| | | if ((tinyMCE.isRealIE) && n.nodeName.indexOf('/') != -1)
|
| | | break;
|
| | |
|
| | | if (this.vElementsRe.test(n.nodeName) && (!this.iveRe || !this.iveRe.test(n.nodeName)) && !inn) {
|
| | | nn = n.nodeName;
|
| | |
|
| | | // Convert fonts to spans
|
| | | if (this.settings.convert_fonts_to_spans) {
|
| | | // On get content FONT -> SPAN
|
| | | if (this.settings.on_save && nn == 'FONT')
|
| | | nn = 'SPAN';
|
| | |
|
| | | // On insert content SPAN -> FONT
|
| | | if (!this.settings.on_save && nn == 'SPAN')
|
| | | nn = 'FONT';
|
| | | }
|
| | |
|
| | | if (this.vElementsRe.test(nn) && (!this.iveRe || !this.iveRe.test(nn)) && !inn) {
|
| | | va = true;
|
| | |
|
| | | r = this.rules[n.nodeName];
|
| | | r = this.rules[nn];
|
| | | if (!r) {
|
| | | at = this.rules;
|
| | | for (no in at) {
|
| | | if (at[no] && at[no].validRe.test(n.nodeName)) {
|
| | | if (at[no] && at[no].validRe.test(nn)) {
|
| | | r = at[no];
|
| | | break;
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | en = r.isWild ? n.nodeName.toLowerCase() : r.oTagName;
|
| | | en = r.isWild ? nn.toLowerCase() : r.oTagName;
|
| | | f = r.fill;
|
| | |
|
| | | if (r.removeEmpty && !hc)
|
| | |
| | | t = null;
|
| | |
|
| | | // Close these
|
| | | if (t != null && this.closeElementsRe.test(n.nodeName))
|
| | | if (t != null && this.closeElementsRe.test(nn))
|
| | | return t + ' />';
|
| | |
|
| | | if (t != null)
|
| | | h += t + '>';
|
| | |
|
| | | if (this.isIE && this.codeElementsRe.test(n.nodeName))
|
| | | if (this.isIE && this.codeElementsRe.test(nn))
|
| | | h += n.innerHTML;
|
| | | }
|
| | | break;
|
| | |
| | | if (r.forceAttribs && (t = r.forceAttribs[an]))
|
| | | av = t;
|
| | |
|
| | | if (os && av.length != 0 && this.settings.url_converter.length != 0 && /^(src|href|longdesc)$/.test(an))
|
| | | av = eval(this.settings.url_converter + '(this, n, av)');
|
| | | if (os && av.length != 0 && /^(src|href|longdesc)$/.test(an))
|
| | | av = this._urlConverter(this, n, av);
|
| | |
|
| | | if (av.length != 0 && r.validAttribValues && r.validAttribValues[an] && !r.validAttribValues[an].test(av))
|
| | | return "";
|
| | |
| | |
|
| | | if (av.length != 0) {
|
| | | if (an.indexOf('on') != 0)
|
| | | av = this.xmlEncode(av);
|
| | | av = this.xmlEncode(av, 1);
|
| | |
|
| | | return " " + an + "=" + '"' + av + '"';
|
| | | }
|
| | |
| | | return o;
|
| | | },
|
| | |
|
| | | xmlEncode : function(s) {
|
| | | var cl = this;
|
| | | xmlEncode : function(s, skip_apos) {
|
| | | var cl = this, re = !skip_apos ? this.xmlEncodeAposRe : this.xmlEncodeRe;
|
| | |
|
| | | this._setupEntities(); // Will intialize lookup table
|
| | |
|
| | | switch (this.settings.entity_encoding) {
|
| | | case "raw":
|
| | | return tinyMCE.xmlEncode(s);
|
| | | return tinyMCE.xmlEncode(s, skip_apos);
|
| | |
|
| | | case "named":
|
| | | return s.replace(new RegExp('[\u007F-\uFFFF<>&"\']', 'g'), function (c, b) {
|
| | | return s.replace(re, function (c, b) {
|
| | | b = cl.entities[c.charCodeAt(0)];
|
| | |
|
| | | return b ? '&' + b + ';' : c;
|
| | | });
|
| | |
|
| | | case "numeric":
|
| | | return s.replace(new RegExp('[\u007F-\uFFFF<>&"\']', 'g'), function (c, b) {
|
| | | return s.replace(re, function (c, b) {
|
| | | return b ? '&#' + c.charCodeAt(0) + ';' : c;
|
| | | });
|
| | | }
|
| | |
| | | },
|
| | |
|
| | | _getAttrib : function(e, n, d) {
|
| | | var v, ex, nn;
|
| | |
|
| | | if (typeof(d) == "undefined")
|
| | | d = "";
|
| | |
|
| | | if (!e || e.nodeType != 1)
|
| | | return d;
|
| | |
|
| | | var v = e.getAttribute(n, 0);
|
| | | try {
|
| | | v = e.getAttribute(n, 0);
|
| | | } catch (ex) {
|
| | | // IE 7 may cast exception on invalid attributes
|
| | | v = e.getAttribute(n, 2);
|
| | | }
|
| | |
|
| | | if (n == "class" && !v)
|
| | | v = e.className;
|
| | |
|
| | | if (this.isIE && n == "http-equiv")
|
| | | v = e.httpEquiv;
|
| | | if (this.isIE) {
|
| | | if (n == "http-equiv")
|
| | | v = e.httpEquiv;
|
| | |
|
| | | if (this.isIE && e.nodeName == "FORM" && n == "enctype" && v == "application/x-www-form-urlencoded")
|
| | | v = "";
|
| | | nn = e.nodeName;
|
| | |
|
| | | if (this.isIE && e.nodeName == "INPUT" && n == "size" && v == "20")
|
| | | v = "";
|
| | | // Skip the default values that IE returns
|
| | | if (nn == "FORM" && n == "enctype" && v == "application/x-www-form-urlencoded")
|
| | | v = "";
|
| | |
|
| | | if (this.isIE && e.nodeName == "INPUT" && n == "maxlength" && v == "2147483647")
|
| | | v = "";
|
| | | if (nn == "INPUT" && n == "size" && v == "20")
|
| | | v = "";
|
| | |
|
| | | if (n == "style" && !tinyMCE.isOpera)
|
| | | v = e.style.cssText;
|
| | | if (nn == "INPUT" && n == "maxlength" && v == "2147483647")
|
| | | v = "";
|
| | | }
|
| | |
|
| | | if (n == 'style')
|
| | | if (n == 'style' && v) {
|
| | | if (!tinyMCE.isOpera)
|
| | | v = e.style.cssText;
|
| | |
|
| | | v = tinyMCE.serializeStyle(tinyMCE.parseStyle(v));
|
| | | }
|
| | |
|
| | | if (this.settings.on_save && n.indexOf('on') != -1 && this.settings.on_save && v && v != "")
|
| | | v = tinyMCE.cleanupEventStr(v);
|
| | |
| | | _urlConverter : function(c, n, v) {
|
| | | if (!c.settings.on_save)
|
| | | return tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, v);
|
| | | else if (tinyMCE.getParam('convert_urls'))
|
| | | return eval(tinyMCE.settings.urlconverter_callback + "(v, n, true);");
|
| | | else if (tinyMCE.getParam('convert_urls')) {
|
| | | if (!this.urlConverter)
|
| | | this.urlConverter = eval(tinyMCE.settings.urlconverter_callback);
|
| | |
|
| | | return this.urlConverter(v, n, true);
|
| | | }
|
| | |
|
| | | return v;
|
| | | },
|
| | |
| | |
|
| | | // Convert all strong/em to b/i in Gecko
|
| | | if (tinyMCE.isGecko) {
|
| | | h = h.replace(/<strong/gi, '<b');
|
| | | h = h.replace(/<em(\/?)/gi, '<i');
|
| | | h = h.replace(/<em /gi, '<i');
|
| | | h = h.replace(/<embed([^>]*)>/gi, '<tmpembed$1>');
|
| | | h = h.replace(/<em([^>]*)>/gi, '<i$1>');
|
| | | h = h.replace(/<tmpembed([^>]*)>/gi, '<embed$1>');
|
| | | h = h.replace(/<strong([^>]*)>/gi, '<b$1>');
|
| | | h = h.replace(/<\/strong>/gi, '</b>');
|
| | | h = h.replace(/<\/em>/gi, '</i>');
|
| | | }
|
| | |
| | | if (!elm || elm.nodeType != 1)
|
| | | return dv;
|
| | |
|
| | | v = elm.getAttribute(name);
|
| | | try {
|
| | | v = elm.getAttribute(name, 0);
|
| | | } catch (ex) {
|
| | | // IE 7 may cast exception on invalid attributes
|
| | | v = elm.getAttribute(name, 2);
|
| | | }
|
| | |
|
| | | // Try className for class attrib
|
| | | if (name == "class" && !v)
|
| | |
| | | width : w.innerWidth || (m ? de.clientWidth : b.clientWidth),
|
| | | height : w.innerHeight || (m ? de.clientHeight : b.clientHeight)
|
| | | };
|
| | | };
|
| | |
|
| | | TinyMCE_Engine.prototype.getStyle = function(n, na, d) {
|
| | | if (!n)
|
| | | return false;
|
| | |
|
| | | // Gecko
|
| | | if (tinyMCE.isGecko && n.ownerDocument.defaultView) {
|
| | | try {
|
| | | return n.ownerDocument.defaultView.getComputedStyle(n, null).getPropertyValue(na);
|
| | | } catch (n) {
|
| | | // Old safari might fail
|
| | | return null;
|
| | | }
|
| | | }
|
| | |
|
| | | // Camelcase it, if needed
|
| | | na = na.replace(/-(\D)/g, function(a, b){
|
| | | return b.toUpperCase();
|
| | | });
|
| | |
|
| | | // IE & Opera
|
| | | if (n.currentStyle)
|
| | | return n.currentStyle[na];
|
| | |
|
| | | return false;
|
| | | };
|
| | |
|
| | | /* file:jscripts/tiny_mce/classes/TinyMCE_URL.class.js */
|
| | |
| | | for (i=0; i<ot.length; i++)
|
| | | f(doc, ot[i], tinyMCE.handleEvent);
|
| | |
|
| | | eval('try { doc.designMode = "On"; } catch(e) {}'); // Force designmode
|
| | | // Force designmode
|
| | | try {
|
| | | doc.designMode = "On";
|
| | | } catch (e) {
|
| | | // Ignore
|
| | | }
|
| | | }
|
| | | };
|
| | |
|
| | |
| | | h = tinyMCE._cleanupHTML(inst, inst.contentDocument, inst.settings, e, e, false, true, false);
|
| | |
|
| | | // When editing always use fonts internaly
|
| | | if (tinyMCE.getParam("convert_fonts_to_spans"))
|
| | | tinyMCE.convertSpansToFonts(inst.getDoc());
|
| | | //if (tinyMCE.getParam("convert_fonts_to_spans"))
|
| | | // tinyMCE.convertSpansToFonts(inst.getDoc());
|
| | |
|
| | | return h;
|
| | | },
|
| | |
| | | }
|
| | |
|
| | | if (tinyMCE.isGecko || tinyMCE.isOpera) {
|
| | | if (!sel)
|
| | | return false;
|
| | |
|
| | | if (bookmark.rng) {
|
| | | sel.removeAllRanges();
|
| | | sel.addRange(bookmark.rng);
|
| | |
| | | if (tinyMCE.isSafari && !s.getRangeAt)
|
| | | return '' + window.getSelection();
|
| | |
|
| | | return s.getRangeAt(0);
|
| | | if (s.rangeCount > 0)
|
| | | return s.getRangeAt(0);
|
| | |
|
| | | return null;
|
| | | },
|
| | |
|
| | | isCollapsed : function() {
|
| | | var r = this.getRng();
|
| | |
|
| | | if (r.item)
|
| | | return false;
|
| | |
|
| | | return r.boundingWidth == 0 || this.getSel().isCollapsed;
|
| | | },
|
| | |
|
| | | collapse : function(b) {
|
| | | var r = this.getRng(), s = this.getSel();
|
| | |
|
| | | if (r.select) {
|
| | | r.collapse(b);
|
| | | r.select();
|
| | | } else {
|
| | | if (b)
|
| | | s.collapseToStart();
|
| | | else
|
| | | s.collapseToEnd();
|
| | | }
|
| | | },
|
| | |
|
| | | getFocusElement : function() {
|
| | |
| | | },
|
| | |
|
| | | show : function() {
|
| | | this.getElement().style.display = 'block';
|
| | | this.updateBlocker();
|
| | | var el = this.getElement();
|
| | |
|
| | | if (el) {
|
| | | el.style.display = 'block';
|
| | | this.updateBlocker();
|
| | | }
|
| | | },
|
| | |
|
| | | hide : function() {
|
| | | this.getElement().style.display = 'none';
|
| | | this.updateBlocker();
|
| | | var el = this.getElement();
|
| | |
|
| | | if (el) {
|
| | | el.style.display = 'none';
|
| | | this.updateBlocker();
|
| | | }
|
| | | },
|
| | |
|
| | | isVisible : function() {
|
| | |
| | | return 0;
|
| | |
|
| | | return parseInt(s);
|
| | | },
|
| | |
|
| | | remove : function() {
|
| | | var e = this.getElement(), b = this.getBlocker();
|
| | |
|
| | | if (e)
|
| | | e.parentNode.removeChild(e);
|
| | |
|
| | | if (b)
|
| | | b.parentNode.removeChild(b);
|
| | | }
|
| | |
|
| | | };
|
| | |
| | | break;
|
| | |
|
| | | default:
|
| | | h += '<tr><td><a href="#" onclick="return tinyMCE.cancelEvent(event);" onmousedown="return tinyMCE.cancelEvent(event);" onmouseup="' + tinyMCE.xmlEncode(m[i].js) + ';return tinyMCE.cancelEvent(event);"><span' + c +'>' + t + '</span></a>';
|
| | | h += '<tr><td><a href="' + tinyMCE.xmlEncode(m[i].js) + '" onmousedown="' + tinyMCE.xmlEncode(m[i].js) + ';return tinyMCE.cancelEvent(event);" onclick="return tinyMCE.cancelEvent(event);" onmouseup="return tinyMCE.cancelEvent(event);"><span' + c +'>' + t + '</span></a>';
|
| | | }
|
| | |
|
| | | h += '</td></tr>';
|