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