Subversion Repositories Applications.papyrus

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1075 ddelon 1
/*
2
 * FCKeditor - The text editor for internet
3
 * Copyright (C) 2003-2006 Frederico Caldeira Knabben
4
 *
5
 * Licensed under the terms of the GNU Lesser General Public License:
6
 * 		http://www.opensource.org/licenses/lgpl-license.php
7
 *
8
 * For further information visit:
9
 * 		http://www.fckeditor.net/
10
 *
11
 * "Support Open Source software. What about a donation today?"
12
 *
13
 * File Name: fcktoolbarset.js
14
 * 	Defines the FCKToolbarSet object that is used to load and draw the
15
 * 	toolbar.
16
 *
17
 * File Authors:
18
 * 		Frederico Caldeira Knabben (fredck@fckeditor.net)
19
 */
20
 
21
function FCKToolbarSet_Create( overhideLocation )
22
{
23
	var oToolbarSet ;
24
 
25
	var sLocation = overhideLocation || FCKConfig.ToolbarLocation ;
26
	switch ( sLocation )
27
	{
28
		case 'In' :
29
				document.getElementById( 'xToolbarRow' ).style.display = '' ;
30
				oToolbarSet = new FCKToolbarSet( document ) ;
31
			break ;
32
 
33
//		case 'OutTop' :
34
			// Not supported.
35
 
36
		default :
37
			FCK.Events.AttachEvent( 'OnBlur', FCK_OnBlur ) ;
38
			FCK.Events.AttachEvent( 'OnFocus', FCK_OnFocus ) ;
39
 
40
			var eToolbarTarget ;
41
 
42
			// Out:[TargetWindow]([TargetId])
43
			var oOutMatch = sLocation.match( /^Out:(.+)\((\w+)\)$/ ) ;
44
			if ( oOutMatch )
45
			{
46
				eToolbarTarget = eval( 'parent.' + oOutMatch[1] ).document.getElementById( oOutMatch[2] ) ;
47
			}
48
			else
49
			{
50
				// Out:[TargetId]
51
				oOutMatch = sLocation.match( /^Out:(\w+)$/ ) ;
52
				if ( oOutMatch )
53
					eToolbarTarget = parent.document.getElementById( oOutMatch[1] ) ;
54
			}
55
 
56
			if ( !eToolbarTarget )
57
			{
58
				alert( 'Invalid value for "ToolbarLocation"' ) ;
59
				return this._Init( 'In' ) ;
60
			}
61
 
62
			// If it is a shared toolbar, it may be already available in the target element.
63
			if ( oToolbarSet = eToolbarTarget.__FCKToolbarSet )
64
				break ;
65
 
66
			// Create the IFRAME that will hold the toolbar inside the target element.
67
			var eToolbarIFrame = FCKTools.GetElementDocument( eToolbarTarget ).createElement( 'iframe' ) ;
68
			eToolbarIFrame.frameBorder = 0 ;
69
			eToolbarIFrame.width = '100%' ;
70
			eToolbarIFrame.height = '10' ;
71
			eToolbarTarget.appendChild( eToolbarIFrame ) ;
72
			eToolbarIFrame.unselectable = 'on' ;
73
 
74
			// Write the basic HTML for the toolbar (copy from the editor main page).
75
			var eTargetDocument = eToolbarIFrame.contentWindow.document ;
76
			eTargetDocument.open() ;
77
			eTargetDocument.write( '<html><head><script type="text/javascript"> window.onload = window.onresize = function() { window.frameElement.height = document.body.scrollHeight ; } </script></head><body style="overflow: hidden">' + document.getElementById( 'xToolbarSpace' ).innerHTML + '</body></html>' ) ;
78
			eTargetDocument.close() ;
79
 
80
			eTargetDocument.oncontextmenu = FCKTools.CancelEvent ;
81
 
82
			// Load external resources (must be done here, otherwise Firefox will not
83
			// have the document DOM ready to be used right away.
84
			FCKTools.AppendStyleSheet( eTargetDocument, FCKConfig.SkinPath + 'fck_editor.css' ) ;
85
 
86
			oToolbarSet = eToolbarTarget.__FCKToolbarSet = new FCKToolbarSet( eTargetDocument ) ;
87
			oToolbarSet._IFrame = eToolbarIFrame ;
88
 
89
			if ( FCK.IECleanup )
90
				FCK.IECleanup.AddItem( eToolbarTarget, FCKToolbarSet_Target_Cleanup ) ;
91
	}
92
 
93
	oToolbarSet.CurrentInstance = FCK ;
94
 
95
	FCK.AttachToOnSelectionChange( oToolbarSet.RefreshItemsState ) ;
96
 
97
	return oToolbarSet ;
98
}
99
 
