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