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