aboutsummaryrefslogtreecommitdiffstats
path: root/ui/ui.sortable.js
diff options
context:
space:
mode:
authorRichard Worth <rdworth@gmail.com>2008-09-20 02:43:18 +0000
committerRichard Worth <rdworth@gmail.com>2008-09-20 02:43:18 +0000
commit0bae0870d920842f10322763c66bc59541b9158c (patch)
tree4133b7ebeb79260c75efc5f8a7f1133bbce85c9f /ui/ui.sortable.js
parent1285c6e76302a65f8eaf6380b33c010a1900519c (diff)
downloadjquery-ui-0bae0870d920842f10322763c66bc59541b9158c.tar.gz
jquery-ui-0bae0870d920842f10322763c66bc59541b9158c.zip
whitespace
Diffstat (limited to 'ui/ui.sortable.js')
-rw-r--r--ui/ui.sortable.js137
1 files changed, 67 insertions, 70 deletions
diff --git a/ui/ui.sortable.js b/ui/ui.sortable.js
index c459f2244..f4263263b 100644
--- a/ui/ui.sortable.js
+++ b/ui/ui.sortable.js
@@ -26,20 +26,20 @@ function contains(a, b) {
$.widget("ui.sortable", $.extend({}, $.ui.mouse, {
_init: function() {
-
+
var o = this.options;
this.containerCache = {};
this.element.addClass("ui-sortable");
-
+
//Get the items
this.refresh();
-
+
//Let's determine if the items are floating
this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false;
//Let's determine the parent's offset
this.offset = this.element.offset();
-
+
//Initialize mouse events for interaction
this._mouseInit();
@@ -64,7 +64,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
},
serialize: function(o) {
-
+
var items = this._getItemsAsjQuery(o && o.connected);
var str = []; o = o || {};
@@ -81,7 +81,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
var items = this._getItemsAsjQuery(o && o.connected);
var ret = [];
-
+
items.each(function() { ret.push($(this).attr(o.attr || 'id')); });
return ret;
@@ -100,7 +100,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
if(this.options.tolerance == "pointer" || this.options.forcePointerForContainers || (this.options.tolerance == "guess" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])) {
return isOverElement;
} else {
-
+
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
@@ -121,7 +121,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
if(this.options.tolerance == "pointer" || (this.options.tolerance == "guess" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])) {
if(!isOverElement) return false;
-
+
if(this.floating) {
if ((x1 + dxClick) > l && (x1 + dxClick) < l + item.width/2) return 2;
if ((x1 + dxClick) > l + item.width/2 && (x1 + dxClick) < r) return 1;
@@ -132,7 +132,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
if (direction == 1 && (y1 + dyClick) < t + height/2) { return 2; } // up
else if (direction == 2 && (y1 + dyClick) > t + height/2) { return 1; } // down
}
-
+
} else {
if (!(l < x1 + (this.helperProportions.width / 2) // Right Half
&& x2 - (this.helperProportions.width / 2) < r // Left Half
@@ -162,7 +162,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
var self = this;
var items = [];
var queries = [];
-
+
if(this.options.connectWith && connected) {
for (var i = this.options.connectWith.length - 1; i >= 0; i--){
var cur = $(this.options.connectWith[i]);
@@ -176,7 +176,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
}
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"), this]);
-
+
for (var i = queries.length - 1; i >= 0; i--){
queries[i][0].each(function() {
items.push(this);
@@ -188,16 +188,16 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
},
_removeCurrentsFromItems: function() {
-
+
var list = this.currentItem.find(":data(sortable-item)");
-
+
for (var i=0; i < this.items.length; i++) {
for (var j=0; j < list.length; j++) {
if(list[j] == this.items[i].item[0])
this.items.splice(i,1);
};
-
+
};
},
@@ -209,7 +209,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
var items = this.items;
var self = this;
var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element), this]];
-
+
if(this.options.connectWith) {
for (var i = this.options.connectWith.length - 1; i >= 0; i--){
var cur = $(this.options.connectWith[i]);
@@ -222,7 +222,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
};
};
}
-
+
for (var i = queries.length - 1; i >= 0; i--){
queries[i][0].each(function() {
$.data(this, 'sortable-item', queries[i][1]); // Data for target checking (mouse manager)
@@ -234,23 +234,23 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
});
});
};
-
+
},
refreshPositions: function(fast) {
-
+
//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
if(this.offsetParent) {
var po = this.offsetParent.offset();
this.offset.parent = { top: po.top + this.offsetParentBorders.top, left: po.left + this.offsetParentBorders.left };
}
-
+
for (var i = this.items.length - 1; i >= 0; i--){
//We ignore calculating positions of all connected containers when we're not over them
if(this.items[i].instance != this.currentContainer && this.currentContainer && this.items[i].item[0] != this.currentItem[0])
continue;
-
+
var t = this.options.toleranceElement ? $(this.options.toleranceElement, this.items[i].item) : this.items[i].item;
if(!fast) {
@@ -263,7 +263,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
this.items[i].top = p.top;
};
-
+
if(this.options.custom && this.options.custom.refreshContainers) {
this.options.custom.refreshContainers.call(this);
} else {
@@ -275,7 +275,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
};
}
-
+
},
destroy: function() {
@@ -292,20 +292,20 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
_createPlaceholder: function(that) {
var self = that || this, o = self.options;
-
+
if(!o.placeholder || o.placeholder.constructor == String) {
var className = o.placeholder;
o.placeholder = {
element: function() {
var el = $(document.createElement(self.currentItem[0].nodeName)).addClass(className || "ui-sortable-placeholder")[0];
-
+
if(!className) {
el.style.visibility = "hidden";
document.body.appendChild(el);
el.innerHTML = self.currentItem[0].innerHTML;
document.body.removeChild(el);
};
-
+
return el;
},
update: function(container, p) {
@@ -324,11 +324,10 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
_contactContainers: function(e) {
for (var i = this.containers.length - 1; i >= 0; i--){
-
+
if(this._intersectsWith(this.containers[i].containerCache)) {
if(!this.containers[i].containerCache.over) {
-
if(this.currentContainer != this.containers[i]) {
//When entering a new container, we will find the item with the least distance and append our item near it
@@ -351,7 +350,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
//Update the placeholder
this.options.placeholder.update(this.currentContainer, this.placeholder);
-
+
}
this.containers[i]._propagate("over", e, this);
@@ -368,12 +367,12 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
},
_mouseCapture: function(e, overrideHandle) {
-
+
if(this.options.disabled || this.options.type == 'static') return false;
-
+
//We have to refresh the items data once first
this._refreshItems();
-
+
//Find out if the clicked node (or one of its parents) is a actual item in this.items
var currentItem = null, self = this, nodes = $(e.target).parents().each(function() {
if($.data(this, 'sortable-item') == self) {
@@ -382,7 +381,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
}
});
if($.data(e.target, 'sortable-item') == self) currentItem = $(e.target);
-
+
if(!currentItem) return false;
if(this.options.handle && !overrideHandle) {
var validHandle = false;
@@ -390,11 +389,11 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
$(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == e.target) validHandle = true; });
if(!validHandle) return false;
}
-
+
this.currentItem = currentItem;
this._removeCurrentsFromItems();
return true;
-
+
},
createHelper: function(e) {
@@ -404,32 +403,32 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
if (!helper.parents('body').length)
$(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]); //Add the helper to the DOM if that didn't happen already
-
+
return helper;
-
+
},
_mouseStart: function(e, overrideHandle, noActivation) {
-
+
var o = this.options;
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
this.helper = this.createHelper(e);
-
+
/*
* - Position generation -
* This block generates everything position related - it's the core of draggables.
*/
-
+
this.margins = { //Cache the margins
left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
};
-
+
this.offset = this.currentItem.offset(); //The element's absolute position on the page
this.offset = { //Substract the margins from the element's absolute offset
top: this.offset.top - this.margins.top,
@@ -443,7 +442,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
this.offsetParent = this.helper.offsetParent(); //Get the offsetParent and cache its position
var po = this.offsetParent.offset();
-
+
this.offsetParentBorders = {
top: (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
left: (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
@@ -453,20 +452,19 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
top: po.top + this.offsetParentBorders.top,
left: po.left + this.offsetParentBorders.left
};
-
+
this.updateOriginalPosition = this.originalPosition = this._generatePosition(e); //Generate the original position
this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; //Cache the former DOM position
//If o.placeholder is used, create a new element at the given position with the class
this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Cache the helper size
-
-
+
if(o.helper == "original") {
this._storedCSS = { position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left"), clear: this.currentItem.css("clear") };
} else {
this.currentItem.hide(); //Hide the original, won't cause anything bad this way
}
-
+
//Position it absolutely and add a helper class
this.helper
.css({ position: 'absolute', clear: 'both' })
@@ -474,7 +472,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
//Create the placeholder
this._createPlaceholder();
-
+
//Call plugins and callbacks
this._propagate("start", e);
@@ -488,7 +486,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
if(o.cursorAt.top != undefined) this.offset.click.top = o.cursorAt.top;
if(o.cursorAt.bottom != undefined) this.offset.click.top = this.helperProportions.height - o.cursorAt.bottom;
}
-
+
/*
* - Position constraining -
* Here we prepare position constraining like grid and containment.
@@ -502,7 +500,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
$(o.containment == 'document' ? document : window).width() - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.element.css("marginRight"),10) || 0),
($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.element.css("marginBottom"),10) || 0)
];
-
+
if(!(/^(document|window|parent)$/).test(o.containment)) {
var ce = $(o.containment)[0];
var co = $(o.containment).offset();
@@ -528,13 +526,12 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
if ($.ui.ddmanager && !o.dropBehaviour)
$.ui.ddmanager.prepareOffsets(this, e);
-
+
this.dragging = true;
-
+
this._mouseDrag(e); //Execute the drag once - this causes the helper not to be visible before getting its correct position
return true;
-
-
+
},
_convertPositionTo: function(d, pos) {
@@ -599,11 +596,11 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
},
_mouseDrag: function(e) {
-
+
//Compute the helpers position
this.position = this._generatePosition(e);
this.positionAbs = this._convertPositionTo("absolute");
-
+
//Call the internal plugins
$.ui.plugin.call(this, "sort", [e, this.ui()]);
@@ -613,7 +610,7 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
//Set the helper's position
this.helper[0].style.left = this.position.left+'px';
this.helper[0].style.top = this.position.top+'px';
-
+
//Rearrange
for (var i = this.items.length - 1; i >= 0; i--) {
var intersection = this._intersectsWithEdge(this.items[i]);
@@ -639,16 +636,16 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
//Interconnect with droppables
if($.ui.ddmanager) $.ui.ddmanager.drag(this, e);
-
+
//Call callbacks
this.element.triggerHandler("sort", [e, this.ui()], this.options["sort"]);
-
+
return false;
},
_rearrange: function(e, i, a, hardRefresh) {
-
+
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));
//Various things done here to improve the performance:
@@ -658,23 +655,23 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
// 4. this lets only the last addition to the timeout stack through
this.counter = this.counter ? ++this.counter : 1;
var self = this, counter = this.counter;
-
+
window.setTimeout(function() {
if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
},0);
-
+
},
_mouseStop: function(e, noPropagation) {
-
+
//If we are using droppables, inform the manager about the drop
if ($.ui.ddmanager && !this.options.dropBehaviour)
$.ui.ddmanager.drop(this, e);
-
+
if(this.options.revert) {
var self = this;
var cur = self.placeholder.offset();
-
+
$(this.helper).animate({
left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
@@ -684,22 +681,22 @@ $.widget("ui.sortable", $.extend({}, $.ui.mouse, {
} else {
this._clear(e, noPropagation);
}
-
+
return false;
},
_clear: function(e, noPropagation) {
-
+
//We first have to update the dom position of the actual currentItem
if(!this._noFinalSort) this.placeholder.before(this.currentItem);
this._noFinalSort = null;
-
+
if(this.options.helper == "original")
this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
else
this.currentItem.show();
-
+
if(this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) this._propagate("update", e, null, noPropagation); //Trigger update callback if the DOM position has changed
if(!contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
this._propagate("remove", e, null, noPropagation);
@@ -800,7 +797,7 @@ $.ui.plugin.add("sortable", "scroll", {
start: function(e, ui) {
var o = ui.options;
var i = $(this).data("sortable");
-
+
i.overflowY = function(el) {
do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-y'))) return el; el = el.parent(); } while (el[0].parentNode);
return $(document);