2 * Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.
\r
6 var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is;
\r
8 tinymce.create('tinymce.plugins.Compat2x', {
\r
9 getInfo : function() {
\r
11 longname : 'Compat2x',
\r
12 author : 'Moxiecode Systems AB',
\r
13 authorurl : 'http://tinymce.moxiecode.com',
\r
14 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/compat2x',
\r
15 version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
\r
21 // Extend tinyMCE/EditorManager
\r
22 tinymce.extend(tinyMCE, {
\r
23 addToLang : function(p, l) {
\r
24 each(l, function(v, k) {
\r
25 tinyMCE.i18n[(tinyMCE.settings.language || 'en') + '.' + (p ? p + '_' : '') + k] = v;
\r
29 getInstanceById : function(n) {
\r
36 var EditorManager = tinymce.EditorManager;
\r
38 tinyMCE.instances = {};
\r
39 tinyMCE.plugins = {};
\r
40 tinymce.PluginManager.onAdd.add(function(pm, n, p) {
\r
41 tinyMCE.plugins[n] = p;
\r
44 tinyMCE.majorVersion = tinymce.majorVersion;
\r
45 tinyMCE.minorVersion = tinymce.minorVersion;
\r
46 tinyMCE.releaseDate = tinymce.releaseDate;
\r
47 tinyMCE.baseURL = tinymce.baseURL;
\r
48 tinyMCE.isIE = tinyMCE.isMSIE = tinymce.isIE || tinymce.isOpera;
\r
49 tinyMCE.isMSIE5 = tinymce.isIE;
\r
50 tinyMCE.isMSIE5_0 = tinymce.isIE;
\r
51 tinyMCE.isMSIE7 = tinymce.isIE;
\r
52 tinyMCE.isGecko = tinymce.isGecko;
\r
53 tinyMCE.isSafari = tinymce.isWebKit;
\r
54 tinyMCE.isOpera = tinymce.isOpera;
\r
55 tinyMCE.isMac = false;
\r
56 tinyMCE.isNS7 = false;
\r
57 tinyMCE.isNS71 = false;
\r
58 tinyMCE.compat = true;
\r
60 // Extend tinyMCE class
\r
61 TinyMCE_Engine = tinyMCE;
\r
62 tinymce.extend(tinyMCE, {
\r
63 getParam : function(n, dv) {
\r
64 return this.activeEditor.getParam(n, dv);
\r
67 addEvent : function(e, na, f, sc) {
\r
68 tinymce.dom.Event.add(e, na, f, sc || this);
\r
71 getControlHTML : function(n) {
\r
72 return EditorManager.activeEditor.controlManager.createControl(n);
\r
75 loadCSS : function(u) {
\r
76 tinymce.DOM.loadCSS(u);
\r
79 importCSS : function(doc, u) {
\r
80 if (doc == document)
\r
83 new tinymce.dom.DOMUtils(doc).loadCSS(u);
\r
87 console.debug.apply(console, arguments);
\r
90 getLang : function(n, dv) {
\r
91 var v = EditorManager.activeEditor.getLang(n.replace(/^lang_/g, ''), dv);
\r
94 if (/^[0-9\-.]+$/g.test(v))
\r
100 isInstance : function(o) {
\r
101 return o != null && typeof(o) == "object" && o.execCommand;
\r
104 triggerNodeChange : function() {
\r
105 EditorManager.activeEditor.nodeChanged();
\r
108 regexpReplace : function(in_str, reg_exp, replace_str, opts) {
\r
111 if (in_str == null)
\r
114 if (typeof(opts) == "undefined")
\r
117 re = new RegExp(reg_exp, opts);
\r
119 return in_str.replace(re, replace_str);
\r
122 trim : function(s) {
\r
123 return tinymce.trim(s);
\r
126 xmlEncode : function(s) {
\r
127 return tinymce.DOM.encode(s);
\r
130 explode : function(s, d) {
\r
133 tinymce.each(s.split(d), function(v) {
\r
141 switchClass : function(id, cls) {
\r
144 if (/^mceButton/.test(cls)) {
\r
145 b = EditorManager.activeEditor.controlManager.get(id);
\r
151 case "mceButtonNormal":
\r
152 b.setDisabled(false);
\r
153 b.setActive(false);
\r
156 case "mceButtonDisabled":
\r
157 b.setDisabled(true);
\r
160 case "mceButtonSelected":
\r
162 b.setDisabled(false);
\r
168 addCSSClass : function(e, n, b) {
\r
169 return tinymce.DOM.addClass(e, n, b);
\r
172 hasCSSClass : function(e, n) {
\r
173 return tinymce.DOM.hasClass(e, n);
\r
176 removeCSSClass : function(e, n) {
\r
177 return tinymce.DOM.removeClass(e, n);
\r
180 getCSSClasses : function() {
\r
181 var cl = EditorManager.activeEditor.dom.getClasses(), o = [];
\r
183 each(cl, function(c) {
\r
184 o.push(c['class']);
\r
190 setWindowArg : function(n, v) {
\r
191 EditorManager.activeEditor.windowManager.params[n] = v;
\r
194 getWindowArg : function(n, dv) {
\r
195 var wm = EditorManager.activeEditor.windowManager, v;
\r
197 v = wm.getParam(n);
\r
201 return v || wm.getFeature(n) || dv;
\r
204 getParentNode : function(n, f) {
\r
205 return this._getDOM().getParent(n, f);
\r
208 selectElements : function(n, na, f) {
\r
209 var i, a = [], nl, x;
\r
211 for (x=0, na = na.split(','); x<na.length; x++)
\r
212 for (i=0, nl = n.getElementsByTagName(na[x]); i<nl.length; i++)
\r
213 (!f || f(nl[i])) && a.push(nl[i]);
\r
218 getNodeTree : function(n, na, t, nn) {
\r
219 return this.selectNodes(n, function(n) {
\r
220 return (!t || n.nodeType == t) && (!nn || n.nodeName == nn);
\r
224 getAttrib : function(e, n, dv) {
\r
225 return this._getDOM().getAttrib(e, n, dv);
\r
228 setAttrib : function(e, n, v) {
\r
229 return this._getDOM().setAttrib(e, n, v);
\r
232 getElementsByAttributeValue : function(n, e, a, v) {
\r
233 var i, nl = n.getElementsByTagName(e), o = [];
\r
235 for (i=0; i<nl.length; i++) {
\r
236 if (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1)
\r
237 o[o.length] = nl[i];
\r
243 selectNodes : function(n, f, a) {
\r
252 if (n.hasChildNodes()) {
\r
253 for (i=0; i<n.childNodes.length; i++)
\r
254 tinyMCE.selectNodes(n.childNodes[i], f, a);
\r
260 getContent : function() {
\r
261 return EditorManager.activeEditor.getContent();
\r
264 getParentElement : function(n, na, f) {
\r
266 na = new RegExp('^(' + na.toUpperCase().replace(/,/g, '|') + ')$', 'g');
\r
268 return this._getDOM().getParent(n, function(n) {
\r
269 return n.nodeType == 1 && (!na || na.test(n.nodeName)) && (!f || f(n));
\r
270 }, this.activeEditor.getBody());
\r
273 importPluginLanguagePack : function(n) {
\r
274 tinymce.PluginManager.requireLangPack(n);
\r
277 getButtonHTML : function(cn, lang, img, c, u, v) {
\r
278 var ed = EditorManager.activeEditor;
\r
280 img = img.replace(/\{\$pluginurl\}/g, tinyMCE.pluginURL);
\r
281 img = img.replace(/\{\$themeurl\}/g, tinyMCE.themeURL);
\r
282 lang = lang.replace(/^lang_/g, '');
\r
284 return ed.controlManager.createButton(cn, {
\r
290 'class' : 'compat',
\r
295 addSelectAccessibility : function(e, s, w) {
\r
296 // Add event handlers
\r
297 if (!s._isAccessible) {
\r
298 s.onkeydown = tinyMCE.accessibleEventHandler;
\r
299 s.onblur = tinyMCE.accessibleEventHandler;
\r
300 s._isAccessible = true;
\r
307 accessibleEventHandler : function(e) {
\r
308 var elm, win = this._win;
\r
310 e = tinymce.isIE ? win.event : e;
\r
311 elm = tinymce.isIE ? e.srcElement : e.target;
\r
313 // Unpiggyback onchange on blur
\r
314 if (e.type == "blur") {
\r
315 if (elm.oldonchange) {
\r
316 elm.onchange = elm.oldonchange;
\r
317 elm.oldonchange = null;
\r
323 // Piggyback onchange
\r
324 if (elm.nodeName == "SELECT" && !elm.oldonchange) {
\r
325 elm.oldonchange = elm.onchange;
\r
326 elm.onchange = null;
\r
329 // Execute onchange and remove piggyback
\r
330 if (e.keyCode == 13 || e.keyCode == 32) {
\r
331 elm.onchange = elm.oldonchange;
\r
333 elm.oldonchange = null;
\r
335 tinyMCE.cancelEvent(e);
\r
342 cancelEvent : function(e) {
\r
343 return tinymce.dom.Event.cancel(e);
\r
346 handleVisualAid : function(e) {
\r
347 EditorManager.activeEditor.addVisual(e);
\r
350 getAbsPosition : function(n, r) {
\r
351 return tinymce.DOM.getPos(n, r);
\r
354 cleanupEventStr : function(s) {
\r
356 s = s.replace('function anonymous()\n{\n', '');
\r
357 s = s.replace('\n}', '');
\r
358 s = s.replace(/^return true;/gi, ''); // Remove event blocker
\r
363 getVisualAidClass : function(s) {
\r
368 parseStyle : function(s) {
\r
369 return this._getDOM().parseStyle(s);
\r
372 serializeStyle : function(s) {
\r
373 return this._getDOM().serializeStyle(s);
\r
376 openWindow : function(tpl, args) {
\r
377 var ed = EditorManager.activeEditor, o = {}, n;
\r
379 // Convert name/value array to object
\r
386 tpl.url = new tinymce.util.URI(tinymce.ThemeManager.themeURLs[ed.settings.theme]).toAbsolute(tpl.file);
\r
387 tpl.inline = tpl.inline || args.inline;
\r
389 ed.windowManager.open(tpl, args);
\r
392 closeWindow : function(win) {
\r
393 EditorManager.activeEditor.windowManager.close(win);
\r
396 getOuterHTML : function(e) {
\r
397 return tinymce.DOM.getOuterHTML(e);
\r
400 setOuterHTML : function(e, h, d) {
\r
401 return tinymce.DOM.setOuterHTML(e, h, d);
\r
404 hasPlugin : function(n) {
\r
405 return tinymce.PluginManager.get(n) != null;
\r
408 _setEventsEnabled : function() {
\r
412 addPlugin : function(pn, f) {
\r
415 function PluginWrapper(ed) {
\r
416 tinyMCE.selectedInstance = ed;
\r
418 ed.onInit.add(function() {
\r
419 t.settings = ed.settings;
\r
420 t.settings['base_href'] = tinyMCE.documentBasePath;
\r
421 tinyMCE.settings = t.settings;
\r
422 tinyMCE.documentBasePath = ed.documentBasePath;
\r
423 //ed.formElement = DOM.get(ed.id);
\r
425 if (f.initInstance)
\r
426 f.initInstance(ed);
\r
428 ed.contentDocument = ed.getDoc();
\r
429 ed.contentWindow = ed.getWin();
\r
430 ed.undoRedo = ed.undoManager;
\r
431 ed.startContent = ed.getContent({format : 'raw'});
\r
433 tinyMCE.instances[ed.id] = ed;
\r
434 tinyMCE.loadedFiles = [];
\r
437 ed.onActivate.add(function() {
\r
438 tinyMCE.settings = ed.settings;
\r
439 tinyMCE.selectedInstance = ed;
\r
442 /* if (f.removeInstance) {
\r
443 ed.onDestroy.add(function() {
\r
444 return f.removeInstance(ed.id);
\r
448 if (f.handleNodeChange) {
\r
449 ed.onNodeChange.add(function(ed, cm, n) {
\r
450 f.handleNodeChange(ed.id, n, 0, 0, false, !ed.selection.isCollapsed());
\r
455 ed.onChange.add(function(ed, n) {
\r
456 return f.onChange(ed);
\r
461 ed.onGetContent.add(function() {
\r
462 //f.cleanup(type, content, inst);
\r
466 this.getInfo = function() {
\r
467 return f.getInfo();
\r
470 this.createControl = function(n) {
\r
471 tinyMCE.pluginURL = tinymce.baseURL + '/plugins/' + pn;
\r
472 tinyMCE.themeURL = tinymce.baseURL + '/themes/' + tinyMCE.activeEditor.settings.theme;
\r
474 if (f.getControlHTML)
\r
475 return f.getControlHTML(n);
\r
480 this.execCommand = function(cmd, ui, val) {
\r
482 return f.execCommand(ed.id, ed.getBody(), cmd, ui, val);
\r
488 tinymce.PluginManager.add(pn, PluginWrapper);
\r
491 _getDOM : function() {
\r
492 return tinyMCE.activeEditor ? tinyMCE.activeEditor.dom : tinymce.DOM;
\r
495 convertRelativeToAbsoluteURL : function(b, u) {
\r
496 return new tinymce.util.URI(b).toAbsolute(u);
\r
499 convertAbsoluteURLToRelativeURL : function(b, u) {
\r
500 return new tinymce.util.URI(b).toRelative(u);
\r
504 // Extend Editor class
\r
505 tinymce.extend(tinymce.Editor.prototype, {
\r
506 getFocusElement : function() {
\r
507 return this.selection.getNode();
\r
510 getData : function(n) {
\r
517 return this.data[n];
\r
520 hasPlugin : function(n) {
\r
521 return this.plugins[n] != null;
\r
524 getContainerWin : function() {
\r
528 getHTML : function(raw) {
\r
529 return this.getContent({ format : raw ? 'raw' : 'html'});
\r
532 setHTML : function(h) {
\r
533 this.setContent(h);
\r
536 getSel : function() {
\r
537 return this.selection.getSel();
\r
540 getRng : function() {
\r
541 return this.selection.getRng();
\r
544 isHidden : function() {
\r
547 if (!tinymce.isGecko)
\r
552 // Weird, wheres that cursor selection?
\r
553 return (!s || !s.rangeCount || s.rangeCount == 0);
\r
556 translate : function(s) {
\r
557 var c = this.settings.language, o;
\r
562 o = tinymce.EditorManager.i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) {
\r
563 return tinymce.EditorManager.i18n[c + '.' + b] || '{#' + b + '}';
\r
566 o = o.replace(/{\$lang_([^}]+)\}/g, function(a, b) {
\r
567 return tinymce.EditorManager.i18n[c + '.' + b] || '{$lang_' + b + '}';
\r
573 repaint : function() {
\r
574 this.execCommand('mceRepaint');
\r
578 // Extend selection
\r
579 tinymce.extend(tinymce.dom.Selection.prototype, {
\r
580 getSelectedText : function() {
\r
581 return this.getContent({format : 'text'});
\r
584 getSelectedHTML : function() {
\r
585 return this.getContent({format : 'html'});
\r
588 getFocusElement : function() {
\r
589 return this.getNode();
\r
592 selectNode : function(node, collapse, select_text_node, to_start) {
\r
595 t.select(node, select_text_node || 0);
\r
604 t.collapse(to_start);
\r
611 tinymce.PluginManager.add('compat2x', tinymce.plugins.Compat2x);
\r