//Jquery Sortable
|
|
//Created by Jonas von Andrian.
|
|
//jquery-sortable.js is released under the Modified BSD License.
|
|
//License http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5
|
|
!(function (d, B, m, f) {
|
|
function v(a, b) {
|
|
var c = Math.max(0, a[0] - b[0], b[0] - a[1]),
|
|
e = Math.max(0, a[2] - b[1], b[1] - a[3]);
|
|
return c + e;
|
|
}
|
|
function w(a, b, c, e) {
|
|
var k = a.length;
|
|
e = e ? "offset" : "position";
|
|
for (c = c || 0; k--; ) {
|
|
var g = a[k].el ? a[k].el : d(a[k]),
|
|
l = g[e]();
|
|
l.left += parseInt(g.css("margin-left"), 10);
|
|
l.top += parseInt(g.css("margin-top"), 10);
|
|
b[k] = [
|
|
l.left - c,
|
|
l.left + g.outerWidth() + c,
|
|
l.top - c,
|
|
l.top + g.outerHeight() + c,
|
|
];
|
|
}
|
|
}
|
|
function p(a, b) {
|
|
var c = b.offset();
|
|
return { left: a.left - c.left, top: a.top - c.top };
|
|
}
|
|
function x(a, b, c) {
|
|
b = [b.left, b.top];
|
|
c = c && [c.left, c.top];
|
|
for (var e, k = a.length, d = []; k--; )
|
|
(e = a[k]), (d[k] = [k, v(e, b), c && v(e, c)]);
|
|
return (d = d.sort(function (a, b) {
|
|
return b[1] - a[1] || b[2] - a[2] || b[0] - a[0];
|
|
}));
|
|
}
|
|
function q(a) {
|
|
this.options = d.extend({}, n, a);
|
|
this.containers = [];
|
|
this.options.rootGroup ||
|
|
((this.scrollProxy = d.proxy(this.scroll, this)),
|
|
(this.dragProxy = d.proxy(this.drag, this)),
|
|
(this.dropProxy = d.proxy(this.drop, this)),
|
|
(this.placeholder = d(this.options.placeholder)),
|
|
a.isValidTarget || (this.options.isValidTarget = f));
|
|
}
|
|
function s(a, b) {
|
|
this.el = a;
|
|
this.options = d.extend({}, z, b);
|
|
this.group = q.get(this.options);
|
|
this.rootGroup = this.options.rootGroup || this.group;
|
|
this.handle =
|
|
this.rootGroup.options.handle || this.rootGroup.options.itemSelector;
|
|
var c = this.rootGroup.options.itemPath;
|
|
this.target = c ? this.el.find(c) : this.el;
|
|
this.target.on(t.start, this.handle, d.proxy(this.dragInit, this));
|
|
this.options.drop && this.group.containers.push(this);
|
|
}
|
|
var z = { drag: !0, drop: !0, exclude: "", nested: !0, vertical: !0 },
|
|
n = {
|
|
afterMove: function (a, b, c) {},
|
|
containerPath: "",
|
|
containerSelector: "ol, ul",
|
|
distance: 0,
|
|
delay: 0,
|
|
handle: "",
|
|
itemPath: "",
|
|
itemSelector: "li",
|
|
bodyClass: "dragging",
|
|
draggedClass: "dragged",
|
|
isValidTarget: function (a, b) {
|
|
return !0;
|
|
},
|
|
onCancel: function (a, b, c, e) {},
|
|
onDrag: function (a, b, c, e) {
|
|
a.css(b);
|
|
},
|
|
onDragStart: function (a, b, c, e) {
|
|
a.css({ height: a.outerHeight(), width: a.outerWidth() });
|
|
a.addClass(b.group.options.draggedClass);
|
|
d("body").addClass(b.group.options.bodyClass);
|
|
},
|
|
onDrop: function (a, b, c, e) {
|
|
a.removeClass(b.group.options.draggedClass).removeAttr("style");
|
|
d("body").removeClass(b.group.options.bodyClass);
|
|
},
|
|
onMousedown: function (a, b, c) {
|
|
if (!c.target.nodeName.match(/^(input|select|textarea)$/i))
|
|
return c.preventDefault(), !0;
|
|
},
|
|
placeholderClass: "placeholder",
|
|
placeholder: '<li class="placeholder"></li>',
|
|
pullPlaceholder: !0,
|
|
serialize: function (a, b, c) {
|
|
a = d.extend({}, a.data());
|
|
if (c) return [b];
|
|
b[0] && (a.children = b);
|
|
delete a.subContainers;
|
|
delete a.sortable;
|
|
return a;
|
|
},
|
|
tolerance: 0,
|
|
},
|
|
r = {},
|
|
y = 0,
|
|
A = { left: 0, top: 0, bottom: 0, right: 0 },
|
|
t = {
|
|
start: "touchstart.sortable mousedown.sortable",
|
|
drop: "touchend.sortable touchcancel.sortable mouseup.sortable",
|
|
drag: "touchmove.sortable mousemove.sortable",
|
|
scroll: "scroll.sortable",
|
|
};
|
|
q.get = function (a) {
|
|
r[a.group] || (a.group === f && (a.group = y++), (r[a.group] = new q(a)));
|
|
return r[a.group];
|
|
};
|
|
q.prototype = {
|
|
dragInit: function (a, b) {
|
|
this.$document = d(b.el[0].ownerDocument);
|
|
var c = d(a.target).closest(this.options.itemSelector);
|
|
c.length &&
|
|
((this.item = c),
|
|
(this.itemContainer = b),
|
|
!this.item.is(this.options.exclude) &&
|
|
this.options.onMousedown(this.item, n.onMousedown, a) &&
|
|
(this.setPointer(a),
|
|
this.toggleListeners("on"),
|
|
this.setupDelayTimer(),
|
|
(this.dragInitDone = !0)));
|
|
},
|
|
drag: function (a) {
|
|
if (!this.dragging) {
|
|
if (!this.distanceMet(a) || !this.delayMet) return;
|
|
this.options.onDragStart(
|
|
this.item,
|
|
this.itemContainer,
|
|
n.onDragStart,
|
|
a
|
|
);
|
|
this.item.before(this.placeholder);
|
|
this.dragging = !0;
|
|
}
|
|
this.setPointer(a);
|
|
this.options.onDrag(
|
|
this.item,
|
|
p(this.pointer, this.item.offsetParent()),
|
|
n.onDrag,
|
|
a
|
|
);
|
|
a = this.getPointer(a);
|
|
var b = this.sameResultBox,
|
|
c = this.options.tolerance;
|
|
(!b ||
|
|
b.top - c > a.top ||
|
|
b.bottom + c < a.top ||
|
|
b.left - c > a.left ||
|
|
b.right + c < a.left) &&
|
|
!this.searchValidTarget() &&
|
|
(this.placeholder.detach(), (this.lastAppendedItem = f));
|
|
},
|
|
drop: function (a) {
|
|
this.toggleListeners("off");
|
|
this.dragInitDone = !1;
|
|
if (this.dragging) {
|
|
if (this.placeholder.closest("html")[0])
|
|
this.placeholder.before(this.item).detach();
|
|
else
|
|
this.options.onCancel(this.item, this.itemContainer, n.onCancel, a);
|
|
this.options.onDrop(
|
|
this.item,
|
|
this.getContainer(this.item),
|
|
n.onDrop,
|
|
a
|
|
);
|
|
this.clearDimensions();
|
|
this.clearOffsetParent();
|
|
this.lastAppendedItem = this.sameResultBox = f;
|
|
this.dragging = !1;
|
|
}
|
|
},
|
|
searchValidTarget: function (a, b) {
|
|
a ||
|
|
((a = this.relativePointer || this.pointer),
|
|
(b = this.lastRelativePointer || this.lastPointer));
|
|
for (
|
|
var c = x(this.getContainerDimensions(), a, b), e = c.length;
|
|
e--;
|
|
|
|
) {
|
|
var d = c[e][0];
|
|
if (!c[e][1] || this.options.pullPlaceholder)
|
|
if (((d = this.containers[d]), !d.disabled)) {
|
|
if (!this.$getOffsetParent()) {
|
|
var g = d.getItemOffsetParent();
|
|
a = p(a, g);
|
|
b = p(b, g);
|
|
}
|
|
if (d.searchValidTarget(a, b)) return !0;
|
|
}
|
|
}
|
|
this.sameResultBox && (this.sameResultBox = f);
|
|
},
|
|
movePlaceholder: function (a, b, c, e) {
|
|
var d = this.lastAppendedItem;
|
|
if (e || !d || d[0] !== b[0])
|
|
b[c](this.placeholder),
|
|
(this.lastAppendedItem = b),
|
|
(this.sameResultBox = e),
|
|
this.options.afterMove(this.placeholder, a, b);
|
|
},
|
|
getContainerDimensions: function () {
|
|
this.containerDimensions ||
|
|
w(
|
|
this.containers,
|
|
(this.containerDimensions = []),
|
|
this.options.tolerance,
|
|
!this.$getOffsetParent()
|
|
);
|
|
return this.containerDimensions;
|
|
},
|
|
getContainer: function (a) {
|
|
return a.closest(this.options.containerSelector).data(m);
|
|
},
|
|
$getOffsetParent: function () {
|
|
if (this.offsetParent === f) {
|
|
var a = this.containers.length - 1,
|
|
b = this.containers[a].getItemOffsetParent();
|
|
if (!this.options.rootGroup)
|
|
for (; a--; )
|
|
if (b[0] != this.containers[a].getItemOffsetParent()[0]) {
|
|
b = !1;
|
|
break;
|
|
}
|
|
this.offsetParent = b;
|
|
}
|
|
return this.offsetParent;
|
|
},
|
|
setPointer: function (a) {
|
|
a = this.getPointer(a);
|
|
if (this.$getOffsetParent()) {
|
|
var b = p(a, this.$getOffsetParent());
|
|
this.lastRelativePointer = this.relativePointer;
|
|
this.relativePointer = b;
|
|
}
|
|
this.lastPointer = this.pointer;
|
|
this.pointer = a;
|
|
},
|
|
distanceMet: function (a) {
|
|
a = this.getPointer(a);
|
|
return (
|
|
Math.max(
|
|
Math.abs(this.pointer.left - a.left),
|
|
Math.abs(this.pointer.top - a.top)
|
|
) >= this.options.distance
|
|
);
|
|
},
|
|
getPointer: function (a) {
|
|
var b =
|
|
a.originalEvent ||
|
|
(a.originalEvent.touches && a.originalEvent.touches[0]);
|
|
return { left: a.pageX || b.pageX, top: a.pageY || b.pageY };
|
|
},
|
|
setupDelayTimer: function () {
|
|
var a = this;
|
|
this.delayMet = !this.options.delay;
|
|
this.delayMet ||
|
|
(clearTimeout(this._mouseDelayTimer),
|
|
(this._mouseDelayTimer = setTimeout(function () {
|
|
a.delayMet = !0;
|
|
}, this.options.delay)));
|
|
},
|
|
scroll: function (a) {
|
|
this.clearDimensions();
|
|
this.clearOffsetParent();
|
|
},
|
|
toggleListeners: function (a) {
|
|
var b = this;
|
|
d.each(["drag", "drop", "scroll"], function (c, e) {
|
|
b.$document[a](t[e], b[e + "Proxy"]);
|
|
});
|
|
},
|
|
clearOffsetParent: function () {
|
|
this.offsetParent = f;
|
|
},
|
|
clearDimensions: function () {
|
|
this.traverse(function (a) {
|
|
a._clearDimensions();
|
|
});
|
|
},
|
|
traverse: function (a) {
|
|
a(this);
|
|
for (var b = this.containers.length; b--; )
|
|
this.containers[b].traverse(a);
|
|
},
|
|
_clearDimensions: function () {
|
|
this.containerDimensions = f;
|
|
},
|
|
_destroy: function () {
|
|
r[this.options.group] = f;
|
|
},
|
|
};
|
|
s.prototype = {
|
|
dragInit: function (a) {
|
|
var b = this.rootGroup;
|
|
!this.disabled &&
|
|
!b.dragInitDone &&
|
|
this.options.drag &&
|
|
this.isValidDrag(a) &&
|
|
b.dragInit(a, this);
|
|
},
|
|
isValidDrag: function (a) {
|
|
return (
|
|
1 == a.which ||
|
|
("touchstart" == a.type && 1 == a.originalEvent.touches.length)
|
|
);
|
|
},
|
|
searchValidTarget: function (a, b) {
|
|
var c = x(this.getItemDimensions(), a, b),
|
|
e = c.length,
|
|
d = this.rootGroup,
|
|
g = !d.options.isValidTarget || d.options.isValidTarget(d.item, this);
|
|
if (!e && g) return d.movePlaceholder(this, this.target, "append"), !0;
|
|
for (; e--; )
|
|
if (((d = c[e][0]), !c[e][1] && this.hasChildGroup(d))) {
|
|
if (this.getContainerGroup(d).searchValidTarget(a, b)) return !0;
|
|
} else if (g) return this.movePlaceholder(d, a), !0;
|
|
},
|
|
movePlaceholder: function (a, b) {
|
|
var c = d(this.items[a]),
|
|
e = this.itemDimensions[a],
|
|
k = "after",
|
|
g = c.outerWidth(),
|
|
f = c.outerHeight(),
|
|
h = c.offset(),
|
|
h = { left: h.left, right: h.left + g, top: h.top, bottom: h.top + f };
|
|
this.options.vertical
|
|
? b.top <= (e[2] + e[3]) / 2
|
|
? ((k = "before"), (h.bottom -= f / 2))
|
|
: (h.top += f / 2)
|
|
: b.left <= (e[0] + e[1]) / 2
|
|
? ((k = "before"), (h.right -= g / 2))
|
|
: (h.left += g / 2);
|
|
this.hasChildGroup(a) && (h = A);
|
|
this.rootGroup.movePlaceholder(this, c, k, h);
|
|
},
|
|
getItemDimensions: function () {
|
|
this.itemDimensions ||
|
|
((this.items = this.$getChildren(this.el, "item")
|
|
.filter(
|
|
":not(." +
|
|
this.group.options.placeholderClass +
|
|
", ." +
|
|
this.group.options.draggedClass +
|
|
")"
|
|
)
|
|
.get()),
|
|
w(this.items, (this.itemDimensions = []), this.options.tolerance));
|
|
return this.itemDimensions;
|
|
},
|
|
getItemOffsetParent: function () {
|
|
var a = this.el;
|
|
return "relative" === a.css("position") ||
|
|
"absolute" === a.css("position") ||
|
|
"fixed" === a.css("position")
|
|
? a
|
|
: a.offsetParent();
|
|
},
|
|
hasChildGroup: function (a) {
|
|
return this.options.nested && this.getContainerGroup(a);
|
|
},
|
|
getContainerGroup: function (a) {
|
|
var b = d.data(this.items[a], "subContainers");
|
|
if (b === f) {
|
|
var c = this.$getChildren(this.items[a], "container"),
|
|
b = !1;
|
|
c[0] &&
|
|
((b = d.extend({}, this.options, {
|
|
rootGroup: this.rootGroup,
|
|
group: y++,
|
|
})),
|
|
(b = c[m](b).data(m).group));
|
|
d.data(this.items[a], "subContainers", b);
|
|
}
|
|
return b;
|
|
},
|
|
$getChildren: function (a, b) {
|
|
var c = this.rootGroup.options,
|
|
e = c[b + "Path"],
|
|
c = c[b + "Selector"];
|
|
a = d(a);
|
|
e && (a = a.find(e));
|
|
return a.children(c);
|
|
},
|
|
_serialize: function (a, b) {
|
|
var c = this,
|
|
e = this.$getChildren(a, b ? "item" : "container")
|
|
.not(this.options.exclude)
|
|
.map(function () {
|
|
return c._serialize(d(this), !b);
|
|
})
|
|
.get();
|
|
return this.rootGroup.options.serialize(a, e, b);
|
|
},
|
|
traverse: function (a) {
|
|
d.each(this.items || [], function (b) {
|
|
(b = d.data(this, "subContainers")) && b.traverse(a);
|
|
});
|
|
a(this);
|
|
},
|
|
_clearDimensions: function () {
|
|
this.itemDimensions = f;
|
|
},
|
|
_destroy: function () {
|
|
var a = this;
|
|
this.target.off(t.start, this.handle);
|
|
this.el.removeData(m);
|
|
this.options.drop &&
|
|
(this.group.containers = d.grep(this.group.containers, function (b) {
|
|
return b != a;
|
|
}));
|
|
d.each(this.items || [], function () {
|
|
d.removeData(this, "subContainers");
|
|
});
|
|
},
|
|
};
|
|
var u = {
|
|
enable: function () {
|
|
this.traverse(function (a) {
|
|
a.disabled = !1;
|
|
});
|
|
},
|
|
disable: function () {
|
|
this.traverse(function (a) {
|
|
a.disabled = !0;
|
|
});
|
|
},
|
|
serialize: function () {
|
|
return this._serialize(this.el, !0);
|
|
},
|
|
refresh: function () {
|
|
this.traverse(function (a) {
|
|
a._clearDimensions();
|
|
});
|
|
},
|
|
destroy: function () {
|
|
this.traverse(function (a) {
|
|
a._destroy();
|
|
});
|
|
},
|
|
};
|
|
d.extend(s.prototype, u);
|
|
d.fn[m] = function (a) {
|
|
var b = Array.prototype.slice.call(arguments, 1);
|
|
return this.map(function () {
|
|
var c = d(this),
|
|
e = c.data(m);
|
|
if (e && u[a]) return u[a].apply(e, b) || this;
|
|
e || (a !== f && "object" !== typeof a) || c.data(m, new s(c, a));
|
|
return this;
|
|
});
|
|
};
|
|
})(jQuery, window, "sortable");
|
|
|