Subversion Repositories Applications.papyrus

Rev

Rev 1688 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1688 Rev 1921
Line 1... Line 1...
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
<!--
2
<!--
3
 * FCKeditor - The text editor for internet
3
 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
4
 * Copyright (C) 2003-2006 Frederico Caldeira Knabben
4
 * Copyright (C) 2003-2008 Frederico Caldeira Knabben
-
 
5
 *
-
 
6
 * == BEGIN LICENSE ==
5
 * 
7
 *
6
 * Licensed under the terms of the GNU Lesser General Public License:
8
 * Licensed under the terms of any of the following licenses at your
7
 * 		http://www.opensource.org/licenses/lgpl-license.php
9
 * choice:
8
 * 
10
 *
9
 * For further information visit:
11
 *  - GNU General Public License Version 2 or later (the "GPL")
10
 * 		http://www.fckeditor.net/
12
 *    http://www.gnu.org/licenses/gpl.html
11
 * 
13
 *
12
 * "Support Open Source software. What about a donation today?"
14
 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
-
 
15
 *    http://www.gnu.org/licenses/lgpl.html
13
 * 
16
 *
14
 * File Name: fckdialog.html
17
 *  - Mozilla Public License Version 1.1 or later (the "MPL")
15
 * 	This page is used by all dialog box as the container.
18
 *    http://www.mozilla.org/MPL/MPL-1.1.html
16
 * 
19
 *
17
 * File Authors:
20
 * == END LICENSE ==
-
 
21
 *
18
 * 		Frederico Caldeira Knabben (fredck@fckeditor.net)
22
 * This page is used by all dialog box as the container.
19
-->
23
-->
20
<html xmlns="http://www.w3.org/1999/xhtml">
24
<html xmlns="http://www.w3.org/1999/xhtml">
21
	<head>
25
	<head>
-
 
26
		<title></title>
22
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
27
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
23
		<meta name="robots" content="noindex, nofollow" />
28
		<meta name="robots" content="noindex, nofollow" />
24
		<script type="text/javascript">
29
		<script type="text/javascript">
-
 
30
// <![CDATA[
Line 25... Line 31...
25
 
31
 
26
// On some Gecko browsers (probably over slow connections) the
-
 
27
// "dialogArguments" are not set so we must get it from the opener window.
32
// Domain relaxation logic.
-
 
33
(function()
28
if ( !window.dialogArguments )
34
{
Line 29... Line 35...
29
	window.dialogArguments = window.opener.FCKLastDialogInfo ;
35
	var d = document.domain ;
-
 
36
 
-
 
37
	while ( true )
-
 
38
	{
-
 
39
		// Test if we can access a parent property.
30
 
40
		try
Line 31... Line 41...
31
// Sets the Skin CSS
41
		{
32
document.write( '<link href="' + window.dialogArguments.Editor.FCKConfig.SkinPath + 'fck_dialog.css" type="text/css" rel="stylesheet">' ) ;
42
			var parentDomain = ( Args().TopWindow || E ).document.domain ;
Line 33... Line 43...
33
 
43
 
-
 
44
			if ( document.domain != parentDomain )
34
// Sets the language direction.
45
				document.domain = parentDomain ;
Line 35... Line -...
35
window.document.dir = window.dialogArguments.Editor.FCKLang.Dir ;
-
 
36
 
-
 
37
var sTitle = window.dialogArguments.Title ;
46
 
38
document.write( '<title>' + sTitle + '<\/title>' ) ;
47
			break ;
Line 39... Line 48...
39
 
48
		}
40
function LoadInnerDialog()
49
		catch( e ) {}
Line 41... Line 50...
41
{
50
 
-
 
51
		// Remove a domain part: www.mytest.example.com => mytest.example.com => example.com ...
-
 
52
		d = d.replace( /.*?(?:\.|$)/, '' ) ;
-
 
53
 
42
	// The following value is set, so the editor can check that the dialog has been correctly opened.
54
		if ( d.length == 0 )
Line -... Line 55...
-
 
55
			break ;		// It was not able to detect the domain.
-
 
56
 
-
 
57
		document.domain = d ;
-
 
58
	}
43
	window.setTimeout( function() { window.returnValue = true ; }, 100 ) ;
59
})() ;
44
 
60
 
Line 45... Line 61...
45
	if ( window.onresize )
61
var E = frameElement._DialogArguments.Editor ;
46
		window.onresize() ;
62
 
47
 
63
// It seems referencing to frameElement._DialogArguments directly would lead to memory leaks in IE.
-
 
64
// So let's use functions to access its members instead.
Line -... Line 65...
-
 
65
function Args()
-
 
66
{
-
 
67
	return frameElement._DialogArguments ;
48
	// First of all, translate the dialog box contents.
68
}
-
 
69
 
49
	window.dialogArguments.Editor.FCKLanguageManager.TranslatePage( document ) ;
70
function ParentDialog( dialog )
Line -... Line 71...
-
 
71
{
50
 
72
	return dialog ? dialog._ParentDialog : frameElement._ParentDialog ;
51
	window.frames["frmMain"].document.location.href = window.dialogArguments.Page ;
-
 
Line 52... Line 73...
52
}
73
}
53
 
74
 
