2 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
\r
3 * Copyright (C) 2003-2009 Frederico Caldeira Knabben
\r
5 * == BEGIN LICENSE ==
\r
7 * Licensed under the terms of any of the following licenses at your
\r
10 * - GNU General Public License Version 2 or later (the "GPL")
\r
11 * http://www.gnu.org/licenses/gpl.html
\r
13 * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
\r
14 * http://www.gnu.org/licenses/lgpl.html
\r
16 * - Mozilla Public License Version 1.1 or later (the "MPL")
\r
17 * http://www.mozilla.org/MPL/MPL-1.1.html
\r
21 * Defines the FCKToolbarSet object that is used to load and draw the
\r
25 function FCKToolbarSet_Create( overhideLocation )
\r
29 var sLocation = overhideLocation || FCKConfig.ToolbarLocation ;
\r
30 switch ( sLocation )
\r
33 document.getElementById( 'xToolbarRow' ).style.display = '' ;
\r
34 oToolbarSet = new FCKToolbarSet( document ) ;
\r
37 oToolbarSet = new FCKToolbarSet( document ) ;
\r
44 FCK.Events.AttachEvent( 'OnBlur', FCK_OnBlur ) ;
\r
45 FCK.Events.AttachEvent( 'OnFocus', FCK_OnFocus ) ;
\r
47 var eToolbarTarget ;
\r
49 // Out:[TargetWindow]([TargetId])
\r
50 var oOutMatch = sLocation.match( /^Out:(.+)\((\w+)\)$/ ) ;
\r
53 if ( FCKBrowserInfo.IsAIR )
\r
54 FCKAdobeAIR.ToolbarSet_GetOutElement( window, oOutMatch ) ;
\r
56 eToolbarTarget = eval( 'parent.' + oOutMatch[1] ).document.getElementById( oOutMatch[2] ) ;
\r
61 oOutMatch = sLocation.match( /^Out:(\w+)$/ ) ;
\r
63 eToolbarTarget = parent.document.getElementById( oOutMatch[1] ) ;
\r
66 if ( !eToolbarTarget )
\r
68 alert( 'Invalid value for "ToolbarLocation"' ) ;
\r
69 return arguments.callee( 'In' );
\r
72 // If it is a shared toolbar, it may be already available in the target element.
\r
73 oToolbarSet = eToolbarTarget.__FCKToolbarSet ;
\r
77 // Create the IFRAME that will hold the toolbar inside the target element.
\r
78 var eToolbarIFrame = FCKTools.GetElementDocument( eToolbarTarget ).createElement( 'iframe' ) ;
\r
79 eToolbarIFrame.src = 'javascript:void(0)' ;
\r
80 eToolbarIFrame.frameBorder = 0 ;
\r
81 eToolbarIFrame.width = '100%' ;
\r
82 eToolbarIFrame.height = '10' ;
\r
83 eToolbarTarget.appendChild( eToolbarIFrame ) ;
\r
84 eToolbarIFrame.unselectable = 'on' ;
\r
86 // Write the basic HTML for the toolbar (copy from the editor main page).
\r
87 var eTargetDocument = eToolbarIFrame.contentWindow.document ;
\r
89 // Workaround for Safari 12256. Ticket #63
\r
91 if ( FCKBrowserInfo.IsSafari )
\r
92 sBase = '<base href="' + window.document.location + '">' ;
\r
94 // Initialize the IFRAME document body.
\r
95 eTargetDocument.open() ;
\r
96 eTargetDocument.write( '<html><head>' + sBase + '<script type="text/javascript"> var adjust = function() { window.frameElement.height = document.body.scrollHeight ; }; '
\r
97 + 'window.onresize = window.onload = '
\r
98 + 'function(){' // poll scrollHeight until it no longer changes for 1 sec.
\r
99 + 'var timer = null;'
\r
100 + 'var lastHeight = -1;'
\r
101 + 'var lastChange = 0;'
\r
102 + 'var poller = function(){'
\r
103 + 'var currentHeight = document.body.scrollHeight || 0;'
\r
104 + 'var currentTime = (new Date()).getTime();'
\r
105 + 'if (currentHeight != lastHeight){'
\r
106 + 'lastChange = currentTime;'
\r
108 + 'lastHeight = document.body.scrollHeight;'
\r
110 + 'if (lastChange < currentTime - 1000) clearInterval(timer);'
\r
112 + 'timer = setInterval(poller, 100);'
\r
114 + '</script></head><body style="overflow: hidden">' + document.getElementById( 'xToolbarSpace' ).innerHTML + '</body></html>' ) ;
\r
115 eTargetDocument.close() ;
\r
117 if( FCKBrowserInfo.IsAIR )
\r
118 FCKAdobeAIR.ToolbarSet_InitOutFrame( eTargetDocument ) ;
\r
120 FCKTools.AddEventListener( eTargetDocument, 'contextmenu', FCKTools.CancelEvent ) ;
\r
122 // Load external resources (must be done here, otherwise Firefox will not
\r
123 // have the document DOM ready to be used right away.
\r
124 FCKTools.AppendStyleSheet( eTargetDocument, FCKConfig.SkinEditorCSS ) ;
\r
126 oToolbarSet = eToolbarTarget.__FCKToolbarSet = new FCKToolbarSet( eTargetDocument ) ;
\r
127 oToolbarSet._IFrame = eToolbarIFrame ;
\r
129 if ( FCK.IECleanup )
\r
130 FCK.IECleanup.AddItem( eToolbarTarget, FCKToolbarSet_Target_Cleanup ) ;
\r
133 oToolbarSet.CurrentInstance = FCK ;
\r
134 if ( !oToolbarSet.ToolbarItems )
\r
135 oToolbarSet.ToolbarItems = FCKToolbarItems ;
\r
137 FCK.AttachToOnSelectionChange( oToolbarSet.RefreshItemsState ) ;
\r
139 return oToolbarSet ;
\r
142 function FCK_OnBlur( editorInstance )
\r
144 var eToolbarSet = editorInstance.ToolbarSet ;
\r
146 if ( eToolbarSet.CurrentInstance == editorInstance )
\r
147 eToolbarSet.Disable() ;
\r
150 function FCK_OnFocus( editorInstance )
\r
152 var oToolbarset = editorInstance.ToolbarSet ;
\r
153 var oInstance = editorInstance || FCK ;
\r
155 // Unregister the toolbar window from the current instance.
\r
156 oToolbarset.CurrentInstance.FocusManager.RemoveWindow( oToolbarset._IFrame.contentWindow ) ;
\r
158 // Set the new current instance.
\r
159 oToolbarset.CurrentInstance = oInstance ;
\r
161 // Register the toolbar window in the current instance.
\r
162 oInstance.FocusManager.AddWindow( oToolbarset._IFrame.contentWindow, true ) ;
\r
164 oToolbarset.Enable() ;
\r
167 function FCKToolbarSet_Cleanup()
\r
169 this._TargetElement = null ;
\r
170 this._IFrame = null ;
\r
173 function FCKToolbarSet_Target_Cleanup()
\r
175 this.__FCKToolbarSet = null ;
\r
178 var FCKToolbarSet = function( targetDocument )
\r
180 this._Document = targetDocument ;
\r
182 // Get the element that will hold the elements structure.
\r
183 this._TargetElement = targetDocument.getElementById( 'xToolbar' ) ;
\r
185 // Setup the expand and collapse handlers.
\r
186 var eExpandHandle = targetDocument.getElementById( 'xExpandHandle' ) ;
\r
187 var eCollapseHandle = targetDocument.getElementById( 'xCollapseHandle' ) ;
\r
189 eExpandHandle.title = FCKLang.ToolbarExpand ;
\r
190 FCKTools.AddEventListener( eExpandHandle, 'click', FCKToolbarSet_Expand_OnClick ) ;
\r
192 eCollapseHandle.title = FCKLang.ToolbarCollapse ;
\r
193 FCKTools.AddEventListener( eCollapseHandle, 'click', FCKToolbarSet_Collapse_OnClick ) ;
\r
195 // Set the toolbar state at startup.
\r
196 if ( !FCKConfig.ToolbarCanCollapse || FCKConfig.ToolbarStartExpanded )
\r
201 // Enable/disable the collapse handler
\r
202 eCollapseHandle.style.display = FCKConfig.ToolbarCanCollapse ? '' : 'none' ;
\r
204 if ( FCKConfig.ToolbarCanCollapse )
\r
205 eCollapseHandle.style.display = '' ;
\r
207 targetDocument.getElementById( 'xTBLeftBorder' ).style.display = '' ;
\r
209 // Set the default properties.
\r
210 this.Toolbars = new Array() ;
\r
211 this.IsLoaded = false ;
\r
213 if ( FCK.IECleanup )
\r
214 FCK.IECleanup.AddItem( this, FCKToolbarSet_Cleanup ) ;
\r
217 function FCKToolbarSet_Expand_OnClick()
\r
219 FCK.ToolbarSet.Expand() ;
\r
222 function FCKToolbarSet_Collapse_OnClick()
\r
224 FCK.ToolbarSet.Collapse() ;
\r
227 FCKToolbarSet.prototype.Expand = function()
\r
229 this._ChangeVisibility( false ) ;
\r
232 FCKToolbarSet.prototype.Collapse = function()
\r
234 this._ChangeVisibility( true ) ;
\r
237 FCKToolbarSet.prototype._ChangeVisibility = function( collapse )
\r
239 this._Document.getElementById( 'xCollapsed' ).style.display = collapse ? '' : 'none' ;
\r
240 this._Document.getElementById( 'xExpanded' ).style.display = collapse ? 'none' : '' ;
\r
242 if ( FCKBrowserInfo.IsGecko )
\r
244 // I had to use "setTimeout" because Gecko was not responding in a right
\r
245 // way when calling window.onresize() directly.
\r
246 FCKTools.RunFunction( window.onresize ) ;
\r
250 FCKToolbarSet.prototype.Load = function( toolbarSetName )
\r
252 this.Name = toolbarSetName ;
\r
254 this.Items = new Array() ;
\r
256 // Reset the array of toolbar items that are active only on WYSIWYG mode.
\r
257 this.ItemsWysiwygOnly = new Array() ;
\r
259 // Reset the array of toolbar items that are sensitive to the cursor position.
\r
260 this.ItemsContextSensitive = new Array() ;
\r
262 // Cleanup the target element.
\r
263 this._TargetElement.innerHTML = '' ;
\r
265 var ToolbarSet = FCKConfig.ToolbarSets[toolbarSetName] ;
\r
269 alert( FCKLang.UnknownToolbarSet.replace( /%1/g, toolbarSetName ) ) ;
\r
273 this.Toolbars = new Array() ;
\r
275 for ( var x = 0 ; x < ToolbarSet.length ; x++ )
\r
277 var oToolbarItems = ToolbarSet[x] ;
\r
279 // If the configuration for the toolbar is missing some element or has any extra comma
\r
280 // this item won't be valid, so skip it and keep on processing.
\r
281 if ( !oToolbarItems )
\r
286 if ( typeof( oToolbarItems ) == 'string' )
\r
288 if ( oToolbarItems == '/' )
\r
289 oToolbar = new FCKToolbarBreak() ;
\r
293 oToolbar = new FCKToolbar() ;
\r
295 for ( var j = 0 ; j < oToolbarItems.length ; j++ )
\r
297 var sItem = oToolbarItems[j] ;
\r
300 oToolbar.AddSeparator() ;
\r
303 var oItem = FCKToolbarItems.GetItem( sItem ) ;
\r
306 oToolbar.AddItem( oItem ) ;
\r
308 this.Items.push( oItem ) ;
\r
310 if ( !oItem.SourceView )
\r
311 this.ItemsWysiwygOnly.push( oItem ) ;
\r
313 if ( oItem.ContextSensitive )
\r
314 this.ItemsContextSensitive.push( oItem ) ;
\r
319 // oToolbar.AddTerminator() ;
\r
322 oToolbar.Create( this._TargetElement ) ;
\r
324 this.Toolbars[ this.Toolbars.length ] = oToolbar ;
\r
327 FCKTools.DisableSelection( this._Document.getElementById( 'xCollapseHandle' ).parentNode ) ;
\r
329 if ( FCK.Status != FCK_STATUS_COMPLETE )
\r
330 FCK.Events.AttachEvent( 'OnStatusChange', this.RefreshModeState ) ;
\r
332 this.RefreshModeState() ;
\r
334 this.IsLoaded = true ;
\r
335 this.IsEnabled = true ;
\r
337 FCKTools.RunFunction( this.OnLoad ) ;
\r
340 FCKToolbarSet.prototype.Enable = function()
\r
342 if ( this.IsEnabled )
\r
345 this.IsEnabled = true ;
\r
347 var aItems = this.Items ;
\r
348 for ( var i = 0 ; i < aItems.length ; i++ )
\r
349 aItems[i].RefreshState() ;
\r
352 FCKToolbarSet.prototype.Disable = function()
\r
354 if ( !this.IsEnabled )
\r
357 this.IsEnabled = false ;
\r
359 var aItems = this.Items ;
\r
360 for ( var i = 0 ; i < aItems.length ; i++ )
\r
361 aItems[i].Disable() ;
\r
364 FCKToolbarSet.prototype.RefreshModeState = function( editorInstance )
\r
366 if ( FCK.Status != FCK_STATUS_COMPLETE )
\r
369 var oToolbarSet = editorInstance ? editorInstance.ToolbarSet : this ;
\r
370 var aItems = oToolbarSet.ItemsWysiwygOnly ;
\r
372 if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
\r
374 // Enable all buttons that are available on WYSIWYG mode only.
\r
375 for ( var i = 0 ; i < aItems.length ; i++ )
\r
376 aItems[i].Enable() ;
\r
378 // Refresh the buttons state.
\r
379 oToolbarSet.RefreshItemsState( editorInstance ) ;
\r
383 // Refresh the buttons state.
\r
384 oToolbarSet.RefreshItemsState( editorInstance ) ;
\r
386 // Disable all buttons that are available on WYSIWYG mode only.
\r
387 for ( var j = 0 ; j < aItems.length ; j++ )
\r
388 aItems[j].Disable() ;
\r
392 FCKToolbarSet.prototype.RefreshItemsState = function( editorInstance )
\r
395 var aItems = ( editorInstance ? editorInstance.ToolbarSet : this ).ItemsContextSensitive ;
\r
397 for ( var i = 0 ; i < aItems.length ; i++ )
\r
398 aItems[i].RefreshState() ;
\r