function DragSelect(e) { this.multiSelectKeyPressed, this.initialCursorPos = { x: 0, y: 0 }, this.newCursorPos = { x: 0, y: 0 }, this.previousCursorPos = { x: 0, y: 0 }, this.initialScroll, this.selected = [], this._prevSelected = [], this._createBindings(), this._setupOptions(e), this.start() } DragSelect.prototype._createBindings = function () { this._startUp = this._startUp.bind(this), this._handleMove = this._handleMove.bind(this), this.reset = this.reset.bind(this), this._onClick = this._onClick.bind(this) }, DragSelect.prototype._setupOptions = function (e) { if (this.selectables = [], this._handleSelectables(this.toArray(e.selectables)), this.multiSelectKeys = e.multiSelectKeys || ["ctrlKey", "shiftKey", "metaKey"], this.multiSelectMode = e.multiSelectMode || !1, this.autoScrollSpeed = e.autoScrollSpeed || 1, this.selectCallback = e.onElementSelect || function () { }, this.unselectCallback = e.onElementUnselect || function () { }, this.moveStartCallback = e.onDragStart || function () { }, this.moveCallback = e.onDragMove || function () { }, this.callback = e.callback || function () { }, this.area = e.area || document, this.customStyles = e.customStyles, this.area !== document) { var t = getComputedStyle(this.area); "absolute" === t.position || "relative" === t.position || "fixed" === t.position || (this.area.style.position = "relative") } this.selector = e.selector || this._createSelector(), this.addClass(this.selector, "ds-selector") }, DragSelect.prototype._handleSelectables = function (e, t, s) { for (var i = 0; i < e.length; i++) { var o = e[i], r = this.selectables.indexOf(o); r < 0 && !t ? (this.addClass(o, "ds-selectable"), o.addEventListener("click", this._onClick), this.selectables.push(o), s && this.selected.indexOf(o) < 0 && (this.addClass(o, "ds-selected"), this.selected.push(o))) : r > -1 && t && (this.removeClass(o, "ds-hover"), this.removeClass(o, "ds-selectable"), o.removeEventListener("click", this._onClick), this.selectables.splice(r, 1), s && this.selected.indexOf(o) > -1 && (this.removeClass(o, "ds-selected"), this.selected.splice(this.selected.indexOf(o), 1))) } }, DragSelect.prototype._onClick = function (e) { if (!this.mouseInteraction && !this.isRightClick(e)) { var t = e.target; this.isMultiSelectKeyPressed(e) ? this._prevSelected = this.selected.slice() : this._prevSelected = [], this.checkIfInsideSelection(!0), this.selectables.indexOf(t) > -1 && this.toggle(t), this.reset() } }, DragSelect.prototype._createSelector = function () { var e = document.createElement("div"); return e.style.position = "absolute", this.customStyles || (e.style.background = "rgba(0, 0, 255, 0.1)", e.style.border = "1px solid rgba(0, 0, 255, 0.45)", e.style.display = "none", e.style.pointerEvents = "none"), (this.area === document ? document.body : this.area).appendChild(e), e }, DragSelect.prototype.start = function () { this.area.addEventListener("mousedown", this._startUp) }, DragSelect.prototype._startUp = function (e) { if (!this.isRightClick(e)) { if (this.mouseInteraction = !0, this.selector.style.display = "block", this.isMultiSelectKeyPressed(e) ? this._prevSelected = this.selected.slice() : this._prevSelected = [], this._getStartingPositions(e), this.checkIfInsideSelection(!0), this.selector.style.display = "none", this.moveStartCallback(e), this._breaked) return !1; this.area.removeEventListener("mousedown", this._startUp), this.area.addEventListener("mousemove", this._handleMove), document.addEventListener("mouseup", this.reset) } }, DragSelect.prototype.isMultiSelectKeyPressed = function (e) { if (this.multiSelectKeyPressed = !1, this.multiSelectMode) this.multiSelectKeyPressed = !0; else for (var t = 0; t < this.multiSelectKeys.length; t++) { var s = this.multiSelectKeys[t]; e[s] && (this.multiSelectKeyPressed = !0) } return this.multiSelectKeyPressed }, DragSelect.prototype._getStartingPositions = function (e) { this.initialCursorPos = this.newCursorPos = this._getCursorPos(e, this.area), this.initialScroll = this.getScroll(this.area); var t = {}; t.x = this.initialCursorPos.x + this.initialScroll.x, t.y = this.initialCursorPos.y + this.initialScroll.y, t.w = 0, t.h = 0, this.updatePos(this.selector, t) }, DragSelect.prototype._handleMove = function (e) { var t = this.getPosition(e); if (this.moveCallback(e), this._breaked) return !1; this.selector.style.display = "block", this.updatePos(this.selector, t), this.checkIfInsideSelection(), this._autoScroll(e) }, DragSelect.prototype.getPosition = function (e) { var t = this._getCursorPos(e, this.area), s = this.getScroll(this.area); this.newCursorPos = t; var i = { x: s.x - this.initialScroll.x, y: s.y - this.initialScroll.y }, o = {}; return t.x > this.initialCursorPos.x - i.x ? (o.x = this.initialCursorPos.x + this.initialScroll.x, o.w = t.x - this.initialCursorPos.x + i.x) : (o.x = t.x + s.x, o.w = this.initialCursorPos.x - t.x - i.x), t.y > this.initialCursorPos.y - i.y ? (o.y = this.initialCursorPos.y + this.initialScroll.y, o.h = t.y - this.initialCursorPos.y + i.y) : (o.y = t.y + s.y, o.h = this.initialCursorPos.y - t.y - i.y), o }, DragSelect.prototype.checkIfInsideSelection = function (e) { for (var t = !1, s = 0, i = this.selectables.length; s < i; s++) { var o = this.selectables[s]; this.isElementTouching(o, this.selector, this.area) ? (this._handleSelection(o, e), t = !0) : this._handleUnselection(o, e) } return t }, DragSelect.prototype._handleSelection = function (e, t) { if (this.hasClass(e, "ds-hover") && !t) return !1; var s = this.selected.indexOf(e); s < 0 ? this.select(e) : s > -1 && this.multiSelectKeyPressed && this.unselect(e), this.addClass(e, "ds-hover") }, DragSelect.prototype._handleUnselection = function (e, t) { if (!this.hasClass(e, "ds-hover") && !t) return !1; var s = this.selected.indexOf(e), i = this._prevSelected.indexOf(e); s > -1 && i < 0 ? this.unselect(e) : s < 0 && i > -1 && this.select(e), this.removeClass(e, "ds-hover") }, DragSelect.prototype.select = function (e) { return !(this.selected.indexOf(e) > -1) && (this.selected.push(e), this.addClass(e, "ds-selected"), this.selectCallback(e), !this._breaked && e) }, DragSelect.prototype.unselect = function (e) { return !(this.selected.indexOf(e) < 0) && (this.selected.splice(this.selected.indexOf(e), 1), this.removeClass(e, "ds-selected"), this.unselectCallback(e), !this._breaked && e) }, DragSelect.prototype.toggle = function (e) { return this.selected.indexOf(e) > -1 ? this.unselect(e) : this.select(e), e }, DragSelect.prototype.isElementTouching = function (e, t, s) { var i = this.getScroll(s), o = { y: t.getBoundingClientRect().top + i.y, x: t.getBoundingClientRect().left + i.x, h: t.offsetHeight || e.getBoundingClientRect().height, w: t.offsetWidth || e.getBoundingClientRect().width }, r = { y: e.getBoundingClientRect().top + i.y, x: e.getBoundingClientRect().left + i.x, h: e.offsetHeight || e.getBoundingClientRect().height, w: e.offsetWidth || e.getBoundingClientRect().width }; return o.x < r.x + r.w && o.x + o.w > r.x && o.y < r.y + r.h && o.h + o.y > r.y }, DragSelect.prototype._autoScroll = function (e) { var t = this.isCursorNearEdge(e, this.area), s = this.area === document ? this.area.body : this.area; "top" === t && s.scrollTop > 0 ? s.scrollTop -= 1 * this.autoScrollSpeed : "bottom" === t ? s.scrollTop += 1 * this.autoScrollSpeed : "left" === t && s.scrollLeft > 0 ? s.scrollLeft -= 1 * this.autoScrollSpeed : "right" === t && (s.scrollLeft += 1 * this.autoScrollSpeed) }, DragSelect.prototype.isCursorNearEdge = function (e, t) { var s = this._getCursorPos(e, t), i = this.getAreaRect(t), o = { x: Math.max(i.width / 10, 30), y: Math.max(i.height / 10, 30) }; return s.y < o.y ? "top" : i.height - s.y < o.y ? "bottom" : i.width - s.x < o.x ? "right" : s.x < o.x && "left" }, DragSelect.prototype.reset = function (e) { if (this.previousCursorPos = this._getCursorPos(e, this.area), document.removeEventListener("mouseup", this.reset), this.area.removeEventListener("mousemove", this._handleMove), this.area.addEventListener("mousedown", this._startUp), this.callback(this.selected, e), this._breaked) return !1; this.selector.style.width = "0", this.selector.style.height = "0", this.selector.style.display = "none", setTimeout(function () { this.mouseInteraction = !1 }.bind(this), 100) }, DragSelect.prototype.break = function () { this._breaked = !0, setTimeout(function () { this._breaked = !1 }.bind(this), 100) }, DragSelect.prototype.stop = function () { this.reset(), this.area.removeEventListener("mousedown", this._startUp), document.removeEventListener("mouseup", this.reset) }, DragSelect.prototype.getSelection = function () { return this.selected }, DragSelect.prototype.getCursorPos = function (e, t, s) { if (!e) return !1; var i = t || !1 !== t && this.area, o = this._getCursorPos(e, i), r = s ? { x: 0, y: 0 } : this.getScroll(i); return { x: o.x + r.x, y: o.y + r.y } }, DragSelect.prototype.addSelection = function (e, t, s) { for (var i = this.toArray(e), o = 0, r = i.length; o < r; o++) { var l = i[o]; this.select(l) } return s || this.addSelectables(i), t && this.callback(this.selected, !1), this.selected }, DragSelect.prototype.removeSelection = function (e, t, s) { for (var i = this.toArray(e), o = 0, r = i.length; o < r; o++) { var l = i[o]; this.unselect(l) } return s && this.removeSelectables(i), t && this.callback(this.selected, !1), this.selected }, DragSelect.prototype.toggleSelection = function (e, t, s) { for (var i = this.toArray(e), o = 0, r = i.length; o < r; o++) { var l = i[o]; this.selected.indexOf(l) < 0 ? this.addSelection(l, t, s) : this.removeSelection(l, t, s) } return this.selected }, DragSelect.prototype.setSelection = function (e, t, s) { return this.clearSelection(), this.addSelection(e, t, s), this.selected }, DragSelect.prototype.clearSelection = function (e) { for (var t = this.selected.slice(), s = 0, i = t.length; s < i; s++) { var o = t[s]; this.unselect(o) } return e && this.callback(this.selected, !1), this.selected }, DragSelect.prototype.addSelectables = function (e, t) { var s = this.toArray(e); return this._handleSelectables(s, !1, t), e }, DragSelect.prototype.getSelectables = function () { return this.selectables }, DragSelect.prototype.removeSelectables = function (e, t) { var s = this.toArray(e); return this._handleSelectables(s, !0, t), e }, DragSelect.prototype.isRightClick = function (e) { if (!e) return !1; var t = !1; return "which" in e ? t = 3 === e.which : "button" in e && (t = 2 === e.button), t }, DragSelect.prototype.addClass = function (e, t) { if (e.classList) return e.classList.add(t); var s = e.getAttribute("class") || ""; return -1 !== s.indexOf(t) ? e : ("" !== s && (t = " " + t), e.setAttribute("class", s + t), e) }, DragSelect.prototype.removeClass = function (e, t) { if (e.classList) return e.classList.remove(t); var s = e.getAttribute("class") || "", i = new RegExp(t + "\\b", "g"); return s = s.replace(i, ""), e.setAttribute("class", s), e }, DragSelect.prototype.hasClass = function (e, t) { return e.classList ? e.classList.contains(t) : (e.getAttribute("class") || "").indexOf(t) > -1 }, DragSelect.prototype.toArray = function (e) { if (!e) return !1; if (!e.length && this.isElement(e)) return [e]; for (var t = [], s = e.length - 1; s >= 0; s--) t[s] = e[s]; return t }, DragSelect.prototype.isElement = function (e) { try { return e instanceof HTMLElement || e instanceof SVGElement } catch (t) { return "object" == typeof e && 1 === e.nodeType && "object" == typeof e.style && "object" == typeof e.ownerDocument } }, DragSelect.prototype._getCursorPos = function (e, t) { if (!e) return { x: 0, y: 0 }; var s = { x: e.pageX || e.clientX, y: e.pageY || e.clientY }, i = this.getAreaRect(t || document), o = this.getScroll(); return { x: s.x - i.left - o.x, y: s.y - i.top - o.y } }, DragSelect.prototype.getInitialCursorPosition = function () { return this.initialCursorPos }, DragSelect.prototype.getCurrentCursorPosition = function () { return this.newCursorPos }, DragSelect.prototype.getPreviousCursorPosition = function () { return this.previousCursorPos }, DragSelect.prototype.getCursorPositionDifference = function (e) { var t = this.getCurrentCursorPosition(), s = e ? this.getPreviousCursorPosition() : this.getInitialCursorPosition(); return { x: t.x - s.x, y: t.y - s.y } }, DragSelect.prototype.getScroll = function (e) { var t = { top: document.body.scrollTop > 0 ? document.body.scrollTop : document.documentElement.scrollTop, left: document.body.scrollLeft > 0 ? document.body.scrollLeft : document.documentElement.scrollLeft }; return { y: e && e.scrollTop >= 0 ? e.scrollTop : t.top, x: e && e.scrollLeft >= 0 ? e.scrollLeft : t.left } }, DragSelect.prototype.getAreaRect = function (e) { if (e === document) { var t = { y: e.documentElement.clientHeight > 0 ? e.documentElement.clientHeight : window.innerHeight, x: e.documentElement.clientWidth > 0 ? e.documentElement.clientWidth : window.innerWidth }; return { top: 0, left: 0, bottom: 0, right: 0, width: t.x, height: t.y } } return { top: e.getBoundingClientRect().top, left: e.getBoundingClientRect().left, bottom: e.getBoundingClientRect().bottom, right: e.getBoundingClientRect().right, width: e.offsetWidth, height: e.offsetHeight } }, DragSelect.prototype.updatePos = function (e, t) { return e.style.left = t.x + "px", e.style.top = t.y + "px", e.style.width = t.w + "px", e.style.height = t.h + "px", e }, "undefined" != typeof module && null !== module ? module.exports = DragSelect : "undefined" != typeof define && "function" == typeof define && define ? define(function () { return DragSelect }) : window.DragSelect = DragSelect;