Began removing $Id$ tags. This will be an ongoing process.
[citadel.git] / webcit / tiny_mce / plugins / media / 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 each = tinymce.each;\r
7 \r
8         tinymce.create('tinymce.plugins.MediaPlugin', {\r
9                 init : function(ed, url) {\r
10                         var t = this;\r
11                         \r
12                         t.editor = ed;\r
13                         t.url = url;\r
14 \r
15                         function isMediaElm(n) {\r
16                                 return /^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n.className);\r
17                         };\r
18 \r
19                         ed.onPreInit.add(function() {\r
20                                 // Force in _value parameter this extra parameter is required for older Opera versions\r
21                                 ed.serializer.addRules('param[name|value|_mce_value]');\r
22                         });\r
23 \r
24                         // Register commands\r
25                         ed.addCommand('mceMedia', function() {\r
26                                 ed.windowManager.open({\r
27                                         file : url + '/media.htm',\r
28                                         width : 430 + parseInt(ed.getLang('media.delta_width', 0)),\r
29                                         height : 470 + parseInt(ed.getLang('media.delta_height', 0)),\r
30                                         inline : 1\r
31                                 }, {\r
32                                         plugin_url : url\r
33                                 });\r
34                         });\r
35 \r
36                         // Register buttons\r
37                         ed.addButton('media', {title : 'media.desc', cmd : 'mceMedia'});\r
38 \r
39                         ed.onNodeChange.add(function(ed, cm, n) {\r
40                                 cm.setActive('media', n.nodeName == 'IMG' && isMediaElm(n));\r
41                         });\r
42 \r
43                         ed.onInit.add(function() {\r
44                                 var lo = {\r
45                                         mceItemFlash : 'flash',\r
46                                         mceItemShockWave : 'shockwave',\r
47                                         mceItemWindowsMedia : 'windowsmedia',\r
48                                         mceItemQuickTime : 'quicktime',\r
49                                         mceItemRealMedia : 'realmedia'\r
50                                 };\r
51 \r
52                                 ed.selection.onSetContent.add(function() {\r
53                                         t._spansToImgs(ed.getBody());\r
54                                 });\r
55 \r
56                                 ed.selection.onBeforeSetContent.add(t._objectsToSpans, t);\r
57 \r
58                                 if (ed.settings.content_css !== false)\r
59                                         ed.dom.loadCSS(url + "/css/content.css");\r
60 \r
61                                 if (ed.theme.onResolveName) {\r
62                                         ed.theme.onResolveName.add(function(th, o) {\r
63                                                 if (o.name == 'img') {\r
64                                                         each(lo, function(v, k) {\r
65                                                                 if (ed.dom.hasClass(o.node, k)) {\r
66                                                                         o.name = v;\r
67                                                                         o.title = ed.dom.getAttrib(o.node, 'title');\r
68                                                                         return false;\r
69                                                                 }\r
70                                                         });\r
71                                                 }\r
72                                         });\r
73                                 }\r
74 \r
75                                 if (ed && ed.plugins.contextmenu) {\r
76                                         ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {\r
77                                                 if (e.nodeName == 'IMG' && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(e.className)) {\r
78                                                         m.add({title : 'media.edit', icon : 'media', cmd : 'mceMedia'});\r
79                                                 }\r
80                                         });\r
81                                 }\r
82                         });\r
83 \r
84                         ed.onBeforeSetContent.add(t._objectsToSpans, t);\r
85 \r
86                         ed.onSetContent.add(function() {\r
87                                 t._spansToImgs(ed.getBody());\r
88                         });\r
89 \r
90                         ed.onPreProcess.add(function(ed, o) {\r
91                                 var dom = ed.dom;\r
92 \r
93                                 if (o.set) {\r
94                                         t._spansToImgs(o.node);\r
95 \r
96                                         each(dom.select('IMG', o.node), function(n) {\r
97                                                 var p;\r
98 \r
99                                                 if (isMediaElm(n)) {\r
100                                                         p = t._parse(n.title);\r
101                                                         dom.setAttrib(n, 'width', dom.getAttrib(n, 'width', p.width || 100));\r
102                                                         dom.setAttrib(n, 'height', dom.getAttrib(n, 'height', p.height || 100));\r
103                                                 }\r
104                                         });\r
105                                 }\r
106 \r
107                                 if (o.get) {\r
108                                         each(dom.select('IMG', o.node), function(n) {\r
109                                                 var ci, cb, mt;\r
110 \r
111                                                 if (ed.getParam('media_use_script')) {\r
112                                                         if (isMediaElm(n))\r
113                                                                 n.className = n.className.replace(/mceItem/g, 'mceTemp');\r
114 \r
115                                                         return;\r
116                                                 }\r
117 \r
118                                                 switch (n.className) {\r
119                                                         case 'mceItemFlash':\r
120                                                                 ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000';\r
121                                                                 cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';\r
122                                                                 mt = 'application/x-shockwave-flash';\r
123                                                                 break;\r
124 \r
125                                                         case 'mceItemShockWave':\r
126                                                                 ci = '166b1bca-3f9c-11cf-8075-444553540000';\r
127                                                                 cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';\r
128                                                                 mt = 'application/x-director';\r
129                                                                 break;\r
130 \r
131                                                         case 'mceItemWindowsMedia':\r
132                                                                 ci = ed.getParam('media_wmp6_compatible') ? '05589fa1-c356-11ce-bf01-00aa0055595a' : '6bf52a52-394a-11d3-b153-00c04f79faa6';\r
133                                                                 cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';\r
134                                                                 mt = 'application/x-mplayer2';\r
135                                                                 break;\r
136 \r
137                                                         case 'mceItemQuickTime':\r
138                                                                 ci = '02bf25d5-8c17-4b23-bc80-d3488abddc6b';\r
139                                                                 cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';\r
140                                                                 mt = 'video/quicktime';\r
141                                                                 break;\r
142 \r
143                                                         case 'mceItemRealMedia':\r
144                                                                 ci = 'cfcdaa03-8be4-11cf-b84b-0020afbbccfa';\r
145                                                                 cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';\r
146                                                                 mt = 'audio/x-pn-realaudio-plugin';\r
147                                                                 break;\r
148                                                 }\r
149 \r
150                                                 if (ci) {\r
151                                                         dom.replace(t._buildObj({\r
152                                                                 classid : ci,\r
153                                                                 codebase : cb,\r
154                                                                 type : mt\r
155                                                         }, n), n);\r
156                                                 }\r
157                                         });\r
158                                 }\r
159                         });\r
160 \r
161                         ed.onPostProcess.add(function(ed, o) {\r
162                                 o.content = o.content.replace(/_mce_value=/g, 'value=');\r
163                         });\r
164 \r
165                         if (ed.getParam('media_use_script')) {\r
166                                 function getAttr(s, n) {\r
167                                         n = new RegExp(n + '=\"([^\"]+)\"', 'g').exec(s);\r
168 \r
169                                         return n ? ed.dom.decode(n[1]) : '';\r
170                                 };\r
171 \r
172                                 ed.onPostProcess.add(function(ed, o) {\r
173                                         o.content = o.content.replace(/<img[^>]+>/g, function(im) {\r
174                                                 var cl = getAttr(im, 'class');\r
175 \r
176                                                 if (/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(cl)) {\r
177                                                         at = t._parse(getAttr(im, 'title'));\r
178                                                         at.width = getAttr(im, 'width');\r
179                                                         at.height = getAttr(im, 'height');\r
180                                                         im = '<script type="text/javascript">write' + cl.substring(7) + '({' + t._serialize(at) + '});</script>';\r
181                                                 }\r
182 \r
183                                                 return im;\r
184                                         });\r
185                                 });\r
186                         }\r
187                 },\r
188 \r
189                 getInfo : function() {\r
190                         return {\r
191                                 longname : 'Media',\r
192                                 author : 'Moxiecode Systems AB',\r
193                                 authorurl : 'http://tinymce.moxiecode.com',\r
194                                 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',\r
195                                 version : tinymce.majorVersion + "." + tinymce.minorVersion\r
196                         };\r
197                 },\r
198 \r
199                 // Private methods\r
200                 _objectsToSpans : function(ed, o) {\r
201                         var t = this, h = o.content;\r
202 \r
203                         h = h.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, function(a, b, c) {\r
204                                 var o = t._parse(c);\r
205 \r
206                                 return '<img class="mceItem' + b + '" title="' + ed.dom.encode(c) + '" src="' + t.url + '/img/trans.gif" width="' + o.width + '" height="' + o.height + '" />'\r
207                         });\r
208 \r
209                         h = h.replace(/<object([^>]*)>/gi, '<span class="mceItemObject" $1>');\r
210                         h = h.replace(/<embed([^>]*)\/?>/gi, '<span class="mceItemEmbed" $1></span>');\r
211                         h = h.replace(/<embed([^>]*)>/gi, '<span class="mceItemEmbed" $1>');\r
212                         h = h.replace(/<\/(object)([^>]*)>/gi, '</span>');\r
213                         h = h.replace(/<\/embed>/gi, '');\r
214                         h = h.replace(/<param([^>]*)>/gi, function(a, b) {return '<span ' + b.replace(/value=/gi, '_mce_value=') + ' class="mceItemParam"></span>'});\r
215                         h = h.replace(/\/ class=\"mceItemParam\"><\/span>/gi, 'class="mceItemParam"></span>');\r
216 \r
217                         o.content = h;\r
218                 },\r
219 \r
220                 _buildObj : function(o, n) {\r
221                         var ob, ed = this.editor, dom = ed.dom, p = this._parse(n.title), stc;\r
222                         \r
223                         stc = ed.getParam('media_strict', true) && o.type == 'application/x-shockwave-flash';\r
224 \r
225                         p.width = o.width = dom.getAttrib(n, 'width') || 100;\r
226                         p.height = o.height = dom.getAttrib(n, 'height') || 100;\r
227 \r
228                         if (p.src)\r
229                                 p.src = ed.convertURL(p.src, 'src', n);\r
230 \r
231                         if (stc) {\r
232                                 ob = dom.create('span', {\r
233                                         mce_name : 'object',\r
234                                         type : 'application/x-shockwave-flash',\r
235                                         data : p.src,\r
236                                         width : o.width,\r
237                                         height : o.height\r
238                                 });\r
239                         } else {\r
240                                 ob = dom.create('span', {\r
241                                         mce_name : 'object',\r
242                                         classid : "clsid:" + o.classid,\r
243                                         codebase : o.codebase,\r
244                                         width : o.width,\r
245                                         height : o.height\r
246                                 });\r
247                         }\r
248 \r
249                         each (p, function(v, k) {\r
250                                 if (!/^(width|height|codebase|classid|_cx|_cy)$/.test(k)) {\r
251                                         // Use url instead of src in IE for Windows media\r
252                                         if (o.type == 'application/x-mplayer2' && k == 'src')\r
253                                                 k = 'url';\r
254 \r
255                                         if (v)\r
256                                                 dom.add(ob, 'span', {mce_name : 'param', name : k, '_mce_value' : v});\r
257                                 }\r
258                         });\r
259 \r
260                         if (!stc)\r
261                                 dom.add(ob, 'span', tinymce.extend({mce_name : 'embed', type : o.type}, p));\r
262 \r
263                         return ob;\r
264                 },\r
265 \r
266                 _spansToImgs : function(p) {\r
267                         var t = this, dom = t.editor.dom, im, ci;\r
268 \r
269                         each(dom.select('span', p), function(n) {\r
270                                 // Convert object into image\r
271                                 if (dom.getAttrib(n, 'class') == 'mceItemObject') {\r
272                                         ci = dom.getAttrib(n, "classid").toLowerCase().replace(/\s+/g, '');\r
273 \r
274                                         switch (ci) {\r
275                                                 case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':\r
276                                                         dom.replace(t._createImg('mceItemFlash', n), n);\r
277                                                         break;\r
278 \r
279                                                 case 'clsid:166b1bca-3f9c-11cf-8075-444553540000':\r
280                                                         dom.replace(t._createImg('mceItemShockWave', n), n);\r
281                                                         break;\r
282 \r
283                                                 case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':\r
284                                                 case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':\r
285                                                 case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':\r
286                                                         dom.replace(t._createImg('mceItemWindowsMedia', n), n);\r
287                                                         break;\r
288 \r
289                                                 case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':\r
290                                                         dom.replace(t._createImg('mceItemQuickTime', n), n);\r
291                                                         break;\r
292 \r
293                                                 case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':\r
294                                                         dom.replace(t._createImg('mceItemRealMedia', n), n);\r
295                                                         break;\r
296 \r
297                                                 default:\r
298                                                         dom.replace(t._createImg('mceItemFlash', n), n);\r
299                                         }\r
300                                         \r
301                                         return;\r
302                                 }\r
303 \r
304                                 // Convert embed into image\r
305                                 if (dom.getAttrib(n, 'class') == 'mceItemEmbed') {\r
306                                         switch (dom.getAttrib(n, 'type')) {\r
307                                                 case 'application/x-shockwave-flash':\r
308                                                         dom.replace(t._createImg('mceItemFlash', n), n);\r
309                                                         break;\r
310 \r
311                                                 case 'application/x-director':\r
312                                                         dom.replace(t._createImg('mceItemShockWave', n), n);\r
313                                                         break;\r
314 \r
315                                                 case 'application/x-mplayer2':\r
316                                                         dom.replace(t._createImg('mceItemWindowsMedia', n), n);\r
317                                                         break;\r
318 \r
319                                                 case 'video/quicktime':\r
320                                                         dom.replace(t._createImg('mceItemQuickTime', n), n);\r
321                                                         break;\r
322 \r
323                                                 case 'audio/x-pn-realaudio-plugin':\r
324                                                         dom.replace(t._createImg('mceItemRealMedia', n), n);\r
325                                                         break;\r
326 \r
327                                                 default:\r
328                                                         dom.replace(t._createImg('mceItemFlash', n), n);\r
329                                         }\r
330                                 }                       \r
331                         });\r
332                 },\r
333 \r
334                 _createImg : function(cl, n) {\r
335                         var im, dom = this.editor.dom, pa = {}, ti = '', args;\r
336 \r
337                         args = ['id', 'name', 'width', 'height', 'bgcolor', 'align', 'flashvars', 'src', 'wmode', 'allowfullscreen', 'quality'];        \r
338 \r
339                         // Create image\r
340                         im = dom.create('img', {\r
341                                 src : this.url + '/img/trans.gif',\r
342                                 width : dom.getAttrib(n, 'width') || 100,\r
343                                 height : dom.getAttrib(n, 'height') || 100,\r
344                                 'class' : cl\r
345                         });\r
346 \r
347                         // Setup base parameters\r
348                         each(args, function(na) {\r
349                                 var v = dom.getAttrib(n, na);\r
350 \r
351                                 if (v)\r
352                                         pa[na] = v;\r
353                         });\r
354 \r
355                         // Add optional parameters\r
356                         each(dom.select('span', n), function(n) {\r
357                                 if (dom.hasClass(n, 'mceItemParam'))\r
358                                         pa[dom.getAttrib(n, 'name')] = dom.getAttrib(n, '_mce_value');\r
359                         });\r
360 \r
361                         // Use src not movie\r
362                         if (pa.movie) {\r
363                                 pa.src = pa.movie;\r
364                                 delete pa.movie;\r
365                         }\r
366 \r
367                         // Merge with embed args\r
368                         n = dom.select('.mceItemEmbed', n)[0];\r
369                         if (n) {\r
370                                 each(args, function(na) {\r
371                                         var v = dom.getAttrib(n, na);\r
372 \r
373                                         if (v && !pa[na])\r
374                                                 pa[na] = v;\r
375                                 });\r
376                         }\r
377 \r
378                         delete pa.width;\r
379                         delete pa.height;\r
380 \r
381                         im.title = this._serialize(pa);\r
382 \r
383                         return im;\r
384                 },\r
385 \r
386                 _parse : function(s) {\r
387                         return tinymce.util.JSON.parse('{' + s + '}');\r
388                 },\r
389 \r
390                 _serialize : function(o) {\r
391                         return tinymce.util.JSON.serialize(o).replace(/[{}]/g, '');\r
392                 }\r
393         });\r
394 \r
395         // Register plugin\r
396         tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);\r
397 })();\r