/*! Sortable 1.4.2 - MIT | git://github.com/rubaxa/Sortable.git */ ! function(a) { "use strict"; "function" == typeof define && define.amd ? define(a) : "undefined" != typeof module && "undefined" != typeof module.exports ? module.exports = a() : "undefined" != typeof Package ? Sortable = a() : window.Sortable = a() }(function() { "use strict"; function a(a, b) { if (!a || !a.nodeType || 1 !== a.nodeType) throw "Sortable: `el` must be HTMLElement, and not " + {}.toString.call(a); this.el = a, this.options = b = r({}, b), a[L] = this; var c = { group: Math.random(), sort: !0, disabled: !1, store: null, handle: null, scroll: !0, scrollSensitivity: 30, scrollSpeed: 10, draggable: /[uo]l/i.test(a.nodeName) ? "li" : ">*", ghostClass: "sortable-ghost", chosenClass: "sortable-chosen", ignore: "a, img", filter: null, animation: 0, setData: function(a, b) { a.setData("Text", b.textContent) }, dropBubble: !1, dragoverBubble: !1, dataIdAttr: "data-id", delay: 0, forceFallback: !1, fallbackClass: "sortable-fallback", fallbackOnBody: !1 }; for (var d in c) !(d in b) && (b[d] = c[d]); V(b); for (var f in this) "_" === f.charAt(0) && (this[f] = this[f].bind(this)); this.nativeDraggable = b.forceFallback ? !1 : P, e(a, "mousedown", this._onTapStart), e(a, "touchstart", this._onTapStart), this.nativeDraggable && (e(a, "dragover", this), e(a, "dragenter", this)), T.push(this._onDragOver), b.store && this.sort(b.store.get(this)) } function b(a) { v && v.state !== a && (h(v, "display", a ? "none" : ""), !a && v.state && w.insertBefore(v, s), v.state = a) } function c(a, b, c) { if (a) { c = c || N, b = b.split("."); var d = b.shift().toUpperCase(), e = new RegExp("\\s(" + b.join("|") + ")(?=\\s)", "g"); do if (">*" === d && a.parentNode === c || ("" === d || a.nodeName.toUpperCase() == d) && (!b.length || ((" " + a.className + " ").match(e) || []).length == b.length)) return a; while (a !== c && (a = a.parentNode)) } return null } function d(a) { a.dataTransfer && (a.dataTransfer.dropEffect = "move"), a.preventDefault() } function e(a, b, c) { a.addEventListener(b, c, !1) } function f(a, b, c) { a.removeEventListener(b, c, !1) } function g(a, b, c) { if (a) if (a.classList) a.classList[c ? "add" : "remove"](b); else { var d = (" " + a.className + " ").replace(K, " ").replace(" " + b + " ", " "); a.className = (d + (c ? " " + b : "")).replace(K, " ") } } function h(a, b, c) { var d = a && a.style; if (d) { if (void 0 === c) return N.defaultView && N.defaultView.getComputedStyle ? c = N.defaultView.getComputedStyle(a, "") : a.currentStyle && (c = a.currentStyle), void 0 === b ? c : c[b]; b in d || (b = "-webkit-" + b), d[b] = c + ("string" == typeof c ? "" : "px") } } function i(a, b, c) { if (a) { var d = a.getElementsByTagName(b), e = 0, f = d.length; if (c) for (; f > e; e++) c(d[e], e); return d } return [] } function j(a, b, c, d, e, f, g) { var h = N.createEvent("Event"), i = (a || b[L]).options, j = "on" + c.charAt(0).toUpperCase() + c.substr(1); h.initEvent(c, !0, !0), h.to = b, h.from = e || b, h.item = d || b, h.clone = v, h.oldIndex = f, h.newIndex = g, b.dispatchEvent(h), i[j] && i[j].call(a, h) } function k(a, b, c, d, e, f) { var g, h, i = a[L], j = i.options.onMove; return g = N.createEvent("Event"), g.initEvent("move", !0, !0), g.to = b, g.from = a, g.dragged = c, g.draggedRect = d, g.related = e || b, g.relatedRect = f || b.getBoundingClientRect(), a.dispatchEvent(g), j && (h = j.call(i, g)), h } function l(a) { a.draggable = !1 } function m() { R = !1 } function n(a, b) { var c = a.lastElementChild, d = c.getBoundingClientRect(); return (b.clientY - (d.top + d.height) > 5 || b.clientX - (d.right + d.width) > 5) && c } function o(a) { for (var b = a.tagName + a.className + a.src + a.href + a.textContent, c = b.length, d = 0; c--;) d += b.charCodeAt(c); return d.toString(36) } function p(a) { var b = 0; if (!a || !a.parentNode) return -1; for (; a && (a = a.previousElementSibling);) "TEMPLATE" !== a.nodeName.toUpperCase() && b++; return b } function q(a, b) { var c, d; return function() { void 0 === c && (c = arguments, d = this, setTimeout(function() { 1 === c.length ? a.call(d, c[0]) : a.apply(d, c), c = void 0 }, b)) } } function r(a, b) { if (a && b) for (var c in b) b.hasOwnProperty(c) && (a[c] = b[c]); return a } var s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J = {}, K = /\s+/g, L = "Sortable" + (new Date).getTime(), M = window, N = M.document, O = M.parseInt, P = !!("draggable" in N.createElement("div")), Q = function(a) { return a = N.createElement("x"), a.style.cssText = "pointer-events:auto", "auto" === a.style.pointerEvents }(), R = !1, S = Math.abs, T = ([].slice, []), U = q(function(a, b, c) { if (c && b.scroll) { var d, e, f, g, h = b.scrollSensitivity, i = b.scrollSpeed, j = a.clientX, k = a.clientY, l = window.innerWidth, m = window.innerHeight; if (z !== c && (y = b.scroll, z = c, y === !0)) { y = c; do if (y.offsetWidth < y.scrollWidth || y.offsetHeight < y.scrollHeight) break; while (y = y.parentNode) } y && (d = y, e = y.getBoundingClientRect(), f = (S(e.right - j) <= h) - (S(e.left - j) <= h), g = (S(e.bottom - k) <= h) - (S(e.top - k) <= h)), f || g || (f = (h >= l - j) - (h >= j), g = (h >= m - k) - (h >= k), (f || g) && (d = M)), (J.vx !== f || J.vy !== g || J.el !== d) && (J.el = d, J.vx = f, J.vy = g, clearInterval(J.pid), d && (J.pid = setInterval(function() { d === M ? M.scrollTo(M.pageXOffset + f * i, M.pageYOffset + g * i) : (g && (d.scrollTop += g * i), f && (d.scrollLeft += f * i)) }, 24))) } }, 30), V = function(a) { var b = a.group; b && "object" == typeof b || (b = a.group = { name: b }), ["pull", "put"].forEach(function(a) { a in b || (b[a] = !0) }), a.groups = " " + b.name + (b.put.join ? " " + b.put.join(" ") : "") + " " }; return a.prototype = { constructor: a, _onTapStart: function(a) { var b = this, d = this.el, e = this.options, f = a.type, g = a.touches && a.touches[0], h = (g || a).target, i = h, k = e.filter; if (!("mousedown" === f && 0 !== a.button || e.disabled) && (h = c(h, e.draggable, d))) { if (D = p(h), "function" == typeof k) { if (k.call(this, a, h, this)) return j(b, i, "filter", h, d, D), void a.preventDefault() } else if (k && (k = k.split(",").some(function(a) { return a = c(i, a.trim(), d), a ? (j(b, a, "filter", h, d, D), !0) : void 0 }))) return void a.preventDefault(); (!e.handle || c(i, e.handle, d)) && this._prepareDragStart(a, g, h) } }, _prepareDragStart: function(a, b, c) { var d, f = this, h = f.el, j = f.options, k = h.ownerDocument; c && !s && c.parentNode === h && (G = a, w = h, s = c, t = s.parentNode, x = s.nextSibling, F = j.group, d = function() { f._disableDelayedDrag(), s.draggable = !0, g(s, f.options.chosenClass, !0), f._triggerDragStart(b) }, j.ignore.split(",").forEach(function(a) { i(s, a.trim(), l) }), e(k, "mouseup", f._onDrop), e(k, "touchend", f._onDrop), e(k, "touchcancel", f._onDrop), j.delay ? (e(k, "mouseup", f._disableDelayedDrag), e(k, "touchend", f._disableDelayedDrag), e(k, "touchcancel", f._disableDelayedDrag), e(k, "mousemove", f._disableDelayedDrag), e(k, "touchmove", f._disableDelayedDrag), f._dragStartTimer = setTimeout(d, j.delay)) : d()) }, _disableDelayedDrag: function() { var a = this.el.ownerDocument; clearTimeout(this._dragStartTimer), f(a, "mouseup", this._disableDelayedDrag), f(a, "touchend", this._disableDelayedDrag), f(a, "touchcancel", this._disableDelayedDrag), f(a, "mousemove", this._disableDelayedDrag), f(a, "touchmove", this._disableDelayedDrag) }, _triggerDragStart: function(a) { a ? (G = { target: s, clientX: a.clientX, clientY: a.clientY }, this._onDragStart(G, "touch")) : this.nativeDraggable ? (e(s, "dragend", this), e(w, "dragstart", this._onDragStart)) : this._onDragStart(G, !0); try { N.selection ? N.selection.empty() : window.getSelection().removeAllRanges() } catch (b) {} }, _dragStarted: function() { w && s && (g(s, this.options.ghostClass, !0), a.active = this, j(this, w, "start", s, w, D)) }, _emulateDragOver: function() { if (H) { if (this._lastX === H.clientX && this._lastY === H.clientY) return; this._lastX = H.clientX, this._lastY = H.clientY, Q || h(u, "display", "none"); var a = N.elementFromPoint(H.clientX, H.clientY), b = a, c = " " + this.options.group.name, d = T.length; if (b) do { if (b[L] && b[L].options.groups.indexOf(c) > -1) { for (; d--;) T[d]({ clientX: H.clientX, clientY: H.clientY, target: a, rootEl: b }); break } a = b } while (b = b.parentNode); Q || h(u, "display", "") } }, _onTouchMove: function(b) { if (G) { a.active || this._dragStarted(), this._appendGhost(); var c = b.touches ? b.touches[0] : b, d = c.clientX - G.clientX, e = c.clientY - G.clientY, f = b.touches ? "translate3d(" + d + "px," + e + "px,0)" : "translate(" + d + "px," + e + "px)"; I = !0, H = c, h(u, "webkitTransform", f), h(u, "mozTransform", f), h(u, "msTransform", f), h(u, "transform", f), b.preventDefault() } }, _appendGhost: function() { if (!u) { var a, b = s.getBoundingClientRect(), c = h(s), d = this.options; u = s.cloneNode(!0), g(u, d.ghostClass, !1), g(u, d.fallbackClass, !0), h(u, "top", b.top - O(c.marginTop, 10)), h(u, "left", b.left - O(c.marginLeft, 10)), h(u, "width", b.width), h(u, "height", b.height), h(u, "opacity", "0.8"), h(u, "position", "fixed"), h(u, "zIndex", "100000"), h(u, "pointerEvents", "none"), d.fallbackOnBody && N.body.appendChild(u) || w.appendChild(u), a = u.getBoundingClientRect(), h(u, "width", 2 * b.width - a.width), h(u, "height", 2 * b.height - a.height) } }, _onDragStart: function(a, b) { var c = a.dataTransfer, d = this.options; this._offUpEvents(), "clone" == F.pull && (v = s.cloneNode(!0), h(v, "display", "none"), w.insertBefore(v, s)), b ? ("touch" === b ? (e(N, "touchmove", this._onTouchMove), e(N, "touchend", this._onDrop), e(N, "touchcancel", this._onDrop)) : (e(N, "mousemove", this._onTouchMove), e(N, "mouseup", this._onDrop)), this._loopId = setInterval(this._emulateDragOver, 50)) : (c && (c.effectAllowed = "move", d.setData && d.setData.call(this, c, s)), e(N, "drop", this), setTimeout(this._dragStarted, 0)) }, _onDragOver: function(a) { var d, e, f, g = this.el, i = this.options, j = i.group, l = j.put, o = F === j, p = i.sort; if (void 0 !== a.preventDefault && (a.preventDefault(), !i.dragoverBubble && a.stopPropagation()), I = !0, F && !i.disabled && (o ? p || (f = !w.contains(s)) : F.pull && l && (F.name === j.name || l.indexOf && ~l.indexOf(F.name))) && (void 0 === a.rootEl || a.rootEl === this.el)) { if (U(a, i, this.el), R) return; if (d = c(a.target, i.draggable, g), e = s.getBoundingClientRect(), f) return b(!0), void(v || x ? w.insertBefore(s, v || x) : p || w.appendChild(s)); if (0 === g.children.length || g.children[0] === u || g === a.target && (d = n(g, a))) { if (d) { if (d.animated) return; r = d.getBoundingClientRect() } b(o), k(w, g, s, e, d, r) !== !1 && (s.contains(g) || (g.appendChild(s), t = g), this._animate(e, s), d && this._animate(r, d)) } else if (d && !d.animated && d !== s && void 0 !== d.parentNode[L]) { A !== d && (A = d, B = h(d), C = h(d.parentNode)); var q, r = d.getBoundingClientRect(), y = r.right - r.left, z = r.bottom - r.top, D = /left|right|inline/.test(B.cssFloat + B.display) || "flex" == C.display && 0 === C["flex-direction"].indexOf("row"), E = d.offsetWidth > s.offsetWidth, G = d.offsetHeight > s.offsetHeight, H = (D ? (a.clientX - r.left) / y : (a.clientY - r.top) / z) > .5, J = d.nextElementSibling, K = k(w, g, s, e, d, r); if (K !== !1) { if (R = !0, setTimeout(m, 30), b(o), 1 === K || -1 === K) q = 1 === K; else if (D) { var M = s.offsetTop, N = d.offsetTop; q = M === N ? d.previousElementSibling === s && !E || H && E : N > M } else q = J !== s && !G || H && G; s.contains(g) || (q && !J ? g.appendChild(s) : d.parentNode.insertBefore(s, q ? J : d)), t = s.parentNode, this._animate(e, s), this._animate(r, d) } } } }, _animate: function(a, b) { var c = this.options.animation; if (c) { var d = b.getBoundingClientRect(); h(b, "transition", "none"), h(b, "transform", "translate3d(" + (a.left - d.left) + "px," + (a.top - d.top) + "px,0)"), b.offsetWidth, h(b, "transition", "all " + c + "ms"), h(b, "transform", "translate3d(0,0,0)"), clearTimeout(b.animated), b.animated = setTimeout(function() { h(b, "transition", ""), h(b, "transform", ""), b.animated = !1 }, c) } }, _offUpEvents: function() { var a = this.el.ownerDocument; f(N, "touchmove", this._onTouchMove), f(a, "mouseup", this._onDrop), f(a, "touchend", this._onDrop), f(a, "touchcancel", this._onDrop) }, _onDrop: function(b) { var c = this.el, d = this.options; clearInterval(this._loopId), clearInterval(J.pid), clearTimeout(this._dragStartTimer), f(N, "mousemove", this._onTouchMove), this.nativeDraggable && (f(N, "drop", this), f(c, "dragstart", this._onDragStart)), this._offUpEvents(), b && (I && (b.preventDefault(), !d.dropBubble && b.stopPropagation()), u && u.parentNode.removeChild(u), s && (this.nativeDraggable && f(s, "dragend", this), l(s), g(s, this.options.ghostClass, !1), g(s, this.options.chosenClass, !1), w !== t ? (E = p(s), E >= 0 && (j(null, t, "sort", s, w, D, E), j(this, w, "sort", s, w, D, E), j(null, t, "add", s, w, D, E), j(this, w, "remove", s, w, D, E))) : (v && v.parentNode.removeChild(v), s.nextSibling !== x && (E = p(s), E >= 0 && (j(this, w, "update", s, w, D, E), j(this, w, "sort", s, w, D, E)))), a.active && ((null === E || -1 === E) && (E = D), j(this, w, "end", s, w, D, E), this.save())), w = s = t = u = x = v = y = z = G = H = I = E = A = B = F = a.active = null) }, handleEvent: function(a) { var b = a.type; "dragover" === b || "dragenter" === b ? s && (this._onDragOver(a), d(a)) : ("drop" === b || "dragend" === b) && this._onDrop(a) }, toArray: function() { for (var a, b = [], d = this.el.children, e = 0, f = d.length, g = this.options; f > e; e++) a = d[e], c(a, g.draggable, this.el) && b.push(a.getAttribute(g.dataIdAttr) || o(a)); return b }, sort: function(a) { var b = {}, d = this.el; this.toArray().forEach(function(a, e) { var f = d.children[e]; c(f, this.options.draggable, d) && (b[a] = f) }, this), a.forEach(function(a) { b[a] && (d.removeChild(b[a]), d.appendChild(b[a])) }) }, save: function() { var a = this.options.store; a && a.set(this) }, closest: function(a, b) { return c(a, b || this.options.draggable, this.el) }, option: function(a, b) { var c = this.options; return void 0 === b ? c[a] : (c[a] = b, void("group" === a && V(c))) }, destroy: function() { var a = this.el; a[L] = null, f(a, "mousedown", this._onTapStart), f(a, "touchstart", this._onTapStart), this.nativeDraggable && (f(a, "dragover", this), f(a, "dragenter", this)), Array.prototype.forEach.call(a.querySelectorAll("[draggable]"), function(a) { a.removeAttribute("draggable") }), T.splice(T.indexOf(this._onDragOver), 1), this._onDrop(), this.el = a = null } }, a.utils = { on: e, off: f, css: h, find: i, is: function(a, b) { return !!c(a, b, a) }, extend: r, throttle: q, closest: c, toggleClass: g, index: p }, a.create = function(b, c) { return new a(b, c) }, a.version = "1.4.2", a });