100
function FCK_OnBlur( editorInstance )
101
{
102
	var eToolbarSet = editorInstance.ToolbarSet ;
103
 
104
	if ( eToolbarSet.CurrentInstance == editorInstance )
105
		eToolbarSet.Disable() ;
106
}
107
 
108
function FCK_OnFocus( editorInstance )
109
{
110
	var oToolbarset = editorInstance.ToolbarSet ;
111
	var oInstance = editorInstance || FCK ;
112
 
113
	// Unregister the toolbar window from the current instance.
114
	oToolbarset.CurrentInstance.FocusManager.RemoveWindow( oToolbarset._IFrame.contentWindow ) ;
115
 
116
	// Set the new current instance.
117
	oToolbarset.CurrentInstance = oInstance ;
118
 
119
	// Register the toolbar window in the current instance.
120
	oInstance.FocusManager.AddWindow( oToolbarset._IFrame.contentWindow, true ) ;
121
 
122
	oToolbarset.Enable() ;
123
}
124
 
125
function FCKToolbarSet_Cleanup()
126
{
127
	this._TargetElement = null ;
128
	this._IFrame = null ;
129
}
130
 
131
function FCKToolbarSet_Target_Cleanup()
132
{
133
	this.__FCKToolbarSet = null ;
134
}
135
 
136
var FCKToolbarSet = function( targetDocument )
137
{
138
	this._Document = targetDocument ;
139
 
140
	// Get the element that will hold the elements structure.
141
	this._TargetElement	= targetDocument.getElementById( 'xToolbar' ) ;
142
 
143
	// Setup the expand and collapse handlers.
144
	var eExpandHandle	= targetDocument.getElementById( 'xExpandHandle' ) ;
145
	var eCollapseHandle	= targetDocument.getElementById( 'xCollapseHandle' ) ;
146
 
147
	eExpandHandle.title		= FCKLang.ToolbarExpand ;
148
	eExpandHandle.onclick	= FCKToolbarSet_Expand_OnClick ;
149
 
150
	eCollapseHandle.title	= FCKLang.ToolbarCollapse ;
151
	eCollapseHandle.onclick	= FCKToolbarSet_Collapse_OnClick ;
152
 
153
	// Set the toolbar state at startup.
154
	if ( !FCKConfig.ToolbarCanCollapse || FCKConfig.ToolbarStartExpanded )
155
		this.Expand() ;
156
	else
157
		this.Collapse() ;
158
 
159
	// Enable/disable the collapse handler
160
	eCollapseHandle.style.display = FCKConfig.ToolbarCanCollapse ? '' : 'none' ;
161
 
162
	if ( FCKConfig.ToolbarCanCollapse )
163
		eCollapseHandle.style.display = '' ;
164
	else
165
		targetDocument.getElementById( 'xTBLeftBorder' ).style.display = '' ;
166
 
167
	// Set the default properties.
168
	this.Toolbars = new Array() ;
169
	this.IsLoaded = false ;
170
 
171
	if ( FCK.IECleanup )
172
		FCK.IECleanup.AddItem( this, FCKToolbarSet_Cleanup ) ;
173
}
174
 
175
function FCKToolbarSet_Expand_OnClick()
176
{
177
	FCK.ToolbarSet.Expand() ;
178
}
179
 
180
function FCKToolbarSet_Collapse_OnClick()
181
{
182
	FCK.ToolbarSet.Collapse() ;
183
}
184
 
185
FCKToolbarSet.prototype.Expand = function()
186
{
187
	this._ChangeVisibility( false ) ;
188
}
189
 
190
FCKToolbarSet.prototype.Collapse = function()
191
{
192
	this._ChangeVisibility( true ) ;
193
}
194
 
195
FCKToolbarSet.prototype._ChangeVisibility = function( collapse )
196
{
197
	this._Document.getElementById( 'xCollapsed' ).style.display = collapse ? '' : 'none' ;
198
	this._Document.getElementById( 'xExpanded' ).style.display = collapse ? 'none' : '' ;
199
 
200
	if ( FCKBrowserInfo.IsGecko )
201
	{
202
		// I had to use "setTimeout" because Gecko was not responding in a right
203
		// way when calling window.onresize() directly.
204
		FCKTools.RunFunction( window.onresize ) ;
205
	}
206
}
207
 
