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