Line 54... Line 75...
54
function InnerDialogLoaded()
75
var FCK				= E.FCK ;
55
{
-
 
-
 
76
var FCKTools		= E.FCKTools ;
Line -... Line 77...
-
 
77
var FCKDomTools		= E.FCKDomTools ;
56
	var oInnerDoc = document.getElementById('frmMain').contentWindow.document ;
78
var FCKDialog		= E.FCKDialog ;
57
 
-
 
58
	// Set the language direction.
79
var FCKBrowserInfo	= E.FCKBrowserInfo ;
59
	oInnerDoc.dir = window.dialogArguments.Editor.FCKLang.Dir ;
-
 
Line 60... Line 80...
60
 
80
var FCKConfig		= E.FCKConfig ;
Line 61... Line 81...
61
	// Sets the Skin CSS.
81
 
-
 
82
// Steal the focus so that the caret would no longer stay in the editor iframe.
62
	oInnerDoc.write( '<link href="' + window.dialogArguments.Editor.FCKConfig.SkinPath + 'fck_dialog.css" type="text/css" rel="stylesheet">' ) ;
83
window.focus() ;
63
 
84
 
64
	SetOnKeyDown( oInnerDoc ) ;
-
 
65
	DisableContextMenu( oInnerDoc ) ;
-
 
Line -... Line 85...
-
 
85
// Sets the Skin CSS
-
 
86
document.write( FCKTools.GetStyleHtml( FCKConfig.SkinDialogCSS ) ) ;
66
 
87
 
67
	return window.dialogArguments.Editor ;
88
// Sets the language direction.
68
}
89
var langDir = document.documentElement.dir = E.FCKLang.Dir ;
-
 
90
 
69
 
91
// For IE6-, the fck_dialog_ie6.js is loaded, used to fix limitations in the browser.
70
function SetOkButton( showIt )
-
 
Line -... Line 92...
-
 
92
if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
-
 
93
	document.write( '<' + 'script type="text/javascript" src="' + FCKConfig.SkinPath + 'fck_dialog_ie6.js"><' + '\/script>' ) ;
-
 
94
 
71
{
95
FCKTools.RegisterDollarFunction( window ) ;
-
 
96
 
72
	document.getElementById('btnOk').style.visibility = ( showIt ? '' : 'hidden' ) ;
97
// Resize related functions.
73
}
-
 
74
 
98
var Sizer = function()
-
 
