Rev 1987 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--* 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 ==** This page is used by all dialog box as the container.--><html xmlns="http://www.w3.org/1999/xhtml"><head><title></title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="robots" content="noindex, nofollow" /><script type="text/javascript">// <![CDATA[// Domain relaxation logic.(function(){var d = document.domain ;while ( true ){// Test if we can access a parent property.try{var parentDomain = ( Args().TopWindow || E ).document.domain ;if ( document.domain != parentDomain )document.domain = parentDomain ;break ;}catch( e ) {}// Remove a domain part: www.mytest.example.com => mytest.example.com => example.com ...d = d.replace( /.*?(?:\.|$)/, '' ) ;if ( d.length == 0 )break ; // It was not able to detect the domain.document.domain = d ;}})() ;var E = frameElement._DialogArguments.Editor ;// It seems referencing to frameElement._DialogArguments directly would lead to memory leaks in IE.// So let's use functions to access its members instead.function Args(){return frameElement._DialogArguments ;}function ParentDialog( dialog ){return dialog ? dialog._ParentDialog : frameElement._ParentDialog ;}var FCK = E.FCK ;var FCKTools = E.FCKTools ;var FCKDomTools = E.FCKDomTools ;var FCKDialog = E.FCKDialog ;var FCKBrowserInfo = E.FCKBrowserInfo ;var FCKConfig = E.FCKConfig ;// Steal the focus so that the caret would no longer stay in the editor iframe.window.focus() ;// Sets the Skin CSSdocument.write( FCKTools.GetStyleHtml( FCKConfig.SkinDialogCSS ) ) ;// Sets the language direction.var langDir = document.documentElement.dir = E.FCKLang.Dir ;// For IE6-, the fck_dialog_ie6.js is loaded, used to fix limitations in the browser.if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )document.write( '<' + 'script type="text/javascript" src="' + FCKConfig.SkinPath + 'fck_dialog_ie6.js"><' + '\/script>' ) ;FCKTools.RegisterDollarFunction( window ) ;// Resize related functions.var Sizer = function(){var bAutoSize = false ;var retval = {// Sets whether the dialog should auto-resize according to its content's height.SetAutoSize : function( autoSize ){bAutoSize = autoSize ;this.RefreshSize() ;},// Fit the dialog container's layout to the inner iframe's external size.RefreshContainerSize : function(){var frmMain = $( 'frmMain' ) ;if ( frmMain ){// Get the container size.var height = $( 'contents' ).offsetHeight ;// Subtract the size of other elements.height -= $( 'TitleArea' ).offsetHeight ;height -= $( 'TabsRow' ).offsetHeight ;height -= $( 'PopupButtons' ).offsetHeight ;frmMain.style.height = Math.max( height, 0 ) + 'px' ;}},// Resize and re-layout the dialog.// Triggers the onresize event for the layout logic.ResizeDialog : function( width, height ){FCKDomTools.SetElementStyles( window.frameElement,{'width' : width + 'px','height' : height + 'px'} ) ;// If the skin have defined a function for resize fixes, call it now.if ( typeof window.DoResizeFixes == 'function' )window.DoResizeFixes() ;},// if bAutoSize is true, automatically fit the dialog size and layout to// accomodate the inner iframe's internal height.// if bAutoSize is false, then only the layout logic for the dialog decorations// is run to accomodate the inner iframe's external height.RefreshSize : function(){if ( bAutoSize ){var frmMain = $( 'frmMain' ) ;var innerDoc = frmMain.contentWindow.document ;var isStrict = FCKTools.IsStrictMode( innerDoc ) ;// Get the size of the frame contents.var innerWidth = isStrict ? innerDoc.documentElement.scrollWidth : innerDoc.body.scrollWidth ;var innerHeight = isStrict ? innerDoc.documentElement.scrollHeight : innerDoc.body.scrollHeight ;// Get the current frame size.var frameSize = FCKTools.GetViewPaneSize( frmMain.contentWindow ) ;var deltaWidth = innerWidth - frameSize.Width ;var deltaHeight = innerHeight - frameSize.Height ;// If the contents fits the current size.if ( deltaWidth <= 0 && deltaHeight <= 0 )return ;var dialogWidth = frameElement.offsetWidth + Math.max( deltaWidth, 0 ) ;var dialogHeight = frameElement.offsetHeight + Math.max( deltaHeight, 0 ) ;this.ResizeDialog( dialogWidth, dialogHeight ) ;}this.RefreshContainerSize() ;}}/*** Safari seems to have a bug with the time when RefreshSize() is executed - it* thinks frmMain's innerHeight is 0 if we query the value too soon after the* page is loaded in some circumstances. (#1316)* TODO : Maybe this is not needed anymore after #35.*/if ( FCKBrowserInfo.IsSafari ){var originalRefreshSize = retval.RefreshSize ;retval.RefreshSize = function(){FCKTools.SetTimeout( originalRefreshSize, 1, retval ) ;}}/*** IE6 has a similar bug where it sometimes thinks $('contents') has an* offsetHeight of 0 (#2114).*/if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 ){var originalRefreshContainerSize = retval.RefreshContainerSize ;retval.RefreshContainerSize = function(){FCKTools.SetTimeout( originalRefreshContainerSize, 1, retval ) ;}}window.onresize = function(){retval.RefreshContainerSize() ;}window.SetAutoSize = FCKTools.Bind( retval, retval.SetAutoSize ) ;return retval ;}() ;// Manages the throbber image that appears if the inner part of dialog is taking too long to load.var Throbber = function(){var timer ;var updateThrobber = function(){var throbberParent = $( 'throbberBlock' ) ;var throbberBlocks = throbberParent.childNodes ;var lastClass = throbberParent.lastChild.className ;// From the last to the second one, copy the class from the previous one.for ( var i = throbberBlocks.length - 1 ; i > 0 ; i-- )throbberBlocks[i].className = throbberBlocks[i-1].className ;// For the first one, copy the last class (rotation).throbberBlocks[0].className = lastClass ;}return {Show : function( waitMilliseconds ){// Auto-setup the Show function to be called again after the// requested amount of time.if ( waitMilliseconds && waitMilliseconds > 0 ){timer = FCKTools.SetTimeout( this.Show, waitMilliseconds, this, null, window ) ;return ;}var throbberParent = $( 'throbberBlock' ) ;if (throbberParent.childNodes.length == 0){// Create the throbber blocks.var classIds = [ 1,2,3,4,5,4,3,2 ] ;while ( classIds.length > 0 )throbberParent.appendChild( document.createElement( 'div' ) ).className = ' throbber_' + classIds.shift() ;}// Center the throbber.var frm = $( 'contents' ) ;var frmCoords = FCKTools.GetDocumentPosition( window, frm ) ;var x = frmCoords.x + ( frm.offsetWidth - throbberParent.offsetWidth ) / 2 ;var y = frmCoords.y + ( frm.offsetHeight - throbberParent.offsetHeight ) / 2 ;throbberParent.style.left = parseInt( x, 10 ) + 'px' ;throbberParent.style.top = parseInt( y, 10 ) + 'px' ;// Show it.throbberParent.style.visibility = '' ;// Hide tabs and buttons:$( 'Tabs' ).style.visibility = 'hidden' ;$( 'PopupButtons' ).style.visibility = 'hidden' ;// Setup the animation interval.timer = setInterval( updateThrobber, 100 ) ;},Hide : function(){if ( timer ){clearInterval( timer ) ;timer = null ;}$( 'throbberBlock' ).style.visibility = 'hidden' ;// Show tabs and buttons:$( 'Tabs' ).style.visibility = '' ;$( 'PopupButtons' ).style.visibility = '' ;}} ;}() ;// Drag and drop handlers.var DragAndDrop = function(){var registeredWindows = [] ;var lastCoords ;var currentPos ;var cleanUpHandlers = function(){for ( var i = 0 ; i < registeredWindows.length ; i++ ){FCKTools.RemoveEventListener( registeredWindows[i].document, 'mousemove', dragMouseMoveHandler ) ;FCKTools.RemoveEventListener( registeredWindows[i].document, 'mouseup', dragMouseUpHandler ) ;}}var dragMouseMoveHandler = function( evt ){if ( !lastCoords )return ;if ( !evt )evt = FCKTools.GetElementDocument( this ).parentWindow.event ;// Updated the last coordinates.var currentCoords ={x : evt.screenX,y : evt.screenY} ;currentPos ={x : currentPos.x + ( currentCoords.x - lastCoords.x ),y : currentPos.y + ( currentCoords.y - lastCoords.y )} ;lastCoords = currentCoords ;frameElement.style.left = currentPos.x + 'px' ;frameElement.style.top = currentPos.y + 'px' ;if ( evt.preventDefault )evt.preventDefault() ;elseevt.returnValue = false ;}var dragMouseUpHandler = function( evt ){if ( !lastCoords )return ;if ( !evt )evt = FCKTools.GetElementDocument( this ).parentWindow.event ;cleanUpHandlers() ;lastCoords = null ;}return {MouseDownHandler : function( evt ){var view = null ;if ( !evt ){view = FCKTools.GetElementDocument( this ).parentWindow ;evt = view.event ;}elseview = evt.view ;var target = evt.srcElement || evt.target ;if ( target.id == 'closeButton' || target.className == 'PopupTab' || target.className == 'PopupTabSelected' )return ;lastCoords ={x : evt.screenX,y : evt.screenY} ;// Save the current IFRAME position.currentPos ={x : parseInt( FCKDomTools.GetCurrentElementStyle( frameElement, 'left' ), 10 ),y : parseInt( FCKDomTools.GetCurrentElementStyle( frameElement, 'top' ), 10 )} ;for ( var i = 0 ; i < registeredWindows.length ; i++ ){FCKTools.AddEventListener( registeredWindows[i].document, 'mousemove', dragMouseMoveHandler ) ;FCKTools.AddEventListener( registeredWindows[i].document, 'mouseup', dragMouseUpHandler ) ;}if ( evt.preventDefault )evt.preventDefault() ;elseevt.returnValue = false ;},RegisterHandlers : function( w ){registeredWindows.push( w ) ;}}}() ;// Selection related functions.//(Became simple shortcuts after the fix for #1990)var Selection ={/*** Ensures that the editing area contains an active selection. This is a* requirement for IE, as it looses the selection when the focus moves to other* frames.*/EnsureSelection : function(){FCK.Selection.Restore() ;},/*** Get the FCKSelection object for the editor instance.*/GetSelection : function(){return FCK.Selection ;},/*** Get the selected element in the editing area (for object selections).*/GetSelectedElement : function(){return FCK.Selection.GetSelectedElement() ;}}// Tab related functions.var Tabs = function(){// Only element ids should be stored here instead of element references since setSelectedTab and TabDiv_OnClick// would build circular references with the element references inside and cause memory leaks in IE6.var oTabs = new Object() ;var setSelectedTab = function( tabCode ){for ( var sCode in oTabs ){if ( sCode == tabCode )$( oTabs[sCode] ).className = 'PopupTabSelected' ;else$( oTabs[sCode] ).className = 'PopupTab' ;}if ( typeof( window.frames["frmMain"].OnDialogTabChange ) == 'function' )window.frames["frmMain"].OnDialogTabChange( tabCode ) ;}function TabDiv_OnClick(){setSelectedTab( this.TabCode ) ;}window.AddTab = function( tabCode, tabText, startHidden ){if ( typeof( oTabs[ tabCode ] ) != 'undefined' )return ;var eTabsRow = $( 'Tabs' ) ;var oCell = eTabsRow.insertCell( eTabsRow.cells.length - 1 ) ;oCell.noWrap = true ;var oDiv = document.createElement( 'DIV' ) ;oDiv.className = 'PopupTab' ;oDiv.innerHTML = tabText ;oDiv.TabCode = tabCode ;oDiv.onclick = TabDiv_OnClick ;oDiv.id = Math.random() ;if ( startHidden )oDiv.style.display = 'none' ;eTabsRow = $( 'TabsRow' ) ;oCell.appendChild( oDiv ) ;if ( eTabsRow.style.display == 'none' ){var eTitleArea = $( 'TitleArea' ) ;eTitleArea.className = 'PopupTitle' ;oDiv.className = 'PopupTabSelected' ;eTabsRow.style.display = '' ;if ( window.onresize )window.onresize() ;}oTabs[ tabCode ] = oDiv.id ;FCKTools.DisableSelection( oDiv ) ;} ;window.SetSelectedTab = setSelectedTab ;window.SetTabVisibility = function( tabCode, isVisible ){var oTab = $( oTabs[ tabCode ] ) ;oTab.style.display = isVisible ? '' : 'none' ;if ( ! isVisible && oTab.className == 'PopupTabSelected' ){for ( var sCode in oTabs ){if ( $( oTabs[sCode] ).style.display != 'none' ){setSelectedTab( sCode ) ;break ;}}}} ;}() ;// readystatechange handler for registering drag and drop handlers in cover// iframes, defined out here to avoid memory leak.// Do NOT put this function as a private function as it will induce memory leak// in IE and it's not detectable with Drip or sIEve and undetectable leaks are// really nasty (sigh).var onReadyRegister = function(){if ( this.readyState != 'complete' )return ;DragAndDrop.RegisterHandlers( this.contentWindow ) ;} ;// The business logic of the dialog, dealing with operational things like// dialog open/dialog close/enable/disable/etc.(function(){var setOnKeyDown = function( targetDocument ){targetDocument.onkeydown = function ( e ){e = e || event || this.parentWindow.event ;switch ( e.keyCode ){case 13 : // ENTERvar oTarget = e.srcElement || e.target ;if ( oTarget.tagName == 'TEXTAREA' )return true ;Ok() ;return false ;case 27 : // ESCCancel() ;return false ;}return true ;}} ;var contextMenuBlocker = function( e ){var sTagName = e.target.tagName ;if ( ! ( ( sTagName == "INPUT" && e.target.type == "text" ) || sTagName == "TEXTAREA" ) )e.preventDefault() ;} ;var disableContextMenu = function( targetDocument ){if ( FCKBrowserInfo.IsIE )return ;targetDocument.addEventListener( 'contextmenu', contextMenuBlocker, true ) ;} ;// Program entry point.window.Init = function(){// Start the throbber timer.Throbber.Show( 1000 ) ;Sizer.RefreshContainerSize() ;LoadInnerDialog() ;FCKTools.DisableSelection( document.body ) ;// Make the title area draggable.var titleElement = $( 'header' ) ;titleElement.onmousedown = DragAndDrop.MouseDownHandler ;// Connect mousemove and mouseup events from dialog frame and outer window to dialog dragging logic.DragAndDrop.RegisterHandlers( window ) ;DragAndDrop.RegisterHandlers( Args().TopWindow ) ;// Disable the previous dialog if it exists.if ( ParentDialog() ){ParentDialog().contentWindow.SetEnabled( false ) ;if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 ){var currentParent = ParentDialog() ;while ( currentParent ){var blockerFrame = currentParent.contentWindow.$( 'blocker' ) ;if ( blockerFrame.readyState == 'complete' )DragAndDrop.RegisterHandlers( blockerFrame.contentWindow ) ;elseblockerFrame.onreadystatechange = onReadyRegister ;currentParent = ParentDialog( currentParent ) ;}}else{var currentParent = ParentDialog() ;while ( currentParent ){DragAndDrop.RegisterHandlers( currentParent.contentWindow ) ;currentParent = ParentDialog( currentParent ) ;}}}// If this is the only dialog on screen, enable the background cover.if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 ){var blockerFrame = FCKDialog.GetCover().firstChild ;if ( blockerFrame.readyState == 'complete' )DragAndDrop.RegisterHandlers( blockerFrame.contentWindow ) ;elseblockerFrame.onreadystatechange = onReadyRegister;}// Add Enter/Esc hotkeys and disable context menu for the dialog.setOnKeyDown( document ) ;disableContextMenu( document ) ;} ;window.LoadInnerDialog = function(){if ( window.onresize )window.onresize() ;// First of all, translate the dialog box contents.E.FCKLanguageManager.TranslatePage( document ) ;// Create the IFRAME that holds the dialog contents.$( 'innerContents' ).innerHTML = '<iframe id="frmMain" src="' + Args().Page + '" name="frmMain" frameborder="0" width="100%" height="100%" scrolling="auto" style="visibility: hidden;" allowtransparency="true"><\/iframe>' ;} ;window.InnerDialogLoaded = function(){// If the dialog has been closed before the iframe is loaded, do nothing.if ( !frameElement.parentNode )return null ;Throbber.Hide() ;var frmMain = $('frmMain') ;var innerWindow = frmMain.contentWindow ;var innerDoc = innerWindow.document ;// Show the loaded iframe.frmMain.style.visibility = '' ;// Set the language direction.innerDoc.documentElement.dir = langDir ;// Sets the Skin CSS.innerDoc.write( FCKTools.GetStyleHtml( FCKConfig.SkinDialogCSS ) ) ;setOnKeyDown( innerDoc ) ;disableContextMenu( innerDoc ) ;Sizer.RefreshContainerSize();DragAndDrop.RegisterHandlers( innerWindow ) ;innerWindow.focus() ;return E ;} ;window.SetOkButton = function( showIt ){$('btnOk').style.visibility = ( showIt ? '' : 'hidden' ) ;} ;window.Ok = function(){Selection.EnsureSelection() ;var frmMain = window.frames["frmMain"] ;if ( frmMain.Ok && frmMain.Ok() )CloseDialog() ;elsefrmMain.focus() ;} ;window.Cancel = function( dontFireChange ){Selection.EnsureSelection() ;return CloseDialog( dontFireChange ) ;} ;window.CloseDialog = function( dontFireChange ){Throbber.Hide() ;// Points the src to a non-existent location to avoid loading errors later, in case the dialog// haven't been completed loaded at this point.if ( $( 'frmMain' ) )$( 'frmMain' ).src = FCKTools.GetVoidUrl() ;if ( !dontFireChange && !FCK.EditMode ){// All dialog windows, by default, will fire the "OnSelectionChange"// event, no matter the Ok or Cancel button has been pressed.// It seems that OnSelectionChange may enter on a concurrency state// on some situations (#1965), so we should put the event firing in// the execution queue instead of executing it immediately.setTimeout( function(){FCK.Events.FireEvent( 'OnSelectionChange' ) ;}, 0 ) ;}FCKDialog.OnDialogClose( window ) ;} ;window.SetEnabled = function( isEnabled ){var cover = $( 'cover' ) ;cover.style.display = isEnabled ? 'none' : '' ;if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 ){if ( !isEnabled ){// Inser the blocker IFRAME before the cover.var blocker = document.createElement( 'iframe' ) ;blocker.src = FCKTools.GetVoidUrl() ;blocker.hideFocus = true ;blocker.frameBorder = 0 ;blocker.id = blocker.className = 'blocker' ;cover.appendChild( blocker ) ;}else{var blocker = $( 'blocker' ) ;if ( blocker && blocker.parentNode )blocker.parentNode.removeChild( blocker ) ;}}} ;})() ;// ]]></script></head><body onload="Init();" class="PopupBody"><div class="contents" id="contents"><div id="header"><div id="TitleArea" class="PopupTitle PopupTitleBorder"><script type="text/javascript">// <![CDATA[document.write( Args().Title ) ;// ]]></script><div id="closeButton" onclick="Cancel();"></div></div><div id="TabsRow" class="PopupTabArea" style="display: none"><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr id="Tabs"><td class="PopupTabEmptyArea"> </td><td class="PopupTabEmptyArea" width="100%"> </td></tr></table></div></div><div id="innerContents"></div><div id="PopupButtons" class="PopupButtons"><table border="0" cellpadding="0" cellspacing="0"><tr><td width="100%"> </td><td nowrap="nowrap"><input id="btnOk" style="visibility: hidden;" type="button" value="Ok" class="Button" onclick="Ok();" fckLang="DlgBtnOK" /> <input id="btnCancel" type="button" value="Cancel" class="Button" onclick="Cancel();" fckLang="DlgBtnCancel" /></td></tr></table></div></div><div class="tl"></div><div class="tc"></div><div class="tr"></div><div class="ml"></div><div class="mr"></div><div class="bl"></div><div class="bc"></div><div class="br"></div><div class="cover" id="cover" style="display:none"></div><div id="throbberBlock" style="position: absolute; visibility: hidden"></div><script type="text/javascript">// <![CDATA[// Set the class name for language direction.document.body.className += ' ' + langDir ;var cover = $( 'cover' ) ;cover.style.backgroundColor = FCKConfig.BackgroundBlockerColor ;FCKDomTools.SetOpacity( cover, FCKConfig.BackgroundBlockerOpacity ) ;// ]]></script></body></html>