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