2010-09-04 04:00:09 +00:00
/ *
2011-04-14 13:09:02 +00:00
* jQuery UI Dialog 1.8 . 11
2010-09-04 04:00:09 +00:00
*
2011-04-14 13:09:02 +00:00
* Copyright 2011 , AUTHORS . txt ( http : //jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses .
* http : //jquery.org/license
2010-09-04 04:00:09 +00:00
*
* http : //docs.jquery.com/UI/Dialog
*
* Depends :
* jquery . ui . core . js
* jquery . ui . widget . js
2011-05-29 17:19:25 +00:00
* jquery . ui . button . js
2010-09-04 04:00:09 +00:00
* jquery . ui . draggable . js
* jquery . ui . mouse . js
* jquery . ui . position . js
* jquery . ui . resizable . js
2011-05-29 17:19:25 +00:00
* jquery . ui . droppable . js
2010-09-04 04:00:09 +00:00
* /
2011-04-14 13:09:02 +00:00
( function ( $ , undefined ) {
2010-09-04 04:00:09 +00:00
var uiDialogClasses =
2011-04-14 13:09:02 +00:00
'ui-dialog ' +
'ui-widget ' +
'ui-widget-content ' +
'ui-corner-all ' ,
sizeRelatedOptions = {
buttons : true ,
height : true ,
maxHeight : true ,
maxWidth : true ,
minHeight : true ,
minWidth : true ,
width : true
} ,
resizableRelatedOptions = {
maxHeight : true ,
maxWidth : true ,
minHeight : true ,
minWidth : true
} ;
2010-09-04 04:00:09 +00:00
$ . widget ( "ui.dialog" , {
options : {
autoOpen : true ,
buttons : { } ,
closeOnEscape : true ,
closeText : 'close' ,
dialogClass : '' ,
draggable : true ,
hide : null ,
height : 'auto' ,
maxHeight : false ,
maxWidth : false ,
minHeight : 150 ,
minWidth : 150 ,
modal : false ,
2011-04-14 13:09:02 +00:00
position : {
my : 'center' ,
at : 'center' ,
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 ) ;
}
}
} ,
2010-09-04 04:00:09 +00:00
resizable : true ,
show : null ,
stack : true ,
title : '' ,
width : 300 ,
zIndex : 1000
} ,
2011-04-14 13:09:02 +00:00
2010-09-04 04:00:09 +00:00
_create : function ( ) {
this . originalTitle = this . element . attr ( 'title' ) ;
2011-04-14 13:09:02 +00:00
// #5742 - .attr() might return a DOMElement
if ( typeof this . originalTitle !== "string" ) {
this . originalTitle = "" ;
}
2010-09-04 04:00:09 +00:00
2011-04-14 13:09:02 +00:00
this . options . title = this . options . title || this . originalTitle ;
2010-09-04 04:00:09 +00:00
var self = this ,
options = self . options ,
2011-04-14 13:09:02 +00:00
title = options . title || ' ' ,
2010-09-04 04:00:09 +00:00
titleId = $ . ui . dialog . getTitleId ( self . element ) ,
uiDialog = ( self . uiDialog = $ ( '<div></div>' ) )
. appendTo ( document . body )
. hide ( )
. addClass ( uiDialogClasses + options . dialogClass )
. css ( {
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 . keyCode &&
event . keyCode === $ . ui . keyCode . ESCAPE ) {
self . close ( event ) ;
event . preventDefault ( ) ;
}
} )
. attr ( {
role : 'dialog' ,
'aria-labelledby' : titleId
} )
. mousedown ( function ( event ) {
self . moveToTop ( false , event ) ;
} ) ,
uiDialogContent = self . 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' ) ;
} )
. click ( function ( event ) {
self . close ( event ) ;
return false ;
} )
. appendTo ( uiDialogTitlebar ) ,
uiDialogTitlebarCloseText = ( self . uiDialogTitlebarCloseText = $ ( '<span></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 ) ;
//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 ;
}
uiDialogTitlebar . find ( "*" ) . add ( uiDialogTitlebar ) . disableSelection ( ) ;
if ( options . draggable && $ . fn . draggable ) {
self . _makeDraggable ( ) ;
}
if ( options . resizable && $ . fn . resizable ) {
self . _makeResizable ( ) ;
}
self . _createButtons ( options . buttons ) ;
self . _isOpen = false ;
if ( $ . fn . bgiframe ) {
uiDialog . bgiframe ( ) ;
}
} ,
2011-04-14 13:09:02 +00:00
2010-09-04 04:00:09 +00:00
_init : function ( ) {
if ( this . options . autoOpen ) {
this . open ( ) ;
}
} ,
destroy : function ( ) {
var self = this ;
if ( self . overlay ) {
self . overlay . destroy ( ) ;
}
self . uiDialog . hide ( ) ;
self . element
. unbind ( '.dialog' )
. removeData ( 'dialog' )
. removeClass ( 'ui-dialog-content ui-widget-content' )
. hide ( ) . appendTo ( 'body' ) ;
self . uiDialog . remove ( ) ;
if ( self . originalTitle ) {
self . element . attr ( 'title' , self . originalTitle ) ;
}
return self ;
} ,
2011-04-14 13:09:02 +00:00
2010-09-04 04:00:09 +00:00
widget : function ( ) {
return this . uiDialog ;
} ,
close : function ( event ) {
var self = this ,
2011-04-14 13:09:02 +00:00
maxZ , thisZ ;
2010-09-04 04:00:09 +00:00
if ( false === self . _trigger ( 'beforeClose' , event ) ) {
return ;
}
if ( self . overlay ) {
self . overlay . destroy ( ) ;
}
self . uiDialog . unbind ( 'keypress.ui-dialog' ) ;
self . _isOpen = false ;
if ( self . options . hide ) {
self . uiDialog . hide ( self . options . hide , function ( ) {
self . _trigger ( 'close' , event ) ;
} ) ;
} else {
self . uiDialog . hide ( ) ;
self . _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 ) {
maxZ = 0 ;
$ ( '.ui-dialog' ) . each ( function ( ) {
if ( this !== self . uiDialog [ 0 ] ) {
2011-04-14 13:09:02 +00:00
thisZ = $ ( this ) . css ( 'z-index' ) ;
if ( ! isNaN ( thisZ ) ) {
maxZ = Math . max ( maxZ , thisZ ) ;
}
2010-09-04 04:00:09 +00:00
}
} ) ;
$ . ui . dialog . maxZ = maxZ ;
}
return self ;
} ,
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 self = this ,
options = self . options ,
saveScroll ;
2011-04-14 13:09:02 +00:00
2010-09-04 04:00:09 +00:00
if ( ( options . modal && ! force ) ||
( ! options . stack && ! options . modal ) ) {
return self . _trigger ( 'focus' , event ) ;
}
2011-04-14 13:09:02 +00:00
2010-09-04 04:00:09 +00:00
if ( options . zIndex > $ . ui . dialog . maxZ ) {
$ . ui . dialog . maxZ = options . zIndex ;
}
if ( self . overlay ) {
$ . ui . dialog . maxZ += 1 ;
self . overlay . $el . css ( 'z-index' , $ . ui . dialog . overlay . maxZ = $ . ui . dialog . 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 . attr ( 'scrollTop' ) , scrollLeft : self . element . attr ( 'scrollLeft' ) } ;
$ . ui . dialog . maxZ += 1 ;
self . uiDialog . css ( 'z-index' , $ . ui . dialog . maxZ ) ;
self . element . attr ( saveScroll ) ;
self . _trigger ( 'focus' , event ) ;
return self ;
} ,
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 ) ;
// prevent tabbing out of modal dialogs
if ( options . modal ) {
uiDialog . bind ( 'keypress.ui-dialog' , function ( event ) {
if ( event . keyCode !== $ . ui . keyCode . TAB ) {
return ;
}
2011-04-14 13:09:02 +00:00
2010-09-04 04:00:09 +00:00
var tabbables = $ ( ':tabbable' , this ) ,
first = tabbables . filter ( ':first' ) ,
last = tabbables . filter ( ':last' ) ;
2011-04-14 13:09:02 +00:00
2010-09-04 04:00:09 +00:00
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 ;
}
} ) ;
}
// 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
2011-04-14 13:09:02 +00:00
$ ( self . element . find ( ':tabbable' ) . get ( ) . concat (
uiDialog . find ( '.ui-dialog-buttonpane :tabbable' ) . get ( ) . concat (
uiDialog . get ( ) ) ) ) . eq ( 0 ) . focus ( ) ;
2010-09-04 04:00:09 +00:00
self . _isOpen = true ;
2011-04-14 13:09:02 +00:00
self . _trigger ( 'open' ) ;
2010-09-04 04:00:09 +00:00
return self ;
} ,
_createButtons : function ( buttons ) {
var self = this ,
hasButtons = false ,
uiDialogButtonPane = $ ( '<div></div>' )
. addClass (
'ui-dialog-buttonpane ' +
'ui-widget-content ' +
'ui-helper-clearfix'
2011-04-14 13:09:02 +00:00
) ,
uiButtonSet = $ ( "<div></div>" )
. addClass ( "ui-dialog-buttonset" )
. appendTo ( uiDialogButtonPane ) ;
2010-09-04 04:00:09 +00:00
// if we already have a button pane, remove it
self . uiDialog . find ( '.ui-dialog-buttonpane' ) . remove ( ) ;
if ( typeof buttons === 'object' && buttons !== null ) {
$ . each ( buttons , function ( ) {
return ! ( hasButtons = true ) ;
} ) ;
}
if ( hasButtons ) {
2011-04-14 13:09:02 +00:00
$ . each ( buttons , function ( name , props ) {
props = $ . isFunction ( props ) ?
{ click : props , text : name } :
props ;
2010-09-04 04:00:09 +00:00
var button = $ ( '<button type="button"></button>' )
2011-04-14 13:09:02 +00:00
. attr ( props , true )
. unbind ( 'click' )
. click ( function ( ) {
props . click . apply ( self . element [ 0 ] , arguments ) ;
} )
. appendTo ( uiButtonSet ) ;
2010-09-04 04:00:09 +00:00
if ( $ . fn . button ) {
button . button ( ) ;
}
} ) ;
uiDialogButtonPane . appendTo ( self . uiDialog ) ;
}
} ,
_makeDraggable : function ( ) {
var self = this ,
options = self . options ,
doc = $ ( document ) ,
heightBeforeDrag ;
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 ) ) ;
} ,
drag : function ( event , ui ) {
self . _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 ) ) ;
$ . ui . dialog . overlay . resize ( ) ;
}
} ) ;
} ,
_makeResizable : function ( handles ) {
handles = ( handles === undefined ? this . options . resizable : handles ) ;
var self = this ,
options = self . 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' ?
handles :
'n,e,s,w,se,sw,ne,nw'
) ;
function filteredUi ( ui ) {
return {
originalPosition : ui . originalPosition ,
originalSize : ui . originalSize ,
position : ui . position ,
size : ui . size
} ;
}
self . uiDialog . resizable ( {
cancel : '.ui-dialog-content' ,
containment : 'document' ,
alsoResize : self . element ,
maxWidth : options . maxWidth ,
maxHeight : options . maxHeight ,
minWidth : options . minWidth ,
minHeight : self . _minHeight ( ) ,
handles : resizeHandles ,
start : function ( event , ui ) {
$ ( this ) . addClass ( "ui-dialog-resizing" ) ;
self . _trigger ( 'resizeStart' , event , filteredUi ( ui ) ) ;
} ,
resize : function ( event , ui ) {
self . _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 ) ) ;
$ . ui . dialog . overlay . resize ( ) ;
}
} )
. 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' ) {
return options . minHeight ;
} else {
return Math . min ( options . minHeight , options . height ) ;
}
} ,
_position : function ( position ) {
var myAt = [ ] ,
offset = [ 0 , 0 ] ,
isVisible ;
2011-04-14 13:09:02 +00:00
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(' ');
2010-09-04 04:00:09 +00:00
2011-04-14 13:09:02 +00:00
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 ] ;
}
2010-09-04 04:00:09 +00:00
2011-04-14 13:09:02 +00:00
$ . each ( [ 'left' , 'top' ] , function ( i , offsetPosition ) {
if ( + myAt [ i ] === myAt [ i ] ) {
offset [ i ] = myAt [ i ] ;
myAt [ i ] = offsetPosition ;
}
} ) ;
2010-09-04 04:00:09 +00:00
2011-04-14 13:09:02 +00:00
position = {
my : myAt . join ( " " ) ,
at : myAt . join ( " " ) ,
offset : offset . join ( " " )
} ;
}
2010-09-04 04:00:09 +00:00
2011-04-14 13:09:02 +00:00
position = $ . extend ( { } , $ . ui . dialog . prototype . options . position , position ) ;
} else {
position = $ . ui . dialog . prototype . options . position ;
2010-09-04 04:00:09 +00:00
}
// need to show the dialog to get the actual offset in the position plugin
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 } )
2011-04-14 13:09:02 +00:00
. position ( $ . extend ( { of : window } , position ) ) ;
2010-09-04 04:00:09 +00:00
if ( ! isVisible ) {
this . uiDialog . hide ( ) ;
}
} ,
2011-04-14 13:09:02 +00:00
_setOptions : function ( options ) {
2010-09-04 04:00:09 +00:00
var self = this ,
2011-04-14 13:09:02 +00:00
resizableOptions = { } ,
2010-09-04 04:00:09 +00:00
resize = false ;
2011-04-14 13:09:02 +00:00
$ . each ( options , function ( key , value ) {
self . _setOption ( key , value ) ;
if ( key in sizeRelatedOptions ) {
resize = true ;
}
if ( key in resizableRelatedOptions ) {
resizableOptions [ key ] = value ;
}
} ) ;
if ( resize ) {
this . _size ( ) ;
}
if ( this . uiDialog . is ( ":data(resizable)" ) ) {
this . uiDialog . resizable ( "option" , resizableOptions ) ;
}
} ,
_setOption : function ( key , value ) {
var self = this ,
uiDialog = self . uiDialog ;
2010-09-04 04:00:09 +00:00
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 ;
case "buttons" :
self . _createButtons ( value ) ;
break ;
case "closeText" :
2011-04-14 13:09:02 +00:00
// ensure that we always pass a string
2010-09-04 04:00:09 +00:00
self . uiDialogTitlebarCloseText . text ( "" + value ) ;
break ;
case "dialogClass" :
uiDialog
. removeClass ( self . options . dialogClass )
. addClass ( uiDialogClasses + value ) ;
break ;
case "disabled" :
if ( value ) {
uiDialog . addClass ( 'ui-dialog-disabled' ) ;
} else {
uiDialog . removeClass ( 'ui-dialog-disabled' ) ;
}
break ;
case "draggable" :
2011-04-14 13:09:02 +00:00
var isDraggable = uiDialog . is ( ":data(draggable)" ) ;
if ( isDraggable && ! value ) {
uiDialog . draggable ( "destroy" ) ;
2010-09-04 04:00:09 +00:00
}
2011-04-14 13:09:02 +00:00
if ( ! isDraggable && value ) {
self . _makeDraggable ( ) ;
2010-09-04 04:00:09 +00:00
}
break ;
case "position" :
self . _position ( value ) ;
break ;
case "resizable" :
// currently resizable, becoming non-resizable
2011-04-14 13:09:02 +00:00
var isResizable = uiDialog . is ( ":data(resizable)" ) ;
2010-09-04 04:00:09 +00:00
if ( isResizable && ! value ) {
uiDialog . resizable ( 'destroy' ) ;
}
// currently resizable, changing handles
if ( isResizable && typeof value === 'string' ) {
uiDialog . resizable ( 'option' , 'handles' , value ) ;
}
// currently non-resizable, becoming resizable
if ( ! isResizable && value !== false ) {
self . _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 || ' ' ) ) ;
break ;
}
$ . Widget . prototype . _setOption . apply ( self , arguments ) ;
} ,
_size : function ( ) {
/ * I f t h e u s e r h a s r e s i z e d t h e d i a l o g , t h e . u i - d i a l o g a n d . u i - d i a l o g - c o n t e n t
* divs will both have width and height set , so we need to reset them
* /
var options = this . options ,
2011-04-14 13:09:02 +00:00
nonContentHeight ,
minContentHeight ,
isVisible = this . uiDialog . is ( ":visible" ) ;
2010-09-04 04:00:09 +00:00
// reset content sizing
2011-04-14 13:09:02 +00:00
this . element . show ( ) . css ( {
2010-09-04 04:00:09 +00:00
width : 'auto' ,
minHeight : 0 ,
height : 0
} ) ;
2011-04-14 13:09:02 +00:00
if ( options . minWidth > options . width ) {
options . width = options . minWidth ;
}
2010-09-04 04:00:09 +00:00
// reset wrapper sizing
// determine the height of all the non-content elements
nonContentHeight = this . uiDialog . css ( {
height : 'auto' ,
width : options . width
} )
. height ( ) ;
2011-04-14 13:09:02 +00:00
minContentHeight = Math . max ( 0 , options . minHeight - nonContentHeight ) ;
if ( options . height === "auto" ) {
// only needed for IE6 support
if ( $ . support . minHeight ) {
this . element . css ( {
minHeight : minContentHeight ,
height : "auto"
} ) ;
} else {
this . uiDialog . show ( ) ;
var autoHeight = this . element . css ( "height" , "auto" ) . height ( ) ;
if ( ! isVisible ) {
this . uiDialog . hide ( ) ;
}
this . element . height ( Math . max ( autoHeight , minContentHeight ) ) ;
}
} else {
this . element . height ( Math . max ( options . height - nonContentHeight , 0 ) ) ;
}
2010-09-04 04:00:09 +00:00
if ( this . uiDialog . is ( ':data(resizable)' ) ) {
this . uiDialog . resizable ( 'option' , 'minHeight' , this . _minHeight ( ) ) ;
}
}
} ) ;
$ . extend ( $ . ui . dialog , {
2011-04-14 13:09:02 +00:00
version : "1.8.11" ,
2010-09-04 04:00:09 +00:00
uuid : 0 ,
maxZ : 0 ,
getTitleId : function ( $el ) {
var id = $el . attr ( 'id' ) ;
if ( ! id ) {
this . uuid += 1 ;
id = this . uuid ;
}
return 'ui-dialog-title-' + id ;
} ,
overlay : function ( dialog ) {
this . $el = $ . ui . dialog . overlay . create ( dialog ) ;
}
} ) ;
$ . 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 ) {
// 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 ) {
// stop events if the z-index of the target is < the z-index of the overlay
2011-04-14 13:09:02 +00:00
// we cannot return true when we don't want to cancel the event (#3523)
if ( $ ( event . target ) . zIndex ( ) < $ . ui . dialog . overlay . maxZ ) {
return false ;
}
2010-09-04 04:00:09 +00:00
} ) ;
}
} , 1 ) ;
// allow closing by pressing the escape key
$ ( document ) . bind ( 'keydown.dialog-overlay' , function ( event ) {
if ( dialog . options . closeOnEscape && event . keyCode &&
event . keyCode === $ . ui . keyCode . ESCAPE ) {
dialog . close ( event ) ;
event . preventDefault ( ) ;
}
} ) ;
// handle window 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 ( )
} ) ;
if ( $ . fn . bgiframe ) {
$el . bgiframe ( ) ;
}
this . instances . push ( $el ) ;
return $el ;
} ,
destroy : function ( $el ) {
2011-04-14 13:09:02 +00:00
var indexOf = $ . inArray ( $el , this . instances ) ;
if ( indexOf != - 1 ) {
this . oldInstances . push ( this . instances . splice ( indexOf , 1 ) [ 0 ] ) ;
}
2010-09-04 04:00:09 +00:00
if ( this . instances . length === 0 ) {
$ ( [ document , window ] ) . unbind ( '.dialog-overlay' ) ;
}
$el . 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' ) ) ;
} ) ;
this . maxZ = maxZ ;
} ,
height : function ( ) {
var scrollHeight ,
offsetHeight ;
// handle IE 6
if ( $ . browser . msie && $ . browser . version < 7 ) {
scrollHeight = Math . max (
document . documentElement . scrollHeight ,
document . body . scrollHeight
) ;
offsetHeight = Math . max (
document . documentElement . offsetHeight ,
document . body . offsetHeight
) ;
if ( scrollHeight < offsetHeight ) {
return $ ( window ) . height ( ) + 'px' ;
} else {
return scrollHeight + 'px' ;
}
// handle "good" browsers
} else {
return $ ( document ) . height ( ) + 'px' ;
}
} ,
width : function ( ) {
var scrollWidth ,
offsetWidth ;
// handle IE 6
if ( $ . browser . msie && $ . browser . version < 7 ) {
scrollWidth = Math . max (
document . documentElement . scrollWidth ,
document . body . scrollWidth
) ;
offsetWidth = Math . max (
document . documentElement . offsetWidth ,
document . body . offsetWidth
) ;
if ( scrollWidth < offsetWidth ) {
return $ ( window ) . width ( ) + 'px' ;
} else {
return scrollWidth + 'px' ;
}
// handle "good" browsers
} else {
return $ ( document ) . width ( ) + 'px' ;
}
} ,
resize : function ( ) {
/ * I f t h e d i a l o g i s d r a g g a b l e a n d t h e u s e r d r a g s i t p a s t t h e
* right edge of the window , the document becomes wider so we
* need to stretch the overlay . If the user then drags the
* dialog back to the left , the document will become narrower ,
* so we need to shrink the overlay to the appropriate size .
* 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 ) ;
} ) ;
$overlays . css ( {
width : 0 ,
height : 0
} ) . css ( {
width : $ . ui . dialog . overlay . width ( ) ,
height : $ . ui . dialog . overlay . height ( )
} ) ;
}
} ) ;
$ . extend ( $ . ui . dialog . overlay . prototype , {
destroy : function ( ) {
$ . ui . dialog . overlay . destroy ( this . $el ) ;
}
} ) ;
2011-05-29 17:19:25 +00:00
/* jquery.ui.droppable.js */
$ . widget ( "ui.droppable" , {
widgetEventPrefix : "drop" ,
options : {
accept : '*' ,
activeClass : false ,
addClasses : true ,
greedy : false ,
hoverClass : false ,
scope : 'default' ,
tolerance : 'intersect'
} ,
_create : function ( ) {
var o = this . options , accept = o . accept ;
this . isover = 0 ; this . isout = 1 ;
this . accept = $ . isFunction ( accept ) ? accept : function ( d ) {
return d . is ( accept ) ;
} ;
//Store the droppable's proportions
this . proportions = { width : this . element [ 0 ] . offsetWidth , height : this . element [ 0 ] . offsetHeight } ;
// Add the reference and positions to the manager
$ . ui . ddmanager . droppables [ o . scope ] = $ . ui . ddmanager . droppables [ o . scope ] || [ ] ;
$ . ui . ddmanager . droppables [ o . scope ] . push ( this ) ;
( o . addClasses && this . element . addClass ( "ui-droppable" ) ) ;
} ,
destroy : function ( ) {
var drop = $ . ui . ddmanager . droppables [ this . options . scope ] ;
for ( var i = 0 ; i < drop . length ; i ++ )
if ( drop [ i ] == this )
drop . splice ( i , 1 ) ;
this . element
. removeClass ( "ui-droppable ui-droppable-disabled" )
. removeData ( "droppable" )
. unbind ( ".droppable" ) ;
return this ;
} ,
_setOption : function ( key , value ) {
if ( key == 'accept' ) {
this . accept = $ . isFunction ( value ) ? value : function ( d ) {
return d . is ( value ) ;
} ;
}
$ . Widget . prototype . _setOption . apply ( this , arguments ) ;
} ,
_activate : function ( event ) {
var draggable = $ . ui . ddmanager . current ;
if ( this . options . activeClass ) this . element . addClass ( this . options . activeClass ) ;
( draggable && this . _trigger ( 'activate' , event , this . ui ( draggable ) ) ) ;
} ,
_deactivate : function ( event ) {
var draggable = $ . ui . ddmanager . current ;
if ( this . options . activeClass ) this . element . removeClass ( this . options . activeClass ) ;
( draggable && this . _trigger ( 'deactivate' , event , this . ui ( draggable ) ) ) ;
} ,
_over : function ( event ) {
var draggable = $ . ui . ddmanager . current ;
if ( ! draggable || ( draggable . currentItem || draggable . element ) [ 0 ] == this . element [ 0 ] ) return ; // Bail if draggable and droppable are same element
if ( this . accept . call ( this . element [ 0 ] , ( draggable . currentItem || draggable . element ) ) ) {
if ( this . options . hoverClass ) this . element . addClass ( this . options . hoverClass ) ;
this . _trigger ( 'over' , event , this . ui ( draggable ) ) ;
}
} ,
_out : function ( event ) {
var draggable = $ . ui . ddmanager . current ;
if ( ! draggable || ( draggable . currentItem || draggable . element ) [ 0 ] == this . element [ 0 ] ) return ; // Bail if draggable and droppable are same element
if ( this . accept . call ( this . element [ 0 ] , ( draggable . currentItem || draggable . element ) ) ) {
if ( this . options . hoverClass ) this . element . removeClass ( this . options . hoverClass ) ;
this . _trigger ( 'out' , event , this . ui ( draggable ) ) ;
}
} ,
_drop : function ( event , custom ) {
var draggable = custom || $ . ui . ddmanager . current ;
if ( ! draggable || ( draggable . currentItem || draggable . element ) [ 0 ] == this . element [ 0 ] ) return false ; // Bail if draggable and droppable are same element
var childrenIntersection = false ;
this . element . find ( ":data(droppable)" ) . not ( ".ui-draggable-dragging" ) . each ( function ( ) {
var inst = $ . data ( this , 'droppable' ) ;
if (
inst . options . greedy
&& ! inst . options . disabled
&& inst . options . scope == draggable . options . scope
&& inst . accept . call ( inst . element [ 0 ] , ( draggable . currentItem || draggable . element ) )
&& $ . ui . intersect ( draggable , $ . extend ( inst , { offset : inst . element . offset ( ) } ) , inst . options . tolerance )
) { childrenIntersection = true ; return false ; }
} ) ;
if ( childrenIntersection ) return false ;
if ( this . accept . call ( this . element [ 0 ] , ( draggable . currentItem || draggable . element ) ) ) {
if ( this . options . activeClass ) this . element . removeClass ( this . options . activeClass ) ;
if ( this . options . hoverClass ) this . element . removeClass ( this . options . hoverClass ) ;
this . _trigger ( 'drop' , event , this . ui ( draggable ) ) ;
return this . element ;
}
return false ;
} ,
ui : function ( c ) {
return {
draggable : ( c . currentItem || c . element ) ,
helper : c . helper ,
position : c . position ,
offset : c . positionAbs
} ;
}
} ) ;
$ . extend ( $ . ui . droppable , {
version : "1.8.11"
} ) ;
$ . ui . intersect = function ( draggable , droppable , toleranceMode ) {
if ( ! droppable . offset ) return false ;
var x1 = ( draggable . positionAbs || draggable . position . absolute ) . left , x2 = x1 + draggable . helperProportions . width ,
y1 = ( draggable . positionAbs || draggable . position . absolute ) . top , y2 = y1 + draggable . helperProportions . height ;
var l = droppable . offset . left , r = l + droppable . proportions . width ,
t = droppable . offset . top , b = t + droppable . proportions . height ;
switch ( toleranceMode ) {
case 'fit' :
return ( l <= x1 && x2 <= r
&& t <= y1 && y2 <= b ) ;
break ;
case 'intersect' :
return ( l < x1 + ( draggable . helperProportions . width / 2 ) // Right Half
&& x2 - ( draggable . helperProportions . width / 2 ) < r // Left Half
&& t < y1 + ( draggable . helperProportions . height / 2 ) // Bottom Half
&& y2 - ( draggable . helperProportions . height / 2 ) < b ) ; // Top Half
break ;
case 'pointer' :
var draggableLeft = ( ( draggable . positionAbs || draggable . position . absolute ) . left + ( draggable . clickOffset || draggable . offset . click ) . left ) ,
draggableTop = ( ( draggable . positionAbs || draggable . position . absolute ) . top + ( draggable . clickOffset || draggable . offset . click ) . top ) ,
isOver = $ . ui . isOver ( draggableTop , draggableLeft , t , l , droppable . proportions . height , droppable . proportions . width ) ;
return isOver ;
break ;
case 'touch' :
return (
( y1 >= t && y1 <= b ) || // Top edge touching
( y2 >= t && y2 <= b ) || // Bottom edge touching
( y1 < t && y2 > b ) // Surrounded vertically
) && (
( x1 >= l && x1 <= r ) || // Left edge touching
( x2 >= l && x2 <= r ) || // Right edge touching
( x1 < l && x2 > r ) // Surrounded horizontally
) ;
break ;
default :
return false ;
break ;
}
} ;
/ *
This manager tracks offsets of draggables and droppables
* /
$ . ui . ddmanager = {
current : null ,
droppables : { 'default' : [ ] } ,
prepareOffsets : function ( t , event ) {
var m = $ . ui . ddmanager . droppables [ t . options . scope ] || [ ] ;
var type = event ? event . type : null ; // workaround for #2317
var list = ( t . currentItem || t . element ) . find ( ":data(droppable)" ) . andSelf ( ) ;
droppablesLoop : for ( var i = 0 ; i < m . length ; i ++ ) {
if ( m [ i ] . options . disabled || ( t && ! m [ i ] . accept . call ( m [ i ] . element [ 0 ] , ( t . currentItem || t . element ) ) ) ) continue ; //No disabled and non-accepted
for ( var j = 0 ; j < list . length ; j ++ ) { if ( list [ j ] == m [ i ] . element [ 0 ] ) { m [ i ] . proportions . height = 0 ; continue droppablesLoop ; } } ; //Filter out elements in the current dragged item
m [ i ] . visible = m [ i ] . element . css ( "display" ) != "none" ; if ( ! m [ i ] . visible ) continue ; //If the element is not visible, continue
if ( type == "mousedown" ) m [ i ] . _activate . call ( m [ i ] , event ) ; //Activate the droppable if used directly from draggables
m [ i ] . offset = m [ i ] . element . offset ( ) ;
m [ i ] . proportions = { width : m [ i ] . element [ 0 ] . offsetWidth , height : m [ i ] . element [ 0 ] . offsetHeight } ;
}
} ,
drop : function ( draggable , event ) {
var dropped = false ;
$ . each ( $ . ui . ddmanager . droppables [ draggable . options . scope ] || [ ] , function ( ) {
if ( ! this . options ) return ;
if ( ! this . options . disabled && this . visible && $ . ui . intersect ( draggable , this , this . options . tolerance ) )
dropped = dropped || this . _drop . call ( this , event ) ;
if ( ! this . options . disabled && this . visible && this . accept . call ( this . element [ 0 ] , ( draggable . currentItem || draggable . element ) ) ) {
this . isout = 1 ; this . isover = 0 ;
this . _deactivate . call ( this , event ) ;
}
} ) ;
return dropped ;
} ,
drag : function ( draggable , event ) {
//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
if ( draggable . options . refreshPositions ) $ . ui . ddmanager . prepareOffsets ( draggable , event ) ;
//Run through all droppables and check their positions based on specific tolerance options
$ . each ( $ . ui . ddmanager . droppables [ draggable . options . scope ] || [ ] , function ( ) {
if ( this . options . disabled || this . greedyChild || ! this . visible ) return ;
var intersects = $ . ui . intersect ( draggable , this , this . options . tolerance ) ;
var c = ! intersects && this . isover == 1 ? 'isout' : ( intersects && this . isover == 0 ? 'isover' : null ) ;
if ( ! c ) return ;
var parentInstance ;
if ( this . options . greedy ) {
var parent = this . element . parents ( ':data(droppable):eq(0)' ) ;
if ( parent . length ) {
parentInstance = $ . data ( parent [ 0 ] , 'droppable' ) ;
parentInstance . greedyChild = ( c == 'isover' ? 1 : 0 ) ;
}
}
// we just moved into a greedy child
if ( parentInstance && c == 'isover' ) {
parentInstance [ 'isover' ] = 0 ;
parentInstance [ 'isout' ] = 1 ;
parentInstance . _out . call ( parentInstance , event ) ;
}
this [ c ] = 1 ; this [ c == 'isout' ? 'isover' : 'isout' ] = 0 ;
this [ c == "isover" ? "_over" : "_out" ] . call ( this , event ) ;
// we just moved out of a greedy child
if ( parentInstance && c == 'isout' ) {
parentInstance [ 'isout' ] = 0 ;
parentInstance [ 'isover' ] = 1 ;
parentInstance . _over . call ( parentInstance , event ) ;
}
} ) ;
}
} ;
2010-09-04 04:00:09 +00:00
} ( jQuery ) ) ;