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: