| Current Path : /home/azimutno/www/libraries/nextend/assets/js/ |
| Current File : /home/azimutno/www/libraries/nextend/assets/js/sortable.js |
(function($, undefined) {
function isOverAxis(x, reference, size) {
return (x > reference) && (x < (reference + size));
}
function isFloating(item) {
return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
}
$.widget("ui.nextendSortable", $.ui.sortable, {
_create: function() {
$.ui.sortable.prototype._create.apply(this, arguments);
$.data(this.element[0], 'ui-sortable', this);
},
_intersectsWith: function(item) {
var pos = $.ui.sortable.prototype._intersectsWith.apply(this, arguments);
return pos;
},
_contactContainers: function(event) {
var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom, floating,
innermostContainer = null,
innermostIndex = null;
// get innermost container that intersects with item
for (i = this.containers.length - 1; i >= 0; i--) {
// never consider a container that's located within the item itself
if ($.contains(this.currentItem[0], this.containers[i].element[0])) {
continue;
}
if (this._intersectsWith(this.containers[i].containerCache)) {
// if we've already found a container and it's more "inner" than this, then continue
//if (innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
if (innermostContainer && parseInt(this.containers[i].element.css('zIndex')) < parseInt(innermostContainer.element.css('zIndex'))) {
continue;
}
innermostContainer = this.containers[i];
innermostIndex = i;
} else {
// container doesn't intersect. trigger "out" event if necessary
if (this.containers[i].containerCache.over) {
this.containers[i]._trigger("out", event, this._uiHash(this));
this.containers[i].containerCache.over = 0;
}
}
}
// if no intersecting containers found, return
if (!innermostContainer) {
return;
}
if(typeof event.processed == 'undefined' && innermostContainer != window.dummySortable){
event.processed = true;
}else{
innermostContainer = window.dummySortable;
innermostIndex = this.containers.indexOf(innermostContainer);
}
// move the item into the container if it's not there already
if (this.containers.length === 1) {
if (!this.containers[innermostIndex].containerCache.over) {
this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
this.containers[innermostIndex].containerCache.over = 1;
}
} else {
//When entering a new container, we will find the item with the least distance and append our item near it
dist = 10000;
itemWithLeastDistance = null;
floating = innermostContainer.floating || isFloating(this.currentItem);
posProperty = floating ? "left" : "top";
sizeProperty = floating ? "width" : "height";
base = this.positionAbs[posProperty] + this.offset.click[posProperty];
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;
}
if (floating && !isOverAxis(this.positionAbs.top + this.offset.click.top, this.items[j].top, this.items[j].height)) {
continue;
}
cur = this.items[j].item.offset()[posProperty];
nearBottom = false;
if (Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)) {
nearBottom = true;
cur += this.items[j][sizeProperty];
}
if (Math.abs(cur - base) < dist) {
dist = Math.abs(cur - base);
itemWithLeastDistance = this.items[j];
this.direction = nearBottom ? "up" : "down";
}
}
//Check if dropOnEmpty is enabled
if (!itemWithLeastDistance && !this.options.dropOnEmpty) {
return;
}
if (this.currentContainer === this.containers[innermostIndex]) {
return;
}
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));
this.currentContainer = this.containers[innermostIndex];
//Update the placeholder
this.options.placeholder.update(this.currentContainer, this.placeholder);
this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
this.containers[innermostIndex].containerCache.over = 1;
}
}
});
})(njQuery);