99
{
75
var bAutoSize = false ;
100
	var bAutoSize = false ;
Line -... Line 101...
-
 
101
 
-
 
102
	var retval = {
76
 
103
		// Sets whether the dialog should auto-resize according to its content's height.
-
 
104
		SetAutoSize : function( autoSize )
Line 77... Line 105...
77
function SetAutoSize( autoSize )
105
		{
-
 
106
			bAutoSize = autoSize ;
-
 
107
			this.RefreshSize() ;
Line -... Line 108...
-
 
108
		},
-
 
109
 
78
{
110
		// Fit the dialog container's layout to the inner iframe's external size.
79
	bAutoSize = autoSize ;
111
		RefreshContainerSize : function()
-
 
112
		{
-
 
113
			var frmMain = $( 'frmMain' ) ;
-
 
114
 
-
 
115
			if ( frmMain )
-
 
116
			{
-
 
117
				// Get the container size.
-
 
118
				var height = $( 'contents' ).offsetHeight ;
-
 
119
 
-
 
120
				// Subtract the size of other elements.
-
 
121
				height -= $( 'TitleArea' ).offsetHeight ;
-
 
122
				height -= $( 'TabsRow' ).offsetHeight ;
-
 
123
				height -= $( 'PopupButtons' ).offsetHeight ;
-
 
124
 
-
 
125
				frmMain.style.height = Math.max( height, 0 ) + 'px' ;
-
 
126
			}
-
 
127
		},
-
 
128
 
80
	RefreshSize() ;
129
		// Resize and re-layout the dialog.
-
 
130
		// Triggers the onresize event for the layout logic.
-
 
131
		ResizeDialog : function( width, height )
-
 
132
		{
-
 
133
			FCKDomTools.SetElementStyles( window.frameElement,
-
 
134
					{
-
 
135
						'width' : width + 'px',
-
 
136
						'height' : height + 'px'
-
 
137
					} ) ;
-
 
138
 
-
 
139
			// If the skin have defined a function for resize fixes, call it now.
-
 
140
			if ( typeof window.DoResizeFixes == 'function' )
-
 
141
				window.DoResizeFixes() ;
-
 
142
		},
-
 
143
 
-
 
144
		// if bAutoSize is true, automatically fit the dialog size and layout to
-
 
145
		// accomodate the inner iframe's internal height.
-
 
146
		// if bAutoSize is false, then only the layout logic for the dialog decorations
-
 
147
		// is run to accomodate the inner iframe's external height.
-
 
148
		RefreshSize : function()
-
 
149
		{
81
}
150
			if ( bAutoSize )
-
 
151
			{
-
 
152
				var frmMain		= $( 'frmMain' ) ;
82
 
153
				var innerDoc	= frmMain.contentWindow.document ;
83
function RefreshSize()
154
				var isStrict	= FCKTools.IsStrictMode( innerDoc ) ;
84
{
155
 
85
	if ( bAutoSize )
156
				// Get the size of the frame contents.
86
	{
-
 
Line 87... Line -...
87
		var oInnerDoc = document.getElementById('frmMain').contentWindow.document ;
-
 
88
 
157
				var innerWidth	= isStrict ? innerDoc.documentElement.scrollWidth : innerDoc.body.scrollWidth ;
-
 
158
				var innerHeight	= isStrict ? innerDoc.documentElement.scrollHeight : innerDoc.body.scrollHeight ;
89
		var iFrameHeight ;
159
 
-
 
160
				// Get the current frame size.
-
 
161
				var frameSize = FCKTools.GetViewPaneSize( frmMain.contentWindow ) ;
90
		if ( document.all )
162
 
-
 
163
				var deltaWidth	= innerWidth - frameSize.Width ;
91
			iFrameHeight = oInnerDoc.body.offsetHeight ;
164
				var deltaHeight	= innerHeight - frameSize.Height ;
-
 
165
 
Line 92... Line 166...
92
		else
166
				// If the contents fits the current size.
-
 
167
				if ( deltaWidth <= 0 && deltaHeight <= 0 )
-
 
168
					return ;
-
 
169
 
-
 
170
				var dialogWidth		= frameElement.offsetWidth + Math.max( deltaWidth, 0 ) ;
93
			iFrameHeight = document.getElementById('frmMain').contentWindow.innerHeight ;
171
				var dialogHeight	= frameElement.offsetHeight + Math.max( deltaHeight, 0 ) ;
-
 
172
 
-
 
173
				this.ResizeDialog( dialogWidth, dialogHeight ) ;
94
 
174
			}
-
 
175
			this.RefreshContainerSize() ;
-
 
176
		}
95
		var iInnerHeight = oInnerDoc.body.scrollHeight ;
177
	}
96
 
178
 
97
		var iDiff = iInnerHeight - iFrameHeight ;
179
	/**
-
 
180
	 * Safari seems to have a bug with the time when RefreshSize() is executed - it
98
 
181
	 * thinks frmMain's innerHeight is 0 if we query the value too soon after the
-
 
182
	 * page is loaded in some circumstances. (#1316)
99
		if ( iDiff > 0 )
183
	 * TODO : Maybe this is not needed anymore after #35.
100
		{
-
 
101
			if ( document.all )
-
 
Line 102... Line 184...
102
				window.dialogHeight = ( parseInt( window.dialogHeight ) + iDiff ) + 'px' ;
184
	 */
-
 
185
	if ( FCKBrowserInfo.IsSafari )
103
			else
186
	{
-
 
187
		var originalRefreshSize = retval.RefreshSize ;
Line 104... Line -...
104
				window.resizeBy( 0, iDiff ) ;
-
 
105
		}
-
 
106
	}
188
 
107
}
-
 
Line 108... Line 189...
108
 
189
		retval.RefreshSize = function()
109
function Ok()
-
 
110
{
-
 
111
	if ( window.frames["frmMain"].Ok && window.frames["frmMain"].Ok() )
190
		{
Line -... Line 191...
-
 
191
			FCKTools.SetTimeout( originalRefreshSize, 1, retval ) ;
112
		Cancel() ;
192
		}
-
 
193
	}
-
 
194
 
Line -... Line 195...
-
 
195
	/**
-
 
196
	 * IE6 has a similar bug where it sometimes thinks $('contents') has an
113
}
197
	 * offsetHeight of 0 (#2114).
114
 
198
	 */
-
 
199
	if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
-
 
200
	{
-
 
201
		var originalRefreshContainerSize = retval.RefreshContainerSize ;
-
 
202
		retval.RefreshContainerSize = function()
-
 
203
		{
Line 115... Line 204...
115
function Cancel( dontFireChange )
204
			FCKTools.SetTimeout( originalRefreshContainerSize, 1, retval ) ;
116
{
205
		}
117
	if ( !dontFireChange )
-
 
118
	{
206
	}
119
		// All dialog windows, by default, will fire the "OnSelectionChange"
-
 
Line 120... Line 207...
120
		// event, no matter the Ok or Cancel button has been pressed.
207
 
121
		window.dialogArguments.Editor.FCK.Events.FireEvent( 'OnSelectionChange' ) ;
208
	window.onresize = function()
-
 
209
	{
-
 
210
		retval.RefreshContainerSize() ;
-
 
211
	}
-
 
212
 
-
 
213
	window.SetAutoSize = FCKTools.Bind( retval, retval.SetAutoSize ) ;
-
 
214
 
-
 
215
	return retval ;
-
 
216
}() ;
Line 122... Line 217...
122
	}
217
 
Line -... Line 218...
-
 
218
// Manages the throbber image that appears if the inner part of dialog is taking too long to load.
-
 
219
var Throbber = function()
-
 
220
{
-
 
221
	var timer ;
123
	window.close() ;
222
 
-
 
223
	var updateThrobber = function()
-
 
224
	{
Line -... Line 225...
-
 
225
		var throbberParent = $( 'throbberBlock' ) ;
-
 
226
		var throbberBlocks = throbberParent.childNodes ;
-
 
227
		var lastClass = throbberParent.lastChild.className ;
-
 
228
 
-
 
229
		// From the last to the second one, copy the class from the previous one.
-
 
230
		for ( var i = throbberBlocks.length - 1 ; i > 0 ; i-- )
-
 
231
			throbberBlocks[i].className = throbberBlocks[i-1].className ;
-
 
232
 
-
 
233
		// For the first one, copy the last class (rotation).
-
 
234
		throbberBlocks[0].className = lastClass ;
-
 
235
	}
-
 
236
 
124
}
237
	return {
-
 
238
		Show : function( waitMilliseconds )
125
 
239
		{
126
// Object that holds all available tabs.
240
			// Auto-setup the Show function to be called again after the
127
var oTabs = new Object() ;
241
			// requested amount of time.
-
 
242
			if ( waitMilliseconds && waitMilliseconds > 0 )
Line 128... Line 243...
128
 
243
			{
-
 
244
				timer = FCKTools.SetTimeout( this.Show, waitMilliseconds, this, null, window ) ;
-
 
245
				return ;
-
 
246
			}
129
function TabDiv_OnClick()
247
 
-
 
248
			var throbberParent = $( 'throbberBlock' ) ;
-
 
249
 
Line 130... Line 250...
130
{
250
			if (throbberParent.childNodes.length == 0)
131
	SetSelectedTab( this.TabCode ) ;
-
 
132
}
-
 
Line 133... Line 251...
133
 
251
			{
134
function AddTab( tabCode, tabText, startHidden )
252
				// Create the throbber blocks.
-
 
253
				var classIds = [ 1,2,3,4,5,4,3,2 ] ;
135
{
254
				while ( classIds.length > 0 )
-
 
255
					throbberParent.appendChild( document.createElement( 'div' ) ).className = ' throbber_' + classIds.shift() ;
-
 
256
			}
Line 136... Line 257...
136
	if ( typeof( oTabs[ tabCode ] ) != 'undefined' )
257
 
-
 
258
			// Center the throbber.
137
		return ;
259
			var frm = $( 'contents' ) ;
138
 
260
			var frmCoords = FCKTools.GetDocumentPosition( window, frm ) ;
-
 
261
			var x = frmCoords.x + ( frm.offsetWidth - throbberParent.offsetWidth ) / 2 ;
-
 
262
			var y = frmCoords.y + ( frm.offsetHeight - throbberParent.offsetHeight ) / 2 ;
-
 
263
			throbberParent.style.left = parseInt( x, 10 ) + 'px' ;
-
 
264
			throbberParent.style.top = parseInt( y, 10 ) + 'px' ;
139
	var eTabsRow = document.getElementById( 'Tabs' ) ;
265
 
140
 
-
 
141
	var oCell = eTabsRow.insertCell(  eTabsRow.cells.length - 1 ) ;
266
			// Show it.
142
	oCell.noWrap = true ;
267
			throbberParent.style.visibility = ''  ;
-
 
268
 
143
 
269
			// Hide tabs and buttons:
-
 
270
			$( 'Tabs' ).style.visibility = 'hidden' ;
144
	var oDiv = document.createElement( 'DIV' ) ;
271
			$( 'PopupButtons' ).style.visibility = 'hidden' ;
Line 145... Line -...
145
	oDiv.className = 'PopupTab' ;
-
 
146
	oDiv.innerHTML = tabText ;
272
 
147
	oDiv.TabCode = tabCode ;
273
			// Setup the animation interval.
-
 
274
			timer = setInterval( updateThrobber, 100 ) ;
-
 
275
		},
Line -... Line 276...
-
 
276
 
148
	oDiv.onclick = TabDiv_OnClick ;
277
		Hide : function()
149
 
278
		{
150
	if ( startHidden )
279
			if ( timer )
-
 
280
			{
-
 
281
				clearInterval( timer ) ;
-
 
282
				timer = null ;
-
 
283
			}
-
 
284
 
-
 
285
			$( 'throbberBlock' ).style.visibility = 'hidden' ;
-
 
286
 
-
 
287
			// Show tabs and buttons:
-
 
288
			$( 'Tabs' ).style.visibility = '' ;
-
 
289
			$( 'PopupButtons' ).style.visibility = '' ;
-
 
290
		}
-
 
291
	} ;
151
		oDiv.style.display = 'none' ;
292
}() ;
Line -... Line 293...
-
 
293
 
152
 
294
// Drag and drop handlers.
-
 
295
var DragAndDrop = function()
-
 
296
{
-
 
297
	var registeredWindows = [] ;
-
 
298
	var lastCoords ;
-
 
299
	var currentPos ;
-
 
300
 
-
 
301
	var cleanUpHandlers = function()
-
 
302
	{
153
	eTabsRow = document.getElementById( 'TabsRow' ) ;
303
		for ( var i = 0 ; i < registeredWindows.length ; i++ )
154
 
304
		{
-
 
305
			FCKTools.RemoveEventListener( registeredWindows[i].document, 'mousemove', dragMouseMoveHandler ) ;
-
 
306
			FCKTools.RemoveEventListener( registeredWindows[i].document, 'mouseup', dragMouseUpHandler ) ;
-
 
307
		}
-
 
308
	}
-
 
309
 
-
 
310
	var dragMouseMoveHandler = function( evt )
-
 
311
	{
-
 
312
		if ( !lastCoords )
-
 
313
			return ;
-
 
314
 
155
	oCell.appendChild( oDiv ) ;
315
		if ( !evt )
156
 
316
			evt = FCKTools.GetElementDocument( this ).parentWindow.event ;
-
 
317
 
157
	if ( eTabsRow.style.display == 'none' )
318
		// Updated the last coordinates.
158
	{
319
		var currentCoords =
159
		var eTitleArea = document.getElementById( 'TitleArea' ) ;
320
		{
160
		eTitleArea.className = 'PopupTitle' ;
321
			x : evt.screenX,
-
 
322
			y : evt.screenY
-
 
323
		} ;
-
 
324
 
-
 
325
		currentPos =
-
 
326
		{
-
 
327
			x : currentPos.x + ( currentCoords.x - lastCoords.x ),
-
 
328
			y : currentPos.y + ( currentCoords.y - lastCoords.y )
-
 
329
		} ;
-
 
330
 
-
 
331
		lastCoords = currentCoords ;
-
 
332
 
-
 
333
		frameElement.style.left	= currentPos.x + 'px' ;
-
 
334
		frameElement.style.top	= currentPos.y + 'px' ;
-
 
335
 
-
 
336
		if ( evt.preventDefault )
-
 
337
			evt.preventDefault() ;
-
 
338
		else
-
 
339
			evt.returnValue = false ;
-
 
340
	}
-
 
341
 
-
 
342
	var dragMouseUpHandler = function( evt )
-
 
343
	{
-
 
344
		if ( !lastCoords )
-
 
345
			return ;
-
 
346
		if ( !evt )
-
 
347
			evt = FCKTools.GetElementDocument( this ).parentWindow.event ;
-
 
348
		cleanUpHandlers() ;
-
 
349
		lastCoords = null ;
-
 
350
	}
-
 
351
 
-
 
352
	return {
-
 
353
 
-
 
354
		MouseDownHandler : function( evt )
-
 
355
		{
-
 
356
			var view = null ;
161
 
357
			if ( !evt )
162
		oDiv.className = 'PopupTabSelected' ;
358
			{
-
 
359
				view = FCKTools.GetElementDocument( this ).parentWindow ;
-
 
360
				evt = view.event ;
-
 
361
			}
-
 
362
			else
-
 
363
				view = evt.view ;
-
 
364
 
-
 
365
			var target = evt.srcElement || evt.target ;
-
 
366
			if ( target.id == 'closeButton' || target.className == 'PopupTab' || target.className == 'PopupTabSelected' )
-
 
367
				return ;
-
 
368
 
-
 
369
			lastCoords =
-
 
370
			{
-
 
371
				x : evt.screenX,
-
 
372
				y : evt.screenY
-
 
373
			} ;
-
 
374
 
-
 
375
			// Save the current IFRAME position.
-
 
376
			currentPos =
-
 
377
			{
-
 
378
				x : parseInt( FCKDomTools.GetCurrentElementStyle( frameElement, 'left' ), 10 ),
-
 
379
				y : parseInt( FCKDomTools.GetCurrentElementStyle( frameElement, 'top' ), 10 )
-
 
380
			} ;
-
 
381
 
-
 
382
			for ( var i = 0 ; i < registeredWindows.length ; i++ )
-
 
383
			{
-
 
384
				FCKTools.AddEventListener( registeredWindows[i].document, 'mousemove', dragMouseMoveHandler ) ;
-
 
385
				FCKTools.AddEventListener( registeredWindows[i].document, 'mouseup', dragMouseUpHandler ) ;
-
 
386
			}
-
 
387
 
-
 
388
			if ( evt.preventDefault )
-
 
389
				evt.preventDefault() ;
163
		eTabsRow.style.display = '' ;
390
			else
Line 164... Line 391...
164
 
391
				evt.returnValue = false ;
-
 
392
		},
165
		if ( ! window.dialogArguments.Editor.FCKBrowserInfo.IsIE )
393
 
-
 
394
		RegisterHandlers : function( w )
-
 
395
		{
-
 
396
			registeredWindows.push( w ) ;
-
 
397
		}
166
			window.onresize() ;
398
	}
167
	}
399
}() ;
168
 
-
 
169
	oTabs[ tabCode ] = oDiv ;
400
 
170
	oTabs[ tabCode ].Index = oTabs.length - 1 ;
401
// Selection related functions.
171
}
402
//(Became simple shortcuts after the fix for #1990)
172
 
