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