fckdialog.js
239 lines
| 7.1 KiB
| application/javascript
|
JavascriptLexer
|
r0 | /* | ||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net | ||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben | ||||
* | ||||
* == BEGIN LICENSE == | ||||
* | ||||
* Licensed under the terms of any of the following licenses at your | ||||
* choice: | ||||
* | ||||
* - GNU General Public License Version 2 or later (the "GPL") | ||||
* http://www.gnu.org/licenses/gpl.html | ||||
* | ||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL") | ||||
* http://www.gnu.org/licenses/lgpl.html | ||||
* | ||||
* - Mozilla Public License Version 1.1 or later (the "MPL") | ||||
* http://www.mozilla.org/MPL/MPL-1.1.html | ||||
* | ||||
* == END LICENSE == | ||||
* | ||||
* Dialog windows operations. | ||||
*/ | ||||
var FCKDialog = ( function() | ||||
{ | ||||
var topDialog ; | ||||
var baseZIndex ; | ||||
var cover ; | ||||
// The document that holds the dialog. | ||||
var topWindow = window.parent ; | ||||
while ( topWindow.parent && topWindow.parent != topWindow ) | ||||
{ | ||||
try | ||||
{ | ||||
if ( topWindow.parent.document.domain != document.domain ) | ||||
break ; | ||||
if ( topWindow.parent.document.getElementsByTagName( 'frameset' ).length > 0 ) | ||||
break ; | ||||
} | ||||
catch ( e ) | ||||
{ | ||||
break ; | ||||
} | ||||
topWindow = topWindow.parent ; | ||||
} | ||||
var topDocument = topWindow.document ; | ||||
var getZIndex = function() | ||||
{ | ||||
if ( !baseZIndex ) | ||||
baseZIndex = FCKConfig.FloatingPanelsZIndex + 999 ; | ||||
return ++baseZIndex ; | ||||
} | ||||
// TODO : This logic is not actually working when reducing the window, only | ||||
// when enlarging it. | ||||
var resizeHandler = function() | ||||
{ | ||||
if ( !cover ) | ||||
return ; | ||||
var relElement = FCKTools.IsStrictMode( topDocument ) ? topDocument.documentElement : topDocument.body ; | ||||
FCKDomTools.SetElementStyles( cover, | ||||
{ | ||||
'width' : Math.max( relElement.scrollWidth, | ||||
relElement.clientWidth, | ||||
topDocument.scrollWidth || 0 ) - 1 + 'px', | ||||
'height' : Math.max( relElement.scrollHeight, | ||||
relElement.clientHeight, | ||||
topDocument.scrollHeight || 0 ) - 1 + 'px' | ||||
} ) ; | ||||
} | ||||
return { | ||||
/** | ||||
* Opens a dialog window using the standard dialog template. | ||||
*/ | ||||
OpenDialog : function( dialogName, dialogTitle, dialogPage, width, height, customValue, parentWindow, resizable ) | ||||
{ | ||||
if ( !topDialog ) | ||||
this.DisplayMainCover() ; | ||||
// Setup the dialog info to be passed to the dialog. | ||||
var dialogInfo = | ||||
{ | ||||
Title : dialogTitle, | ||||
Page : dialogPage, | ||||
Editor : window, | ||||
CustomValue : customValue, // Optional | ||||
TopWindow : topWindow | ||||
} | ||||
FCK.ToolbarSet.CurrentInstance.Selection.Save() ; | ||||
// Calculate the dialog position, centering it on the screen. | ||||
var viewSize = FCKTools.GetViewPaneSize( topWindow ) ; | ||||
var scrollPosition = { 'X' : 0, 'Y' : 0 } ; | ||||
var useAbsolutePosition = FCKBrowserInfo.IsIE && ( !FCKBrowserInfo.IsIE7 || !FCKTools.IsStrictMode( topWindow.document ) ) ; | ||||
if ( useAbsolutePosition ) | ||||
scrollPosition = FCKTools.GetScrollPosition( topWindow ) ; | ||||
var iTop = Math.max( scrollPosition.Y + ( viewSize.Height - height - 20 ) / 2, 0 ) ; | ||||
var iLeft = Math.max( scrollPosition.X + ( viewSize.Width - width - 20 ) / 2, 0 ) ; | ||||
// Setup the IFRAME that will hold the dialog. | ||||
var dialog = topDocument.createElement( 'iframe' ) ; | ||||
FCKTools.ResetStyles( dialog ) ; | ||||
dialog.src = FCKConfig.BasePath + 'fckdialog.html' ; | ||||
// Dummy URL for testing whether the code in fckdialog.js alone leaks memory. | ||||
// dialog.src = 'about:blank'; | ||||
dialog.frameBorder = 0 ; | ||||
dialog.allowTransparency = true ; | ||||
FCKDomTools.SetElementStyles( dialog, | ||||
{ | ||||
'position' : ( useAbsolutePosition ) ? 'absolute' : 'fixed', | ||||
'top' : iTop + 'px', | ||||
'left' : iLeft + 'px', | ||||
'width' : width + 'px', | ||||
'height' : height + 'px', | ||||
'zIndex' : getZIndex() | ||||
} ) ; | ||||
// Save the dialog info to be used by the dialog page once loaded. | ||||
dialog._DialogArguments = dialogInfo ; | ||||
// Append the IFRAME to the target document. | ||||
topDocument.body.appendChild( dialog ) ; | ||||
// Keep record of the dialog's parent/child relationships. | ||||
dialog._ParentDialog = topDialog ; | ||||
topDialog = dialog ; | ||||
}, | ||||
/** | ||||
* (For internal use) | ||||
* Called when the top dialog is closed. | ||||
*/ | ||||
OnDialogClose : function( dialogWindow ) | ||||
{ | ||||
var dialog = dialogWindow.frameElement ; | ||||
FCKDomTools.RemoveNode( dialog ) ; | ||||
if ( dialog._ParentDialog ) // Nested Dialog. | ||||
{ | ||||
topDialog = dialog._ParentDialog ; | ||||
dialog._ParentDialog.contentWindow.SetEnabled( true ) ; | ||||
} | ||||
else // First Dialog. | ||||
{ | ||||
// Set the Focus in the browser, so the "OnBlur" event is not | ||||
// fired. In IE, there is no need to do that because the dialog | ||||
// already moved the selection to the editing area before | ||||
// closing (EnsureSelection). Also, the Focus() call here | ||||
// causes memory leak on IE7 (weird). | ||||
if ( !FCKBrowserInfo.IsIE ) | ||||
FCK.Focus() ; | ||||
this.HideMainCover() ; | ||||
// Bug #1918: Assigning topDialog = null directly causes IE6 to crash. | ||||
setTimeout( function(){ topDialog = null ; }, 0 ) ; | ||||
// Release the previously saved selection. | ||||
FCK.ToolbarSet.CurrentInstance.Selection.Release() ; | ||||
} | ||||
}, | ||||
DisplayMainCover : function() | ||||
{ | ||||
// Setup the DIV that will be used to cover. | ||||
cover = topDocument.createElement( 'div' ) ; | ||||
FCKTools.ResetStyles( cover ) ; | ||||
FCKDomTools.SetElementStyles( cover, | ||||
{ | ||||
'position' : 'absolute', | ||||
'zIndex' : getZIndex(), | ||||
'top' : '0px', | ||||
'left' : '0px', | ||||
'backgroundColor' : FCKConfig.BackgroundBlockerColor | ||||
} ) ; | ||||
FCKDomTools.SetOpacity( cover, FCKConfig.BackgroundBlockerOpacity ) ; | ||||
// For IE6-, we need to fill the cover with a transparent IFRAME, | ||||
// to properly block <select> fields. | ||||
if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 ) | ||||
{ | ||||
var iframe = topDocument.createElement( 'iframe' ) ; | ||||
FCKTools.ResetStyles( iframe ) ; | ||||
iframe.hideFocus = true ; | ||||
iframe.frameBorder = 0 ; | ||||
iframe.src = FCKTools.GetVoidUrl() ; | ||||
FCKDomTools.SetElementStyles( iframe, | ||||
{ | ||||
'width' : '100%', | ||||
'height' : '100%', | ||||
'position' : 'absolute', | ||||
'left' : '0px', | ||||
'top' : '0px', | ||||
'filter' : 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)' | ||||
} ) ; | ||||
cover.appendChild( iframe ) ; | ||||
} | ||||
// We need to manually adjust the cover size on resize. | ||||
FCKTools.AddEventListener( topWindow, 'resize', resizeHandler ) ; | ||||
resizeHandler() ; | ||||
topDocument.body.appendChild( cover ) ; | ||||
FCKFocusManager.Lock() ; | ||||
// Prevent the user from refocusing the disabled | ||||
// editing window by pressing Tab. (Bug #2065) | ||||
var el = FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'frameElement' ) ; | ||||
el._fck_originalTabIndex = el.tabIndex ; | ||||
el.tabIndex = -1 ; | ||||
}, | ||||
HideMainCover : function() | ||||
{ | ||||
FCKDomTools.RemoveNode( cover ) ; | ||||
FCKFocusManager.Unlock() ; | ||||
// Revert the tab index hack. (Bug #2065) | ||||
var el = FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'frameElement' ) ; | ||||
el.tabIndex = el._fck_originalTabIndex ; | ||||
FCKDomTools.ClearElementJSProperty( el, '_fck_originalTabIndex' ) ; | ||||
}, | ||||
GetCover : function() | ||||
{ | ||||
return cover ; | ||||
} | ||||
} ; | ||||
} )() ; | ||||