//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: '
', 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");