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