208
FCKToolbarSet.prototype.Load = function( toolbarSetName )
209
{
210
	this.Name = toolbarSetName ;
211
 
212
	this.Items = new Array() ;
213
 
214
	// Reset the array of toolbat items that are active only on WYSIWYG mode.
215
	this.ItemsWysiwygOnly = new Array() ;
216
 
217
	// Reset the array of toolbar items that are sensitive to the cursor position.
218
	this.ItemsContextSensitive = new Array() ;
219
 
220
	// Cleanup the target element.
221
	this._TargetElement.innerHTML = '' ;
222
 
223
	var ToolbarSet = FCKConfig.ToolbarSets[toolbarSetName] ;
224
 
225
	if ( !ToolbarSet )
226
	{
227
		alert( FCKLang.UnknownToolbarSet.replace( /%1/g, toolbarSetName ) ) ;
228
		return ;
229
	}
230
 
231
	this.Toolbars = new Array() ;
232
 
233
	for ( var x = 0 ; x < ToolbarSet.length ; x++ )
234
	{
235
		var oToolbarItems = ToolbarSet[x] ;
236
 
237
		var oToolbar ;
238
 
239
		if ( typeof( oToolbarItems ) == 'string' )
240
		{
241
			if ( oToolbarItems == '/' )
242
				oToolbar = new FCKToolbarBreak() ;
243
		}
244
		else
245
		{
246
			oToolbar = new FCKToolbar() ;
247
 
248
			for ( var j = 0 ; j < oToolbarItems.length ; j++ )
249
			{
250
				var sItem = oToolbarItems[j] ;
251
 
252
				if ( sItem == '-')
253
					oToolbar.AddSeparator() ;
254
				else
255
				{
256
					var oItem = FCKToolbarItems.GetItem( sItem ) ;
257
					if ( oItem )
258
					{
259
						oToolbar.AddItem( oItem ) ;
260
 
261
						this.Items.push( oItem ) ;
262
 
263
						if ( !oItem.SourceView )
264
							this.ItemsWysiwygOnly.push( oItem ) ;
265
 
266
						if ( oItem.ContextSensitive )
267
							this.ItemsContextSensitive.push( oItem ) ;
268
					}
269
				}
270
			}
271
 
272
			// oToolbar.AddTerminator() ;
273
		}
274
 
275
		oToolbar.Create( this._TargetElement ) ;
276
 
277
		this.Toolbars[ this.Toolbars.length ] = oToolbar ;
278
	}
279
 
280
	FCKTools.DisableSelection( this._Document.getElementById( 'xCollapseHandle' ).parentNode ) ;
281
 
282
	if ( FCK.Status != FCK_STATUS_COMPLETE )
283
		FCK.Events.AttachEvent( 'OnStatusChange', this.RefreshModeState ) ;
284
	else
285
		this.RefreshModeState() ;
286
 
287
	this.IsLoaded = true ;
288
	this.IsEnabled = true ;
289
 
290
	FCKTools.RunFunction( this.OnLoad ) ;
291
}
292
 
293
FCKToolbarSet.prototype.Enable = function()
294
{
295
	if ( this.IsEnabled )
296
		return ;
297
 
298
	this.IsEnabled = true ;
299
 
300
	var aItems = this.Items ;
301
	for ( var i = 0 ; i < aItems.length ; i++ )
302
		aItems[i].RefreshState() ;
303
}
304
 
305
FCKToolbarSet.prototype.Disable = function()
306
{
307
	if ( !this.IsEnabled )
308
		return ;
309
 
310
	this.IsEnabled = false ;
311
 
312
	var aItems = this.Items ;
313
	for ( var i = 0 ; i < aItems.length ; i++ )
314
		aItems[i].Disable() ;
315
}
316
 
317
FCKToolbarSet.prototype.RefreshModeState = function( editorInstance )
318
{
319
	if ( FCK.Status != FCK_STATUS_COMPLETE )
320
		return ;
321
 
322
	var oToolbarSet = editorInstance ? editorInstance.ToolbarSet : this ;
323
	var aItems = oToolbarSet.ItemsWysiwygOnly ;
324
 
325
	if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
326
	{
327
		// Enable all buttons that are available on WYSIWYG mode only.
328
		for ( var i = 0 ; i < aItems.length ; i++ )
329
			aItems[i].Enable() ;
330
 
331
		// Refresh the buttons state.
332
		oToolbarSet.RefreshItemsState( editorInstance ) ;
333
	}
334
	else
335
	{
336
		// Refresh the buttons state.
337
		oToolbarSet.RefreshItemsState( editorInstance ) ;
338
 
339
		// Disable all buttons that are available on WYSIWYG mode only.
340
		for ( var i = 0 ; i < aItems.length ; i++ )
341
			aItems[i].Disable() ;
342
	}
343
}
344
 
345
FCKToolbarSet.prototype.RefreshItemsState = function( editorInstance )
346
{
347
 
348
	var aItems = ( editorInstance ? editorInstance.ToolbarSet : this ).ItemsContextSensitive ;
349
 
350
	for ( var i = 0 ; i < aItems.length ; i++ )
351
		aItems[i].RefreshState() ;
352
}