Merge "Revert "[search] Remove more dead code""
[lhc/web/wiklou.git] / resources / lib / jquery.ui / jquery.ui.dialog.js
index 06b85f2..75a9e8f 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Dialog 1.8.24
+ * jQuery UI Dialog 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Dialog
+ * http://api.jqueryui.com/dialog/
  *
  * Depends:
  *     jquery.ui.core.js
  */
 (function( $, undefined ) {
 
-var uiDialogClasses =
-               'ui-dialog ' +
-               'ui-widget ' +
-               'ui-widget-content ' +
-               'ui-corner-all ',
+var uiDialogClasses = "ui-dialog ui-widget ui-widget-content ui-corner-all ",
        sizeRelatedOptions = {
                buttons: true,
                height: true,
@@ -40,158 +37,167 @@ var uiDialogClasses =
        };
 
 $.widget("ui.dialog", {
+       version: "1.9.2",
        options: {
                autoOpen: true,
                buttons: {},
                closeOnEscape: true,
-               closeText: 'close',
-               dialogClass: '',
+               closeText: "close",
+               dialogClass: "",
                draggable: true,
                hide: null,
-               height: 'auto',
+               height: "auto",
                maxHeight: false,
                maxWidth: false,
                minHeight: 150,
                minWidth: 150,
                modal: false,
                position: {
-                       my: 'center',
-                       at: 'center',
-                       collision: 'fit',
+                       my: "center",
+                       at: "center",
+                       of: window,
+                       collision: "fit",
                        // ensure that the titlebar is never outside the document
-                       using: function(pos) {
-                               var topOffset = $(this).css(pos).offset().top;
-                               if (topOffset < 0) {
-                                       $(this).css('top', pos.top - topOffset);
+                       using: function( pos ) {
+                               var topOffset = $( this ).css( pos ).offset().top;
+                               if ( topOffset < 0 ) {
+                                       $( this ).css( "top", pos.top - topOffset );
                                }
                        }
                },
                resizable: true,
                show: null,
                stack: true,
-               title: '',
+               title: "",
                width: 300,
                zIndex: 1000
        },
 
        _create: function() {
-               this.originalTitle = this.element.attr('title');
+               this.originalTitle = this.element.attr( "title" );
                // #5742 - .attr() might return a DOMElement
                if ( typeof this.originalTitle !== "string" ) {
                        this.originalTitle = "";
                }
-
+               this.oldPosition = {
+                       parent: this.element.parent(),
+                       index: this.element.parent().children().index( this.element )
+               };
                this.options.title = this.options.title || this.originalTitle;
-               var self = this,
-                       options = self.options,
-
-                       title = options.title || '&#160;',
-                       titleId = $.ui.dialog.getTitleId(self.element),
-
-                       uiDialog = (self.uiDialog = $('<div></div>'))
-                               .appendTo(document.body)
-                               .hide()
-                               .addClass(uiDialogClasses + options.dialogClass)
+               var that = this,
+                       options = this.options,
+
+                       title = options.title || "&#160;",
+                       uiDialog,
+                       uiDialogTitlebar,
+                       uiDialogTitlebarClose,
+                       uiDialogTitle,
+                       uiDialogButtonPane;
+
+                       uiDialog = ( this.uiDialog = $( "<div>" ) )
+                               .addClass( uiDialogClasses + options.dialogClass )
                                .css({
+                                       display: "none",
+                                       outline: 0, // TODO: move to stylesheet
                                        zIndex: options.zIndex
                                })
                                // setting tabIndex makes the div focusable
-                               // setting outline to 0 prevents a border on focus in Mozilla
-                               .attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
-                                       if (options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-                                               event.keyCode === $.ui.keyCode.ESCAPE) {
-                                               
-                                               self.close(event);
+                               .attr( "tabIndex", -1)
+                               .keydown(function( event ) {
+                                       if ( options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+                                                       event.keyCode === $.ui.keyCode.ESCAPE ) {
+                                               that.close( event );
                                                event.preventDefault();
                                        }
                                })
-                               .attr({
-                                       role: 'dialog',
-                                       'aria-labelledby': titleId
+                               .mousedown(function( event ) {
+                                       that.moveToTop( false, event );
                                })
-                               .mousedown(function(event) {
-                                       self.moveToTop(false, event);
-                               }),
+                               .appendTo( "body" );
 
-                       uiDialogContent = self.element
+                       this.element
                                .show()
-                               .removeAttr('title')
-                               .addClass(
-                                       'ui-dialog-content ' +
-                                       'ui-widget-content')
-                               .appendTo(uiDialog),
-
-                       uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
-                               .addClass(
-                                       'ui-dialog-titlebar ' +
-                                       'ui-widget-header ' +
-                                       'ui-corner-all ' +
-                                       'ui-helper-clearfix'
-                               )
-                               .prependTo(uiDialog),
-
-                       uiDialogTitlebarClose = $('<a href="#"></a>')
-                               .addClass(
-                                       'ui-dialog-titlebar-close ' +
-                                       'ui-corner-all'
-                               )
-                               .attr('role', 'button')
-                               .hover(
-                                       function() {
-                                               uiDialogTitlebarClose.addClass('ui-state-hover');
-                                       },
-                                       function() {
-                                               uiDialogTitlebarClose.removeClass('ui-state-hover');
-                                       }
-                               )
-                               .focus(function() {
-                                       uiDialogTitlebarClose.addClass('ui-state-focus');
-                               })
-                               .blur(function() {
-                                       uiDialogTitlebarClose.removeClass('ui-state-focus');
+                               .removeAttr( "title" )
+                               .addClass( "ui-dialog-content ui-widget-content" )
+                               .appendTo( uiDialog );
+
+                       uiDialogTitlebar = ( this.uiDialogTitlebar = $( "<div>" ) )
+                               .addClass( "ui-dialog-titlebar  ui-widget-header  " +
+                                       "ui-corner-all  ui-helper-clearfix" )
+                               .bind( "mousedown", function() {
+                                       // Dialog isn't getting focus when dragging (#8063)
+                                       uiDialog.focus();
                                })
-                               .click(function(event) {
-                                       self.close(event);
-                                       return false;
+                               .prependTo( uiDialog );
+
+                       uiDialogTitlebarClose = $( "<a href='#'></a>" )
+                               .addClass( "ui-dialog-titlebar-close  ui-corner-all" )
+                               .attr( "role", "button" )
+                               .click(function( event ) {
+                                       event.preventDefault();
+                                       that.close( event );
                                })
-                               .appendTo(uiDialogTitlebar),
+                               .appendTo( uiDialogTitlebar );
 
-                       uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
-                               .addClass(
-                                       'ui-icon ' +
-                                       'ui-icon-closethick'
-                               )
-                               .text(options.closeText)
-                               .appendTo(uiDialogTitlebarClose),
+                       ( this.uiDialogTitlebarCloseText = $( "<span>" ) )
+                               .addClass( "ui-icon ui-icon-closethick" )
+                               .text( options.closeText )
+                               .appendTo( uiDialogTitlebarClose );
 
-                       uiDialogTitle = $('<span></span>')
-                               .addClass('ui-dialog-title')
-                               .attr('id', titleId)
-                               .html(title)
-                               .prependTo(uiDialogTitlebar);
+                       uiDialogTitle = $( "<span>" )
+                               .uniqueId()
+                               .addClass( "ui-dialog-title" )
+                               .html( title )
+                               .prependTo( uiDialogTitlebar );
 
-               //handling of deprecated beforeclose (vs beforeClose) option
-               //Ticket #4669 http://dev.jqueryui.com/ticket/4669
-               //TODO: remove in 1.9pre
-               if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
-                       options.beforeClose = options.beforeclose;
-               }
+                       uiDialogButtonPane = ( this.uiDialogButtonPane = $( "<div>" ) )
+                               .addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
+
+                       ( this.uiButtonSet = $( "<div>" ) )
+                               .addClass( "ui-dialog-buttonset" )
+                               .appendTo( uiDialogButtonPane );
 
-               uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
+               uiDialog.attr({
+                       role: "dialog",
+                       "aria-labelledby": uiDialogTitle.attr( "id" )
+               });
 
-               if (options.draggable && $.fn.draggable) {
-                       self._makeDraggable();
+               uiDialogTitlebar.find( "*" ).add( uiDialogTitlebar ).disableSelection();
+               this._hoverable( uiDialogTitlebarClose );
+               this._focusable( uiDialogTitlebarClose );
+
+               if ( options.draggable && $.fn.draggable ) {
+                       this._makeDraggable();
                }
-               if (options.resizable && $.fn.resizable) {
-                       self._makeResizable();
+               if ( options.resizable && $.fn.resizable ) {
+                       this._makeResizable();
                }
 
-               self._createButtons(options.buttons);
-               self._isOpen = false;
+               this._createButtons( options.buttons );
+               this._isOpen = false;
 
-               if ($.fn.bgiframe) {
+               if ( $.fn.bgiframe ) {
                        uiDialog.bgiframe();
                }
+
+               // prevent tabbing out of modal dialogs
+               this._on( uiDialog, { keydown: function( event ) {
+                       if ( !options.modal || event.keyCode !== $.ui.keyCode.TAB ) {
+                               return;
+                       }
+
+                       var tabbables = $( ":tabbable", uiDialog ),
+                               first = tabbables.filter( ":first" ),
+                               last  = tabbables.filter( ":last" );
+
+                       if ( event.target === last[0] && !event.shiftKey ) {
+                               first.focus( 1 );
+                               return false;
+                       } else if ( event.target === first[0] && event.shiftKey ) {
+                               last.focus( 1 );
+                               return false;
+                       }
+               }});
        },
 
        _init: function() {
@@ -200,72 +206,81 @@ $.widget("ui.dialog", {
                }
        },
 
-       destroy: function() {
-               var self = this;
-               
-               if (self.overlay) {
-                       self.overlay.destroy();
+       _destroy: function() {
+               var next,
+                       oldPosition = this.oldPosition;
+
+               if ( this.overlay ) {
+                       this.overlay.destroy();
                }
-               self.uiDialog.hide();
-               self.element
-                       .unbind('.dialog')
-                       .removeData('dialog')
-                       .removeClass('ui-dialog-content ui-widget-content')
-                       .hide().appendTo('body');
-               self.uiDialog.remove();
+               this.uiDialog.hide();
+               this.element
+                       .removeClass( "ui-dialog-content ui-widget-content" )
+                       .hide()
+                       .appendTo( "body" );
+               this.uiDialog.remove();
 
-               if (self.originalTitle) {
-                       self.element.attr('title', self.originalTitle);
+               if ( this.originalTitle ) {
+                       this.element.attr( "title", this.originalTitle );
                }
 
-               return self;
+               next = oldPosition.parent.children().eq( oldPosition.index );
+               // Don't try to place the dialog next to itself (#8613)
+               if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
+                       next.before( this.element );
+               } else {
+                       oldPosition.parent.append( this.element );
+               }
        },
 
        widget: function() {
                return this.uiDialog;
        },
 
-       close: function(event) {
-               var self = this,
+       close: function( event ) {
+               var that = this,
                        maxZ, thisZ;
-               
-               if (false === self._trigger('beforeClose', event)) {
+
+               if ( !this._isOpen ) {
                        return;
                }
 
-               if (self.overlay) {
-                       self.overlay.destroy();
+               if ( false === this._trigger( "beforeClose", event ) ) {
+                       return;
                }
-               self.uiDialog.unbind('keypress.ui-dialog');
 
-               self._isOpen = false;
+               this._isOpen = false;
+
+               if ( this.overlay ) {
+                       this.overlay.destroy();
+               }
 
-               if (self.options.hide) {
-                       self.uiDialog.hide(self.options.hide, function() {
-                               self._trigger('close', event);
+               if ( this.options.hide ) {
+                       this._hide( this.uiDialog, this.options.hide, function() {
+                               that._trigger( "close", event );
                        });
                } else {
-                       self.uiDialog.hide();
-                       self._trigger('close', event);
+                       this.uiDialog.hide();
+                       this._trigger( "close", event );
                }
 
                $.ui.dialog.overlay.resize();
 
                // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
-               if (self.options.modal) {
+               if ( this.options.modal ) {
                        maxZ = 0;
-                       $('.ui-dialog').each(function() {
-                               if (this !== self.uiDialog[0]) {
-                                       thisZ = $(this).css('z-index');
-                                       if(!isNaN(thisZ)) {
-                                               maxZ = Math.max(maxZ, thisZ);
+                       $( ".ui-dialog" ).each(function() {
+                               if ( this !== that.uiDialog[0] ) {
+                                       thisZ = $( this ).css( "z-index" );
+                                       if ( !isNaN( thisZ ) ) {
+                                               maxZ = Math.max( maxZ, thisZ );
                                        }
                                }
                        });
                        $.ui.dialog.maxZ = maxZ;
                }
 
-               return self;
+               return this;
        },
 
        isOpen: function() {
@@ -274,179 +289,158 @@ $.widget("ui.dialog", {
 
        // the force parameter allows us to move modal dialogs to their correct
        // position on open
-       moveToTop: function(force, event) {
-               var self = this,
-                       options = self.options,
+       moveToTop: function( force, event ) {
+               var options = this.options,
                        saveScroll;
 
-               if ((options.modal && !force) ||
-                       (!options.stack && !options.modal)) {
-                       return self._trigger('focus', event);
+               if ( ( options.modal && !force ) ||
+                               ( !options.stack && !options.modal ) ) {
+                       return this._trigger( "focus", event );
                }
 
-               if (options.zIndex > $.ui.dialog.maxZ) {
+               if ( options.zIndex > $.ui.dialog.maxZ ) {
                        $.ui.dialog.maxZ = options.zIndex;
                }
-               if (self.overlay) {
+               if ( this.overlay ) {
                        $.ui.dialog.maxZ += 1;
-                       self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
+                       $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ;
+                       this.overlay.$el.css( "z-index", $.ui.dialog.overlay.maxZ );
                }
 
-               //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
-               //  http://ui.jquery.com/bugs/ticket/3193
-               saveScroll = { scrollTop: self.element.scrollTop(), scrollLeft: self.element.scrollLeft() };
+               // Save and then restore scroll
+               // Opera 9.5+ resets when parent z-index is changed.
+               // http://bugs.jqueryui.com/ticket/3193
+               saveScroll = {
+                       scrollTop: this.element.scrollTop(),
+                       scrollLeft: this.element.scrollLeft()
+               };
                $.ui.dialog.maxZ += 1;
-               self.uiDialog.css('z-index', $.ui.dialog.maxZ);
-               self.element.attr(saveScroll);
-               self._trigger('focus', event);
+               this.uiDialog.css( "z-index", $.ui.dialog.maxZ );
+               this.element.attr( saveScroll );
+               this._trigger( "focus", event );
 
-               return self;
+               return this;
        },
 
        open: function() {
-               if (this._isOpen) { return; }
-
-               var self = this,
-                       options = self.options,
-                       uiDialog = self.uiDialog;
-
-               self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
-               self._size();
-               self._position(options.position);
-               uiDialog.show(options.show);
-               self.moveToTop(true);
+               if ( this._isOpen ) {
+                       return;
+               }
 
-               // prevent tabbing out of modal dialogs
-               if ( options.modal ) {
-                       uiDialog.bind( "keydown.ui-dialog", function( event ) {
-                               if ( event.keyCode !== $.ui.keyCode.TAB ) {
-                                       return;
-                               }
+               var hasFocus,
+                       options = this.options,
+                       uiDialog = this.uiDialog;
 
-                               var tabbables = $(':tabbable', this),
-                                       first = tabbables.filter(':first'),
-                                       last  = tabbables.filter(':last');
-
-                               if (event.target === last[0] && !event.shiftKey) {
-                                       first.focus(1);
-                                       return false;
-                               } else if (event.target === first[0] && event.shiftKey) {
-                                       last.focus(1);
-                                       return false;
-                               }
-                       });
-               }
+               this._size();
+               this._position( options.position );
+               uiDialog.show( options.show );
+               this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null;
+               this.moveToTop( true );
 
                // set focus to the first tabbable element in the content area or the first button
                // if there are no tabbable elements, set focus on the dialog itself
-               $(self.element.find(':tabbable').get().concat(
-                       uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
-                               uiDialog.get()))).eq(0).focus();
+               hasFocus = this.element.find( ":tabbable" );
+               if ( !hasFocus.length ) {
+                       hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
+                       if ( !hasFocus.length ) {
+                               hasFocus = uiDialog;
+                       }
+               }
+               hasFocus.eq( 0 ).focus();
 
-               self._isOpen = true;
-               self._trigger('open');
+               this._isOpen = true;
+               this._trigger( "open" );
 
-               return self;
+               return this;
        },
 
-       _createButtons: function(buttons) {
-               var self = this,
-                       hasButtons = false,
-                       uiDialogButtonPane = $('<div></div>')
-                               .addClass(
-                                       'ui-dialog-buttonpane ' +
-                                       'ui-widget-content ' +
-                                       'ui-helper-clearfix'
-                               ),
-                       uiButtonSet = $( "<div></div>" )
-                               .addClass( "ui-dialog-buttonset" )
-                               .appendTo( uiDialogButtonPane );
+       _createButtons: function( buttons ) {
+               var that = this,
+                       hasButtons = false;
 
                // if we already have a button pane, remove it
-               self.uiDialog.find('.ui-dialog-buttonpane').remove();
+               this.uiDialogButtonPane.remove();
+               this.uiButtonSet.empty();
 
-               if (typeof buttons === 'object' && buttons !== null) {
-                       $.each(buttons, function() {
+               if ( typeof buttons === "object" && buttons !== null ) {
+                       $.each( buttons, function() {
                                return !(hasButtons = true);
                        });
                }
-               if (hasButtons) {
-                       $.each(buttons, function(name, props) {
+               if ( hasButtons ) {
+                       $.each( buttons, function( name, props ) {
+                               var button, click;
                                props = $.isFunction( props ) ?
                                        { click: props, text: name } :
                                        props;
-                               var button = $('<button type="button"></button>')
-                                       .click(function() {
-                                               props.click.apply(self.element[0], arguments);
-                                       })
-                                       .appendTo(uiButtonSet);
-                               // can't use .attr( props, true ) with jQuery 1.3.2.
-                               $.each( props, function( key, value ) {
-                                       if ( key === "click" ) {
-                                               return;
-                                       }
-                                       if ( key in button ) {
-                                               button[ key ]( value );
-                                       } else {
-                                               button.attr( key, value );
-                                       }
-                               });
-                               if ($.fn.button) {
+                               // Default to a non-submitting button
+                               props = $.extend( { type: "button" }, props );
+                               // Change the context for the click callback to be the main element
+                               click = props.click;
+                               props.click = function() {
+                                       click.apply( that.element[0], arguments );
+                               };
+                               button = $( "<button></button>", props )
+                                       .appendTo( that.uiButtonSet );
+                               if ( $.fn.button ) {
                                        button.button();
                                }
                        });
-                       uiDialogButtonPane.appendTo(self.uiDialog);
+                       this.uiDialog.addClass( "ui-dialog-buttons" );
+                       this.uiDialogButtonPane.appendTo( this.uiDialog );
+               } else {
+                       this.uiDialog.removeClass( "ui-dialog-buttons" );
                }
        },
 
        _makeDraggable: function() {
-               var self = this,
-                       options = self.options,
-                       doc = $(document),
-                       heightBeforeDrag;
+               var that = this,
+                       options = this.options;
 
-               function filteredUi(ui) {
+               function filteredUi( ui ) {
                        return {
                                position: ui.position,
                                offset: ui.offset
                        };
                }
 
-               self.uiDialog.draggable({
-                       cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
-                       handle: '.ui-dialog-titlebar',
-                       containment: 'document',
-                       start: function(event, ui) {
-                               heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
-                               $(this).height($(this).height()).addClass("ui-dialog-dragging");
-                               self._trigger('dragStart', event, filteredUi(ui));
+               this.uiDialog.draggable({
+                       cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
+                       handle: ".ui-dialog-titlebar",
+                       containment: "document",
+                       start: function( event, ui ) {
+                               $( this )
+                                       .addClass( "ui-dialog-dragging" );
+                               that._trigger( "dragStart", event, filteredUi( ui ) );
                        },
-                       drag: function(event, ui) {
-                               self._trigger('drag', event, filteredUi(ui));
+                       drag: function( event, ui ) {
+                               that._trigger( "drag", event, filteredUi( ui ) );
                        },
-                       stop: function(event, ui) {
-                               options.position = [ui.position.left - doc.scrollLeft(),
-                                       ui.position.top - doc.scrollTop()];
-                               $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
-                               self._trigger('dragStop', event, filteredUi(ui));
+                       stop: function( event, ui ) {
+                               options.position = [
+                                       ui.position.left - that.document.scrollLeft(),
+                                       ui.position.top - that.document.scrollTop()
+                               ];
+                               $( this )
+                                       .removeClass( "ui-dialog-dragging" );
+                               that._trigger( "dragStop", event, filteredUi( ui ) );
                                $.ui.dialog.overlay.resize();
                        }
                });
        },
 
-       _makeResizable: function(handles) {
+       _makeResizable: function( handles ) {
                handles = (handles === undefined ? this.options.resizable : handles);
-               var self = this,
-                       options = self.options,
+               var that = this,
+                       options = this.options,
                        // .ui-resizable has position: relative defined in the stylesheet
                        // but dialogs have to use absolute or fixed positioning
-                       position = self.uiDialog.css('position'),
-                       resizeHandles = (typeof handles === 'string' ?
+                       position = this.uiDialog.css( "position" ),
+                       resizeHandles = typeof handles === 'string' ?
                                handles :
-                               'n,e,s,w,se,sw,ne,nw'
-                       );
+                               "n,e,s,w,se,sw,ne,nw";
 
-               function filteredUi(ui) {
+               function filteredUi( ui ) {
                        return {
                                originalPosition: ui.originalPosition,
                                originalSize: ui.originalSize,
@@ -455,101 +449,99 @@ $.widget("ui.dialog", {
                        };
                }
 
-               self.uiDialog.resizable({
-                       cancel: '.ui-dialog-content',
-                       containment: 'document',
-                       alsoResize: self.element,
+               this.uiDialog.resizable({
+                       cancel: ".ui-dialog-content",
+                       containment: "document",
+                       alsoResize: this.element,
                        maxWidth: options.maxWidth,
                        maxHeight: options.maxHeight,
                        minWidth: options.minWidth,
-                       minHeight: self._minHeight(),
+                       minHeight: this._minHeight(),
                        handles: resizeHandles,
-                       start: function(event, ui) {
-                               $(this).addClass("ui-dialog-resizing");
-                               self._trigger('resizeStart', event, filteredUi(ui));
+                       start: function( event, ui ) {
+                               $( this ).addClass( "ui-dialog-resizing" );
+                               that._trigger( "resizeStart", event, filteredUi( ui ) );
                        },
-                       resize: function(event, ui) {
-                               self._trigger('resize', event, filteredUi(ui));
+                       resize: function( event, ui ) {
+                               that._trigger( "resize", event, filteredUi( ui ) );
                        },
-                       stop: function(event, ui) {
-                               $(this).removeClass("ui-dialog-resizing");
-                               options.height = $(this).height();
-                               options.width = $(this).width();
-                               self._trigger('resizeStop', event, filteredUi(ui));
+                       stop: function( event, ui ) {
+                               $( this ).removeClass( "ui-dialog-resizing" );
+                               options.height = $( this ).height();
+                               options.width = $( this ).width();
+                               that._trigger( "resizeStop", event, filteredUi( ui ) );
                                $.ui.dialog.overlay.resize();
                        }
                })
-               .css('position', position)
-               .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+               .css( "position", position )
+               .find( ".ui-resizable-se" )
+                       .addClass( "ui-icon ui-icon-grip-diagonal-se" );
        },
 
        _minHeight: function() {
                var options = this.options;
 
-               if (options.height === 'auto') {
+               if ( options.height === "auto" ) {
                        return options.minHeight;
                } else {
-                       return Math.min(options.minHeight, options.height);
+                       return Math.min( options.minHeight, options.height );
                }
        },
 
-       _position: function(position) {
+       _position: function( position ) {
                var myAt = [],
-                       offset = [0, 0],
+                       offset = [ 0, 0 ],
                        isVisible;
 
-               if (position) {
+               if ( position ) {
                        // deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
        //              if (typeof position == 'string' || $.isArray(position)) {
        //                      myAt = $.isArray(position) ? position : position.split(' ');
 
-                       if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
-                               myAt = position.split ? position.split(' ') : [position[0], position[1]];
-                               if (myAt.length === 1) {
-                                       myAt[1] = myAt[0];
+                       if ( typeof position === "string" || (typeof position === "object" && "0" in position ) ) {
+                               myAt = position.split ? position.split( " " ) : [ position[ 0 ], position[ 1 ] ];
+                               if ( myAt.length === 1 ) {
+                                       myAt[ 1 ] = myAt[ 0 ];
                                }
 
-                               $.each(['left', 'top'], function(i, offsetPosition) {
-                                       if (+myAt[i] === myAt[i]) {
-                                               offset[i] = myAt[i];
-                                               myAt[i] = offsetPosition;
+                               $.each( [ "left", "top" ], function( i, offsetPosition ) {
+                                       if ( +myAt[ i ] === myAt[ i ] ) {
+                                               offset[ i ] = myAt[ i ];
+                                               myAt[ i ] = offsetPosition;
                                        }
                                });
 
                                position = {
-                                       my: myAt.join(" "),
-                                       at: myAt.join(" "),
-                                       offset: offset.join(" ")
+                                       my: myAt[0] + (offset[0] < 0 ? offset[0] : "+" + offset[0]) + " " +
+                                               myAt[1] + (offset[1] < 0 ? offset[1] : "+" + offset[1]),
+                                       at: myAt.join( " " )
                                };
-                       } 
+                       }
 
-                       position = $.extend({}, $.ui.dialog.prototype.options.position, position);
+                       position = $.extend( {}, $.ui.dialog.prototype.options.position, position );
                } else {
                        position = $.ui.dialog.prototype.options.position;
                }
 
                // need to show the dialog to get the actual offset in the position plugin
-               isVisible = this.uiDialog.is(':visible');
-               if (!isVisible) {
+               isVisible = this.uiDialog.is( ":visible" );
+               if ( !isVisible ) {
                        this.uiDialog.show();
                }
-               this.uiDialog
-                       // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
-                       .css({ top: 0, left: 0 })
-                       .position($.extend({ of: window }, position));
-               if (!isVisible) {
+               this.uiDialog.position( position );
+               if ( !isVisible ) {
                        this.uiDialog.hide();
                }
        },
 
        _setOptions: function( options ) {
-               var self = this,
+               var that = this,
                        resizableOptions = {},
                        resize = false;
 
                $.each( options, function( key, value ) {
-                       self._setOption( key, value );
-                       
+                       that._setOption( key, value );
+
                        if ( key in sizeRelatedOptions ) {
                                resize = true;
                        }
@@ -566,104 +558,98 @@ $.widget("ui.dialog", {
                }
        },
 
-       _setOption: function(key, value){
-               var self = this,
-                       uiDialog = self.uiDialog;
+       _setOption: function( key, value ) {
+               var isDraggable, isResizable,
+                       uiDialog = this.uiDialog;
 
-               switch (key) {
-                       //handling of deprecated beforeclose (vs beforeClose) option
-                       //Ticket #4669 http://dev.jqueryui.com/ticket/4669
-                       //TODO: remove in 1.9pre
-                       case "beforeclose":
-                               key = "beforeClose";
-                               break;
+               switch ( key ) {
                        case "buttons":
-                               self._createButtons(value);
+                               this._createButtons( value );
                                break;
                        case "closeText":
                                // ensure that we always pass a string
-                               self.uiDialogTitlebarCloseText.text("" + value);
+                               this.uiDialogTitlebarCloseText.text( "" + value );
                                break;
                        case "dialogClass":
                                uiDialog
-                                       .removeClass(self.options.dialogClass)
-                                       .addClass(uiDialogClasses + value);
+                                       .removeClass( this.options.dialogClass )
+                                       .addClass( uiDialogClasses + value );
                                break;
                        case "disabled":
-                               if (value) {
-                                       uiDialog.addClass('ui-dialog-disabled');
+                               if ( value ) {
+                                       uiDialog.addClass( "ui-dialog-disabled" );
                                } else {
-                                       uiDialog.removeClass('ui-dialog-disabled');
+                                       uiDialog.removeClass( "ui-dialog-disabled" );
                                }
                                break;
                        case "draggable":
-                               var isDraggable = uiDialog.is( ":data(draggable)" );
+                               isDraggable = uiDialog.is( ":data(draggable)" );
                                if ( isDraggable && !value ) {
                                        uiDialog.draggable( "destroy" );
                                }
-                               
+
                                if ( !isDraggable && value ) {
-                                       self._makeDraggable();
+                                       this._makeDraggable();
                                }
                                break;
                        case "position":
-                               self._position(value);
+                               this._position( value );
                                break;
                        case "resizable":
                                // currently resizable, becoming non-resizable
-                               var isResizable = uiDialog.is( ":data(resizable)" );
-                               if (isResizable && !value) {
-                                       uiDialog.resizable('destroy');
+                               isResizable = uiDialog.is( ":data(resizable)" );
+                               if ( isResizable && !value ) {
+                                       uiDialog.resizable( "destroy" );
                                }
 
                                // currently resizable, changing handles
-                               if (isResizable && typeof value === 'string') {
-                                       uiDialog.resizable('option', 'handles', value);
+                               if ( isResizable && typeof value === "string" ) {
+                                       uiDialog.resizable( "option", "handles", value );
                                }
 
                                // currently non-resizable, becoming resizable
-                               if (!isResizable && value !== false) {
-                                       self._makeResizable(value);
+                               if ( !isResizable && value !== false ) {
+                                       this._makeResizable( value );
                                }
                                break;
                        case "title":
                                // convert whatever was passed in o a string, for html() to not throw up
-                               $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
+                               $( ".ui-dialog-title", this.uiDialogTitlebar )
+                                       .html( "" + ( value || "&#160;" ) );
                                break;
                }
 
-               $.Widget.prototype._setOption.apply(self, arguments);
+               this._super( key, value );
        },
 
        _size: function() {
                /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
                 * divs will both have width and height set, so we need to reset them
                 */
-               var options = this.options,
-                       nonContentHeight,
-                       minContentHeight,
+               var nonContentHeight, minContentHeight, autoHeight,
+                       options = this.options,
                        isVisible = this.uiDialog.is( ":visible" );
 
                // reset content sizing
                this.element.show().css({
-                       width: 'auto',
+                       width: "auto",
                        minHeight: 0,
                        height: 0
                });
 
-               if (options.minWidth > options.width) {
+               if ( options.minWidth > options.width ) {
                        options.width = options.minWidth;
                }
 
                // reset wrapper sizing
                // determine the height of all the non-content elements
                nonContentHeight = this.uiDialog.css({
-                               height: 'auto',
+                               height: "auto",
                                width: options.width
                        })
-                       .height();
+                       .outerHeight();
                minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
-               
+
                if ( options.height === "auto" ) {
                        // only needed for IE6 support
                        if ( $.support.minHeight ) {
@@ -673,7 +659,7 @@ $.widget("ui.dialog", {
                                });
                        } else {
                                this.uiDialog.show();
-                               var autoHeight = this.element.css( "height", "auto" ).height();
+                               autoHeight = this.element.css( "height", "auto" ).height();
                                if ( !isVisible ) {
                                        this.uiDialog.hide();
                                }
@@ -683,102 +669,108 @@ $.widget("ui.dialog", {
                        this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
                }
 
-               if (this.uiDialog.is(':data(resizable)')) {
-                       this.uiDialog.resizable('option', 'minHeight', this._minHeight());
+               if (this.uiDialog.is( ":data(resizable)" ) ) {
+                       this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
                }
        }
 });
 
 $.extend($.ui.dialog, {
-       version: "1.8.24",
-
        uuid: 0,
        maxZ: 0,
 
        getTitleId: function($el) {
-               var id = $el.attr('id');
-               if (!id) {
+               var id = $el.attr( "id" );
+               if ( !id ) {
                        this.uuid += 1;
                        id = this.uuid;
                }
-               return 'ui-dialog-title-' + id;
+               return "ui-dialog-title-" + id;
        },
 
-       overlay: function(dialog) {
-               this.$el = $.ui.dialog.overlay.create(dialog);
+       overlay: function( dialog ) {
+               this.$el = $.ui.dialog.overlay.create( dialog );
        }
 });
 
-$.extend($.ui.dialog.overlay, {
+$.extend( $.ui.dialog.overlay, {
        instances: [],
        // reuse old instances due to IE memory leak with alpha transparency (see #5185)
        oldInstances: [],
        maxZ: 0,
-       events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
-               function(event) { return event + '.dialog-overlay'; }).join(' '),
-       create: function(dialog) {
-               if (this.instances.length === 0) {
+       events: $.map(
+               "focus,mousedown,mouseup,keydown,keypress,click".split( "," ),
+               function( event ) {
+                       return event + ".dialog-overlay";
+               }
+       ).join( " " ),
+       create: function( dialog ) {
+               if ( this.instances.length === 0 ) {
                        // prevent use of anchors and inputs
                        // we use a setTimeout in case the overlay is created from an
                        // event that we're going to be cancelling (see #2804)
                        setTimeout(function() {
                                // handle $(el).dialog().dialog('close') (see #4065)
-                               if ($.ui.dialog.overlay.instances.length) {
-                                       $(document).bind($.ui.dialog.overlay.events, function(event) {
+                               if ( $.ui.dialog.overlay.instances.length ) {
+                                       $( document ).bind( $.ui.dialog.overlay.events, function( event ) {
                                                // stop events if the z-index of the target is < the z-index of the overlay
                                                // we cannot return true when we don't want to cancel the event (#3523)
-                                               if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
+                                               if ( $( event.target ).zIndex() < $.ui.dialog.overlay.maxZ ) {
                                                        return false;
                                                }
                                        });
                                }
-                       }, 1);
-
-                       // allow closing by pressing the escape key
-                       $(document).bind('keydown.dialog-overlay', function(event) {
-                               if (dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-                                       event.keyCode === $.ui.keyCode.ESCAPE) {
-                                       
-                                       dialog.close(event);
-                                       event.preventDefault();
-                               }
-                       });
+                       }, 1 );
 
                        // handle window resize
-                       $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
+                       $( window ).bind( "resize.dialog-overlay", $.ui.dialog.overlay.resize );
                }
 
-               var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
-                       .appendTo(document.body)
-                       .css({
-                               width: this.width(),
-                               height: this.height()
-                       });
+               var $el = ( this.oldInstances.pop() || $( "<div>" ).addClass( "ui-widget-overlay" ) );
 
-               if ($.fn.bgiframe) {
+               // allow closing by pressing the escape key
+               $( document ).bind( "keydown.dialog-overlay", function( event ) {
+                       var instances = $.ui.dialog.overlay.instances;
+                       // only react to the event if we're the top overlay
+                       if ( instances.length !== 0 && instances[ instances.length - 1 ] === $el &&
+                               dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+                               event.keyCode === $.ui.keyCode.ESCAPE ) {
+
+                               dialog.close( event );
+                               event.preventDefault();
+                       }
+               });
+
+               $el.appendTo( document.body ).css({
+                       width: this.width(),
+                       height: this.height()
+               });
+
+               if ( $.fn.bgiframe ) {
                        $el.bgiframe();
                }
 
-               this.instances.push($el);
+               this.instances.push( $el );
                return $el;
        },
 
-       destroy: function($el) {
-               var indexOf = $.inArray($el, this.instances);
-               if (indexOf != -1){
-                       this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
+       destroy: function( $el ) {
+               var indexOf = $.inArray( $el, this.instances ),
+                       maxZ = 0;
+
+               if ( indexOf !== -1 ) {
+                       this.oldInstances.push( this.instances.splice( indexOf, 1 )[ 0 ] );
                }
 
-               if (this.instances.length === 0) {
-                       $([document, window]).unbind('.dialog-overlay');
+               if ( this.instances.length === 0 ) {
+                       $( [ document, window ] ).unbind( ".dialog-overlay" );
                }
 
-               $el.remove();
-               
+               $el.height( 0 ).width( 0 ).remove();
+
                // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
-               var maxZ = 0;
-               $.each(this.instances, function() {
-                       maxZ = Math.max(maxZ, this.css('z-index'));
+               $.each( this.instances, function() {
+                       maxZ = Math.max( maxZ, this.css( "z-index" ) );
                });
                this.maxZ = maxZ;
        },
@@ -786,8 +778,8 @@ $.extend($.ui.dialog.overlay, {
        height: function() {
                var scrollHeight,
                        offsetHeight;
-               // handle IE 6
-               if ($.browser.msie && $.browser.version < 7) {
+               // handle IE
+               if ( $.ui.ie ) {
                        scrollHeight = Math.max(
                                document.documentElement.scrollHeight,
                                document.body.scrollHeight
@@ -797,14 +789,14 @@ $.extend($.ui.dialog.overlay, {
                                document.body.offsetHeight
                        );
 
-                       if (scrollHeight < offsetHeight) {
-                               return $(window).height() + 'px';
+                       if ( scrollHeight < offsetHeight ) {
+                               return $( window ).height() + "px";
                        } else {
-                               return scrollHeight + 'px';
+                               return scrollHeight + "px";
                        }
                // handle "good" browsers
                } else {
-                       return $(document).height() + 'px';
+                       return $( document ).height() + "px";
                }
        },
 
@@ -812,7 +804,7 @@ $.extend($.ui.dialog.overlay, {
                var scrollWidth,
                        offsetWidth;
                // handle IE
-               if ( $.browser.msie ) {
+               if ( $.ui.ie ) {
                        scrollWidth = Math.max(
                                document.documentElement.scrollWidth,
                                document.body.scrollWidth
@@ -822,14 +814,14 @@ $.extend($.ui.dialog.overlay, {
                                document.body.offsetWidth
                        );
 
-                       if (scrollWidth < offsetWidth) {
-                               return $(window).width() + 'px';
+                       if ( scrollWidth < offsetWidth ) {
+                               return $( window ).width() + "px";
                        } else {
-                               return scrollWidth + 'px';
+                               return scrollWidth + "px";
                        }
                // handle "good" browsers
                } else {
-                       return $(document).width() + 'px';
+                       return $( document ).width() + "px";
                }
        },
 
@@ -842,9 +834,9 @@ $.extend($.ui.dialog.overlay, {
                 * This is handled by shrinking the overlay before setting it
                 * to the full document size.
                 */
-               var $overlays = $([]);
-               $.each($.ui.dialog.overlay.instances, function() {
-                       $overlays = $overlays.add(this);
+               var $overlays = $( [] );
+               $.each( $.ui.dialog.overlay.instances, function() {
+                       $overlays = $overlays.add( this );
                });
 
                $overlays.css({
@@ -857,10 +849,10 @@ $.extend($.ui.dialog.overlay, {
        }
 });
 
-$.extend($.ui.dialog.overlay.prototype, {
+$.extend( $.ui.dialog.overlay.prototype, {
        destroy: function() {
-               $.ui.dialog.overlay.destroy(this.$el);
+               $.ui.dialog.overlay.destroy( this.$el );
        }
 });
 
-}(jQuery));
+}( jQuery ) );