source: extensions/FCKEditor/editor/_source/internals/fckdialog.js @ 3295

Last change on this file since 3295 was 3295, checked in by patdenice, 15 years ago

New extension added:
FCK Editor (2.0.a)

File size: 7.1 KB
Line 
1/*
2 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
3 * Copyright (C) 2003-2009 Frederico Caldeira Knabben
4 *
5 * == BEGIN LICENSE ==
6 *
7 * Licensed under the terms of any of the following licenses at your
8 * choice:
9 *
10 *  - GNU General Public License Version 2 or later (the "GPL")
11 *    http://www.gnu.org/licenses/gpl.html
12 *
13 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
14 *    http://www.gnu.org/licenses/lgpl.html
15 *
16 *  - Mozilla Public License Version 1.1 or later (the "MPL")
17 *    http://www.mozilla.org/MPL/MPL-1.1.html
18 *
19 * == END LICENSE ==
20 *
21 * Dialog windows operations.
22 */
23
24var FCKDialog = ( function()
25{
26        var topDialog ;
27        var baseZIndex ;
28        var cover ;
29
30        // The document that holds the dialog.
31        var topWindow = window.parent ;
32
33        while ( topWindow.parent && topWindow.parent != topWindow )
34        {
35                try
36                {
37                        if ( topWindow.parent.document.domain != document.domain )
38                                break ;
39                        if ( topWindow.parent.document.getElementsByTagName( 'frameset' ).length > 0 )
40                                break ;
41                }
42                catch ( e )
43                {
44                        break ;
45                }
46                topWindow = topWindow.parent ;
47        }
48
49        var topDocument = topWindow.document ;
50
51        var getZIndex = function()
52        {
53                if ( !baseZIndex )
54                        baseZIndex = FCKConfig.FloatingPanelsZIndex + 999 ;
55                return ++baseZIndex ;
56        }
57
58        // TODO : This logic is not actually working when reducing the window, only
59        // when enlarging it.
60        var resizeHandler = function()
61        {
62                if ( !cover )
63                        return ;
64
65                var relElement = FCKTools.IsStrictMode( topDocument ) ? topDocument.documentElement : topDocument.body ;
66
67                FCKDomTools.SetElementStyles( cover,
68                        {
69                                'width' : Math.max( relElement.scrollWidth,
70                                        relElement.clientWidth,
71                                        topDocument.scrollWidth || 0 ) - 1 + 'px',
72                                'height' : Math.max( relElement.scrollHeight,
73                                        relElement.clientHeight,
74                                        topDocument.scrollHeight || 0 ) - 1 + 'px'
75                        } ) ;
76        }
77
78        return {
79                /**
80                 * Opens a dialog window using the standard dialog template.
81                 */
82                OpenDialog : function( dialogName, dialogTitle, dialogPage, width, height, customValue, parentWindow, resizable )
83                {
84                        if ( !topDialog )
85                                this.DisplayMainCover() ;
86
87                        // Setup the dialog info to be passed to the dialog.
88                        var dialogInfo =
89                        {
90                                Title : dialogTitle,
91                                Page : dialogPage,
92                                Editor : window,
93                                CustomValue : customValue,              // Optional
94                                TopWindow : topWindow
95                        }
96
97                        FCK.ToolbarSet.CurrentInstance.Selection.Save( true ) ;
98
99                        // Calculate the dialog position, centering it on the screen.
100                        var viewSize = FCKTools.GetViewPaneSize( topWindow ) ;
101                        var scrollPosition = { 'X' : 0, 'Y' : 0 } ;
102                        var useAbsolutePosition = FCKBrowserInfo.IsIE && ( !FCKBrowserInfo.IsIE7 || !FCKTools.IsStrictMode( topWindow.document ) ) ;
103                        if ( useAbsolutePosition )
104                                scrollPosition = FCKTools.GetScrollPosition( topWindow ) ;
105                        var iTop  = Math.max( scrollPosition.Y + ( viewSize.Height - height - 20 ) / 2, 0 ) ;
106                        var iLeft = Math.max( scrollPosition.X + ( viewSize.Width - width - 20 )  / 2, 0 ) ;
107
108                        // Setup the IFRAME that will hold the dialog.
109                        var dialog = topDocument.createElement( 'iframe' ) ;
110                        FCKTools.ResetStyles( dialog ) ;
111                        dialog.src = FCKConfig.BasePath + 'fckdialog.html' ;
112
113                        // Dummy URL for testing whether the code in fckdialog.js alone leaks memory.
114                        // dialog.src = 'about:blank';
115
116                        dialog.frameBorder = 0 ;
117                        dialog.allowTransparency = true ;
118                        FCKDomTools.SetElementStyles( dialog,
119                                        {
120                                                'position'      : ( useAbsolutePosition ) ? 'absolute' : 'fixed',
121                                                'top'           : iTop + 'px',
122                                                'left'          : iLeft + 'px',
123                                                'width'         : width + 'px',
124                                                'height'        : height + 'px',
125                                                'zIndex'        : getZIndex()
126                                        } ) ;
127
128                        // Save the dialog info to be used by the dialog page once loaded.
129                        dialog._DialogArguments = dialogInfo ;
130
131                        // Append the IFRAME to the target document.
132                        topDocument.body.appendChild( dialog ) ;
133
134                        // Keep record of the dialog's parent/child relationships.
135                        dialog._ParentDialog = topDialog ;
136                        topDialog = dialog ;
137                },
138
139                /**
140                 * (For internal use)
141                 * Called when the top dialog is closed.
142                 */
143                OnDialogClose : function( dialogWindow )
144                {
145                        var dialog = dialogWindow.frameElement ;
146                        FCKDomTools.RemoveNode( dialog ) ;
147
148                        if ( dialog._ParentDialog )             // Nested Dialog.
149                        {
150                                topDialog = dialog._ParentDialog ;
151                                dialog._ParentDialog.contentWindow.SetEnabled( true ) ;
152                        }
153                        else                                                    // First Dialog.
154                        {
155                                // Set the Focus in the browser, so the "OnBlur" event is not
156                                // fired. In IE, there is no need to do that because the dialog
157                                // already moved the selection to the editing area before
158                                // closing (EnsureSelection). Also, the Focus() call here
159                                // causes memory leak on IE7 (weird).
160                                if ( !FCKBrowserInfo.IsIE )
161                                        FCK.Focus() ;
162
163                                this.HideMainCover() ;
164                                // Bug #1918: Assigning topDialog = null directly causes IE6 to crash.
165                                setTimeout( function(){ topDialog = null ; }, 0 ) ;
166
167                                // Release the previously saved selection.
168                                FCK.ToolbarSet.CurrentInstance.Selection.Release() ;
169                        }
170                },
171
172                DisplayMainCover : function()
173                {
174                        // Setup the DIV that will be used to cover.
175                        cover = topDocument.createElement( 'div' ) ;
176                        FCKTools.ResetStyles( cover ) ;
177                        FCKDomTools.SetElementStyles( cover,
178                                {
179                                        'position' : 'absolute',
180                                        'zIndex' : getZIndex(),
181                                        'top' : '0px',
182                                        'left' : '0px',
183                                        'backgroundColor' : FCKConfig.BackgroundBlockerColor
184                                } ) ;
185                        FCKDomTools.SetOpacity( cover, FCKConfig.BackgroundBlockerOpacity ) ;
186
187                        // For IE6-, we need to fill the cover with a transparent IFRAME,
188                        // to properly block <select> fields.
189                        if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
190                        {
191                                var iframe = topDocument.createElement( 'iframe' ) ;
192                                FCKTools.ResetStyles( iframe ) ;
193                                iframe.hideFocus = true ;
194                                iframe.frameBorder = 0 ;
195                                iframe.src = FCKTools.GetVoidUrl() ;
196                                FCKDomTools.SetElementStyles( iframe,
197                                        {
198                                                'width' : '100%',
199                                                'height' : '100%',
200                                                'position' : 'absolute',
201                                                'left' : '0px',
202                                                'top' : '0px',
203                                                'filter' : 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)'
204                                        } ) ;
205                                cover.appendChild( iframe ) ;
206                        }
207
208                        // We need to manually adjust the cover size on resize.
209                        FCKTools.AddEventListener( topWindow, 'resize', resizeHandler ) ;
210                        resizeHandler() ;
211
212                        topDocument.body.appendChild( cover ) ;
213
214                        FCKFocusManager.Lock() ;
215
216                        // Prevent the user from refocusing the disabled
217                        // editing window by pressing Tab. (Bug #2065)
218                        var el = FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'frameElement' ) ;
219                        el._fck_originalTabIndex = el.tabIndex ;
220                        el.tabIndex = -1 ;
221                },
222
223                HideMainCover : function()
224                {
225                        FCKDomTools.RemoveNode( cover ) ;
226                        FCKFocusManager.Unlock() ;
227
228                        // Revert the tab index hack. (Bug #2065)
229                        var el = FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'frameElement' ) ;
230                        el.tabIndex = el._fck_originalTabIndex ;
231                        FCKDomTools.ClearElementJSProperty( el, '_fck_originalTabIndex' ) ;
232                },
233
234                GetCover : function()
235                {
236                        return cover ;
237                }
238        } ;
239} )() ;
Note: See TracBrowser for help on using the repository browser.