app/soc/content/js/tiny_mce/plugins/media/editor_plugin_src.js
changeset 126 6186c115a210
equal deleted inserted replaced
125:155f43a0fa68 126:6186c115a210
       
     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 })();