1 /*
  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
  3 For licensing, see LICENSE.html or http://ckeditor.com/license
  4 */
  5
  6 (function()
  7 {
  8 	var flashFilenameRegex = /\.swf(?:$|\?)/i,
  9 		numberRegex = /^\d+(?:\.\d+)?$/;
 10
 11 	function cssifyLength( length )
 12 	{
 13 		if ( numberRegex.test( length ) )
 14 			return length + 'px';
 15 		return length;
 16 	}
 17
 18 	function isFlashEmbed( element )
 19 	{
 20 		var attributes = element.attributes;
 21
 22 		return ( attributes.type != 'application/x-shockwave-flash' || !flashFilenameRegex.test( attributes.src || '' ) );
 23 	}
 24
 25 	function createFakeElement( editor, realElement )
 26 	{
 27 		var fakeElement = editor.createFakeParserElement( realElement, 'cke_flash', 'flash', true ),
 28 			fakeStyle = fakeElement.attributes.style || '';
 29
 30 		var width = realElement.attributes.width,
 31 			height = realElement.attributes.height;
 32
 33 		if ( typeof width != 'undefined' )
 34 			fakeStyle = fakeElement.attributes.style = fakeStyle + 'width:' + cssifyLength( width ) + ';';
 35
 36 		if ( typeof height != 'undefined' )
 37 			fakeStyle = fakeElement.attributes.style = fakeStyle + 'height:' + cssifyLength( height ) + ';';
 38
 39 		return fakeElement;
 40 	}
 41
 42 	CKEDITOR.plugins.add( 'flash',
 43 	{
 44 		init : function( editor )
 45 		{
 46 			editor.addCommand( 'flash', new CKEDITOR.dialogCommand( 'flash' ) );
 47 			editor.ui.addButton( 'Flash',
 48 				{
 49 					label : editor.lang.common.flash,
 50 					command : 'flash'
 51 				});
 52 			CKEDITOR.dialog.add( 'flash', this.path + 'dialogs/flash.js' );
 53
 54 			editor.addCss(
 55 				'img.cke_flash' +
 56 				'{' +
 57 					'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/placeholder.png' ) + ');' +
 58 					'background-position: center center;' +
 59 					'background-repeat: no-repeat;' +
 60 					'border: 1px solid #a9a9a9;' +
 61 					'width: 80px;' +
 62 					'height: 80px;' +
 63 				'}'
 64 				);
 65
 66 			// If the "menu" plugin is loaded, register the menu items.
 67 			if ( editor.addMenuItems )
 68 			{
 69 				editor.addMenuItems(
 70 					{
 71 						flash :
 72 						{
 73 							label : editor.lang.flash.properties,
 74 							command : 'flash',
 75 							group : 'flash'
 76 						}
 77 					});
 78 			}
 79
 80 			// If the "contextmenu" plugin is loaded, register the listeners.
 81 			if ( editor.contextMenu )
 82 			{
 83 				editor.contextMenu.addListener( function( element, selection )
 84 					{
 85 						if ( element && element.is( 'img' ) && element.getAttribute( '_cke_real_element_type' ) == 'flash' )
 86 							return { flash : CKEDITOR.TRISTATE_OFF };
 87 					});
 88 			}
 89 		},
 90
 91 		afterInit : function( editor )
 92 		{
 93 			var dataProcessor = editor.dataProcessor,
 94 				dataFilter = dataProcessor && dataProcessor.dataFilter;
 95
 96 			if ( dataFilter )
 97 			{
 98 				dataFilter.addRules(
 99 					{
100 						elements :
101 						{
102 							'cke:object' : function( element )
103 							{
104 								var attributes = element.attributes,
105 									classId = attributes.classid && String( attributes.classid ).toLowerCase();
106
107 								if ( !classId )
108 								{
109 									// Look for the inner <embed>
110 									for ( var i = 0 ; i < element.children.length ; i++ )
111 									{
112 										if ( element.children[ i ].name == 'embed' )
113 										{
114 											if ( !isFlashEmbed( element.children[ i ] ) )
115 												return null;
116
117 											return createFakeElement( editor, element );
118 										}
119 									}
120 									return null;
121 								}
122
123 								return createFakeElement( editor, element );
124 							},
125
126 							'cke:embed' : function( element )
127 							{
128 								if ( !isFlashEmbed( element ) )
129 									return null;
130
131 								return createFakeElement( editor, element );
132 							}
133 						}
134 					},
135 					5);
136 			}
137 		},
138
139 		requires : [ 'fakeobjects' ]
140 	});
141 })();
142
143 CKEDITOR.tools.extend( CKEDITOR.config,
144 {
145 	/**
146 	 * Save as EMBED tag only. This tag is unrecommended.
147 	 * @type Boolean
148 	 * @default false
149 	 */
150 	flashEmbedTagOnly : false,
151
152 	/**
153 	 * Add EMBED tag as alternative: <object><embed></embed></object>
154 	 * @type Boolean
155 	 * @default false
156 	 */
157 	flashAddEmbedTag : true,
158
159 	/**
160 	 * Use embedTagOnly and addEmbedTag values on edit.
161 	 * @type Boolean
162 	 * @default false
163 	 */
164 	flashConvertOnEdit : false
165 } );
166