CommunityID/fckeditor/editor/_source/internals/fckdialog.js

240 lines
7.1 KiB
JavaScript

/*
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
* Copyright (C) 2003-2009 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( true ) ;
// 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 ;
}
} ;
} )() ;