2 * $Id: editor_plugin_src.js 1222 2009-09-03 17:26:47Z spocke $
5 * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.
9 var each
= tinymce
.each
;
11 tinymce
.create('tinymce.plugins.MediaPlugin', {
12 init : function(ed
, url
) {
18 function isMediaElm(n
) {
19 return /^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n
.className
);
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]');
28 ed
.addCommand('mceMedia', function() {
29 ed
.windowManager
.open({
30 file
: url
+ '/media.htm',
31 width
: 600 + parseInt(ed
.getLang('media.delta_width', 0)),
32 height
: 520 + parseInt(ed
.getLang('media.delta_height', 0)),
40 ed
.addButton('media', {title
: 'media.desc', cmd
: 'mceMedia'});
42 ed
.onNodeChange
.add(function(ed
, cm
, n
) {
43 cm
.setActive('media', n
.nodeName
== 'IMG' && isMediaElm(n
));
46 ed
.onInit
.add(function() {
48 mceItemFlash
: 'flash',
49 mceItemShockWave
: 'shockwave',
50 mceItemWindowsMedia
: 'windowsmedia',
51 mceItemQuickTime
: 'quicktime',
52 mceItemRealMedia
: 'realmedia'
55 ed
.selection
.onSetContent
.add(function() {
56 t
._spansToImgs(ed
.getBody());
59 ed
.selection
.onBeforeSetContent
.add(t
._objectsToSpans
, t
);
61 if (ed
.settings
.content_css
!== false)
62 ed
.dom
.loadCSS(url
+ "/css/content.css");
64 if (ed
.theme
&& 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
)) {
70 o
.title
= ed
.dom
.getAttrib(o
.node
, 'title');
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'});
87 ed
.onBeforeSetContent
.add(t
._objectsToSpans
, t
);
89 ed
.onSetContent
.add(function() {
90 t
._spansToImgs(ed
.getBody());
93 ed
.onPreProcess
.add(function(ed
, o
) {
97 t
._spansToImgs(o
.node
);
99 each(dom
.select('IMG', o
.node
), function(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));
111 each(dom
.select('IMG', o
.node
), function(n
) {
114 if (ed
.getParam('media_use_script')) {
116 n
.className
= n
.className
.replace(/mceItem/g, 'mceTemp');
121 switch (n
.className
) {
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';
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';
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';
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';
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';
154 dom
.replace(t
._buildObj({
164 ed
.onPostProcess
.add(function(ed
, o
) {
165 o
.content
= o
.content
.replace(/_mce_value=/g, 'value=');
168 function getAttr(s
, n
) {
169 n
= new RegExp(n
+ '=\"([^\"]+)\"', 'g').exec(s
);
171 return n
? ed
.dom
.decode(n
[1]) : '';
174 ed
.onPostProcess
.add(function(ed
, o
) {
175 if (ed
.getParam('media_use_script')) {
176 o
.content
= o
.content
.replace(/<img[^>]+>/g, function(im
) {
177 var cl
= getAttr(im
, 'class');
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>';
192 getInfo : function() {
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
203 _objectsToSpans : function(ed
, o
) {
204 var t
= this, h
= o
.content
;
206 h
= h
.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, function(a
, b
, c
) {
209 return '<img class="mceItem' + b
+ '" title="' + ed
.dom
.encode(c
) + '" src="' + t
.url
+ '/img/trans.gif" width="' + o
.width
+ '" height="' + o
.height
+ '" />'
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>');
223 _buildObj : function(o
, n
) {
224 var ob
, ed
= this.editor
, dom
= ed
.dom
, p
= this._parse(n
.title
), stc
;
226 stc
= ed
.getParam('media_strict', true) && o
.type
== 'application/x-shockwave-flash';
228 p
.width
= o
.width
= dom
.getAttrib(n
, 'width') || 100;
229 p
.height
= o
.height
= dom
.getAttrib(n
, 'height') || 100;
232 p
.src
= ed
.convertURL(p
.src
, 'src', n
);
235 ob
= dom
.create('span', {
238 type
: 'application/x-shockwave-flash',
240 style
: dom
.getAttrib(n
, 'style'),
245 ob
= dom
.create('span', {
248 classid
: "clsid:" + o
.classid
,
249 style
: dom
.getAttrib(n
, 'style'),
250 codebase
: o
.codebase
,
256 each (p
, function(v
, k
) {
257 if (!/^(width|height|codebase|classid|id|_cx|_cy)$/.test(k
)) {
258 // Use url instead of src in IE for Windows media
259 if (o
.type
== 'application/x-mplayer2' && k
== 'src' && !p
.url
)
263 dom
.add(ob
, 'span', {mce_name
: 'param', name
: k
, '_mce_value' : v
});
268 dom
.add(ob
, 'span', tinymce
.extend({mce_name
: 'embed', type
: o
.type
, style
: dom
.getAttrib(n
, 'style')}, p
));
273 _spansToImgs : function(p
) {
274 var t
= this, dom
= t
.editor
.dom
, im
, ci
;
276 each(dom
.select('span', p
), function(n
) {
277 // Convert object into image
278 if (dom
.getAttrib(n
, 'class') == 'mceItemObject') {
279 ci
= dom
.getAttrib(n
, "classid").toLowerCase().replace(/\s+/g, '');
282 case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':
283 dom
.replace(t
._createImg('mceItemFlash', n
), n
);
286 case 'clsid:166b1bca-3f9c-11cf-8075-444553540000':
287 dom
.replace(t
._createImg('mceItemShockWave', n
), n
);
290 case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':
291 case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':
292 case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':
293 dom
.replace(t
._createImg('mceItemWindowsMedia', n
), n
);
296 case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':
297 dom
.replace(t
._createImg('mceItemQuickTime', n
), n
);
300 case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':
301 dom
.replace(t
._createImg('mceItemRealMedia', n
), n
);
305 dom
.replace(t
._createImg('mceItemFlash', n
), n
);
311 // Convert embed into image
312 if (dom
.getAttrib(n
, 'class') == 'mceItemEmbed') {
313 switch (dom
.getAttrib(n
, 'type')) {
314 case 'application/x-shockwave-flash':
315 dom
.replace(t
._createImg('mceItemFlash', n
), n
);
318 case 'application/x-director':
319 dom
.replace(t
._createImg('mceItemShockWave', n
), n
);
322 case 'application/x-mplayer2':
323 dom
.replace(t
._createImg('mceItemWindowsMedia', n
), n
);
326 case 'video/quicktime':
327 dom
.replace(t
._createImg('mceItemQuickTime', n
), n
);
330 case 'audio/x-pn-realaudio-plugin':
331 dom
.replace(t
._createImg('mceItemRealMedia', n
), n
);
335 dom
.replace(t
._createImg('mceItemFlash', n
), n
);
341 _createImg : function(cl
, n
) {
342 var im
, dom
= this.editor
.dom
, pa
= {}, ti
= '', args
;
344 args
= ['id', 'name', 'width', 'height', 'bgcolor', 'align', 'flashvars', 'src', 'wmode', 'allowfullscreen', 'quality', 'data'];
347 im
= dom
.create('img', {
348 src
: this.url
+ '/img/trans.gif',
349 width
: dom
.getAttrib(n
, 'width') || 100,
350 height
: dom
.getAttrib(n
, 'height') || 100,
351 style
: dom
.getAttrib(n
, 'style'),
355 // Setup base parameters
356 each(args
, function(na
) {
357 var v
= dom
.getAttrib(n
, na
);
363 // Add optional parameters
364 each(dom
.select('span', n
), function(n
) {
365 if (dom
.hasClass(n
, 'mceItemParam'))
366 pa
[dom
.getAttrib(n
, 'name')] = dom
.getAttrib(n
, '_mce_value');
381 // Merge with embed args
382 n
= dom
.select('.mceItemEmbed', n
)[0];
384 each(args
, function(na
) {
385 var v
= dom
.getAttrib(n
, na
);
395 im
.title
= this._serialize(pa
);
400 _parse : function(s
) {
401 return tinymce
.util
.JSON
.parse('{' + s
+ '}');
404 _serialize : function(o
) {
405 return tinymce
.util
.JSON
.serialize(o
).replace(/[{}]/g, '');
410 tinymce
.PluginManager
.add('media', tinymce
.plugins
.MediaPlugin
);