-
 
173
function SetSelectedTab( tabCode )
403
var Selection =
174
{
404
{
175
	for ( var sCode in oTabs )
-
 
176
	{
-
 
177
		if ( sCode == tabCode )
-
 
178
			oTabs[sCode].className = 'PopupTabSelected' ;
405
	/**
179
		else
-
 
180
			oTabs[sCode].className = 'PopupTab' ;
406
	 * Ensures that the editing area contains an active selection. This is a
-
 
407
	 * requirement for IE, as it looses the selection when the focus moves to other
-
 
408
	 * frames.
181
	}
409
	 */
182
 
410
	EnsureSelection : function()
183
	if ( typeof( window.frames["frmMain"].OnDialogTabChange ) == 'function' )
-
 
184
		window.frames["frmMain"].OnDialogTabChange( tabCode ) ;
-
 
Line -... Line 411...
-
 
411
	{
-
 
412
		FCK.Selection.Restore() ;
-
 
413
	},
-
 
414
 
-
 
415
	/**
-
 
416
	 * Get the FCKSelection object for the editor instance.
-
 
417
	 */
-
 
418
	GetSelection : function()
-
 
419
	{
-
 
420
		return FCK.Selection ;
-
 
421
	},
-
 
422
 
-
 
423
	/**
-
 
424
	 * Get the selected element in the editing area (for object selections).
-
 
425
	 */
-
 
426
	GetSelectedElement : function()
-
 
427
	{
-
 
428
		return FCK.Selection.GetSelectedElement() ;
-
 
429
	}
-
 
430
}
-
 
431
 
-
 
432
// Tab related functions.
-
 
433
var Tabs = function()
-
 
434
{
-
 
435
	// Only element ids should be stored here instead of element references since setSelectedTab and TabDiv_OnClick
-
 
436
	// would build circular references with the element references inside and cause memory leaks in IE6.
-
 
437
	var oTabs = new Object() ;
-
 
438
 
-
 
439
	var setSelectedTab = function( tabCode )
-
 
440
	{
-
 
441
		for ( var sCode in oTabs )
-
 
442
		{
-
 
443
			if ( sCode == tabCode )
-
 
444
				$( oTabs[sCode] ).className = 'PopupTabSelected' ;
-
 
445
			else
-
 
446
				$( oTabs[sCode] ).className = 'PopupTab' ;
-
 
447
		}
-
 
448
 
-
 
449
		if ( typeof( window.frames["frmMain"].OnDialogTabChange ) == 'function' )
-
 
450
			window.frames["frmMain"].OnDialogTabChange( tabCode ) ;
-
 
451
	}
-
 
452
 
-
 
453
	function TabDiv_OnClick()
185
}
454
	{
-
 
455
		setSelectedTab( this.TabCode ) ;
-
 
456
	}
-
 
457
 
-
 
458
	window.AddTab = function( tabCode, tabText, startHidden )
-
 
459
	{
-
 
460
		if ( typeof( oTabs[ tabCode ] ) != 'undefined' )
-
 
461
			return ;
-
 
462
 
-
 
463
		var eTabsRow = $( 'Tabs' ) ;
-
 
464
 
-
 
465
		var oCell = eTabsRow.insertCell(  eTabsRow.cells.length - 1 ) ;
-
 
466
		oCell.noWrap = true ;
-
 
467
 
-
 
468
		var oDiv = document.createElement( 'DIV' ) ;
-
 
469
		oDiv.className = 'PopupTab' ;
-
 
470
		oDiv.innerHTML = tabText ;
-
 
471
		oDiv.TabCode = tabCode ;
-
 
472
		oDiv.onclick = TabDiv_OnClick ;
-
 
473
		oDiv.id = Math.random() ;
-
 
474
 
-
 
475
		if ( startHidden )
-
 
476
			oDiv.style.display = 'none' ;
-
 
477
 
-
 
478
		eTabsRow = $( 'TabsRow' ) ;
-
 
479
 
-
 
480
		oCell.appendChild( oDiv ) ;
-
 
481
 
-
 
482
		if ( eTabsRow.style.display == 'none' )
-
 
483
		{
-
 
484
			var eTitleArea = $( 'TitleArea' ) ;
-
 
485
			eTitleArea.className = 'PopupTitle' ;
-
 
486
 
-
 
487
			oDiv.className = 'PopupTabSelected' ;
-
 
488
			eTabsRow.style.display = '' ;
-
 
489
 
-
 
490
			if ( window.onresize )
-
 
491
				window.onresize() ;
-
 
492
		}
186
 
493
 
-
 
494
		oTabs[ tabCode ] = oDiv.id ;
-
 
495
 
-
 
496
		FCKTools.DisableSelection( oDiv ) ;
-
 
497
	} ;
-
 
498
 
-
 
499
	window.SetSelectedTab = setSelectedTab ;
-
 
500
 
-
 
501
	window.SetTabVisibility = function( tabCode, isVisible )
187
function SetTabVisibility( tabCode, isVisible )
502
	{
-
 
503
		var oTab = $( oTabs[ tabCode ] ) ;
-
 
504
		oTab.style.display = isVisible ? '' : 'none' ;
-
 
505
 
-
 
506
		if ( ! isVisible && oTab.className == 'PopupTabSelected' )
-
 
507
		{
-
 
508
			for ( var sCode in oTabs )
-
 
509
			{
-
 
510
				if ( $( oTabs[sCode] ).style.display != 'none' )
-
 
511
				{
-
 
512
					setSelectedTab( sCode ) ;
-
 
513
					break ;
-
 
514
				}
Line 188... Line -...
188
{
-
 
189
	var oTab = oTabs[ tabCode ] ;
515
			}
190
	oTab.style.display = isVisible ? '' : 'none' ;
516
		}
191
 
517
	} ;
192
	if ( ! isVisible && oTab.className == 'PopupTabSelected' )
518
}() ;
193
	{
519
 
194
		for ( var sCode in oTabs )
520
// readystatechange handler for registering drag and drop handlers in cover
195
		{
-
 
196
			if ( oTabs[sCode].style.display != 'none' )
-
 
197
			{
-
 
Line 198... Line -...
198
				SetSelectedTab( sCode ) ;
-
 
199
				break ;
-
 
200
			}
521
// iframes, defined out here to avoid memory leak.
201
		}
522
// Do NOT put this function as a private function as it will induce memory leak
202
	}
523
// in IE and it's not detectable with Drip or sIEve and undetectable leaks are
-
 
524
// really nasty (sigh).
Line 203... Line 525...
203
}
525
var onReadyRegister = function()
204
 
526
{
Line -... Line 527...
-
 
527
	if ( this.readyState != 'complete' )
-
 
528
		return ;
-
 
529
	DragAndDrop.RegisterHandlers( this.contentWindow ) ;
-
 
530
} ;
205
function SetOnKeyDown( targetDocument )
531
 
Line 206... Line 532...
206
{
532
// The business logic of the dialog, dealing with operational things like
207
	targetDocument.onkeydown = function ( e )
533
// dialog open/dialog close/enable/disable/etc.
Line 208... Line 534...
208
	{
534
(function()
209
		e = e || event || this.parentWindow.event ;
-
 
210
		switch ( e.keyCode )
-
 
Line -... Line 535...
-
 
535
{
-
 
536
	var setOnKeyDown = function( targetDocument )
-
 
537
	{
-
 
538
		targetDocument.onkeydown = function ( e )
-
 
539
		{
-
 
540
			e = e || event || this.parentWindow.event ;
-
 
541
			switch ( e.keyCode )
-
 
542
			{
-
 
543
				case 13 :		// ENTER
-
 
544
					var oTarget = e.srcElement || e.target ;
-
 
545
					if ( oTarget.tagName == 'TEXTAREA' )
-
 
546
						return true ;
-
 
547
					Ok() ;
-
 
548
					return false ;
-
 
549
 
-
 
550
				case 27 :		// ESC
-
 
551
					Cancel() ;
-
 
552
					return false ;
-
 
553
			}
-
 
554
			return true ;
-
 
555
		}
-
 
556
	} ;
-
 
557
 
-
 
558
	var contextMenuBlocker = function( e )
-
 
559
	{
-
 
560
		var sTagName = e.target.tagName ;
-
 
561
		if ( ! ( ( sTagName == "INPUT" && e.target.type == "text" ) || sTagName == "TEXTAREA" ) )
-
 
562
			e.preventDefault() ;
-
 
563
	} ;
-
 
564
 
-
 
565
	var disableContextMenu = function( targetDocument )
-
 
566
	{
-
 
567
		if ( FCKBrowserInfo.IsIE )
-
 
568
			return ;
-
 
569
 
-
 
570
		targetDocument.addEventListener( 'contextmenu', contextMenuBlocker, true ) ;
-
 
571
	} ;
211
		{
572
 
-
 
573
	// Program entry point.
-
 
574
	window.Init = function()
-
 
575
	{
-
 
576
		// Start the throbber timer.
-
 
577
		Throbber.Show( 1000 ) ;
-
 
578
 
-
 
579
		Sizer.RefreshContainerSize() ;
-
 
580
		LoadInnerDialog() ;
-
 
581
 
-
 
582
		FCKTools.DisableSelection( document.body ) ;
-
 
583
 
-
 
584
		// Make the title area draggable.
212
			case 13 :		// ENTER
585
		var titleElement = $( 'header' ) ;
213
				var oTarget = e.srcElement || e.target ;
586
		titleElement.onmousedown = DragAndDrop.MouseDownHandler ;
214
				if ( oTarget.tagName == 'TEXTAREA' ) return ;
587
 
215
				Ok() ;
588
		// Connect mousemove and mouseup events from dialog frame and outer window to dialog dragging logic.
216
				return false ;
589
		DragAndDrop.RegisterHandlers( window ) ;
Line 217... Line 590...
217
			case 27 :		// ESC
590
		DragAndDrop.RegisterHandlers( Args().TopWindow ) ;
218
				Cancel() ;
-
 
219
				return false ;
591
 
220
				break ;
-
 
Line -... Line 592...
-
 
592
		// Disable the previous dialog if it exists.
-
 
593
		if ( ParentDialog() )
-
 
594
		{
-
 
595
			ParentDialog().contentWindow.SetEnabled( false ) ;
-
 
596
			if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
-
 
597
			{
-
 
598
				var currentParent = ParentDialog() ;
-
 
599
				while ( currentParent )
-
 
600
				{
-
 
601
					var blockerFrame = currentParent.contentWindow.$( 'blocker' ) ;
-
 
602
					if ( blockerFrame.readyState == 'complete' )
-
 
603
						DragAndDrop.RegisterHandlers( blockerFrame.contentWindow ) ;
-
 
604
					else
-
 
605
						blockerFrame.onreadystatechange = onReadyRegister ;
-
 
606
					currentParent = ParentDialog( currentParent ) ;
-
 
607
				}
-
 
608
			}
-
 
609
			else
-
 
610
			{
-
 
611
				var currentParent = ParentDialog() ;
-
 
612
				while ( currentParent )
-
 
613
				{
-
 
614
					DragAndDrop.RegisterHandlers( currentParent.contentWindow ) ;
-
 
615
					currentParent = ParentDialog( currentParent ) ;
-
 
616
				}
-
 
617
			}
-
 
618
		}
-
 
619
 
-
 
620
		// If this is the only dialog on screen, enable the background cover.
-
 
621
		if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
-
 
622
		{
-
 
623
			var blockerFrame = FCKDialog.GetCover().firstChild ;
221
		}
624
			if ( blockerFrame.readyState == 'complete' )
-
 
625
				DragAndDrop.RegisterHandlers( blockerFrame.contentWindow ) ;
-
 
626
			else
-
 
627
				blockerFrame.onreadystatechange = onReadyRegister;
-
 
628
		}
-
 
629
 
-
 
630
		// Add Enter/Esc hotkeys and disable context menu for the dialog.
-
 
631
		setOnKeyDown( document ) ;
-
 
632
		disableContextMenu( document ) ;
-
 
633
	} ;
-
 
634
 
-
 
635
	window.LoadInnerDialog = function()
-
 
636
	{
-
 
637
		if ( window.onresize )
-
 
638
			window.onresize() ;
-
 
639
 
-
 
640
		// First of all, translate the dialog box contents.
-
 
641
		E.FCKLanguageManager.TranslatePage( document ) ;
-
 
642
 
-
 
643
		// Create the IFRAME that holds the dialog contents.
-
 
644
		$( 'innerContents' ).innerHTML = '<iframe id="frmMain" src="' + Args().Page + '" name="frmMain" frameborder="0" width="100%" height="100%" scrolling="auto" style="visibility: hidden;" allowtransparency="true"><\/iframe>' ;
-
 
645
	} ;
-
 
646
 
222
		return true ;
647
	window.InnerDialogLoaded = function()
-
 
648
	{
-
 
649
		// If the dialog has been closed before the iframe is loaded, do nothing.
-
 
650
		if ( !frameElement.parentNode )
-
 
651
			return null ;
223
	}
652
 
-
 
653
		Throbber.Hide() ;
-
 
654
 
-
 
655
		var frmMain = $('frmMain') ;
-
 
656
		var innerWindow = frmMain.contentWindow ;
-
 
657
		var innerDoc = innerWindow.document ;
-
 
658
 
-
 
659
		// Show the loaded iframe.
224
}
660
		frmMain.style.visibility = '' ;
-
 
661
 
-
 
662
		// Set the language direction.
-
 
663
		innerDoc.documentElement.dir = langDir ;
-
 
664
 
-
 
665
		// Sets the Skin CSS.
-
 
666
		innerDoc.write( FCKTools.GetStyleHtml( FCKConfig.SkinDialogCSS ) ) ;
-
 
667
 
-
 
668
		setOnKeyDown( innerDoc ) ;
-
 
669
		disableContextMenu( innerDoc ) ;
-
 
670
 
-
 
671
		Sizer.RefreshContainerSize();
-
 
672
 
Line 225... Line 673...
225
SetOnKeyDown( document ) ;
673
		DragAndDrop.RegisterHandlers( innerWindow ) ;
226
 
-
 
-
 
674
 
Line -... Line 675...
-
 
675
		innerWindow.focus() ;
-
 
676
 
-
 
677
		return E ;
-
 
678
	} ;
-
 
679
 
-
 
680
	window.SetOkButton = function( showIt )
-
 
681
	{
-
 
682
		$('btnOk').style.visibility = ( showIt ? '' : 'hidden' ) ;
-
 
683
	} ;
-
 
684
 
-
 
685
	window.Ok = function()
-
 
686
	{
-
 
687
		Selection.EnsureSelection() ;
-
 
688
 
-
 
689
		var frmMain = window.frames["frmMain"] ;
-
 
690
 
-
 
691
		if ( frmMain.Ok && frmMain.Ok() )
-
 
692
			CloseDialog() ;
-
 
693
		else
-
 
694
			frmMain.focus() ;
-
 
695
	} ;
-
 
696
 
-
 
697
	window.Cancel = function( dontFireChange )
-
 
698
	{
-
 
699
		Selection.EnsureSelection() ;
-
 
700
		return CloseDialog( dontFireChange ) ;
-
 
701
	} ;
227
function DisableContextMenu( targetDocument )
702
 
228
{
703
	window.CloseDialog = function( dontFireChange )
229
	if ( window.dialogArguments.Editor.FCKBrowserInfo.IsIE ) return ;
704
	{
230
 
705
		Throbber.Hide() ;
231
	// Disable Right-Click
706
 
232
	var oOnContextMenu = function( e )
707
		// Points the src to a non-existent location to avoid loading errors later, in case the dialog
233
	{
708
		// haven't been completed loaded at this point.
-
 
709
		if ( $( 'frmMain' ) )
234
		var sTagName = e.target.tagName ;
710
			$( 'frmMain' ).src = FCKTools.GetVoidUrl() ;
-
 
711
 
235
		if ( ! ( ( sTagName == "INPUT" && e.target.type == "text" ) || sTagName == "TEXTAREA" ) )
712
		if ( !dontFireChange && !FCK.EditMode )
236
			e.preventDefault() ;
713
		{
237
	}
714
			// All dialog windows, by default, will fire the "OnSelectionChange"
238
	targetDocument.addEventListener( 'contextmenu', oOnContextMenu, true ) ;
715
			// event, no matter the Ok or Cancel button has been pressed.
239
}
-
 
240
DisableContextMenu( document ) ;
716
			// It seems that OnSelectionChange may enter on a concurrency state
241
 
717
			// on some situations (#1965), so we should put the event firing in
242
if ( ! window.dialogArguments.Editor.FCKBrowserInfo.IsIE )
718
			// the execution queue instead of executing it immediately.
243
{
719
			setTimeout( function()
244
	window.onresize = function()
720
				{
245
	{
721
					FCK.Events.FireEvent( 'OnSelectionChange' ) ;
246
		var oFrame = document.getElementById("frmMain") ;
722
				}, 0 ) ;
247
 
723
		}
248
		if ( ! oFrame )
-
 
249
		return ;
724
 
250
 
-
 
251
		oFrame.height = 0 ;
-
 
252
 
-
 
253
		var oCell = document.getElementById("FrameCell") ;
-
 
254
		var iHeight = oCell.offsetHeight ;
-
 
255
 
725
		FCKDialog.OnDialogClose( window ) ;
256
		oFrame.height = iHeight - 2 ;
726
	} ;
257
	}
727
 
258
}
728
	window.SetEnabled = function( isEnabled )
259
 
729
	{
260
if ( window.dialogArguments.Editor.FCKBrowserInfo.IsIE )
730
		var cover = $( 'cover' ) ;
-
 
731
		cover.style.display = isEnabled ? 'none' : '' ;
261
{
732
 
262
	function Window_OnBeforeUnload()
733
		if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
263
	{
734
		{
264
		for ( var t in oTabs )
735
			if ( !isEnabled )
265
			oTabs[t] = null ;
736
			{
266
 
737
				// Inser the blocker IFRAME before the cover.
-
 
738
				var blocker = document.createElement( 'iframe' ) ;
-
 
739
				blocker.src = FCKTools.GetVoidUrl() ;
-
 
740
				blocker.hideFocus = true ;
-
 
741
				blocker.frameBorder = 0 ;
-
 
742
				blocker.id = blocker.className = 'blocker' ;
-
 
743
				cover.appendChild( blocker ) ;
-
 
744
			}
-
 
745
			else
-
 
746
			{
-
 
747
				var blocker = $( 'blocker' ) ;
-
 
748
				if ( blocker && blocker.parentNode )
-
 
749
					blocker.parentNode.removeChild( blocker ) ;
-
 
750
			}
-
 
751
		}
-
 
752
	} ;
-
 
753
})() ;
-
 
754
// ]]>
-
 
755
		</script>
-
 
756
	</head>
267
		window.dialogArguments.Editor = null ;
757
	<body onload="Init();" class="PopupBody">
268
	}
758
		<div class="contents" id="contents">
269
	window.attachEvent( "onbeforeunload", Window_OnBeforeUnload ) ;
-
 
270
}
759
			<div id="header">
-
 
760
				<div id="TitleArea" class="PopupTitle PopupTitleBorder">