2012-02-27 00:49:51 +00:00
/ * !
2008-09-04 22:03:30 +00:00
* jQuery UI Sortable @ VERSION
2012-07-04 13:08:08 +00:00
* http : //jqueryui.com
2008-06-04 02:34:33 +00:00
*
2014-12-21 18:27:43 +00:00
* Copyright jQuery Foundation and other contributors
2012-08-09 14:13:24 +00:00
* Released under the MIT license .
2010-07-09 13:01:04 +00:00
* http : //jquery.org/license
2008-06-04 02:34:33 +00:00
* /
2014-10-30 19:55:08 +00:00
//>>label: Sortable
//>>group: Interactions
//>>description: Enables items in a list to be sorted using the mouse.
//>>docs: http://api.jqueryui.com/sortable/
//>>demos: http://jqueryui.com/sortable/
2014-04-15 14:45:46 +00:00
//>>css.structure: ../themes/base/sortable.css
2014-10-30 19:55:08 +00:00
2013-07-12 16:40:48 +00:00
( function ( factory ) {
if ( typeof define === "function" && define . amd ) {
// AMD. Register as an anonymous module.
define ( [
"jquery" ,
2015-07-15 02:08:51 +00:00
"./mouse" ,
"../data" ,
"../ie" ,
"../scroll-parent" ,
"../version" ,
"../widget"
2013-07-12 16:40:48 +00:00
] , factory ) ;
} else {
// Browser globals
factory ( jQuery ) ;
}
} ( function ( $ ) {
2008-06-04 02:34:33 +00:00
2013-07-12 16:40:48 +00:00
return $ . widget ( "ui.sortable" , $ . ui . mouse , {
2011-05-28 19:39:55 +00:00
version : "@VERSION" ,
2010-02-05 03:03:50 +00:00
widgetEventPrefix : "sort" ,
2012-01-20 03:54:47 +00:00
ready : false ,
2010-01-07 03:19:50 +00:00
options : {
appendTo : "parent" ,
axis : false ,
connectWith : false ,
containment : false ,
2012-12-25 17:01:09 +00:00
cursor : "auto" ,
2010-01-07 03:19:50 +00:00
cursorAt : false ,
dropOnEmpty : true ,
forcePlaceholderSize : false ,
forceHelperSize : false ,
grid : false ,
handle : false ,
helper : "original" ,
2012-12-25 17:01:09 +00:00
items : "> *" ,
2010-01-07 03:19:50 +00:00
opacity : false ,
placeholder : false ,
revert : false ,
scroll : true ,
scrollSensitivity : 20 ,
scrollSpeed : 20 ,
scope : "default" ,
tolerance : "intersect" ,
2013-01-02 23:27:22 +00:00
zIndex : 1000 ,
// callbacks
activate : null ,
beforeStop : null ,
change : null ,
deactivate : null ,
out : null ,
over : null ,
receive : null ,
remove : null ,
sort : null ,
start : null ,
stop : null ,
update : null
2010-01-07 03:19:50 +00:00
} ,
2013-09-17 13:56:00 +00:00
_isOverAxis : function ( x , reference , size ) {
return ( x >= reference ) && ( x < ( reference + size ) ) ;
} ,
_isFloating : function ( item ) {
return ( /left|right/ ) . test ( item . css ( "float" ) ) || ( /inline|table-cell/ ) . test ( item . css ( "display" ) ) ;
} ,
2010-01-15 18:58:20 +00:00
_create : function ( ) {
2008-06-04 02:34:33 +00:00
this . containerCache = { } ;
2015-02-24 21:16:47 +00:00
this . _addClass ( "ui-sortable" ) ;
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
//Get the items
this . refresh ( ) ;
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
//Let's determine the parent's offset
this . offset = this . element . offset ( ) ;
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
//Initialize mouse events for interaction
2008-08-17 08:15:49 +00:00
this . _mouseInit ( ) ;
2012-04-19 13:03:22 +00:00
2013-12-13 03:10:06 +00:00
this . _setHandleClassName ( ) ;
2012-01-20 03:54:47 +00:00
//We're ready to go
2012-11-02 00:54:52 +00:00
this . ready = true ;
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
} ,
2008-11-21 04:01:33 +00:00
2013-12-13 03:10:06 +00:00
_setOption : function ( key , value ) {
this . _super ( key , value ) ;
if ( key === "handle" ) {
this . _setHandleClassName ( ) ;
}
} ,
_setHandleClassName : function ( ) {
2015-02-24 21:16:47 +00:00
var that = this ;
this . _removeClass ( this . element . find ( ".ui-sortable-handle" ) , "ui-sortable-handle" ) ;
2013-12-13 03:10:06 +00:00
$ . each ( this . items , function ( ) {
2015-02-24 21:16:47 +00:00
that . _addClass (
this . instance . options . handle ?
this . item . find ( this . instance . options . handle ) :
this . item ,
"ui-sortable-handle"
) ;
2013-12-13 03:10:06 +00:00
} ) ;
} ,
2012-02-02 16:38:51 +00:00
_destroy : function ( ) {
2008-11-21 04:01:33 +00:00
this . _mouseDestroy ( ) ;
2012-11-17 03:51:24 +00:00
for ( var i = this . items . length - 1 ; i >= 0 ; i -- ) {
2011-09-27 11:57:06 +00:00
this . items [ i ] . item . removeData ( this . widgetName + "-item" ) ;
2012-11-17 03:51:24 +00:00
}
2009-04-15 02:33:28 +00:00
return this ;
2008-11-21 04:01:33 +00:00
} ,
_mouseCapture : function ( event , overrideHandle ) {
2012-11-17 03:51:24 +00:00
var currentItem = null ,
validHandle = false ,
that = this ;
2008-11-21 04:01:33 +00:00
if ( this . reverting ) {
return false ;
}
2012-12-25 17:01:09 +00:00
if ( this . options . disabled || this . options . type === "static" ) {
2012-11-17 03:51:24 +00:00
return false ;
}
2008-11-21 04:01:33 +00:00
//We have to refresh the items data once first
this . _refreshItems ( event ) ;
//Find out if the clicked node (or one of its parents) is a actual item in this.items
2012-11-02 00:54:52 +00:00
$ ( event . target ) . parents ( ) . each ( function ( ) {
2012-12-25 17:01:09 +00:00
if ( $ . data ( this , that . widgetName + "-item" ) === that ) {
2008-11-21 04:01:33 +00:00
currentItem = $ ( this ) ;
return false ;
}
} ) ;
2012-12-25 17:01:09 +00:00
if ( $ . data ( event . target , that . widgetName + "-item" ) === that ) {
2012-11-17 03:51:24 +00:00
currentItem = $ ( event . target ) ;
}
2008-11-21 04:01:33 +00:00
2012-11-17 03:51:24 +00:00
if ( ! currentItem ) {
return false ;
}
2008-11-21 04:01:33 +00:00
if ( this . options . handle && ! overrideHandle ) {
2012-12-14 16:13:46 +00:00
$ ( this . options . handle , currentItem ) . find ( "*" ) . addBack ( ) . each ( function ( ) {
2012-11-17 03:51:24 +00:00
if ( this === event . target ) {
validHandle = true ;
}
} ) ;
if ( ! validHandle ) {
return false ;
}
2008-11-21 04:01:33 +00:00
}
this . currentItem = currentItem ;
this . _removeCurrentsFromItems ( ) ;
return true ;
} ,
_mouseStart : function ( event , overrideHandle , noActivation ) {
2013-02-13 16:34:52 +00:00
var i , body ,
2012-11-17 03:51:24 +00:00
o = this . options ;
2008-11-21 04:01:33 +00:00
this . currentContainer = this ;
//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
this . refreshPositions ( ) ;
//Create and append the visible helper
2008-11-25 09:57:41 +00:00
this . helper = this . _createHelper ( event ) ;
2008-11-28 15:43:32 +00:00
2008-11-25 09:57:41 +00:00
//Cache the helper size
this . _cacheHelperProportions ( ) ;
2008-11-21 04:01:33 +00:00
/ *
* - Position generation -
* This block generates everything position related - it ' s the core of draggables .
* /
2008-11-25 09:57:41 +00:00
//Cache the margins of the original element
this . _cacheMargins ( ) ;
2008-12-17 19:24:06 +00:00
2008-12-02 12:47:53 +00:00
//Get the next scrolling parent
2008-11-25 09:57:41 +00:00
this . scrollParent = this . helper . scrollParent ( ) ;
2008-11-28 15:43:32 +00:00
2008-11-25 09:57:41 +00:00
//The element's absolute position on the page minus margins
2008-11-28 15:43:32 +00:00
this . offset = this . currentItem . offset ( ) ;
2008-11-25 09:57:41 +00:00
this . offset = {
2008-11-21 04:01:33 +00:00
top : this . offset . top - this . margins . top ,
left : this . offset . left - this . margins . left
2008-10-28 05:44:17 +00:00
} ;
2008-12-17 19:24:06 +00:00
2008-11-25 09:57:41 +00:00
$ . extend ( this . offset , {
click : { //Where the click happened, relative to the element
left : event . pageX - this . offset . left ,
top : event . pageY - this . offset . top
} ,
parent : this . _getParentOffset ( ) ,
relative : this . _getRelativeOffset ( ) //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
} ) ;
2008-11-21 04:01:33 +00:00
2012-05-07 10:28:47 +00:00
// Only after we got the offset, we can change the helper's position to absolute
// TODO: Still need to figure out a way to make relative sorting possible
this . helper . css ( "position" , "absolute" ) ;
this . cssPosition = this . helper . css ( "position" ) ;
2012-05-10 00:19:51 +00:00
2009-01-09 14:08:32 +00:00
//Generate the original position
this . originalPosition = this . _generatePosition ( event ) ;
this . originalPageX = event . pageX ;
this . originalPageY = event . pageY ;
2012-12-25 17:01:09 +00:00
//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
2009-08-03 13:17:00 +00:00
( o . cursorAt && this . _adjustOffsetFromHelper ( o . cursorAt ) ) ;
2008-11-21 04:01:33 +00:00
2008-11-25 09:57:41 +00:00
//Cache the former DOM position
this . domPosition = { prev : this . currentItem . prev ( ) [ 0 ] , parent : this . currentItem . parent ( ) [ 0 ] } ;
2008-11-28 15:43:32 +00:00
2008-11-25 09:57:41 +00:00
//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
2012-11-17 03:51:24 +00:00
if ( this . helper [ 0 ] !== this . currentItem [ 0 ] ) {
2008-11-25 09:57:41 +00:00
this . currentItem . hide ( ) ;
2008-11-21 04:01:33 +00:00
}
//Create the placeholder
this . _createPlaceholder ( ) ;
2008-12-17 19:24:06 +00:00
2008-12-11 11:18:28 +00:00
//Set a containment if given in the options
2012-11-17 03:51:24 +00:00
if ( o . containment ) {
2008-12-11 11:18:28 +00:00
this . _setContainment ( ) ;
2012-11-17 03:51:24 +00:00
}
2008-11-21 04:01:33 +00:00
2013-02-13 16:34:52 +00:00
if ( o . cursor && o . cursor !== "auto" ) { // cursor option
body = this . document . find ( "body" ) ;
// support: IE
this . storedCursor = body . css ( "cursor" ) ;
body . css ( "cursor" , o . cursor ) ;
this . storedStylesheet = $ ( "<style>*{ cursor: " + o . cursor + " !important; }</style>" ) . appendTo ( body ) ;
2009-01-16 20:41:03 +00:00
}
2009-01-22 13:10:18 +00:00
2009-01-16 20:41:03 +00:00
if ( o . opacity ) { // opacity option
2012-11-17 03:51:24 +00:00
if ( this . helper . css ( "opacity" ) ) {
this . _storedOpacity = this . helper . css ( "opacity" ) ;
}
2009-01-16 20:41:03 +00:00
this . helper . css ( "opacity" , o . opacity ) ;
}
2009-01-22 13:10:18 +00:00
2009-01-16 20:41:03 +00:00
if ( o . zIndex ) { // zIndex option
2012-11-17 03:51:24 +00:00
if ( this . helper . css ( "zIndex" ) ) {
this . _storedZIndex = this . helper . css ( "zIndex" ) ;
}
2009-01-16 20:41:03 +00:00
this . helper . css ( "zIndex" , o . zIndex ) ;
}
2009-01-22 13:10:18 +00:00
2009-01-16 20:41:03 +00:00
//Prepare scrolling
2015-02-02 19:59:03 +00:00
if ( this . scrollParent [ 0 ] !== this . document [ 0 ] && this . scrollParent [ 0 ] . tagName !== "HTML" ) {
2009-01-16 20:41:03 +00:00
this . overflowOffset = this . scrollParent . offset ( ) ;
2012-11-17 03:51:24 +00:00
}
2009-01-16 20:41:03 +00:00
//Call callbacks
this . _trigger ( "start" , event , this . _uiHash ( ) ) ;
2008-11-21 04:01:33 +00:00
//Recache the helper size
2012-11-17 03:51:24 +00:00
if ( ! this . _preserveHelperProportions ) {
2008-11-25 09:57:41 +00:00
this . _cacheHelperProportions ( ) ;
2012-11-17 03:51:24 +00:00
}
2008-11-21 04:01:33 +00:00
2012-12-25 17:01:09 +00:00
//Post "activate" events to possible containers
2012-11-17 03:51:24 +00:00
if ( ! noActivation ) {
for ( i = this . containers . length - 1 ; i >= 0 ; i -- ) {
this . containers [ i ] . _trigger ( "activate" , event , this . _uiHash ( this ) ) ;
}
2008-11-21 04:01:33 +00:00
}
//Prepare possible droppables
2012-11-17 03:51:24 +00:00
if ( $ . ui . ddmanager ) {
2008-11-21 04:01:33 +00:00
$ . ui . ddmanager . current = this ;
2012-11-17 03:51:24 +00:00
}
2008-11-21 04:01:33 +00:00
2012-11-17 03:51:24 +00:00
if ( $ . ui . ddmanager && ! o . dropBehaviour ) {
2008-11-21 04:01:33 +00:00
$ . ui . ddmanager . prepareOffsets ( this , event ) ;
2012-11-17 03:51:24 +00:00
}
2008-11-21 04:01:33 +00:00
this . dragging = true ;
2015-02-24 21:16:47 +00:00
this . _addClass ( this . helper , "ui-sortable-helper" ) ;
2008-11-21 04:01:33 +00:00
this . _mouseDrag ( event ) ; //Execute the drag once - this causes the helper not to be visible before getting its correct position
return true ;
} ,
_mouseDrag : function ( event ) {
2012-11-17 03:51:24 +00:00
var i , item , itemElement , intersection ,
o = this . options ,
scrolled = false ;
2008-11-28 15:43:32 +00:00
2008-11-21 15:30:15 +00:00
//Compute the helpers position
2008-11-21 04:01:33 +00:00
this . position = this . _generatePosition ( event ) ;
this . positionAbs = this . _convertPositionTo ( "absolute" ) ;
if ( ! this . lastPositionAbs ) {
this . lastPositionAbs = this . positionAbs ;
}
2009-01-16 20:41:03 +00:00
//Do scrolling
if ( this . options . scroll ) {
2015-02-02 19:59:03 +00:00
if ( this . scrollParent [ 0 ] !== this . document [ 0 ] && this . scrollParent [ 0 ] . tagName !== "HTML" ) {
2009-01-22 13:10:18 +00:00
2012-11-17 03:51:24 +00:00
if ( ( this . overflowOffset . top + this . scrollParent [ 0 ] . offsetHeight ) - event . pageY < o . scrollSensitivity ) {
2009-01-16 20:41:03 +00:00
this . scrollParent [ 0 ] . scrollTop = scrolled = this . scrollParent [ 0 ] . scrollTop + o . scrollSpeed ;
2012-11-17 03:51:24 +00:00
} else if ( event . pageY - this . overflowOffset . top < o . scrollSensitivity ) {
2009-01-16 20:41:03 +00:00
this . scrollParent [ 0 ] . scrollTop = scrolled = this . scrollParent [ 0 ] . scrollTop - o . scrollSpeed ;
2012-11-17 03:51:24 +00:00
}
2009-01-22 13:10:18 +00:00
2012-11-17 03:51:24 +00:00
if ( ( this . overflowOffset . left + this . scrollParent [ 0 ] . offsetWidth ) - event . pageX < o . scrollSensitivity ) {
2009-01-16 20:41:03 +00:00
this . scrollParent [ 0 ] . scrollLeft = scrolled = this . scrollParent [ 0 ] . scrollLeft + o . scrollSpeed ;
2012-11-17 03:51:24 +00:00
} else if ( event . pageX - this . overflowOffset . left < o . scrollSensitivity ) {
2009-01-16 20:41:03 +00:00
this . scrollParent [ 0 ] . scrollLeft = scrolled = this . scrollParent [ 0 ] . scrollLeft - o . scrollSpeed ;
2012-11-17 03:51:24 +00:00
}
2009-01-22 13:10:18 +00:00
2009-01-16 20:41:03 +00:00
} else {
2009-01-22 13:10:18 +00:00
2015-02-02 19:59:03 +00:00
if ( event . pageY - this . document . scrollTop ( ) < o . scrollSensitivity ) {
scrolled = this . document . scrollTop ( this . document . scrollTop ( ) - o . scrollSpeed ) ;
} else if ( this . window . height ( ) - ( event . pageY - this . document . scrollTop ( ) ) < o . scrollSensitivity ) {
scrolled = this . document . scrollTop ( this . document . scrollTop ( ) + o . scrollSpeed ) ;
2012-11-17 03:51:24 +00:00
}
2009-01-22 13:10:18 +00:00
2015-02-02 19:59:03 +00:00
if ( event . pageX - this . document . scrollLeft ( ) < o . scrollSensitivity ) {
scrolled = this . document . scrollLeft ( this . document . scrollLeft ( ) - o . scrollSpeed ) ;
} else if ( this . window . width ( ) - ( event . pageX - this . document . scrollLeft ( ) ) < o . scrollSensitivity ) {
scrolled = this . document . scrollLeft ( this . document . scrollLeft ( ) + o . scrollSpeed ) ;
2012-11-17 03:51:24 +00:00
}
2009-01-22 13:10:18 +00:00
2009-01-16 20:41:03 +00:00
}
2009-01-22 13:10:18 +00:00
2012-11-17 03:51:24 +00:00
if ( scrolled !== false && $ . ui . ddmanager && ! o . dropBehaviour ) {
2009-01-16 20:41:03 +00:00
$ . ui . ddmanager . prepareOffsets ( this , event ) ;
2012-11-17 03:51:24 +00:00
}
2009-01-16 20:41:03 +00:00
}
2008-11-21 04:01:33 +00:00
//Regenerate the absolute position used for position checks
this . positionAbs = this . _convertPositionTo ( "absolute" ) ;
2008-11-25 09:57:41 +00:00
//Set the helper position
2012-11-17 03:51:24 +00:00
if ( ! this . options . axis || this . options . axis !== "y" ) {
2012-12-25 17:01:09 +00:00
this . helper [ 0 ] . style . left = this . position . left + "px" ;
2012-11-17 03:51:24 +00:00
}
if ( ! this . options . axis || this . options . axis !== "x" ) {
2012-12-25 17:01:09 +00:00
this . helper [ 0 ] . style . top = this . position . top + "px" ;
2012-11-17 03:51:24 +00:00
}
2008-11-28 15:43:32 +00:00
2008-11-21 04:01:33 +00:00
//Rearrange
2012-11-17 03:51:24 +00:00
for ( i = this . items . length - 1 ; i >= 0 ; i -- ) {
2008-11-21 04:01:33 +00:00
2008-11-25 09:57:41 +00:00
//Cache variables and intersection, continue if no intersection
2012-11-17 03:51:24 +00:00
item = this . items [ i ] ;
itemElement = item . item [ 0 ] ;
intersection = this . _intersectsWithPointer ( item ) ;
if ( ! intersection ) {
continue ;
}
2008-11-21 04:01:33 +00:00
2012-08-23 02:02:39 +00:00
// Only put the placeholder inside the current Container, skip all
2013-10-17 14:20:11 +00:00
// items from other containers. This works because when moving
2012-08-23 02:02:39 +00:00
// an item from one container to another the
// currentContainer is switched before the placeholder is moved.
//
2013-10-17 14:20:11 +00:00
// Without this, moving items in "sub-sortables" can cause
2014-05-07 16:28:34 +00:00
// the placeholder to jitter between the outer and inner container.
2012-11-17 03:51:24 +00:00
if ( item . instance !== this . currentContainer ) {
continue ;
}
2012-08-23 02:02:39 +00:00
2012-11-17 03:51:24 +00:00
// cannot intersect with itself
// no useless actions that have been done before
// no action if the item moved is the parent of the item checked
if ( itemElement !== this . currentItem [ 0 ] &&
this . placeholder [ intersection === 1 ? "next" : "prev" ] ( ) [ 0 ] !== itemElement &&
! $ . contains ( this . placeholder [ 0 ] , itemElement ) &&
2012-12-25 17:01:09 +00:00
( this . options . type === "semi-dynamic" ? ! $ . contains ( this . element [ 0 ] , itemElement ) : true )
2008-11-21 04:01:33 +00:00
) {
2012-11-17 03:51:24 +00:00
this . direction = intersection === 1 ? "down" : "up" ;
2008-11-21 15:30:15 +00:00
2012-11-17 03:51:24 +00:00
if ( this . options . tolerance === "pointer" || this . _intersectsWithSides ( item ) ) {
2009-02-13 03:47:53 +00:00
this . _rearrange ( event , item ) ;
2008-12-17 19:35:13 +00:00
} else {
break ;
2008-11-21 15:30:15 +00:00
}
2009-01-16 20:41:03 +00:00
this . _trigger ( "change" , event , this . _uiHash ( ) ) ;
2008-11-21 04:01:33 +00:00
break ;
}
}
//Post events to containers
this . _contactContainers ( event ) ;
//Interconnect with droppables
2012-11-17 03:51:24 +00:00
if ( $ . ui . ddmanager ) {
$ . ui . ddmanager . drag ( this , event ) ;
}
2008-11-21 04:01:33 +00:00
//Call callbacks
2012-12-25 17:01:09 +00:00
this . _trigger ( "sort" , event , this . _uiHash ( ) ) ;
2008-11-21 04:01:33 +00:00
this . lastPositionAbs = this . positionAbs ;
return false ;
} ,
_mouseStop : function ( event , noPropagation ) {
2012-11-17 03:51:24 +00:00
if ( ! event ) {
return ;
}
2008-11-21 04:01:33 +00:00
//If we are using droppables, inform the manager about the drop
2012-11-17 03:51:24 +00:00
if ( $ . ui . ddmanager && ! this . options . dropBehaviour ) {
2008-11-21 04:01:33 +00:00
$ . ui . ddmanager . drop ( this , event ) ;
2012-11-17 03:51:24 +00:00
}
2008-11-21 04:01:33 +00:00
if ( this . options . revert ) {
2012-11-17 03:51:24 +00:00
var that = this ,
2013-03-13 02:44:43 +00:00
cur = this . placeholder . offset ( ) ,
axis = this . options . axis ,
animation = { } ;
2008-11-21 04:01:33 +00:00
2013-03-13 02:44:43 +00:00
if ( ! axis || axis === "x" ) {
2015-02-02 19:59:03 +00:00
animation . left = cur . left - this . offset . parent . left - this . margins . left + ( this . offsetParent [ 0 ] === this . document [ 0 ] . body ? 0 : this . offsetParent [ 0 ] . scrollLeft ) ;
2013-03-13 02:44:43 +00:00
}
if ( ! axis || axis === "y" ) {
2015-02-02 19:59:03 +00:00
animation . top = cur . top - this . offset . parent . top - this . margins . top + ( this . offsetParent [ 0 ] === this . document [ 0 ] . body ? 0 : this . offsetParent [ 0 ] . scrollTop ) ;
2013-03-13 02:44:43 +00:00
}
2012-05-10 00:19:51 +00:00
this . reverting = true ;
2013-03-13 02:44:43 +00:00
$ ( this . helper ) . animate ( animation , parseInt ( this . options . revert , 10 ) || 500 , function ( ) {
2012-05-10 00:19:51 +00:00
that . _clear ( event ) ;
2008-11-21 04:01:33 +00:00
} ) ;
} else {
this . _clear ( event , noPropagation ) ;
}
return false ;
2008-06-04 02:34:33 +00:00
} ,
2008-11-10 05:17:12 +00:00
2008-11-03 21:41:59 +00:00
cancel : function ( ) {
if ( this . dragging ) {
2008-11-10 05:17:12 +00:00
2011-01-19 15:45:44 +00:00
this . _mouseUp ( { target : null } ) ;
2008-11-10 05:17:12 +00:00
2012-11-17 03:51:24 +00:00
if ( this . options . helper === "original" ) {
2015-02-24 21:16:47 +00:00
this . currentItem . css ( this . _storedCSS ) ;
this . _removeClass ( this . currentItem , "ui-sortable-helper" ) ;
2012-11-17 03:51:24 +00:00
} else {
2008-11-03 21:41:59 +00:00
this . currentItem . show ( ) ;
2012-11-17 03:51:24 +00:00
}
2008-11-10 05:17:12 +00:00
2008-11-03 21:41:59 +00:00
//Post deactivating events to containers
for ( var i = this . containers . length - 1 ; i >= 0 ; i -- ) {
2012-05-10 00:19:51 +00:00
this . containers [ i ] . _trigger ( "deactivate" , null , this . _uiHash ( this ) ) ;
2008-11-03 21:41:59 +00:00
if ( this . containers [ i ] . containerCache . over ) {
2012-05-10 00:19:51 +00:00
this . containers [ i ] . _trigger ( "out" , null , this . _uiHash ( this ) ) ;
2008-11-03 21:41:59 +00:00
this . containers [ i ] . containerCache . over = 0 ;
}
}
2008-11-10 05:17:12 +00:00
2008-11-03 21:41:59 +00:00
}
2011-01-18 18:33:30 +00:00
if ( this . placeholder ) {
//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
2012-11-17 03:51:24 +00:00
if ( this . placeholder [ 0 ] . parentNode ) {
this . placeholder [ 0 ] . parentNode . removeChild ( this . placeholder [ 0 ] ) ;
}
if ( this . options . helper !== "original" && this . helper && this . helper [ 0 ] . parentNode ) {
this . helper . remove ( ) ;
}
2011-01-18 18:33:30 +00:00
$ . extend ( this , {
helper : null ,
dragging : false ,
reverting : false ,
_noFinalSort : null
} ) ;
2008-11-10 05:17:12 +00:00
2011-01-18 18:33:30 +00:00
if ( this . domPosition . prev ) {
$ ( this . domPosition . prev ) . after ( this . currentItem ) ;
} else {
$ ( this . domPosition . parent ) . prepend ( this . currentItem ) ;
}
2008-11-03 21:41:59 +00:00
}
2009-04-15 02:33:28 +00:00
return this ;
2008-11-10 05:17:12 +00:00
2008-11-03 21:41:59 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
serialize : function ( o ) {
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
var items = this . _getItemsAsjQuery ( o && o . connected ) ,
str = [ ] ;
o = o || { } ;
2008-10-28 05:44:17 +00:00
2008-07-19 15:05:37 +00:00
$ ( items ) . each ( function ( ) {
2012-12-25 17:01:09 +00:00
var res = ( $ ( o . item || this ) . attr ( o . attribute || "id" ) || "" ) . match ( o . expression || ( /(.+)[\-=_](.+)/ ) ) ;
2012-11-17 03:51:24 +00:00
if ( res ) {
2012-12-25 17:01:09 +00:00
str . push ( ( o . key || res [ 1 ] + "[]" ) + "=" + ( o . key && o . expression ? res [ 1 ] : res [ 2 ] ) ) ;
2012-11-17 03:51:24 +00:00
}
2008-06-04 02:34:33 +00:00
} ) ;
2008-10-28 05:44:17 +00:00
2010-07-04 22:29:09 +00:00
if ( ! str . length && o . key ) {
2012-12-25 17:01:09 +00:00
str . push ( o . key + "=" ) ;
2010-07-04 22:29:09 +00:00
}
2012-12-25 17:01:09 +00:00
return str . join ( "&" ) ;
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-08-26 12:29:55 +00:00
toArray : function ( o ) {
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
var items = this . _getItemsAsjQuery ( o && o . connected ) ,
ret = [ ] ;
o = o || { } ;
2008-10-28 05:44:17 +00:00
2012-12-25 17:01:09 +00:00
items . each ( function ( ) { ret . push ( $ ( o . item || this ) . attr ( o . attribute || "id" ) || "" ) ; } ) ;
2008-06-04 02:34:33 +00:00
return ret ;
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
/* Be careful with the following core functions */
2008-08-17 02:19:14 +00:00
_intersectsWith : function ( item ) {
2008-11-28 15:43:32 +00:00
2008-11-25 09:57:41 +00:00
var x1 = this . positionAbs . left ,
x2 = x1 + this . helperProportions . width ,
y1 = this . positionAbs . top ,
2012-11-17 03:51:24 +00:00
y2 = y1 + this . helperProportions . height ,
l = item . left ,
2008-11-25 09:57:41 +00:00
r = l + item . width ,
t = item . top ,
2012-11-17 03:51:24 +00:00
b = t + item . height ,
dyClick = this . offset . click . top ,
dxClick = this . offset . click . left ,
2013-03-21 14:56:39 +00:00
isOverElementHeight = ( this . options . axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ) ,
isOverElementWidth = ( this . options . axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ) ,
isOverElement = isOverElementHeight && isOverElementWidth ;
2012-11-17 03:51:24 +00:00
if ( this . options . tolerance === "pointer" ||
this . options . forcePointerForContainers ||
2012-12-25 17:01:09 +00:00
( this . options . tolerance !== "pointer" && this . helperProportions [ this . floating ? "width" : "height" ] > item [ this . floating ? "width" : "height" ] )
2008-11-25 09:57:41 +00:00
) {
2008-07-10 00:56:29 +00:00
return isOverElement ;
2008-06-04 02:34:33 +00:00
} else {
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
return ( l < x1 + ( this . helperProportions . width / 2 ) && // Right Half
x2 - ( this . helperProportions . width / 2 ) < r && // Left Half
t < y1 + ( this . helperProportions . height / 2 ) && // Bottom Half
y2 - ( this . helperProportions . height / 2 ) < b ) ; // Top Half
2008-10-28 05:44:17 +00:00
2008-07-10 00:56:29 +00:00
}
2008-06-04 02:34:33 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-11-21 15:30:15 +00:00
_intersectsWithPointer : function ( item ) {
2008-10-28 18:05:02 +00:00
2015-07-08 10:53:13 +00:00
var verticalDirection , horizontalDirection ,
isOverElementHeight = ( this . options . axis === "x" ) || this . _isOverAxis ( this . positionAbs . top + this . offset . click . top , item . top , item . height ) ,
2013-09-17 13:56:00 +00:00
isOverElementWidth = ( this . options . axis === "y" ) || this . _isOverAxis ( this . positionAbs . left + this . offset . click . left , item . left , item . width ) ,
2015-07-08 10:53:13 +00:00
isOverElement = isOverElementHeight && isOverElementWidth ;
2008-10-28 18:05:02 +00:00
2012-11-17 03:51:24 +00:00
if ( ! isOverElement ) {
2008-11-25 09:57:41 +00:00
return false ;
2012-11-17 03:51:24 +00:00
}
2008-11-12 04:34:34 +00:00
2015-07-08 10:53:13 +00:00
verticalDirection = this . _getDragVerticalDirection ( ) ;
horizontalDirection = this . _getDragHorizontalDirection ( ) ;
2008-11-25 09:57:41 +00:00
return this . floating ?
2015-07-08 10:53:13 +00:00
( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 )
2012-11-17 03:51:24 +00:00
: ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) ) ;
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-12-17 19:35:13 +00:00
_intersectsWithSides : function ( item ) {
2008-11-28 15:43:32 +00:00
2013-09-17 13:56:00 +00:00
var isOverBottomHalf = this . _isOverAxis ( this . positionAbs . top + this . offset . click . top , item . top + ( item . height / 2 ) , item . height ) ,
isOverRightHalf = this . _isOverAxis ( this . positionAbs . left + this . offset . click . left , item . left + ( item . width / 2 ) , item . width ) ,
2008-11-25 09:57:41 +00:00
verticalDirection = this . _getDragVerticalDirection ( ) ,
horizontalDirection = this . _getDragHorizontalDirection ( ) ;
if ( this . floating && horizontalDirection ) {
2012-11-17 03:51:24 +00:00
return ( ( horizontalDirection === "right" && isOverRightHalf ) || ( horizontalDirection === "left" && ! isOverRightHalf ) ) ;
2008-11-25 09:57:41 +00:00
} else {
2012-11-17 03:51:24 +00:00
return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) || ( verticalDirection === "up" && ! isOverBottomHalf ) ) ;
2008-11-21 15:30:15 +00:00
}
} ,
2008-10-28 05:44:17 +00:00
_getDragVerticalDirection : function ( ) {
2008-11-25 09:57:41 +00:00
var delta = this . positionAbs . top - this . lastPositionAbs . top ;
2012-11-02 00:54:52 +00:00
return delta !== 0 && ( delta > 0 ? "down" : "up" ) ;
2008-10-28 05:44:17 +00:00
} ,
_getDragHorizontalDirection : function ( ) {
2008-11-25 09:57:41 +00:00
var delta = this . positionAbs . left - this . lastPositionAbs . left ;
2012-11-02 00:54:52 +00:00
return delta !== 0 && ( delta > 0 ? "right" : "left" ) ;
2008-10-28 05:44:17 +00:00
} ,
2008-11-19 09:54:53 +00:00
refresh : function ( event ) {
this . _refreshItems ( event ) ;
2013-12-13 03:10:06 +00:00
this . _setHandleClassName ( ) ;
2008-06-04 02:34:33 +00:00
this . refreshPositions ( ) ;
2009-04-15 02:33:28 +00:00
return this ;
2008-06-04 02:34:33 +00:00
} ,
2008-10-28 05:44:17 +00:00
2009-01-31 16:54:06 +00:00
_connectWith : function ( ) {
var options = this . options ;
2012-11-17 03:51:24 +00:00
return options . connectWith . constructor === String ? [ options . connectWith ] : options . connectWith ;
2009-01-31 16:54:06 +00:00
} ,
2012-04-19 13:03:22 +00:00
2008-08-17 02:19:14 +00:00
_getItemsAsjQuery : function ( connected ) {
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
var i , j , cur , inst ,
items = [ ] ,
queries = [ ] ,
connectWith = this . _connectWith ( ) ;
2008-10-28 05:44:17 +00:00
2009-01-31 16:54:06 +00:00
if ( connectWith && connected ) {
2012-11-17 03:51:24 +00:00
for ( i = connectWith . length - 1 ; i >= 0 ; i -- ) {
2015-02-02 19:59:03 +00:00
cur = $ ( connectWith [ i ] , this . document [ 0 ] ) ;
2012-11-17 03:51:24 +00:00
for ( j = cur . length - 1 ; j >= 0 ; j -- ) {
inst = $ . data ( cur [ j ] , this . widgetFullName ) ;
if ( inst && inst !== this && ! inst . options . disabled ) {
2012-12-25 17:01:09 +00:00
queries . push ( [ $ . isFunction ( inst . options . items ) ? inst . options . items . call ( inst . element ) : $ ( inst . options . items , inst . element ) . not ( ".ui-sortable-helper" ) . not ( ".ui-sortable-placeholder" ) , inst ] ) ;
2008-07-19 15:05:37 +00:00
}
2012-11-02 00:54:52 +00:00
}
}
2008-07-19 15:05:37 +00:00
}
2008-10-28 05:44:17 +00:00
2012-12-25 17:01:09 +00:00
queries . push ( [ $ . isFunction ( this . options . items ) ? this . options . items . call ( this . element , null , { options : this . options , item : this . currentItem } ) : $ ( this . options . items , this . element ) . not ( ".ui-sortable-helper" ) . not ( ".ui-sortable-placeholder" ) , this ] ) ;
2008-10-28 05:44:17 +00:00
2013-04-22 16:33:35 +00:00
function addItems ( ) {
items . push ( this ) ;
}
2012-11-17 03:51:24 +00:00
for ( i = queries . length - 1 ; i >= 0 ; i -- ) {
2013-04-22 16:33:35 +00:00
queries [ i ] [ 0 ] . each ( addItems ) ;
2012-11-02 00:54:52 +00:00
}
2008-10-28 05:44:17 +00:00
2008-07-19 15:05:37 +00:00
return $ ( items ) ;
2008-10-28 05:44:17 +00:00
2008-07-19 15:05:37 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-08-17 02:19:14 +00:00
_removeCurrentsFromItems : function ( ) {
2008-10-28 05:44:17 +00:00
2011-09-27 11:57:06 +00:00
var list = this . currentItem . find ( ":data(" + this . widgetName + "-item)" ) ;
2008-10-28 05:44:17 +00:00
2012-09-12 09:37:04 +00:00
this . items = $ . grep ( this . items , function ( item ) {
2008-07-28 18:34:01 +00:00
for ( var j = 0 ; j < list . length ; j ++ ) {
2012-11-17 03:51:24 +00:00
if ( list [ j ] === item . item [ 0 ] ) {
2012-09-12 09:37:04 +00:00
return false ;
2012-11-17 03:51:24 +00:00
}
2012-11-02 00:54:52 +00:00
}
2012-09-12 09:37:04 +00:00
return true ;
} ) ;
2008-10-28 05:44:17 +00:00
2008-07-28 18:34:01 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-11-19 09:54:53 +00:00
_refreshItems : function ( event ) {
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
this . items = [ ] ;
this . containers = [ this ] ;
2012-11-17 03:51:24 +00:00
var i , j , cur , inst , targetData , _queries , item , queriesLength ,
items = this . items ,
queries = [ [ $ . isFunction ( this . options . items ) ? this . options . items . call ( this . element [ 0 ] , event , { item : this . currentItem } ) : $ ( this . options . items , this . element ) , this ] ] ,
connectWith = this . _connectWith ( ) ;
2008-10-28 05:44:17 +00:00
2012-01-20 03:54:47 +00:00
if ( connectWith && this . ready ) { //Shouldn't be run the first time through due to massive slow-down
2012-11-17 03:51:24 +00:00
for ( i = connectWith . length - 1 ; i >= 0 ; i -- ) {
2015-02-02 19:59:03 +00:00
cur = $ ( connectWith [ i ] , this . document [ 0 ] ) ;
2012-11-17 03:51:24 +00:00
for ( j = cur . length - 1 ; j >= 0 ; j -- ) {
inst = $ . data ( cur [ j ] , this . widgetFullName ) ;
if ( inst && inst !== this && ! inst . options . disabled ) {
2008-11-19 09:54:53 +00:00
queries . push ( [ $ . isFunction ( inst . options . items ) ? inst . options . items . call ( inst . element [ 0 ] , event , { item : this . currentItem } ) : $ ( inst . options . items , inst . element ) , inst ] ) ;
2008-06-04 02:34:33 +00:00
this . containers . push ( inst ) ;
}
2012-11-02 00:54:52 +00:00
}
}
2008-06-04 02:34:33 +00:00
}
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
for ( i = queries . length - 1 ; i >= 0 ; i -- ) {
targetData = queries [ i ] [ 1 ] ;
_queries = queries [ i ] [ 0 ] ;
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
for ( j = 0 , queriesLength = _queries . length ; j < queriesLength ; j ++ ) {
item = $ ( _queries [ j ] ) ;
2008-10-28 05:44:17 +00:00
2012-12-25 17:01:09 +00:00
item . data ( this . widgetName + "-item" , targetData ) ; // Data for target checking (mouse manager)
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
items . push ( {
2008-10-28 05:44:17 +00:00
item : item ,
instance : targetData ,
2008-06-04 02:34:33 +00:00
width : 0 , height : 0 ,
left : 0 , top : 0
} ) ;
2012-11-02 00:54:52 +00:00
}
}
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
refreshPositions : function ( fast ) {
2008-10-28 05:44:17 +00:00
2014-10-31 13:46:41 +00:00
// Determine whether items are being displayed horizontally
this . floating = this . items . length ?
this . options . axis === "x" || this . _isFloating ( this . items [ 0 ] . item ) :
false ;
2008-06-24 12:51:15 +00:00
//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
2008-11-25 09:57:41 +00:00
if ( this . offsetParent && this . helper ) {
this . offset . parent = this . _getParentOffset ( ) ;
2008-06-24 12:51:15 +00:00
}
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
var i , item , t , p ;
for ( i = this . items . length - 1 ; i >= 0 ; i -- ) {
item = this . items [ i ] ;
2008-10-28 05:44:17 +00:00
2011-04-07 13:08:48 +00:00
//We ignore calculating positions of all connected containers when we're not over them
2012-11-17 03:51:24 +00:00
if ( item . instance !== this . currentContainer && this . currentContainer && item . item [ 0 ] !== this . currentItem [ 0 ] ) {
2011-04-07 13:08:48 +00:00
continue ;
2012-11-17 03:51:24 +00:00
}
2011-04-07 13:08:48 +00:00
2012-11-17 03:51:24 +00:00
t = this . options . toleranceElement ? $ ( this . options . toleranceElement , item . item ) : item . item ;
2008-10-28 05:44:17 +00:00
if ( ! fast ) {
2009-02-25 04:15:48 +00:00
item . width = t . outerWidth ( ) ;
item . height = t . outerHeight ( ) ;
2008-06-25 13:30:22 +00:00
}
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
p = t . offset ( ) ;
2008-10-28 05:44:17 +00:00
item . left = p . left ;
item . top = p . top ;
2012-11-02 00:54:52 +00:00
}
2008-10-28 05:44:17 +00:00
2008-07-09 09:03:24 +00:00
if ( this . options . custom && this . options . custom . refreshContainers ) {
this . options . custom . refreshContainers . call ( this ) ;
} else {
2012-11-17 03:51:24 +00:00
for ( i = this . containers . length - 1 ; i >= 0 ; i -- ) {
p = this . containers [ i ] . element . offset ( ) ;
2008-07-09 09:03:24 +00:00
this . containers [ i ] . containerCache . left = p . left ;
this . containers [ i ] . containerCache . top = p . top ;
2014-01-14 07:36:16 +00:00
this . containers [ i ] . containerCache . width = this . containers [ i ] . element . outerWidth ( ) ;
2008-07-09 09:03:24 +00:00
this . containers [ i ] . containerCache . height = this . containers [ i ] . element . outerHeight ( ) ;
2012-11-02 00:54:52 +00:00
}
2008-07-09 09:03:24 +00:00
}
2008-10-28 05:44:17 +00:00
2009-04-15 02:33:28 +00:00
return this ;
2008-06-04 02:34:33 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-08-17 02:19:14 +00:00
_createPlaceholder : function ( that ) {
2012-05-10 00:19:51 +00:00
that = that || this ;
2012-11-17 03:51:24 +00:00
var className ,
o = that . options ;
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
if ( ! o . placeholder || o . placeholder . constructor === String ) {
className = o . placeholder ;
2008-06-04 02:34:33 +00:00
o . placeholder = {
element : function ( ) {
2008-10-28 05:44:17 +00:00
2013-02-21 01:16:29 +00:00
var nodeName = that . currentItem [ 0 ] . nodeName . toLowerCase ( ) ,
2015-02-24 21:16:47 +00:00
element = $ ( "<" + nodeName + ">" , that . document [ 0 ] ) ;
that . _addClass ( element , "ui-sortable-placeholder" ,
className || that . currentItem [ 0 ] . className )
. _removeClass ( element , "ui-sortable-helper" ) ;
2013-02-21 01:16:29 +00:00
2014-10-31 13:24:29 +00:00
if ( nodeName === "tbody" ) {
that . _createTrPlaceholder (
that . currentItem . find ( "tr" ) . eq ( 0 ) ,
$ ( "<tr>" , that . document [ 0 ] ) . appendTo ( element )
) ;
} else if ( nodeName === "tr" ) {
that . _createTrPlaceholder ( that . currentItem , element ) ;
2013-03-07 17:55:00 +00:00
} else if ( nodeName === "img" ) {
element . attr ( "src" , that . currentItem . attr ( "src" ) ) ;
2013-02-21 01:16:29 +00:00
}
2008-10-28 05:44:17 +00:00
2013-02-21 01:16:29 +00:00
if ( ! className ) {
element . css ( "visibility" , "hidden" ) ;
2012-11-17 03:51:24 +00:00
}
2008-10-28 05:44:17 +00:00
2013-02-21 01:16:29 +00:00
return element ;
2008-06-04 02:34:33 +00:00
} ,
2008-07-09 11:09:40 +00:00
update : function ( container , p ) {
2009-01-22 13:10:18 +00:00
2009-01-09 15:16:41 +00:00
// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
2012-11-17 03:51:24 +00:00
if ( className && ! o . forcePlaceholderSize ) {
return ;
}
2009-01-22 13:10:18 +00:00
2012-04-30 14:39:06 +00:00
//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
2012-12-25 17:01:09 +00:00
if ( ! p . height ( ) ) { p . height ( that . currentItem . innerHeight ( ) - parseInt ( that . currentItem . css ( "paddingTop" ) || 0 , 10 ) - parseInt ( that . currentItem . css ( "paddingBottom" ) || 0 , 10 ) ) ; }
if ( ! p . width ( ) ) { p . width ( that . currentItem . innerWidth ( ) - parseInt ( that . currentItem . css ( "paddingLeft" ) || 0 , 10 ) - parseInt ( that . currentItem . css ( "paddingRight" ) || 0 , 10 ) ) ; }
2008-06-04 02:34:33 +00:00
}
} ;
}
2008-10-28 05:44:17 +00:00
2008-10-17 08:13:14 +00:00
//Create the placeholder
2012-05-10 00:19:51 +00:00
that . placeholder = $ ( o . placeholder . element . call ( that . element , that . currentItem ) ) ;
2008-10-28 05:44:17 +00:00
2008-10-17 08:13:14 +00:00
//Append it after the actual current item
2012-05-10 00:19:51 +00:00
that . currentItem . after ( that . placeholder ) ;
2008-10-28 05:44:17 +00:00
2008-11-21 04:01:33 +00:00
//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
2012-05-10 00:19:51 +00:00
o . placeholder . update ( that , that . placeholder ) ;
2008-10-28 05:44:17 +00:00
2008-11-21 04:01:33 +00:00
} ,
2008-10-28 05:44:17 +00:00
2014-10-31 13:24:29 +00:00
_createTrPlaceholder : function ( sourceTr , targetTr ) {
var that = this ;
sourceTr . children ( ) . each ( function ( ) {
$ ( "<td> </td>" , that . document [ 0 ] )
. attr ( "colspan" , $ ( this ) . attr ( "colspan" ) || 1 )
. appendTo ( targetTr ) ;
} ) ;
} ,
2008-11-21 04:01:33 +00:00
_contactContainers : function ( event ) {
2013-10-30 05:00:18 +00:00
var i , j , dist , itemWithLeastDistance , posProperty , sizeProperty , cur , nearBottom , floating , axis ,
2012-11-17 03:51:24 +00:00
innermostContainer = null ,
innermostIndex = null ;
2012-04-19 13:03:22 +00:00
// get innermost container that intersects with item
2012-11-17 03:51:24 +00:00
for ( i = this . containers . length - 1 ; i >= 0 ; i -- ) {
2008-10-28 05:44:17 +00:00
2012-04-19 13:03:22 +00:00
// never consider a container that's located within the item itself
2012-11-17 03:51:24 +00:00
if ( $ . contains ( this . currentItem [ 0 ] , this . containers [ i ] . element [ 0 ] ) ) {
2009-07-28 05:50:23 +00:00
continue ;
2012-11-17 03:51:24 +00:00
}
2008-10-28 05:44:17 +00:00
2009-07-28 05:50:23 +00:00
if ( this . _intersectsWith ( this . containers [ i ] . containerCache ) ) {
2008-10-28 05:44:17 +00:00
2012-04-19 13:03:22 +00:00
// if we've already found a container and it's more "inner" than this, then continue
2012-11-17 03:51:24 +00:00
if ( innermostContainer && $ . contains ( this . containers [ i ] . element [ 0 ] , innermostContainer . element [ 0 ] ) ) {
2009-07-28 05:50:23 +00:00
continue ;
2012-11-17 03:51:24 +00:00
}
2008-11-21 04:01:33 +00:00
2012-04-19 13:03:22 +00:00
innermostContainer = this . containers [ i ] ;
2009-07-28 05:50:23 +00:00
innermostIndex = i ;
2012-04-19 13:03:22 +00:00
2008-11-21 04:01:33 +00:00
} else {
2012-04-19 13:03:22 +00:00
// container doesn't intersect. trigger "out" event if necessary
2008-11-21 04:01:33 +00:00
if ( this . containers [ i ] . containerCache . over ) {
2009-01-16 20:41:03 +00:00
this . containers [ i ] . _trigger ( "out" , event , this . _uiHash ( this ) ) ;
2008-11-21 04:01:33 +00:00
this . containers [ i ] . containerCache . over = 0 ;
}
2008-06-04 02:34:33 +00:00
}
2008-10-28 05:44:17 +00:00
2009-07-28 05:50:23 +00:00
}
2012-04-19 13:03:22 +00:00
// if no intersecting containers found, return
2012-11-17 03:51:24 +00:00
if ( ! innermostContainer ) {
return ;
}
2009-07-28 05:50:23 +00:00
2010-03-16 01:15:57 +00:00
// move the item into the container if it's not there already
if ( this . containers . length === 1 ) {
2013-02-16 14:35:58 +00:00
if ( ! this . containers [ innermostIndex ] . containerCache . over ) {
this . containers [ innermostIndex ] . _trigger ( "over" , event , this . _uiHash ( this ) ) ;
this . containers [ innermostIndex ] . containerCache . over = 1 ;
}
2012-08-17 08:20:45 +00:00
} else {
2012-04-19 13:03:22 +00:00
//When entering a new container, we will find the item with the least distance and append our item near it
2012-11-17 03:51:24 +00:00
dist = 10000 ;
itemWithLeastDistance = null ;
2013-09-17 13:56:00 +00:00
floating = innermostContainer . floating || this . _isFloating ( this . currentItem ) ;
2013-02-16 13:32:55 +00:00
posProperty = floating ? "left" : "top" ;
sizeProperty = floating ? "width" : "height" ;
2013-10-30 05:00:18 +00:00
axis = floating ? "clientX" : "clientY" ;
2012-11-17 03:51:24 +00:00
for ( j = this . items . length - 1 ; j >= 0 ; j -- ) {
if ( ! $ . contains ( this . containers [ innermostIndex ] . element [ 0 ] , this . items [ j ] . item [ 0 ] ) ) {
continue ;
}
if ( this . items [ j ] . item [ 0 ] === this . currentItem [ 0 ] ) {
continue ;
}
2013-10-30 05:00:18 +00:00
2012-11-17 03:51:24 +00:00
cur = this . items [ j ] . item . offset ( ) [ posProperty ] ;
nearBottom = false ;
2013-10-30 05:00:18 +00:00
if ( event [ axis ] - cur > this . items [ j ] [ sizeProperty ] / 2 ) {
2012-08-17 08:20:45 +00:00
nearBottom = true ;
}
2013-10-30 05:00:18 +00:00
if ( Math . abs ( event [ axis ] - cur ) < dist ) {
dist = Math . abs ( event [ axis ] - cur ) ;
itemWithLeastDistance = this . items [ j ] ;
2012-08-17 08:20:45 +00:00
this . direction = nearBottom ? "up" : "down" ;
2012-04-19 13:03:22 +00:00
}
}
2012-11-17 03:51:24 +00:00
//Check if dropOnEmpty is enabled
if ( ! itemWithLeastDistance && ! this . options . dropOnEmpty ) {
2012-04-19 13:03:22 +00:00
return ;
2012-11-17 03:51:24 +00:00
}
2012-04-19 13:03:22 +00:00
2013-02-16 13:32:55 +00:00
if ( this . currentContainer === this . containers [ innermostIndex ] ) {
2014-01-14 09:10:27 +00:00
if ( ! this . currentContainer . containerCache . over ) {
this . containers [ innermostIndex ] . _trigger ( "over" , event , this . _uiHash ( ) ) ;
this . currentContainer . containerCache . over = 1 ;
}
2013-02-16 13:32:55 +00:00
return ;
}
2012-04-19 13:03:22 +00:00
itemWithLeastDistance ? this . _rearrange ( event , itemWithLeastDistance , null , true ) : this . _rearrange ( event , null , this . containers [ innermostIndex ] . element , true ) ;
this . _trigger ( "change" , event , this . _uiHash ( ) ) ;
this . containers [ innermostIndex ] . _trigger ( "change" , event , this . _uiHash ( this ) ) ;
2013-02-16 13:32:55 +00:00
this . currentContainer = this . containers [ innermostIndex ] ;
2012-04-19 13:03:22 +00:00
//Update the placeholder
this . options . placeholder . update ( this . currentContainer , this . placeholder ) ;
this . containers [ innermostIndex ] . _trigger ( "over" , event , this . _uiHash ( this ) ) ;
2010-02-20 02:31:49 +00:00
this . containers [ innermostIndex ] . containerCache . over = 1 ;
2012-04-19 13:03:22 +00:00
}
2008-11-21 04:01:33 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-11-25 09:57:41 +00:00
_createHelper : function ( event ) {
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
var o = this . options ,
2012-12-25 17:01:09 +00:00
helper = $ . isFunction ( o . helper ) ? $ ( o . helper . apply ( this . element [ 0 ] , [ event , this . currentItem ] ) ) : ( o . helper === "clone" ? this . currentItem . clone ( ) : this . currentItem ) ;
2008-11-28 15:43:32 +00:00
2012-11-17 03:51:24 +00:00
//Add the helper to the DOM if that didn't happen already
2012-12-25 17:01:09 +00:00
if ( ! helper . parents ( "body" ) . length ) {
$ ( o . appendTo !== "parent" ? o . appendTo : this . currentItem [ 0 ] . parentNode ) [ 0 ] . appendChild ( helper [ 0 ] ) ;
2012-11-17 03:51:24 +00:00
}
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
if ( helper [ 0 ] === this . currentItem [ 0 ] ) {
2008-11-25 09:57:41 +00:00
this . _storedCSS = { width : this . currentItem [ 0 ] . style . width , height : this . currentItem [ 0 ] . style . height , position : this . currentItem . css ( "position" ) , top : this . currentItem . css ( "top" ) , left : this . currentItem . css ( "left" ) } ;
2012-11-17 03:51:24 +00:00
}
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
if ( ! helper [ 0 ] . style . width || o . forceHelperSize ) {
helper . width ( this . currentItem . width ( ) ) ;
}
if ( ! helper [ 0 ] . style . height || o . forceHelperSize ) {
helper . height ( this . currentItem . height ( ) ) ;
}
2008-11-25 09:57:41 +00:00
2008-11-21 04:01:33 +00:00
return helper ;
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
} ,
2008-11-28 15:43:32 +00:00
2008-11-25 09:57:41 +00:00
_adjustOffsetFromHelper : function ( obj ) {
2012-12-25 17:01:09 +00:00
if ( typeof obj === "string" ) {
obj = obj . split ( " " ) ;
2009-08-03 13:17:00 +00:00
}
if ( $ . isArray ( obj ) ) {
obj = { left : + obj [ 0 ] , top : + obj [ 1 ] || 0 } ;
}
2012-12-25 17:01:09 +00:00
if ( "left" in obj ) {
2009-08-03 13:17:00 +00:00
this . offset . click . left = obj . left + this . margins . left ;
}
2012-12-25 17:01:09 +00:00
if ( "right" in obj ) {
2009-08-03 13:17:00 +00:00
this . offset . click . left = this . helperProportions . width - obj . right + this . margins . left ;
}
2012-12-25 17:01:09 +00:00
if ( "top" in obj ) {
2009-08-03 13:17:00 +00:00
this . offset . click . top = obj . top + this . margins . top ;
}
2012-12-25 17:01:09 +00:00
if ( "bottom" in obj ) {
2009-08-03 13:17:00 +00:00
this . offset . click . top = this . helperProportions . height - obj . bottom + this . margins . top ;
}
2008-11-25 09:57:41 +00:00
} ,
2008-11-28 15:43:32 +00:00
2008-11-25 09:57:41 +00:00
_getParentOffset : function ( ) {
2009-01-09 14:08:32 +00:00
2008-11-25 09:57:41 +00:00
//Get the offsetParent and cache its position
2009-01-09 14:08:32 +00:00
this . offsetParent = this . helper . offsetParent ( ) ;
var po = this . offsetParent . offset ( ) ;
2009-01-22 13:10:18 +00:00
2009-01-09 14:08:32 +00:00
// This is a special case where we need to modify a offset calculated on start, since the following happened:
// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
// the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
2015-02-02 19:59:03 +00:00
if ( this . cssPosition === "absolute" && this . scrollParent [ 0 ] !== this . document [ 0 ] && $ . contains ( this . scrollParent [ 0 ] , this . offsetParent [ 0 ] ) ) {
2009-01-09 14:08:32 +00:00
po . left += this . scrollParent . scrollLeft ( ) ;
po . top += this . scrollParent . scrollTop ( ) ;
}
2008-11-25 09:57:41 +00:00
2012-11-17 03:51:24 +00:00
// This needs to be actually done for all browsers, since pageX/pageY includes this information
// with an ugly IE fix
2015-02-02 19:59:03 +00:00
if ( this . offsetParent [ 0 ] === this . document [ 0 ] . body || ( this . offsetParent [ 0 ] . tagName && this . offsetParent [ 0 ] . tagName . toLowerCase ( ) === "html" && $ . ui . ie ) ) {
2008-11-28 15:43:32 +00:00
po = { top : 0 , left : 0 } ;
2012-11-17 03:51:24 +00:00
}
2008-11-25 09:57:41 +00:00
return {
top : po . top + ( parseInt ( this . offsetParent . css ( "borderTopWidth" ) , 10 ) || 0 ) ,
left : po . left + ( parseInt ( this . offsetParent . css ( "borderLeftWidth" ) , 10 ) || 0 )
} ;
} ,
2008-11-28 15:43:32 +00:00
2008-11-25 09:57:41 +00:00
_getRelativeOffset : function ( ) {
2012-11-17 03:51:24 +00:00
if ( this . cssPosition === "relative" ) {
2008-11-25 09:57:41 +00:00
var p = this . currentItem . position ( ) ;
return {
top : p . top - ( parseInt ( this . helper . css ( "top" ) , 10 ) || 0 ) + this . scrollParent . scrollTop ( ) ,
left : p . left - ( parseInt ( this . helper . css ( "left" ) , 10 ) || 0 ) + this . scrollParent . scrollLeft ( )
} ;
} else {
return { top : 0 , left : 0 } ;
}
2008-11-28 15:43:32 +00:00
2008-11-25 09:57:41 +00:00
} ,
2008-11-28 15:43:32 +00:00
2008-11-25 09:57:41 +00:00
_cacheMargins : function ( ) {
this . margins = {
left : ( parseInt ( this . currentItem . css ( "marginLeft" ) , 10 ) || 0 ) ,
top : ( parseInt ( this . currentItem . css ( "marginTop" ) , 10 ) || 0 )
} ;
} ,
_cacheHelperProportions : function ( ) {
this . helperProportions = {
width : this . helper . outerWidth ( ) ,
height : this . helper . outerHeight ( )
} ;
} ,
_setContainment : function ( ) {
2012-11-17 03:51:24 +00:00
var ce , co , over ,
o = this . options ;
2012-12-25 17:01:09 +00:00
if ( o . containment === "parent" ) {
2012-11-17 03:51:24 +00:00
o . containment = this . helper [ 0 ] . parentNode ;
}
2012-12-25 17:01:09 +00:00
if ( o . containment === "document" || o . containment === "window" ) {
2012-11-17 03:51:24 +00:00
this . containment = [
0 - this . offset . relative . left - this . offset . parent . left ,
0 - this . offset . relative . top - this . offset . parent . top ,
2015-02-02 19:59:03 +00:00
o . containment === "document" ? this . document . width ( ) : this . window . width ( ) - this . helperProportions . width - this . margins . left ,
( o . containment === "document" ? this . document . width ( ) : this . window . height ( ) || this . document [ 0 ] . body . parentNode . scrollHeight ) - this . helperProportions . height - this . margins . top
2012-11-17 03:51:24 +00:00
] ;
}
2008-11-25 09:57:41 +00:00
if ( ! ( /^(document|window|parent)$/ ) . test ( o . containment ) ) {
2012-11-17 03:51:24 +00:00
ce = $ ( o . containment ) [ 0 ] ;
co = $ ( o . containment ) . offset ( ) ;
2012-12-25 17:01:09 +00:00
over = ( $ ( ce ) . css ( "overflow" ) !== "hidden" ) ;
2008-11-25 09:57:41 +00:00
this . containment = [
2009-01-29 15:25:02 +00:00
co . left + ( parseInt ( $ ( ce ) . css ( "borderLeftWidth" ) , 10 ) || 0 ) + ( parseInt ( $ ( ce ) . css ( "paddingLeft" ) , 10 ) || 0 ) - this . margins . left ,
co . top + ( parseInt ( $ ( ce ) . css ( "borderTopWidth" ) , 10 ) || 0 ) + ( parseInt ( $ ( ce ) . css ( "paddingTop" ) , 10 ) || 0 ) - this . margins . top ,
co . left + ( over ? Math . max ( ce . scrollWidth , ce . offsetWidth ) : ce . offsetWidth ) - ( parseInt ( $ ( ce ) . css ( "borderLeftWidth" ) , 10 ) || 0 ) - ( parseInt ( $ ( ce ) . css ( "paddingRight" ) , 10 ) || 0 ) - this . helperProportions . width - this . margins . left ,
co . top + ( over ? Math . max ( ce . scrollHeight , ce . offsetHeight ) : ce . offsetHeight ) - ( parseInt ( $ ( ce ) . css ( "borderTopWidth" ) , 10 ) || 0 ) - ( parseInt ( $ ( ce ) . css ( "paddingBottom" ) , 10 ) || 0 ) - this . helperProportions . height - this . margins . top
2008-11-25 09:57:41 +00:00
] ;
}
} ,
2008-10-28 05:44:17 +00:00
2008-08-17 02:15:55 +00:00
_convertPositionTo : function ( d , pos ) {
2008-11-25 09:57:41 +00:00
2012-11-17 03:51:24 +00:00
if ( ! pos ) {
pos = this . position ;
}
var mod = d === "absolute" ? 1 : - 1 ,
2015-02-02 19:59:03 +00:00
scroll = this . cssPosition === "absolute" && ! ( this . scrollParent [ 0 ] !== this . document [ 0 ] && $ . contains ( this . scrollParent [ 0 ] , this . offsetParent [ 0 ] ) ) ? this . offsetParent : this . scrollParent ,
2012-11-17 03:51:24 +00:00
scrollIsRootNode = ( /(html|body)/i ) . test ( scroll [ 0 ] . tagName ) ;
2008-11-25 09:57:41 +00:00
2008-06-04 02:34:33 +00:00
return {
top : (
2012-11-17 03:51:24 +00:00
pos . top + // The absolute mouse position
this . offset . relative . top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
this . offset . parent . top * mod - // The offsetParent's offset without borders (offset + border)
2012-12-25 17:01:09 +00:00
( ( this . cssPosition === "fixed" ? - this . scrollParent . scrollTop ( ) : ( scrollIsRootNode ? 0 : scroll . scrollTop ( ) ) ) * mod )
2008-06-04 02:34:33 +00:00
) ,
left : (
2012-11-17 03:51:24 +00:00
pos . left + // The absolute mouse position
this . offset . relative . left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
this . offset . parent . left * mod - // The offsetParent's offset without borders (offset + border)
2012-12-25 17:01:09 +00:00
( ( this . cssPosition === "fixed" ? - this . scrollParent . scrollLeft ( ) : scrollIsRootNode ? 0 : scroll . scrollLeft ( ) ) * mod )
2008-06-04 02:34:33 +00:00
)
} ;
2009-01-22 13:10:18 +00:00
2008-06-04 02:34:33 +00:00
} ,
2008-11-28 15:43:32 +00:00
2008-11-14 03:00:16 +00:00
_generatePosition : function ( event ) {
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
var top , left ,
o = this . options ,
pageX = event . pageX ,
pageY = event . pageY ,
2015-02-02 19:59:03 +00:00
scroll = this . cssPosition === "absolute" && ! ( this . scrollParent [ 0 ] !== this . document [ 0 ] && $ . contains ( this . scrollParent [ 0 ] , this . offsetParent [ 0 ] ) ) ? this . offsetParent : this . scrollParent , scrollIsRootNode = ( /(html|body)/i ) . test ( scroll [ 0 ] . tagName ) ;
2009-01-09 14:08:32 +00:00
// This is another very weird special case that only happens for relative elements:
// 1. If the css position is relative
// 2. and the scroll parent is the document or similar to the offset parent
// we have to refresh the relative offset during the scroll so there are no jumps
2015-02-02 19:59:03 +00:00
if ( this . cssPosition === "relative" && ! ( this . scrollParent [ 0 ] !== this . document [ 0 ] && this . scrollParent [ 0 ] !== this . offsetParent [ 0 ] ) ) {
2009-01-09 14:08:32 +00:00
this . offset . relative = this . _getRelativeOffset ( ) ;
}
2009-01-22 13:10:18 +00:00
2009-01-09 14:08:32 +00:00
/ *
* - Position constraining -
* Constrain the position to a mix of grid , containment .
* /
2009-01-22 13:10:18 +00:00
2009-01-09 14:08:32 +00:00
if ( this . originalPosition ) { //If we are not dragging yet, we won't check for options
if ( this . containment ) {
2012-11-17 03:51:24 +00:00
if ( event . pageX - this . offset . click . left < this . containment [ 0 ] ) {
pageX = this . containment [ 0 ] + this . offset . click . left ;
}
if ( event . pageY - this . offset . click . top < this . containment [ 1 ] ) {
pageY = this . containment [ 1 ] + this . offset . click . top ;
}
if ( event . pageX - this . offset . click . left > this . containment [ 2 ] ) {
pageX = this . containment [ 2 ] + this . offset . click . left ;
}
if ( event . pageY - this . offset . click . top > this . containment [ 3 ] ) {
pageY = this . containment [ 3 ] + this . offset . click . top ;
}
2009-01-09 14:08:32 +00:00
}
2009-01-22 13:10:18 +00:00
2009-01-09 14:08:32 +00:00
if ( o . grid ) {
2012-11-17 03:51:24 +00:00
top = this . originalPageY + Math . round ( ( pageY - this . originalPageY ) / o . grid [ 1 ] ) * o . grid [ 1 ] ;
2012-11-02 00:54:52 +00:00
pageY = this . containment ? ( ( top - this . offset . click . top >= this . containment [ 1 ] && top - this . offset . click . top <= this . containment [ 3 ] ) ? top : ( ( top - this . offset . click . top >= this . containment [ 1 ] ) ? top - o . grid [ 1 ] : top + o . grid [ 1 ] ) ) : top ;
2009-01-09 14:08:32 +00:00
2012-11-17 03:51:24 +00:00
left = this . originalPageX + Math . round ( ( pageX - this . originalPageX ) / o . grid [ 0 ] ) * o . grid [ 0 ] ;
2012-11-02 00:54:52 +00:00
pageX = this . containment ? ( ( left - this . offset . click . left >= this . containment [ 0 ] && left - this . offset . click . left <= this . containment [ 2 ] ) ? left : ( ( left - this . offset . click . left >= this . containment [ 0 ] ) ? left - o . grid [ 0 ] : left + o . grid [ 0 ] ) ) : left ;
2009-01-09 14:08:32 +00:00
}
2008-11-25 09:57:41 +00:00
2009-01-09 14:08:32 +00:00
}
return {
2008-06-04 02:34:33 +00:00
top : (
2012-11-17 03:51:24 +00:00
pageY - // The absolute mouse position
this . offset . click . top - // Click offset (relative to the element)
this . offset . relative . top - // Only for relative positioned nodes: Relative offset from element to offset parent
this . offset . parent . top + // The offsetParent's offset without borders (offset + border)
2012-12-25 17:01:09 +00:00
( ( this . cssPosition === "fixed" ? - this . scrollParent . scrollTop ( ) : ( scrollIsRootNode ? 0 : scroll . scrollTop ( ) ) ) )
2008-06-04 02:34:33 +00:00
) ,
left : (
2012-11-17 03:51:24 +00:00
pageX - // The absolute mouse position
this . offset . click . left - // Click offset (relative to the element)
this . offset . relative . left - // Only for relative positioned nodes: Relative offset from element to offset parent
this . offset . parent . left + // The offsetParent's offset without borders (offset + border)
2012-12-25 17:01:09 +00:00
( ( this . cssPosition === "fixed" ? - this . scrollParent . scrollLeft ( ) : scrollIsRootNode ? 0 : scroll . scrollLeft ( ) ) )
2008-06-04 02:34:33 +00:00
)
} ;
2009-01-22 13:10:18 +00:00
2008-06-04 02:34:33 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-11-14 03:00:16 +00:00
_rearrange : function ( event , i , a , hardRefresh ) {
2008-10-28 05:44:17 +00:00
2012-12-25 17:01:09 +00:00
a ? a [ 0 ] . appendChild ( this . placeholder [ 0 ] ) : i . item [ 0 ] . parentNode . insertBefore ( this . placeholder [ 0 ] , ( this . direction === "down" ? i . item [ 0 ] : i . item [ 0 ] . nextSibling ) ) ;
2008-10-28 05:44:17 +00:00
2008-06-25 13:30:22 +00:00
//Various things done here to improve the performance:
// 1. we create a setTimeout, that calls refreshPositions
// 2. on the instance, we have a counter variable, that get's higher after every append
// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
// 4. this lets only the last addition to the timeout stack through
this . counter = this . counter ? ++ this . counter : 1 ;
2012-05-10 00:19:51 +00:00
var counter = this . counter ;
2008-10-28 05:44:17 +00:00
2012-05-10 00:19:51 +00:00
this . _delay ( function ( ) {
2012-11-17 03:51:24 +00:00
if ( counter === this . counter ) {
this . refreshPositions ( ! hardRefresh ) ; //Precompute after each DOM insertion, NOT on mousemove
}
2012-05-10 00:19:51 +00:00
} ) ;
2008-10-28 05:44:17 +00:00
2008-06-24 12:51:15 +00:00
} ,
2008-10-28 05:44:17 +00:00
2008-11-14 03:00:16 +00:00
_clear : function ( event , noPropagation ) {
2008-10-28 05:44:17 +00:00
2008-10-28 06:41:11 +00:00
this . reverting = false ;
2009-01-19 12:00:45 +00:00
// We delay all events that have to be triggered to after the point where the placeholder has been removed and
// everything else normalized again
2012-11-17 03:51:24 +00:00
var i ,
delayedTriggers = [ ] ;
2008-10-28 06:41:11 +00:00
2009-02-10 10:07:25 +00:00
// We first have to update the dom position of the actual currentItem
// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
2012-11-17 03:51:24 +00:00
if ( ! this . _noFinalSort && this . currentItem . parent ( ) . length ) {
this . placeholder . before ( this . currentItem ) ;
}
2008-07-09 11:09:40 +00:00
this . _noFinalSort = null ;
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
if ( this . helper [ 0 ] === this . currentItem [ 0 ] ) {
for ( i in this . _storedCSS ) {
2012-12-25 17:01:09 +00:00
if ( this . _storedCSS [ i ] === "auto" || this . _storedCSS [ i ] === "static" ) {
this . _storedCSS [ i ] = "" ;
2012-11-17 03:51:24 +00:00
}
2008-11-25 09:57:41 +00:00
}
2015-02-24 21:16:47 +00:00
this . currentItem . css ( this . _storedCSS ) ;
this . _removeClass ( this . currentItem , "ui-sortable-helper" ) ;
2008-11-25 09:57:41 +00:00
} else {
2008-07-09 11:09:40 +00:00
this . currentItem . show ( ) ;
2008-11-25 09:57:41 +00:00
}
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
if ( this . fromOutside && ! noPropagation ) {
delayedTriggers . push ( function ( event ) { this . _trigger ( "receive" , event , this . _uiHash ( this . fromOutside ) ) ; } ) ;
}
if ( ( this . fromOutside || this . domPosition . prev !== this . currentItem . prev ( ) . not ( ".ui-sortable-helper" ) [ 0 ] || this . domPosition . parent !== this . currentItem . parent ( ) [ 0 ] ) && ! noPropagation ) {
delayedTriggers . push ( function ( event ) { this . _trigger ( "update" , event , this . _uiHash ( ) ) ; } ) ; //Trigger update callback if the DOM position has changed
}
2012-08-23 02:04:40 +00:00
// Check if the items Container has Changed and trigger appropriate
// events.
if ( this !== this . currentContainer ) {
if ( ! noPropagation ) {
delayedTriggers . push ( function ( event ) { this . _trigger ( "remove" , event , this . _uiHash ( ) ) ; } ) ;
delayedTriggers . push ( ( function ( c ) { return function ( event ) { c . _trigger ( "receive" , event , this . _uiHash ( this ) ) ; } ; } ) . call ( this , this . currentContainer ) ) ;
delayedTriggers . push ( ( function ( c ) { return function ( event ) { c . _trigger ( "update" , event , this . _uiHash ( this ) ) ; } ; } ) . call ( this , this . currentContainer ) ) ;
}
}
2008-10-28 05:44:17 +00:00
2008-06-04 02:34:33 +00:00
//Post events to containers
2013-04-22 16:33:35 +00:00
function delayEvent ( type , instance , container ) {
return function ( event ) {
container . _trigger ( type , event , instance . _uiHash ( instance ) ) ;
} ;
}
2012-11-17 03:51:24 +00:00
for ( i = this . containers . length - 1 ; i >= 0 ; i -- ) {
2013-04-22 16:33:35 +00:00
if ( ! noPropagation ) {
delayedTriggers . push ( delayEvent ( "deactivate" , this , this . containers [ i ] ) ) ;
2012-11-17 03:51:24 +00:00
}
2008-06-04 02:34:33 +00:00
if ( this . containers [ i ] . containerCache . over ) {
2013-04-22 16:33:35 +00:00
delayedTriggers . push ( delayEvent ( "out" , this , this . containers [ i ] ) ) ;
2008-06-04 02:34:33 +00:00
this . containers [ i ] . containerCache . over = 0 ;
}
}
2008-10-28 05:44:17 +00:00
2009-01-16 20:41:03 +00:00
//Do what was originally in plugins
2013-02-13 16:34:52 +00:00
if ( this . storedCursor ) {
this . document . find ( "body" ) . css ( "cursor" , this . storedCursor ) ;
this . storedStylesheet . remove ( ) ;
2012-11-17 03:51:24 +00:00
}
if ( this . _storedOpacity ) {
this . helper . css ( "opacity" , this . _storedOpacity ) ;
}
if ( this . _storedZIndex ) {
2012-12-25 17:01:09 +00:00
this . helper . css ( "zIndex" , this . _storedZIndex === "auto" ? "" : this . _storedZIndex ) ;
2012-11-17 03:51:24 +00:00
}
2009-01-16 20:41:03 +00:00
2008-06-04 02:34:33 +00:00
this . dragging = false ;
2008-10-28 05:44:17 +00:00
2012-11-17 03:51:24 +00:00
if ( ! noPropagation ) {
this . _trigger ( "beforeStop" , event , this . _uiHash ( ) ) ;
}
2008-11-10 05:17:12 +00:00
2008-11-03 13:23:15 +00:00
//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
this . placeholder [ 0 ] . parentNode . removeChild ( this . placeholder [ 0 ] ) ;
2008-11-10 05:17:12 +00:00
2014-08-25 14:28:39 +00:00
if ( ! this . cancelHelperRemoval ) {
if ( this . helper [ 0 ] !== this . currentItem [ 0 ] ) {
this . helper . remove ( ) ;
}
this . helper = null ;
2012-11-17 03:51:24 +00:00
}
2009-01-22 13:10:18 +00:00
2009-01-19 12:00:45 +00:00
if ( ! noPropagation ) {
2012-11-17 03:51:24 +00:00
for ( i = 0 ; i < delayedTriggers . length ; i ++ ) {
2012-11-02 00:54:52 +00:00
delayedTriggers [ i ] . call ( this , event ) ;
} //Trigger all delayed events
2009-01-19 12:00:45 +00:00
this . _trigger ( "stop" , event , this . _uiHash ( ) ) ;
}
2008-10-28 05:44:17 +00:00
2009-01-08 15:49:20 +00:00
this . fromOutside = false ;
2014-08-25 14:28:39 +00:00
return ! this . cancelHelperRemoval ;
2008-10-28 05:44:17 +00:00
2008-11-21 04:01:33 +00:00
} ,
2009-01-16 20:41:03 +00:00
_trigger : function ( ) {
2010-01-07 03:19:50 +00:00
if ( $ . Widget . prototype . _trigger . apply ( this , arguments ) === false ) {
2009-01-16 20:41:03 +00:00
this . cancel ( ) ;
2009-01-16 02:25:03 +00:00
}
2008-11-21 04:01:33 +00:00
} ,
2012-05-10 00:19:51 +00:00
_uiHash : function ( _inst ) {
var inst = _inst || this ;
2008-11-21 04:01:33 +00:00
return {
2012-05-10 00:19:51 +00:00
helper : inst . helper ,
placeholder : inst . placeholder || $ ( [ ] ) ,
position : inst . position ,
originalPosition : inst . originalPosition ,
offset : inst . positionAbs ,
item : inst . currentItem ,
sender : _inst ? _inst . element : null
2008-11-21 04:01:33 +00:00
} ;
2008-06-04 02:34:33 +00:00
}
2008-11-21 04:01:33 +00:00
2010-01-07 03:19:50 +00:00
} ) ;
2008-06-04 02:34:33 +00:00
2013-07-12 16:40:48 +00:00
} ) ) ;