bgneal@45: /** bgneal@45: * $Id: editor_plugin_src.js 264 2007-04-26 20:53:09Z spocke $ bgneal@45: * bgneal@45: * @author Moxiecode bgneal@45: * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved. bgneal@45: */ bgneal@45: bgneal@45: (function() { bgneal@45: var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is; bgneal@45: bgneal@45: tinymce.create('tinymce.plugins.Compat2x', { bgneal@45: getInfo : function() { bgneal@45: return { bgneal@45: longname : 'Compat2x', bgneal@45: author : 'Moxiecode Systems AB', bgneal@45: authorurl : 'http://tinymce.moxiecode.com', bgneal@45: infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/compat2x', bgneal@45: version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion bgneal@45: }; bgneal@45: } bgneal@45: }); bgneal@45: bgneal@45: (function() { bgneal@45: // Extend tinyMCE/EditorManager bgneal@45: tinymce.extend(tinyMCE, { bgneal@45: addToLang : function(p, l) { bgneal@45: each(l, function(v, k) { bgneal@45: tinyMCE.i18n[(tinyMCE.settings.language || 'en') + '.' + (p ? p + '_' : '') + k] = v; bgneal@45: }); bgneal@45: }, bgneal@45: bgneal@45: getInstanceById : function(n) { bgneal@45: return this.get(n); bgneal@45: } bgneal@45: }); bgneal@45: })(); bgneal@45: bgneal@45: (function() { bgneal@45: var EditorManager = tinymce.EditorManager; bgneal@45: bgneal@45: tinyMCE.instances = {}; bgneal@45: tinyMCE.plugins = {}; bgneal@45: tinymce.PluginManager.onAdd.add(function(pm, n, p) { bgneal@45: tinyMCE.plugins[n] = p; bgneal@45: }); bgneal@45: bgneal@45: tinyMCE.majorVersion = tinymce.majorVersion; bgneal@45: tinyMCE.minorVersion = tinymce.minorVersion; bgneal@45: tinyMCE.releaseDate = tinymce.releaseDate; bgneal@45: tinyMCE.baseURL = tinymce.baseURL; bgneal@45: tinyMCE.isIE = tinyMCE.isMSIE = tinymce.isIE || tinymce.isOpera; bgneal@45: tinyMCE.isMSIE5 = tinymce.isIE; bgneal@45: tinyMCE.isMSIE5_0 = tinymce.isIE; bgneal@45: tinyMCE.isMSIE7 = tinymce.isIE; bgneal@45: tinyMCE.isGecko = tinymce.isGecko; bgneal@45: tinyMCE.isSafari = tinymce.isWebKit; bgneal@45: tinyMCE.isOpera = tinymce.isOpera; bgneal@45: tinyMCE.isMac = false; bgneal@45: tinyMCE.isNS7 = false; bgneal@45: tinyMCE.isNS71 = false; bgneal@45: tinyMCE.compat = true; bgneal@45: bgneal@45: // Extend tinyMCE class bgneal@45: TinyMCE_Engine = tinyMCE; bgneal@45: tinymce.extend(tinyMCE, { bgneal@45: getParam : function(n, dv) { bgneal@45: return this.activeEditor.getParam(n, dv); bgneal@45: }, bgneal@45: bgneal@45: addEvent : function(e, na, f, sc) { bgneal@45: tinymce.dom.Event.add(e, na, f, sc || this); bgneal@45: }, bgneal@45: bgneal@45: getControlHTML : function(n) { bgneal@45: return EditorManager.activeEditor.controlManager.createControl(n); bgneal@45: }, bgneal@45: bgneal@45: loadCSS : function(u) { bgneal@45: tinymce.DOM.loadCSS(u); bgneal@45: }, bgneal@45: bgneal@45: importCSS : function(doc, u) { bgneal@45: if (doc == document) bgneal@45: this.loadCSS(u); bgneal@45: else bgneal@45: new tinymce.dom.DOMUtils(doc).loadCSS(u); bgneal@45: }, bgneal@45: bgneal@45: log : function() { bgneal@45: console.debug.apply(console, arguments); bgneal@45: }, bgneal@45: bgneal@45: getLang : function(n, dv) { bgneal@45: var v = EditorManager.activeEditor.getLang(n.replace(/^lang_/g, ''), dv); bgneal@45: bgneal@45: // Is number bgneal@45: if (/^[0-9\-.]+$/g.test(v)) bgneal@45: return parseInt(v); bgneal@45: bgneal@45: return v; bgneal@45: }, bgneal@45: bgneal@45: isInstance : function(o) { bgneal@45: return o != null && typeof(o) == "object" && o.execCommand; bgneal@45: }, bgneal@45: bgneal@45: triggerNodeChange : function() { bgneal@45: EditorManager.activeEditor.nodeChanged(); bgneal@45: }, bgneal@45: bgneal@45: regexpReplace : function(in_str, reg_exp, replace_str, opts) { bgneal@45: var re; bgneal@45: bgneal@45: if (in_str == null) bgneal@45: return in_str; bgneal@45: bgneal@45: if (typeof(opts) == "undefined") bgneal@45: opts = 'g'; bgneal@45: bgneal@45: re = new RegExp(reg_exp, opts); bgneal@45: bgneal@45: return in_str.replace(re, replace_str); bgneal@45: }, bgneal@45: bgneal@45: trim : function(s) { bgneal@45: return tinymce.trim(s); bgneal@45: }, bgneal@45: bgneal@45: xmlEncode : function(s) { bgneal@45: return tinymce.DOM.encode(s); bgneal@45: }, bgneal@45: bgneal@45: explode : function(s, d) { bgneal@45: var o = []; bgneal@45: bgneal@45: tinymce.each(s.split(d), function(v) { bgneal@45: if (v != '') bgneal@45: o.push(v); bgneal@45: }); bgneal@45: bgneal@45: return o; bgneal@45: }, bgneal@45: bgneal@45: switchClass : function(id, cls) { bgneal@45: var b; bgneal@45: bgneal@45: if (/^mceButton/.test(cls)) { bgneal@45: b = EditorManager.activeEditor.controlManager.get(id); bgneal@45: bgneal@45: if (!b) bgneal@45: return; bgneal@45: bgneal@45: switch (cls) { bgneal@45: case "mceButtonNormal": bgneal@45: b.setDisabled(false); bgneal@45: b.setActive(false); bgneal@45: return; bgneal@45: bgneal@45: case "mceButtonDisabled": bgneal@45: b.setDisabled(true); bgneal@45: return; bgneal@45: bgneal@45: case "mceButtonSelected": bgneal@45: b.setActive(true); bgneal@45: b.setDisabled(false); bgneal@45: return; bgneal@45: } bgneal@45: } bgneal@45: }, bgneal@45: bgneal@45: addCSSClass : function(e, n, b) { bgneal@45: return tinymce.DOM.addClass(e, n, b); bgneal@45: }, bgneal@45: bgneal@45: hasCSSClass : function(e, n) { bgneal@45: return tinymce.DOM.hasClass(e, n); bgneal@45: }, bgneal@45: bgneal@45: removeCSSClass : function(e, n) { bgneal@45: return tinymce.DOM.removeClass(e, n); bgneal@45: }, bgneal@45: bgneal@45: getCSSClasses : function() { bgneal@45: var cl = EditorManager.activeEditor.dom.getClasses(), o = []; bgneal@45: bgneal@45: each(cl, function(c) { bgneal@45: o.push(c['class']); bgneal@45: }); bgneal@45: bgneal@45: return o; bgneal@45: }, bgneal@45: bgneal@45: setWindowArg : function(n, v) { bgneal@45: EditorManager.activeEditor.windowManager.params[n] = v; bgneal@45: }, bgneal@45: bgneal@45: getWindowArg : function(n, dv) { bgneal@45: var wm = EditorManager.activeEditor.windowManager, v; bgneal@45: bgneal@45: v = wm.getParam(n); bgneal@45: if (v === '') bgneal@45: return ''; bgneal@45: bgneal@45: return v || wm.getFeature(n) || dv; bgneal@45: }, bgneal@45: bgneal@45: getParentNode : function(n, f) { bgneal@45: return this._getDOM().getParent(n, f); bgneal@45: }, bgneal@45: bgneal@45: selectElements : function(n, na, f) { bgneal@45: var i, a = [], nl, x; bgneal@45: bgneal@45: for (x=0, na = na.split(','); x<na.length; x++) bgneal@45: for (i=0, nl = n.getElementsByTagName(na[x]); i<nl.length; i++) bgneal@45: (!f || f(nl[i])) && a.push(nl[i]); bgneal@45: bgneal@45: return a; bgneal@45: }, bgneal@45: bgneal@45: getNodeTree : function(n, na, t, nn) { bgneal@45: return this.selectNodes(n, function(n) { bgneal@45: return (!t || n.nodeType == t) && (!nn || n.nodeName == nn); bgneal@45: }, na ? na : []); bgneal@45: }, bgneal@45: bgneal@45: getAttrib : function(e, n, dv) { bgneal@45: return this._getDOM().getAttrib(e, n, dv); bgneal@45: }, bgneal@45: bgneal@45: setAttrib : function(e, n, v) { bgneal@45: return this._getDOM().setAttrib(e, n, v); bgneal@45: }, bgneal@45: bgneal@45: getElementsByAttributeValue : function(n, e, a, v) { bgneal@45: var i, nl = n.getElementsByTagName(e), o = []; bgneal@45: bgneal@45: for (i=0; i<nl.length; i++) { bgneal@45: if (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1) bgneal@45: o[o.length] = nl[i]; bgneal@45: } bgneal@45: bgneal@45: return o; bgneal@45: }, bgneal@45: bgneal@45: selectNodes : function(n, f, a) { bgneal@45: var i; bgneal@45: bgneal@45: if (!a) bgneal@45: a = []; bgneal@45: bgneal@45: if (f(n)) bgneal@45: a[a.length] = n; bgneal@45: bgneal@45: if (n.hasChildNodes()) { bgneal@45: for (i=0; i<n.childNodes.length; i++) bgneal@45: tinyMCE.selectNodes(n.childNodes[i], f, a); bgneal@45: } bgneal@45: bgneal@45: return a; bgneal@45: }, bgneal@45: bgneal@45: getContent : function() { bgneal@45: return EditorManager.activeEditor.getContent(); bgneal@45: }, bgneal@45: bgneal@45: getParentElement : function(n, na, f) { bgneal@45: if (na) bgneal@45: na = new RegExp('^(' + na.toUpperCase().replace(/,/g, '|') + ')$', 'g'); bgneal@45: bgneal@45: return this._getDOM().getParent(n, function(n) { bgneal@45: return n.nodeType == 1 && (!na || na.test(n.nodeName)) && (!f || f(n)); bgneal@45: }, this.activeEditor.getBody()); bgneal@45: }, bgneal@45: bgneal@45: importPluginLanguagePack : function(n) { bgneal@45: tinymce.PluginManager.requireLangPack(n); bgneal@45: }, bgneal@45: bgneal@45: getButtonHTML : function(cn, lang, img, c, u, v) { bgneal@45: var ed = EditorManager.activeEditor; bgneal@45: bgneal@45: img = img.replace(/\{\$pluginurl\}/g, tinyMCE.pluginURL); bgneal@45: img = img.replace(/\{\$themeurl\}/g, tinyMCE.themeURL); bgneal@45: lang = lang.replace(/^lang_/g, ''); bgneal@45: bgneal@45: return ed.controlManager.createButton(cn, { bgneal@45: title : lang, bgneal@45: command : c, bgneal@45: ui : u, bgneal@45: value : v, bgneal@45: scope : this, bgneal@45: 'class' : 'compat', bgneal@45: image : img bgneal@45: }); bgneal@45: }, bgneal@45: bgneal@45: addSelectAccessibility : function(e, s, w) { bgneal@45: // Add event handlers bgneal@45: if (!s._isAccessible) { bgneal@45: s.onkeydown = tinyMCE.accessibleEventHandler; bgneal@45: s.onblur = tinyMCE.accessibleEventHandler; bgneal@45: s._isAccessible = true; bgneal@45: s._win = w; bgneal@45: } bgneal@45: bgneal@45: return false; bgneal@45: }, bgneal@45: bgneal@45: accessibleEventHandler : function(e) { bgneal@45: var elm, win = this._win; bgneal@45: bgneal@45: e = tinymce.isIE ? win.event : e; bgneal@45: elm = tinymce.isIE ? e.srcElement : e.target; bgneal@45: bgneal@45: // Unpiggyback onchange on blur bgneal@45: if (e.type == "blur") { bgneal@45: if (elm.oldonchange) { bgneal@45: elm.onchange = elm.oldonchange; bgneal@45: elm.oldonchange = null; bgneal@45: } bgneal@45: bgneal@45: return true; bgneal@45: } bgneal@45: bgneal@45: // Piggyback onchange bgneal@45: if (elm.nodeName == "SELECT" && !elm.oldonchange) { bgneal@45: elm.oldonchange = elm.onchange; bgneal@45: elm.onchange = null; bgneal@45: } bgneal@45: bgneal@45: // Execute onchange and remove piggyback bgneal@45: if (e.keyCode == 13 || e.keyCode == 32) { bgneal@45: elm.onchange = elm.oldonchange; bgneal@45: elm.onchange(); bgneal@45: elm.oldonchange = null; bgneal@45: bgneal@45: tinyMCE.cancelEvent(e); bgneal@45: return false; bgneal@45: } bgneal@45: bgneal@45: return true; bgneal@45: }, bgneal@45: bgneal@45: cancelEvent : function(e) { bgneal@45: return tinymce.dom.Event.cancel(e); bgneal@45: }, bgneal@45: bgneal@45: handleVisualAid : function(e) { bgneal@45: EditorManager.activeEditor.addVisual(e); bgneal@45: }, bgneal@45: bgneal@45: getAbsPosition : function(n, r) { bgneal@45: return tinymce.DOM.getPos(n, r); bgneal@45: }, bgneal@45: bgneal@45: cleanupEventStr : function(s) { bgneal@45: s = "" + s; bgneal@45: s = s.replace('function anonymous()\n{\n', ''); bgneal@45: s = s.replace('\n}', ''); bgneal@45: s = s.replace(/^return true;/gi, ''); // Remove event blocker bgneal@45: bgneal@45: return s; bgneal@45: }, bgneal@45: bgneal@45: getVisualAidClass : function(s) { bgneal@45: // TODO: Implement bgneal@45: return s; bgneal@45: }, bgneal@45: bgneal@45: parseStyle : function(s) { bgneal@45: return this._getDOM().parseStyle(s); bgneal@45: }, bgneal@45: bgneal@45: serializeStyle : function(s) { bgneal@45: return this._getDOM().serializeStyle(s); bgneal@45: }, bgneal@45: bgneal@45: openWindow : function(tpl, args) { bgneal@45: var ed = EditorManager.activeEditor, o = {}, n; bgneal@45: bgneal@45: // Convert name/value array to object bgneal@45: for (n in tpl) bgneal@45: o[n] = tpl[n]; bgneal@45: bgneal@45: tpl = o; bgneal@45: bgneal@45: args = args || {}; bgneal@45: tpl.url = new tinymce.util.URI(tinymce.ThemeManager.themeURLs[ed.settings.theme]).toAbsolute(tpl.file); bgneal@45: tpl.inline = tpl.inline || args.inline; bgneal@45: bgneal@45: ed.windowManager.open(tpl, args); bgneal@45: }, bgneal@45: bgneal@45: closeWindow : function(win) { bgneal@45: EditorManager.activeEditor.windowManager.close(win); bgneal@45: }, bgneal@45: bgneal@45: getOuterHTML : function(e) { bgneal@45: return tinymce.DOM.getOuterHTML(e); bgneal@45: }, bgneal@45: bgneal@45: setOuterHTML : function(e, h, d) { bgneal@45: return tinymce.DOM.setOuterHTML(e, h, d); bgneal@45: }, bgneal@45: bgneal@45: hasPlugin : function(n) { bgneal@45: return tinymce.PluginManager.get(n) != null; bgneal@45: }, bgneal@45: bgneal@45: _setEventsEnabled : function() { bgneal@45: // Ignore it!! bgneal@45: }, bgneal@45: bgneal@45: addPlugin : function(pn, f) { bgneal@45: var t = this; bgneal@45: bgneal@45: function PluginWrapper(ed) { bgneal@45: tinyMCE.selectedInstance = ed; bgneal@45: bgneal@45: ed.onInit.add(function() { bgneal@45: t.settings = ed.settings; bgneal@45: t.settings['base_href'] = tinyMCE.documentBasePath; bgneal@45: tinyMCE.settings = t.settings; bgneal@45: tinyMCE.documentBasePath = ed.documentBasePath; bgneal@45: //ed.formElement = DOM.get(ed.id); bgneal@45: bgneal@45: if (f.initInstance) bgneal@45: f.initInstance(ed); bgneal@45: bgneal@45: ed.contentDocument = ed.getDoc(); bgneal@45: ed.contentWindow = ed.getWin(); bgneal@45: ed.undoRedo = ed.undoManager; bgneal@45: ed.startContent = ed.getContent({format : 'raw'}); bgneal@45: bgneal@45: tinyMCE.instances[ed.id] = ed; bgneal@45: tinyMCE.loadedFiles = []; bgneal@45: }); bgneal@45: bgneal@45: ed.onActivate.add(function() { bgneal@45: tinyMCE.settings = ed.settings; bgneal@45: tinyMCE.selectedInstance = ed; bgneal@45: }); bgneal@45: bgneal@45: /* if (f.removeInstance) { bgneal@45: ed.onDestroy.add(function() { bgneal@45: return f.removeInstance(ed.id); bgneal@45: }); bgneal@45: }*/ bgneal@45: bgneal@45: if (f.handleNodeChange) { bgneal@45: ed.onNodeChange.add(function(ed, cm, n) { bgneal@45: f.handleNodeChange(ed.id, n, 0, 0, false, !ed.selection.isCollapsed()); bgneal@45: }); bgneal@45: } bgneal@45: bgneal@45: if (f.onChange) { bgneal@45: ed.onChange.add(function(ed, n) { bgneal@45: return f.onChange(ed); bgneal@45: }); bgneal@45: } bgneal@45: bgneal@45: if (f.cleanup) { bgneal@45: ed.onGetContent.add(function() { bgneal@45: //f.cleanup(type, content, inst); bgneal@45: }); bgneal@45: } bgneal@45: bgneal@45: this.getInfo = function() { bgneal@45: return f.getInfo(); bgneal@45: }; bgneal@45: bgneal@45: this.createControl = function(n) { bgneal@45: tinyMCE.pluginURL = tinymce.baseURL + '/plugins/' + pn; bgneal@45: tinyMCE.themeURL = tinymce.baseURL + '/themes/' + tinyMCE.activeEditor.settings.theme; bgneal@45: bgneal@45: if (f.getControlHTML) bgneal@45: return f.getControlHTML(n); bgneal@45: bgneal@45: return null; bgneal@45: }; bgneal@45: bgneal@45: this.execCommand = function(cmd, ui, val) { bgneal@45: if (f.execCommand) bgneal@45: return f.execCommand(ed.id, ed.getBody(), cmd, ui, val); bgneal@45: bgneal@45: return false; bgneal@45: }; bgneal@45: }; bgneal@45: bgneal@45: tinymce.PluginManager.add(pn, PluginWrapper); bgneal@45: }, bgneal@45: bgneal@45: _getDOM : function() { bgneal@45: return tinyMCE.activeEditor ? tinyMCE.activeEditor.dom : tinymce.DOM; bgneal@45: }, bgneal@45: bgneal@45: convertRelativeToAbsoluteURL : function(b, u) { bgneal@45: return new tinymce.util.URI(b).toAbsolute(u); bgneal@45: }, bgneal@45: bgneal@45: convertAbsoluteURLToRelativeURL : function(b, u) { bgneal@45: return new tinymce.util.URI(b).toRelative(u); bgneal@45: } bgneal@45: }); bgneal@45: bgneal@45: // Extend Editor class bgneal@45: tinymce.extend(tinymce.Editor.prototype, { bgneal@45: getFocusElement : function() { bgneal@45: return this.selection.getNode(); bgneal@45: }, bgneal@45: bgneal@45: getData : function(n) { bgneal@45: if (!this.data) bgneal@45: this.data = []; bgneal@45: bgneal@45: if (!this.data[n]) bgneal@45: this.data[n] = []; bgneal@45: bgneal@45: return this.data[n]; bgneal@45: }, bgneal@45: bgneal@45: hasPlugin : function(n) { bgneal@45: return this.plugins[n] != null; bgneal@45: }, bgneal@45: bgneal@45: getContainerWin : function() { bgneal@45: return window; bgneal@45: }, bgneal@45: bgneal@45: getHTML : function(raw) { bgneal@45: return this.getContent({ format : raw ? 'raw' : 'html'}); bgneal@45: }, bgneal@45: bgneal@45: setHTML : function(h) { bgneal@45: this.setContent(h); bgneal@45: }, bgneal@45: bgneal@45: getSel : function() { bgneal@45: return this.selection.getSel(); bgneal@45: }, bgneal@45: bgneal@45: getRng : function() { bgneal@45: return this.selection.getRng(); bgneal@45: }, bgneal@45: bgneal@45: isHidden : function() { bgneal@45: var s; bgneal@45: bgneal@45: if (!tinymce.isGecko) bgneal@45: return false; bgneal@45: bgneal@45: s = this.getSel(); bgneal@45: bgneal@45: // Weird, wheres that cursor selection? bgneal@45: return (!s || !s.rangeCount || s.rangeCount == 0); bgneal@45: }, bgneal@45: bgneal@45: translate : function(s) { bgneal@45: var c = this.settings.language, o; bgneal@45: bgneal@45: if (!s) bgneal@45: return s; bgneal@45: bgneal@45: o = tinymce.EditorManager.i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) { bgneal@45: return tinymce.EditorManager.i18n[c + '.' + b] || '{#' + b + '}'; bgneal@45: }); bgneal@45: bgneal@45: o = o.replace(/{\$lang_([^}]+)\}/g, function(a, b) { bgneal@45: return tinymce.EditorManager.i18n[c + '.' + b] || '{$lang_' + b + '}'; bgneal@45: }); bgneal@45: bgneal@45: return o; bgneal@45: }, bgneal@45: bgneal@45: repaint : function() { bgneal@45: this.execCommand('mceRepaint'); bgneal@45: } bgneal@45: }); bgneal@45: bgneal@45: // Extend selection bgneal@45: tinymce.extend(tinymce.dom.Selection.prototype, { bgneal@45: getSelectedText : function() { bgneal@45: return this.getContent({format : 'text'}); bgneal@45: }, bgneal@45: bgneal@45: getSelectedHTML : function() { bgneal@45: return this.getContent({format : 'html'}); bgneal@45: }, bgneal@45: bgneal@45: getFocusElement : function() { bgneal@45: return this.getNode(); bgneal@45: }, bgneal@45: bgneal@45: selectNode : function(node, collapse, select_text_node, to_start) { bgneal@45: var t = this; bgneal@45: bgneal@45: t.select(node, select_text_node || 0); bgneal@45: bgneal@45: if (!is(collapse)) bgneal@45: collapse = true; bgneal@45: bgneal@45: if (collapse) { bgneal@45: if (!is(to_start)) bgneal@45: to_start = true; bgneal@45: bgneal@45: t.collapse(to_start); bgneal@45: } bgneal@45: } bgneal@45: }); bgneal@45: }).call(this); bgneal@45: bgneal@45: // Register plugin bgneal@45: tinymce.PluginManager.add('compat2x', tinymce.plugins.Compat2x); bgneal@45: })(); bgneal@45: