fckdialog.js
上传用户:dbstep
上传日期:2022-08-06
资源大小:2803k
文件大小:7k
- /*
- * 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 ;
- }
- } ;
- } )() ;