" ) )
.addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" ),
uiButtonSet = ( this.uiButtonSet = $( "
" ) )
.addClass( "ui-dialog-buttonset" )
.appendTo( uiDialogButtonPane );
uiDialog.attr({
role: "dialog",
"aria-labelledby": uiDialogTitle.attr( "id" )
});
uiDialogTitlebar.find( "*" ).add( uiDialogTitlebar ).disableSelection();
this._hoverable( uiDialogTitlebarClose );
this._focusable( uiDialogTitlebarClose );
if ( options.draggable && $.fn.draggable ) {
this._makeDraggable();
}
if ( options.resizable && $.fn.resizable ) {
this._makeResizable();
}
this._createButtons( options.buttons );
this._isOpen = false;
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() {
if ( this.options.autoOpen ) {
this.open();
}
},
_destroy: function() {
var next,
oldPosition = this.oldPosition;
if ( this.overlay ) {
this.overlay.destroy();
}
this.uiDialog.hide();
this.element
.removeClass( "ui-dialog-content ui-widget-content" )
.hide()
.appendTo( "body" );
this.uiDialog.remove();
if ( this.originalTitle ) {
this.element.attr( "title", this.originalTitle );
}
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 that = this,
maxZ, thisZ;
if ( !this._isOpen ) {
return;
}
if ( false === this._trigger( "beforeClose", event ) ) {
return;
}
this._isOpen = false;
if ( this.overlay ) {
this.overlay.destroy();
}
if ( this.options.hide ) {
this.uiDialog.hide( this.options.hide, function() {
that._trigger( "close", event );
});
} else {
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 ( this.options.modal ) {
maxZ = 0;
$( ".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 this;
},
isOpen: function() {
return this._isOpen;
},
// the force parameter allows us to move modal dialogs to their correct
// position on open
moveToTop: function( force, event ) {
var options = this.options,
saveScroll;
if ( ( options.modal && !force ) ||
( !options.stack && !options.modal ) ) {
return this._trigger( "focus", event );
}
if ( options.zIndex > $.ui.dialog.maxZ ) {
$.ui.dialog.maxZ = options.zIndex;
}
if ( this.overlay ) {
$.ui.dialog.maxZ += 1;
$.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ;
this.overlay.$el.css( "z-index", $.ui.dialog.overlay.maxZ );
}
// 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;
this.uiDialog.css( "z-index", $.ui.dialog.maxZ );
this.element.attr( saveScroll );
this._trigger( "focus", event );
return this;
},
open: function() {
if ( this._isOpen ) {
return;
}
var hasFocus,
options = this.options,
uiDialog = this.uiDialog;
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
hasFocus = this.element.find( ":tabbable" );
if ( !hasFocus.length ) {
hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
if ( !hasFocus.length ) {
hasFocus = uiDialog;
}
}
hasFocus.eq( 0 ).focus();
this._isOpen = true;
this._trigger( "open" );
return this;
},
_createButtons: function( buttons ) {
var uiDialogButtonPane, uiButtonSet,
that = this,
hasButtons = false;
// if we already have a button pane, remove it
this.uiDialogButtonPane.remove();
this.uiButtonSet.empty();
if ( typeof buttons === "object" && buttons !== null ) {
$.each( buttons, function() {
return !(hasButtons = true);
});
}
if ( hasButtons ) {
$.each( buttons, function( name, props ) {
props = $.isFunction( props ) ?
{ click: props, text: name } :
props;
var button = $( "