includes/clientside/tinymce/plugins/compat2x/editor_plugin_src.js
changeset 335 67bd3121a12e
child 395 fa4c5ecb7c9a
equal deleted inserted replaced
334:c72b545f1304 335:67bd3121a12e
       
     1 /**
       
     2  * $Id: editor_plugin_src.js 264 2007-04-26 20:53:09Z spocke $
       
     3  *
       
     4  * @author Moxiecode
       
     5  * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
       
     6  */
       
     7 
       
     8 (function() {
       
     9 	var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is;
       
    10 
       
    11 	tinymce.create('tinymce.plugins.Compat2x', {
       
    12 		getInfo : function() {
       
    13 			return {
       
    14 				longname : 'Compat2x',
       
    15 				author : 'Moxiecode Systems AB',
       
    16 				authorurl : 'http://tinymce.moxiecode.com',
       
    17 				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/compat2x',
       
    18 				version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
       
    19 			};
       
    20 		}
       
    21 	});
       
    22 
       
    23 	(function() {
       
    24 		// Extend tinyMCE/EditorManager
       
    25 		tinymce.extend(tinyMCE, {
       
    26 			addToLang : function(p, l) {
       
    27 				each(l, function(v, k) {
       
    28 					tinyMCE.i18n[(tinyMCE.settings.language || 'en') + '.' + (p ? p + '_' : '') + k] = v;
       
    29 				});
       
    30 			},
       
    31 
       
    32 			getInstanceById : function(n) {
       
    33 				return this.get(n);
       
    34 			}
       
    35 		});
       
    36 	})();
       
    37 
       
    38 	(function() {
       
    39 		var EditorManager = tinymce.EditorManager;
       
    40 
       
    41 		tinyMCE.instances = {};
       
    42 		tinyMCE.plugins = {};
       
    43 		tinymce.PluginManager.onAdd.add(function(pm, n, p) {
       
    44 			tinyMCE.plugins[n] = p;
       
    45 		});
       
    46 
       
    47 		tinyMCE.majorVersion = tinymce.majorVersion;
       
    48 		tinyMCE.minorVersion = tinymce.minorVersion;
       
    49 		tinyMCE.releaseDate = tinymce.releaseDate;
       
    50 		tinyMCE.baseURL = tinymce.baseURL;
       
    51 		tinyMCE.isIE = tinyMCE.isMSIE = tinymce.isIE || tinymce.isOpera;
       
    52 		tinyMCE.isMSIE5 = tinymce.isIE;
       
    53 		tinyMCE.isMSIE5_0 = tinymce.isIE;
       
    54 		tinyMCE.isMSIE7 = tinymce.isIE;
       
    55 		tinyMCE.isGecko = tinymce.isGecko;
       
    56 		tinyMCE.isSafari = tinymce.isWebKit;
       
    57 		tinyMCE.isOpera = tinymce.isOpera;
       
    58 		tinyMCE.isMac = false;
       
    59 		tinyMCE.isNS7 = false;
       
    60 		tinyMCE.isNS71 = false;
       
    61 		tinyMCE.compat = true;
       
    62 
       
    63 		// Extend tinyMCE class
       
    64 		TinyMCE_Engine = tinyMCE;
       
    65 		tinymce.extend(tinyMCE, {
       
    66 			getParam : function(n, dv) {
       
    67 				return this.activeEditor.getParam(n, dv);
       
    68 			},
       
    69 
       
    70 			addEvent : function(e, na, f, sc) {
       
    71 				tinymce.dom.Event.add(e, na, f, sc || this);
       
    72 			},
       
    73 
       
    74 			getControlHTML : function(n) {
       
    75 				return EditorManager.activeEditor.controlManager.createControl(n);
       
    76 			},
       
    77 
       
    78 			loadCSS : function(u) {
       
    79 				tinymce.DOM.loadCSS(u);
       
    80 			},
       
    81 
       
    82 			importCSS : function(doc, u) {
       
    83 				if (doc == document)
       
    84 					this.loadCSS(u);
       
    85 				else
       
    86 					new tinymce.dom.DOMUtils(doc).loadCSS(u);
       
    87 			},
       
    88 
       
    89 			log : function() {
       
    90 				console.debug.apply(console, arguments);
       
    91 			},
       
    92 
       
    93 			getLang : function(n, dv) {
       
    94 				var v = EditorManager.activeEditor.getLang(n.replace(/^lang_/g, ''), dv);
       
    95 
       
    96 				// Is number
       
    97 				if (/^[0-9\-.]+$/g.test(v))
       
    98 					return parseInt(v);
       
    99 
       
   100 				return v;
       
   101 			},
       
   102 
       
   103 			isInstance : function(o) {
       
   104 				return o != null && typeof(o) == "object" && o.execCommand;
       
   105 			},
       
   106 
       
   107 			triggerNodeChange : function() {
       
   108 				EditorManager.activeEditor.nodeChanged();
       
   109 			},
       
   110 
       
   111 			regexpReplace : function(in_str, reg_exp, replace_str, opts) {
       
   112 				var re;
       
   113 
       
   114 				if (in_str == null)
       
   115 					return in_str;
       
   116 
       
   117 				if (typeof(opts) == "undefined")
       
   118 					opts = 'g';
       
   119 
       
   120 				re = new RegExp(reg_exp, opts);
       
   121 
       
   122 				return in_str.replace(re, replace_str);
       
   123 			},
       
   124 
       
   125 			trim : function(s) {
       
   126 				return tinymce.trim(s);
       
   127 			},
       
   128 
       
   129 			xmlEncode : function(s) {
       
   130 				return tinymce.DOM.encode(s);
       
   131 			},
       
   132 
       
   133 			explode : function(s, d) {
       
   134 				var o = [];
       
   135 
       
   136 				tinymce.each(s.split(d), function(v) {
       
   137 					if (v != '')
       
   138 						o.push(v);
       
   139 				});
       
   140 
       
   141 				return o;
       
   142 			},
       
   143 
       
   144 			switchClass : function(id, cls) {
       
   145 				var b;
       
   146 
       
   147 				if (/^mceButton/.test(cls)) {
       
   148 					b = EditorManager.activeEditor.controlManager.get(id);
       
   149 
       
   150 					if (!b)
       
   151 						return;
       
   152 
       
   153 					switch (cls) {
       
   154 						case "mceButtonNormal":
       
   155 							b.setDisabled(false);
       
   156 							b.setActive(false);
       
   157 							return;
       
   158 
       
   159 						case "mceButtonDisabled":
       
   160 							b.setDisabled(true);
       
   161 							return;
       
   162 
       
   163 						case "mceButtonSelected":
       
   164 							b.setActive(true);
       
   165 							b.setDisabled(false);
       
   166 							return;
       
   167 					}
       
   168 				}
       
   169 			},
       
   170 
       
   171 			addCSSClass : function(e, n, b) {
       
   172 				return tinymce.DOM.addClass(e, n, b);
       
   173 			},
       
   174 
       
   175 			hasCSSClass : function(e, n) {
       
   176 				return tinymce.DOM.hasClass(e, n);
       
   177 			},
       
   178 
       
   179 			removeCSSClass : function(e, n) {
       
   180 				return tinymce.DOM.removeClass(e, n);
       
   181 			},
       
   182 
       
   183 			getCSSClasses : function() {
       
   184 				var cl = EditorManager.activeEditor.dom.getClasses(), o = [];
       
   185 
       
   186 				each(cl, function(c) {
       
   187 					o.push(c['class']);
       
   188 				});
       
   189 
       
   190 				return o;
       
   191 			},
       
   192 
       
   193 			setWindowArg : function(n, v) {
       
   194 				EditorManager.activeEditor.windowManager.params[n] = v;
       
   195 			},
       
   196 
       
   197 			getWindowArg : function(n, dv) {
       
   198 				var wm = EditorManager.activeEditor.windowManager, v;
       
   199 
       
   200 				v = wm.getParam(n);
       
   201 				if (v === '')
       
   202 					return '';
       
   203 
       
   204 				return v || wm.getFeature(n) || dv;
       
   205 			},
       
   206 
       
   207 			getParentNode : function(n, f) {
       
   208 				return this._getDOM().getParent(n, f);
       
   209 			},
       
   210 
       
   211 			selectElements : function(n, na, f) {
       
   212 				var i, a = [], nl, x;
       
   213 
       
   214 				for (x=0, na = na.split(','); x<na.length; x++)
       
   215 					for (i=0, nl = n.getElementsByTagName(na[x]); i<nl.length; i++)
       
   216 						(!f || f(nl[i])) && a.push(nl[i]);
       
   217 
       
   218 				return a;
       
   219 			},
       
   220 
       
   221 			getNodeTree : function(n, na, t, nn) {
       
   222 				return this.selectNodes(n, function(n) {
       
   223 					return (!t || n.nodeType == t) && (!nn || n.nodeName == nn);
       
   224 				}, na ? na : []);
       
   225 			},
       
   226 
       
   227 			getAttrib : function(e, n, dv) {
       
   228 				return this._getDOM().getAttrib(e, n, dv);
       
   229 			},
       
   230 
       
   231 			setAttrib : function(e, n, v) {
       
   232 				return this._getDOM().setAttrib(e, n, v);
       
   233 			},
       
   234 
       
   235 			getElementsByAttributeValue : function(n, e, a, v) {
       
   236 				var i, nl = n.getElementsByTagName(e), o = [];
       
   237 
       
   238 				for (i=0; i<nl.length; i++) {
       
   239 					if (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1)
       
   240 						o[o.length] = nl[i];
       
   241 				}
       
   242 
       
   243 				return o;
       
   244 			},
       
   245 
       
   246 			selectNodes : function(n, f, a) {
       
   247 				var i;
       
   248 
       
   249 				if (!a)
       
   250 					a = [];
       
   251 
       
   252 				if (f(n))
       
   253 					a[a.length] = n;
       
   254 
       
   255 				if (n.hasChildNodes()) {
       
   256 					for (i=0; i<n.childNodes.length; i++)
       
   257 						tinyMCE.selectNodes(n.childNodes[i], f, a);
       
   258 				}
       
   259 
       
   260 				return a;
       
   261 			},
       
   262 
       
   263 			getContent : function() {
       
   264 				return EditorManager.activeEditor.getContent();
       
   265 			},
       
   266 
       
   267 			getParentElement : function(n, na, f) {
       
   268 				if (na)
       
   269 					na = new RegExp('^(' + na.toUpperCase().replace(/,/g, '|') + ')$', 'g');
       
   270 
       
   271 				return this._getDOM().getParent(n, function(n) {
       
   272 					return n.nodeType == 1 && (!na || na.test(n.nodeName)) && (!f || f(n));
       
   273 				}, this.activeEditor.getBody());
       
   274 			},
       
   275 
       
   276 			importPluginLanguagePack : function(n) {
       
   277 				tinymce.PluginManager.requireLangPack(n);
       
   278 			},
       
   279 
       
   280 			getButtonHTML : function(cn, lang, img, c, u, v) {
       
   281 				var ed = EditorManager.activeEditor;
       
   282 
       
   283 				img = img.replace(/\{\$pluginurl\}/g, tinyMCE.pluginURL);
       
   284 				img = img.replace(/\{\$themeurl\}/g, tinyMCE.themeURL);
       
   285 				lang = lang.replace(/^lang_/g, '');
       
   286 
       
   287 				return ed.controlManager.createButton(cn, {
       
   288 					title : lang,
       
   289 					command : c,
       
   290 					ui : u,
       
   291 					value : v,
       
   292 					scope : this,
       
   293 					'class' : 'compat',
       
   294 					image : img
       
   295 				});
       
   296 			},
       
   297 
       
   298 			addSelectAccessibility : function(e, s, w) {
       
   299 				// Add event handlers 
       
   300 				if (!s._isAccessible) {
       
   301 					s.onkeydown = tinyMCE.accessibleEventHandler;
       
   302 					s.onblur = tinyMCE.accessibleEventHandler;
       
   303 					s._isAccessible = true;
       
   304 					s._win = w;
       
   305 				}
       
   306 
       
   307 				return false;
       
   308 			},
       
   309 
       
   310 			accessibleEventHandler : function(e) {
       
   311 				var elm, win = this._win;
       
   312 
       
   313 				e = tinymce.isIE ? win.event : e;
       
   314 				elm = tinymce.isIE ? e.srcElement : e.target;
       
   315 
       
   316 				// Unpiggyback onchange on blur
       
   317 				if (e.type == "blur") {
       
   318 					if (elm.oldonchange) {
       
   319 						elm.onchange = elm.oldonchange;
       
   320 						elm.oldonchange = null;
       
   321 					}
       
   322 
       
   323 					return true;
       
   324 				}
       
   325 
       
   326 				// Piggyback onchange
       
   327 				if (elm.nodeName == "SELECT" && !elm.oldonchange) {
       
   328 					elm.oldonchange = elm.onchange;
       
   329 					elm.onchange = null;
       
   330 				}
       
   331 
       
   332 				// Execute onchange and remove piggyback
       
   333 				if (e.keyCode == 13 || e.keyCode == 32) {
       
   334 					elm.onchange = elm.oldonchange;
       
   335 					elm.onchange();
       
   336 					elm.oldonchange = null;
       
   337 
       
   338 					tinyMCE.cancelEvent(e);
       
   339 					return false;
       
   340 				}
       
   341 
       
   342 				return true;
       
   343 			},
       
   344 
       
   345 			cancelEvent : function(e) {
       
   346 				return tinymce.dom.Event.cancel(e);
       
   347 			},
       
   348 
       
   349 			handleVisualAid : function(e) {
       
   350 				EditorManager.activeEditor.addVisual(e);
       
   351 			},
       
   352 
       
   353 			getAbsPosition : function(n, r) {
       
   354 				return tinymce.DOM.getPos(n, r);
       
   355 			},
       
   356 
       
   357 			cleanupEventStr : function(s) {
       
   358 				s = "" + s;
       
   359 				s = s.replace('function anonymous()\n{\n', '');
       
   360 				s = s.replace('\n}', '');
       
   361 				s = s.replace(/^return true;/gi, ''); // Remove event blocker
       
   362 
       
   363 				return s;
       
   364 			},
       
   365 
       
   366 			getVisualAidClass : function(s) {
       
   367 				// TODO: Implement
       
   368 				return s;
       
   369 			},
       
   370 
       
   371 			parseStyle : function(s) {
       
   372 				return this._getDOM().parseStyle(s);
       
   373 			},
       
   374 
       
   375 			serializeStyle : function(s) {
       
   376 				return this._getDOM().serializeStyle(s);
       
   377 			},
       
   378 
       
   379 			openWindow : function(tpl, args) {
       
   380 				var ed = EditorManager.activeEditor, o = {}, n;
       
   381 
       
   382 				// Convert name/value array to object
       
   383 				for (n in tpl)
       
   384 					o[n] = tpl[n];
       
   385 
       
   386 				tpl = o;
       
   387 
       
   388 				args = args || {};
       
   389 				tpl.url = new tinymce.util.URI(tinymce.ThemeManager.themeURLs[ed.settings.theme]).toAbsolute(tpl.file);
       
   390 				tpl.inline = tpl.inline || args.inline;
       
   391 
       
   392 				ed.windowManager.open(tpl, args);
       
   393 			},
       
   394 
       
   395 			closeWindow : function(win) {
       
   396 				EditorManager.activeEditor.windowManager.close(win);
       
   397 			},
       
   398 
       
   399 			getOuterHTML : function(e) {
       
   400 				return tinymce.DOM.getOuterHTML(e);
       
   401 			},
       
   402 
       
   403 			setOuterHTML : function(e, h, d) {
       
   404 				return tinymce.DOM.setOuterHTML(e, h, d);
       
   405 			},
       
   406 
       
   407 			hasPlugin : function(n) {
       
   408 				return tinymce.PluginManager.get(n) != null;
       
   409 			},
       
   410 
       
   411 			_setEventsEnabled : function() {
       
   412 				// Ignore it!!
       
   413 			},
       
   414 
       
   415 			addPlugin : function(pn, f) {
       
   416 				var t = this;
       
   417 
       
   418 				function PluginWrapper(ed) {
       
   419 					tinyMCE.selectedInstance = ed;
       
   420 
       
   421 					ed.onInit.add(function() {
       
   422 						t.settings = ed.settings;
       
   423 						t.settings['base_href'] = tinyMCE.documentBasePath;
       
   424 						tinyMCE.settings = t.settings;
       
   425 						tinyMCE.documentBasePath = ed.documentBasePath;
       
   426 						//ed.formElement = DOM.get(ed.id);
       
   427 
       
   428 						if (f.initInstance)
       
   429 							f.initInstance(ed);
       
   430 
       
   431 						ed.contentDocument = ed.getDoc();
       
   432 						ed.contentWindow = ed.getWin();
       
   433 						ed.undoRedo = ed.undoManager;
       
   434 						ed.startContent = ed.getContent({format : 'raw'});
       
   435 
       
   436 						tinyMCE.instances[ed.id] = ed;
       
   437 						tinyMCE.loadedFiles = [];
       
   438 					});
       
   439 
       
   440 					ed.onActivate.add(function() {
       
   441 						tinyMCE.settings = ed.settings;
       
   442 						tinyMCE.selectedInstance = ed;
       
   443 					});
       
   444 
       
   445 				/*	if (f.removeInstance) {
       
   446 						ed.onDestroy.add(function() {
       
   447 							return f.removeInstance(ed.id);
       
   448 						});
       
   449 					}*/
       
   450 
       
   451 					if (f.handleNodeChange) {
       
   452 						ed.onNodeChange.add(function(ed, cm, n) {
       
   453 							f.handleNodeChange(ed.id, n, 0, 0, false, !ed.selection.isCollapsed());
       
   454 						});
       
   455 					}
       
   456 
       
   457 					if (f.onChange) {
       
   458 						ed.onChange.add(function(ed, n) {
       
   459 							return f.onChange(ed);
       
   460 						});
       
   461 					}
       
   462 
       
   463 					if (f.cleanup) {
       
   464 						ed.onGetContent.add(function() {
       
   465 							//f.cleanup(type, content, inst);
       
   466 						});
       
   467 					}
       
   468 
       
   469 					this.getInfo = function() {
       
   470 						return f.getInfo();
       
   471 					};
       
   472 
       
   473 					this.createControl = function(n) {
       
   474 						tinyMCE.pluginURL = tinymce.baseURL + '/plugins/' + pn;
       
   475 						tinyMCE.themeURL = tinymce.baseURL + '/themes/' + tinyMCE.activeEditor.settings.theme;
       
   476 
       
   477 						if (f.getControlHTML)
       
   478 							return f.getControlHTML(n);
       
   479 
       
   480 						return null;
       
   481 					};
       
   482 
       
   483 					this.execCommand = function(cmd, ui, val) {
       
   484 						if (f.execCommand)
       
   485 							return f.execCommand(ed.id, ed.getBody(), cmd, ui, val);
       
   486 
       
   487 						return false;
       
   488 					};
       
   489 				};
       
   490 
       
   491 				tinymce.PluginManager.add(pn, PluginWrapper);
       
   492 			},
       
   493 
       
   494 			_getDOM : function() {
       
   495 				return tinyMCE.activeEditor ? tinyMCE.activeEditor.dom : tinymce.DOM;
       
   496 			},
       
   497 
       
   498 			convertRelativeToAbsoluteURL : function(b, u) {
       
   499 				return new tinymce.util.URI(b).toAbsolute(u);
       
   500 			},
       
   501 
       
   502 			convertAbsoluteURLToRelativeURL : function(b, u) {
       
   503 				return new tinymce.util.URI(b).toRelative(u);
       
   504 			}
       
   505 		});
       
   506 
       
   507 		// Extend Editor class
       
   508 		tinymce.extend(tinymce.Editor.prototype, {
       
   509 			getFocusElement : function() {
       
   510 				return this.selection.getNode();
       
   511 			},
       
   512 
       
   513 			getData : function(n) {
       
   514 				if (!this.data)
       
   515 					this.data = [];
       
   516 
       
   517 				if (!this.data[n])
       
   518 					this.data[n] = [];
       
   519 
       
   520 				return this.data[n];
       
   521 			},
       
   522 
       
   523 			hasPlugin : function(n) {
       
   524 				return this.plugins[n] != null;
       
   525 			},
       
   526 
       
   527 			getContainerWin : function() {
       
   528 				return window;
       
   529 			},
       
   530 
       
   531 			getHTML : function(raw) {
       
   532 				return this.getContent({ format : raw ? 'raw' : 'html'});
       
   533 			},
       
   534 
       
   535 			setHTML : function(h) {
       
   536 				this.setContent(h);
       
   537 			},
       
   538 
       
   539 			getSel : function() {
       
   540 				return this.selection.getSel();
       
   541 			},
       
   542 
       
   543 			getRng : function() {
       
   544 				return this.selection.getRng();
       
   545 			},
       
   546 
       
   547 			isHidden : function() {
       
   548 				var s;
       
   549 
       
   550 				if (!tinymce.isGecko)
       
   551 					return false;
       
   552 
       
   553 				s = this.getSel();
       
   554 
       
   555 				// Weird, wheres that cursor selection?
       
   556 				return (!s || !s.rangeCount || s.rangeCount == 0);
       
   557 			},
       
   558 
       
   559 			translate : function(s) {
       
   560 				var c = this.settings.language, o;
       
   561 
       
   562 				o = tinymce.EditorManager.i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) {
       
   563 					return tinymce.EditorManager.i18n[c + '.' + b] || '{#' + b + '}';
       
   564 				});
       
   565 
       
   566 				o = o.replace(/{\$lang_([^}]+)\}/g, function(a, b) {
       
   567 					return tinymce.EditorManager.i18n[c + '.' + b] || '{$lang_' + b + '}';
       
   568 				});
       
   569 
       
   570 				return o;
       
   571 			},
       
   572 
       
   573 			repaint : function() {
       
   574 				this.execCommand('mceRepaint');
       
   575 			}
       
   576 		});
       
   577 
       
   578 		// Extend selection
       
   579 		tinymce.extend(tinymce.dom.Selection.prototype, {
       
   580 			getSelectedText : function() {
       
   581 				return this.getContent({format : 'text'});
       
   582 			},
       
   583 
       
   584 			getSelectedHTML : function() {
       
   585 				return this.getContent({format : 'html'});
       
   586 			},
       
   587 
       
   588 			getFocusElement : function() {
       
   589 				return this.getNode();
       
   590 			},
       
   591 
       
   592 			selectNode : function(node, collapse, select_text_node, to_start) {
       
   593 				var t = this;
       
   594 
       
   595 				t.select(node, select_text_node || 0);
       
   596 
       
   597 				if (!is(collapse))
       
   598 					collapse = true;
       
   599 
       
   600 				if (collapse) {
       
   601 					if (!is(to_start))
       
   602 						to_start = true;
       
   603 
       
   604 					t.collapse(to_start);
       
   605 				}
       
   606 			}
       
   607 		});
       
   608 	}).call(this);
       
   609 
       
   610 	// Register plugin
       
   611 	tinymce.PluginManager.add('compat2x', tinymce.plugins.Compat2x);
       
   612 })();
       
   613