JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.6.5
[ckeditor.git] / _source / plugins / dialog / plugin.js
index db371c4..e21f5d1 100644 (file)
@@ -457,7 +457,7 @@ CKEDITOR.DIALOG_RESIZE_BOTH = 3;
                        {\r
                                // Don't do that for a target that handles ENTER.\r
                                var target = evt.data.getTarget();\r
-                               if ( !target.is( 'a', 'button', 'select' ) && ( !target.is( 'input' ) || target.$.type != 'button' ) )\r
+                               if ( !target.is( 'a', 'button', 'select', 'textarea' ) && ( !target.is( 'input' ) || target.$.type != 'button' ) )\r
                                {\r
                                        button = this.getButton( 'ok' );\r
                                        button && CKEDITOR.tools.setTimeout( button.click, 0, button );\r
@@ -665,6 +665,15 @@ CKEDITOR.DIALOG_RESIZE_BOTH = 3;
                        } );\r
        }\r
 \r
+       // Re-layout the dialog on window resize.\r
+       function resizeWithWindow( dialog )\r
+       {\r
+               var win = CKEDITOR.document.getWindow();\r
+               function resizeHandler() { dialog.layout(); }\r
+               win.on( 'resize', resizeHandler );\r
+               dialog.on( 'hide', function() { win.removeListener( 'resize', resizeHandler ); } );\r
+       }\r
+\r
        CKEDITOR.dialog.prototype =\r
        {\r
                destroy : function()\r
@@ -733,49 +742,44 @@ CKEDITOR.DIALOG_RESIZE_BOTH = 3;
                 * @example\r
                 * dialogObj.move( 10, 40 );\r
                 */\r
-               move : (function()\r
+               move : function( x, y, save )\r
                {\r
-                       var isFixed;\r
-                       return function( x, y, save )\r
-                       {\r
-                               // The dialog may be fixed positioned or absolute positioned. Ask the\r
-                               // browser what is the current situation first.\r
-                               var element = this._.element.getFirst(),\r
-                                       rtl = this._.editor.lang.dir == 'rtl';\r
+                       // The dialog may be fixed positioned or absolute positioned. Ask the\r
+                       // browser what is the current situation first.\r
+                       var element = this._.element.getFirst(),\r
+                               rtl = this._.editor.lang.dir == 'rtl';\r
 \r
-                               if ( isFixed === undefined )\r
-                                       isFixed = element.getComputedStyle( 'position' ) == 'fixed';\r
+                       var isFixed = element.getComputedStyle( 'position' ) == 'fixed';\r
 \r
-                               if ( isFixed && this._.position && this._.position.x == x && this._.position.y == y )\r
-                                       return;\r
+                       if ( isFixed && this._.position && this._.position.x == x && this._.position.y == y )\r
+                               return;\r
 \r
-                               // Save the current position.\r
-                               this._.position = { x : x, y : y };\r
+                       // Save the current position.\r
+                       this._.position = { x : x, y : y };\r
 \r
-                               // If not fixed positioned, add scroll position to the coordinates.\r
-                               if ( !isFixed )\r
-                               {\r
-                                       var scrollPosition = CKEDITOR.document.getWindow().getScrollPosition();\r
-                                       x += scrollPosition.x;\r
-                                       y += scrollPosition.y;\r
-                               }\r
+                       // If not fixed positioned, add scroll position to the coordinates.\r
+                       if ( !isFixed )\r
+                       {\r
+                               var scrollPosition = CKEDITOR.document.getWindow().getScrollPosition();\r
+                               x += scrollPosition.x;\r
+                               y += scrollPosition.y;\r
+                       }\r
 \r
-                               // Translate coordinate for RTL.\r
-                               if ( rtl )\r
-                               {\r
-                                       var dialogSize = this.getSize(),\r
-                                               viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize();\r
-                                       x = viewPaneSize.width - dialogSize.width - x;\r
-                               }\r
+                       // Translate coordinate for RTL.\r
+                       if ( rtl )\r
+                       {\r
+                               var dialogSize = this.getSize(),\r
+                                       viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize();\r
+                               x = viewPaneSize.width - dialogSize.width - x;\r
+                       }\r
 \r
-                               var styles = { 'top'    : ( y > 0 ? y : 0 ) + 'px' };\r
-                               styles[ rtl ? 'right' : 'left' ] = ( x > 0 ? x : 0 ) + 'px';\r
+                       var styles = { 'top'    : ( y > 0 ? y : 0 ) + 'px' };\r
+                       styles[ rtl ? 'right' : 'left' ] = ( x > 0 ? x : 0 ) + 'px';\r
 \r
-                               element.setStyles( styles );\r
+                       element.setStyles( styles );\r
 \r
-                               save && ( this._.moved = 1 );\r
-                       };\r
-               })(),\r
+                       save && ( this._.moved = 1 );\r
+               },\r
 \r
                /**\r
                 * Gets the dialog's position in the window.\r
@@ -852,6 +856,8 @@ CKEDITOR.DIALOG_RESIZE_BOTH = 3;
                        CKEDITOR.tools.setTimeout( function()\r
                                {\r
                                        this.layout();\r
+                                       resizeWithWindow( this );\r
+\r
                                        this.parts.dialog.setStyle( 'visibility', '' );\r
 \r
                                        // Execute onLoad for the first show.\r
@@ -874,11 +880,26 @@ CKEDITOR.DIALOG_RESIZE_BOTH = 3;
                 */\r
                layout : function()\r
                {\r
-                       var viewSize = CKEDITOR.document.getWindow().getViewPaneSize(),\r
-                                       dialogSize = this.getSize();\r
+                       var el = this.parts.dialog;\r
+                       var dialogSize = this.getSize();\r
+                       var win = CKEDITOR.document.getWindow(),\r
+                                       viewSize = win.getViewPaneSize();\r
+\r
+                       var posX = ( viewSize.width - dialogSize.width ) / 2,\r
+                               posY = ( viewSize.height - dialogSize.height ) / 2;\r
+\r
+                       // Switch to absolute position when viewport is smaller than dialog size.\r
+                       if ( !CKEDITOR.env.ie6Compat )\r
+                       {\r
+                               if ( dialogSize.height + ( posY > 0 ? posY : 0 ) > viewSize.height ||\r
+                                                dialogSize.width + ( posX > 0 ? posX : 0 ) > viewSize.width )\r
+                                       el.setStyle( 'position', 'absolute' );\r
+                               else\r
+                                       el.setStyle( 'position', 'fixed' );\r
+                       }\r
 \r
-                       this.move( this._.moved ? this._.position.x : ( viewSize.width - dialogSize.width ) / 2,\r
-                                       this._.moved ? this._.position.y : ( viewSize.height - dialogSize.height ) / 2 );\r
+                       this.move( this._.moved ? this._.position.x : posX,\r
+                                       this._.moved ? this._.position.y : posY );\r
                },\r
 \r
                /**\r