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