app/tiny_mce/plugins/compat2x/editor_plugin_src.js
author Todd Larsen <tlarsen@google.com>
Sat, 22 Nov 2008 08:55:55 +0000
changeset 546 850d9a5ad894
parent 154 d2377425d3f2
permissions -rwxr-xr-x
Rename the User.public_name Property to simply 'name' (but leave the verbose name as "Public name"). This is to take advantage of standardizing on 'name' in the common edit template (and possibly other common templates). The Property was renamed because public_name was already a "name", unlike the recent change to the Work Model class, where 'title' was "aliases" using a tiny name() method instead. Patch by: Todd Larsen

/**
 * $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);
})();