import torrus 1.0.9
[freeside.git] / rt / share / html / NoAuth / RichText / FCKeditor / editor / _source / internals / fcktoolbarset.js
1 /*\r
2  * FCKeditor - The text editor for Internet - http://www.fckeditor.net\r
3  * Copyright (C) 2003-2009 Frederico Caldeira Knabben\r
4  *\r
5  * == BEGIN LICENSE ==\r
6  *\r
7  * Licensed under the terms of any of the following licenses at your\r
8  * choice:\r
9  *\r
10  *  - GNU General Public License Version 2 or later (the "GPL")\r
11  *    http://www.gnu.org/licenses/gpl.html\r
12  *\r
13  *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")\r
14  *    http://www.gnu.org/licenses/lgpl.html\r
15  *\r
16  *  - Mozilla Public License Version 1.1 or later (the "MPL")\r
17  *    http://www.mozilla.org/MPL/MPL-1.1.html\r
18  *\r
19  * == END LICENSE ==\r
20  *\r
21  * Defines the FCKToolbarSet object that is used to load and draw the\r
22  * toolbar.\r
23  */\r
24 \r
25 function FCKToolbarSet_Create( overhideLocation )\r
26 {\r
27         var oToolbarSet ;\r
28 \r
29         var sLocation = overhideLocation || FCKConfig.ToolbarLocation ;\r
30         switch ( sLocation )\r
31         {\r
32                 case 'In' :\r
33                         document.getElementById( 'xToolbarRow' ).style.display = '' ;\r
34                         oToolbarSet = new FCKToolbarSet( document ) ;\r
35                         break ;\r
36                 case 'None' :\r
37                         oToolbarSet = new FCKToolbarSet( document ) ;\r
38                         break ;\r
39 \r
40 //              case 'OutTop' :\r
41                         // Not supported.\r
42 \r
43                 default :\r
44                         FCK.Events.AttachEvent( 'OnBlur', FCK_OnBlur ) ;\r
45                         FCK.Events.AttachEvent( 'OnFocus', FCK_OnFocus ) ;\r
46 \r
47                         var eToolbarTarget ;\r
48 \r
49                         // Out:[TargetWindow]([TargetId])\r
50                         var oOutMatch = sLocation.match( /^Out:(.+)\((\w+)\)$/ ) ;\r
51                         if ( oOutMatch )\r
52                         {\r
53                                 if ( FCKBrowserInfo.IsAIR )\r
54                                         FCKAdobeAIR.ToolbarSet_GetOutElement( window, oOutMatch ) ;\r
55                                 else\r
56                                         eToolbarTarget = eval( 'parent.' + oOutMatch[1] ).document.getElementById( oOutMatch[2] ) ;\r
57                         }\r
58                         else\r
59                         {\r
60                                 // Out:[TargetId]\r
61                                 oOutMatch = sLocation.match( /^Out:(\w+)$/ ) ;\r
62                                 if ( oOutMatch )\r
63                                         eToolbarTarget = parent.document.getElementById( oOutMatch[1] ) ;\r
64                         }\r
65 \r
66                         if ( !eToolbarTarget )\r
67                         {\r
68                                 alert( 'Invalid value for "ToolbarLocation"' ) ;\r
69                                 return arguments.callee( 'In' );\r
70                         }\r
71 \r
72                         // If it is a shared toolbar, it may be already available in the target element.\r
73                         oToolbarSet = eToolbarTarget.__FCKToolbarSet ;\r
74                         if ( oToolbarSet )\r
75                                 break ;\r
76 \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
85 \r
86                         // Write the basic HTML for the toolbar (copy from the editor main page).\r
87                         var eTargetDocument = eToolbarIFrame.contentWindow.document ;\r
88 \r
89                         // Workaround for Safari 12256. Ticket #63\r
90                         var sBase = '' ;\r
91                         if ( FCKBrowserInfo.IsSafari )\r
92                                 sBase = '<base href="' + window.document.location + '">' ;\r
93 \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
107                                         + 'adjust();'\r
108                                         + 'lastHeight = document.body.scrollHeight;'\r
109                                         + '}'\r
110                                         + 'if (lastChange < currentTime - 1000) clearInterval(timer);'\r
111                                         + '};'\r
112                                         + 'timer = setInterval(poller, 100);'\r
113                                         + '}'\r
114                                         + '</script></head><body style="overflow: hidden">' + document.getElementById( 'xToolbarSpace' ).innerHTML + '</body></html>' ) ;\r
115                         eTargetDocument.close() ;\r
116 \r
117                         if( FCKBrowserInfo.IsAIR )\r
118                                 FCKAdobeAIR.ToolbarSet_InitOutFrame( eTargetDocument ) ;\r
119 \r
120                         FCKTools.AddEventListener( eTargetDocument, 'contextmenu', FCKTools.CancelEvent ) ;\r
121 \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
125 \r
126                         oToolbarSet = eToolbarTarget.__FCKToolbarSet = new FCKToolbarSet( eTargetDocument ) ;\r
127                         oToolbarSet._IFrame = eToolbarIFrame ;\r
128 \r
129                         if ( FCK.IECleanup )\r
130                                 FCK.IECleanup.AddItem( eToolbarTarget, FCKToolbarSet_Target_Cleanup ) ;\r
131         }\r
132 \r
133         oToolbarSet.CurrentInstance = FCK ;\r
134         if ( !oToolbarSet.ToolbarItems )\r
135                 oToolbarSet.ToolbarItems = FCKToolbarItems ;\r
136 \r
137         FCK.AttachToOnSelectionChange( oToolbarSet.RefreshItemsState ) ;\r
138 \r
139         return oToolbarSet ;\r
140 }\r
141 \r
142 function FCK_OnBlur( editorInstance )\r
143 {\r
144         var eToolbarSet = editorInstance.ToolbarSet ;\r
145 \r
146         if ( eToolbarSet.CurrentInstance == editorInstance )\r
147                 eToolbarSet.Disable() ;\r
148 }\r
149 \r
150 function FCK_OnFocus( editorInstance )\r
151 {\r
152         var oToolbarset = editorInstance.ToolbarSet ;\r
153         var oInstance = editorInstance || FCK ;\r
154 \r
155         // Unregister the toolbar window from the current instance.\r
156         oToolbarset.CurrentInstance.FocusManager.RemoveWindow( oToolbarset._IFrame.contentWindow ) ;\r
157 \r
158         // Set the new current instance.\r
159         oToolbarset.CurrentInstance = oInstance ;\r
160 \r
161         // Register the toolbar window in the current instance.\r
162         oInstance.FocusManager.AddWindow( oToolbarset._IFrame.contentWindow, true ) ;\r
163 \r
164         oToolbarset.Enable() ;\r
165 }\r
166 \r
167 function FCKToolbarSet_Cleanup()\r
168 {\r
169         this._TargetElement = null ;\r
170         this._IFrame = null ;\r
171 }\r
172 \r
173 function FCKToolbarSet_Target_Cleanup()\r
174 {\r
175         this.__FCKToolbarSet = null ;\r
176 }\r
177 \r
178 var FCKToolbarSet = function( targetDocument )\r
179 {\r
180         this._Document = targetDocument ;\r
181 \r
182         // Get the element that will hold the elements structure.\r
183         this._TargetElement     = targetDocument.getElementById( 'xToolbar' ) ;\r
184 \r
185         // Setup the expand and collapse handlers.\r
186         var eExpandHandle       = targetDocument.getElementById( 'xExpandHandle' ) ;\r
187         var eCollapseHandle     = targetDocument.getElementById( 'xCollapseHandle' ) ;\r
188 \r
189         eExpandHandle.title             = FCKLang.ToolbarExpand ;\r
190         FCKTools.AddEventListener( eExpandHandle, 'click', FCKToolbarSet_Expand_OnClick ) ;\r
191 \r
192         eCollapseHandle.title   = FCKLang.ToolbarCollapse ;\r
193         FCKTools.AddEventListener( eCollapseHandle, 'click', FCKToolbarSet_Collapse_OnClick ) ;\r
194 \r
195         // Set the toolbar state at startup.\r
196         if ( !FCKConfig.ToolbarCanCollapse || FCKConfig.ToolbarStartExpanded )\r
197                 this.Expand() ;\r
198         else\r
199                 this.Collapse() ;\r
200 \r
201         // Enable/disable the collapse handler\r
202         eCollapseHandle.style.display = FCKConfig.ToolbarCanCollapse ? '' : 'none' ;\r
203 \r
204         if ( FCKConfig.ToolbarCanCollapse )\r
205                 eCollapseHandle.style.display = '' ;\r
206         else\r
207                 targetDocument.getElementById( 'xTBLeftBorder' ).style.display = '' ;\r
208 \r
209         // Set the default properties.\r
210         this.Toolbars = new Array() ;\r
211         this.IsLoaded = false ;\r
212 \r
213         if ( FCK.IECleanup )\r
214                 FCK.IECleanup.AddItem( this, FCKToolbarSet_Cleanup ) ;\r
215 }\r
216 \r
217 function FCKToolbarSet_Expand_OnClick()\r
218 {\r
219         FCK.ToolbarSet.Expand() ;\r
220 }\r
221 \r
222 function FCKToolbarSet_Collapse_OnClick()\r
223 {\r
224         FCK.ToolbarSet.Collapse() ;\r
225 }\r
226 \r
227 FCKToolbarSet.prototype.Expand = function()\r
228 {\r
229         this._ChangeVisibility( false ) ;\r
230 }\r
231 \r
232 FCKToolbarSet.prototype.Collapse = function()\r
233 {\r
234         this._ChangeVisibility( true ) ;\r
235 }\r
236 \r
237 FCKToolbarSet.prototype._ChangeVisibility = function( collapse )\r
238 {\r
239         this._Document.getElementById( 'xCollapsed' ).style.display = collapse ? '' : 'none' ;\r
240         this._Document.getElementById( 'xExpanded' ).style.display = collapse ? 'none' : '' ;\r
241 \r
242         if ( FCKBrowserInfo.IsGecko )\r
243         {\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
247         }\r
248 }\r
249 \r
250 FCKToolbarSet.prototype.Load = function( toolbarSetName )\r
251 {\r
252         this.Name = toolbarSetName ;\r
253 \r
254         this.Items = new Array() ;\r
255 \r
256         // Reset the array of toolbar items that are active only on WYSIWYG mode.\r
257         this.ItemsWysiwygOnly = new Array() ;\r
258 \r
259         // Reset the array of toolbar items that are sensitive to the cursor position.\r
260         this.ItemsContextSensitive = new Array() ;\r
261 \r
262         // Cleanup the target element.\r
263         this._TargetElement.innerHTML = '' ;\r
264 \r
265         var ToolbarSet = FCKConfig.ToolbarSets[toolbarSetName] ;\r
266 \r
267         if ( !ToolbarSet )\r
268         {\r
269                 alert( FCKLang.UnknownToolbarSet.replace( /%1/g, toolbarSetName ) ) ;\r
270                 return ;\r
271         }\r
272 \r
273         this.Toolbars = new Array() ;\r
274 \r
275         for ( var x = 0 ; x < ToolbarSet.length ; x++ )\r
276         {\r
277                 var oToolbarItems = ToolbarSet[x] ;\r
278 \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
282                         continue ;\r
283 \r
284                 var oToolbar ;\r
285 \r
286                 if ( typeof( oToolbarItems ) == 'string' )\r
287                 {\r
288                         if ( oToolbarItems == '/' )\r
289                                 oToolbar = new FCKToolbarBreak() ;\r
290                 }\r
291                 else\r
292                 {\r
293                         oToolbar = new FCKToolbar() ;\r
294 \r
295                         for ( var j = 0 ; j < oToolbarItems.length ; j++ )\r
296                         {\r
297                                 var sItem = oToolbarItems[j] ;\r
298 \r
299                                 if ( sItem == '-')\r
300                                         oToolbar.AddSeparator() ;\r
301                                 else\r
302                                 {\r
303                                         var oItem = FCKToolbarItems.GetItem( sItem ) ;\r
304                                         if ( oItem )\r
305                                         {\r
306                                                 oToolbar.AddItem( oItem ) ;\r
307 \r
308                                                 this.Items.push( oItem ) ;\r
309 \r
310                                                 if ( !oItem.SourceView )\r
311                                                         this.ItemsWysiwygOnly.push( oItem ) ;\r
312 \r
313                                                 if ( oItem.ContextSensitive )\r
314                                                         this.ItemsContextSensitive.push( oItem ) ;\r
315                                         }\r
316                                 }\r
317                         }\r
318 \r
319                         // oToolbar.AddTerminator() ;\r
320                 }\r
321 \r
322                 oToolbar.Create( this._TargetElement ) ;\r
323 \r
324                 this.Toolbars[ this.Toolbars.length ] = oToolbar ;\r
325         }\r
326 \r
327         FCKTools.DisableSelection( this._Document.getElementById( 'xCollapseHandle' ).parentNode ) ;\r
328 \r
329         if ( FCK.Status != FCK_STATUS_COMPLETE )\r
330                 FCK.Events.AttachEvent( 'OnStatusChange', this.RefreshModeState ) ;\r
331         else\r
332                 this.RefreshModeState() ;\r
333 \r
334         this.IsLoaded = true ;\r
335         this.IsEnabled = true ;\r
336 \r
337         FCKTools.RunFunction( this.OnLoad ) ;\r
338 }\r
339 \r
340 FCKToolbarSet.prototype.Enable = function()\r
341 {\r
342         if ( this.IsEnabled )\r
343                 return ;\r
344 \r
345         this.IsEnabled = true ;\r
346 \r
347         var aItems = this.Items ;\r
348         for ( var i = 0 ; i < aItems.length ; i++ )\r
349                 aItems[i].RefreshState() ;\r
350 }\r
351 \r
352 FCKToolbarSet.prototype.Disable = function()\r
353 {\r
354         if ( !this.IsEnabled )\r
355                 return ;\r
356 \r
357         this.IsEnabled = false ;\r
358 \r
359         var aItems = this.Items ;\r
360         for ( var i = 0 ; i < aItems.length ; i++ )\r
361                 aItems[i].Disable() ;\r
362 }\r
363 \r
364 FCKToolbarSet.prototype.RefreshModeState = function( editorInstance )\r
365 {\r
366         if ( FCK.Status != FCK_STATUS_COMPLETE )\r
367                 return ;\r
368 \r
369         var oToolbarSet = editorInstance ? editorInstance.ToolbarSet : this ;\r
370         var aItems = oToolbarSet.ItemsWysiwygOnly ;\r
371 \r
372         if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )\r
373         {\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
377 \r
378                 // Refresh the buttons state.\r
379                 oToolbarSet.RefreshItemsState( editorInstance ) ;\r
380         }\r
381         else\r
382         {\r
383                 // Refresh the buttons state.\r
384                 oToolbarSet.RefreshItemsState( editorInstance ) ;\r
385 \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
389         }\r
390 }\r
391 \r
392 FCKToolbarSet.prototype.RefreshItemsState = function( editorInstance )\r
393 {\r
394 \r
395         var aItems = ( editorInstance ? editorInstance.ToolbarSet : this ).ItemsContextSensitive ;\r
396 \r
397         for ( var i = 0 ; i < aItems.length ; i++ )\r
398                 aItems[i].RefreshState() ;\r
399 }\r