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