{"version":3,"sources":["html.sortable.js"],"names":["root","factory","define","amd","exports","module","sortable","this","dragging","draggingHeight","matches","placeholders","sortables","_data","element","key","value","undefined","h5s","data","_removeData","window","Element","prototype","_filter","nodes","wanted","Array","slice","call","result","i","length","push","indexOf","_on","event","callback","addEventListener","events","_off","removeEventListener","_attr","attribute","setAttribute","_removeAttr","removeAttribute","_offset","rect","getClientRects","left","scrollX","top","scrollY","_removeItemEvents","items","_removeSortableEvents","_attachGhost","ghost","dataTransfer","effectAllowed","setData","setDragImage","draggedItem","x","y","_addGhostPos","parseInt","pageX","pageY","_makeGhost","_getGhost","_removeSortableData","_removeItemData","_listsConnected","curList","destList","_getHandles","handle","handles","querySelectorAll","concat","_destroySortable","sortableElement","opts","children","_enableSortable","spanEl","document","createElement","dragDrop","disableIEFix","parent","parentElement","_disableSortable","_reloadSortable","_index","_attached","parentNode","_html2element","html","div","innerHTML","firstChild","_before","target","insertBefore","_after","nextElementSibling","_detach","removeChild","_makeEvent","name","detail","e","createEvent","initEvent","_dispatchEventOnConnected","forEach","dispatchEvent","sortableElements","options","method","String","connectWith","placeholder","dragImage","placeholderClass","draggingClass","hoverClass","option","test","index","startParent","tagName","classList","add","apply","split","getAttribute","id","remove","stopImmediatePropagation","console","log","getComputedStyle","height","item","startparent","newParent","style","display","oldDisplay","oldindex","elementIndex","oldElementIndex","endparent","visiblePlaceholder","preventDefault","stopPropagation","filter","onDragOverEnter","dropEffect","thisHeight","placeholderIndex","thisIndex","forcePlaceholderSize","deadZone","offsetTop","appendChild","destroy","enable","disable"],"mappings":"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","file":"html.sortable.min.js","sourcesContent":[";(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.sortable = factory();\n }\n}(this, function() {\n/*\n * HTML5 Sortable library\n * https://github.com/voidberg/html5sortable\n *\n * Original code copyright 2012 Ali Farhadi.\n * This version is mantained by Alexandru Badiu & Lukas Oppermann \n * jQuery-independent implementation by Nazar Mokrynskyi \n *\n * Released under the MIT license.\n */\n'use strict';\n/*\n * variables global to the plugin\n */\nvar dragging;\nvar draggingHeight;\nvar placeholders = [];\nvar sortables = [];\n/**\n * Get or set data on element\n * @param {Element} element\n * @param {string} key\n * @param {*} value\n * @return {*}\n */\nvar _data = function(element, key, value) {\n if (value === undefined) {\n return element && element.h5s && element.h5s.data && element.h5s.data[key];\n } else {\n element.h5s = element.h5s || {};\n element.h5s.data = element.h5s.data || {};\n element.h5s.data[key] = value;\n }\n};\n/**\n * Remove data from element\n * @param {Element} element\n */\nvar _removeData = function(element) {\n if (element.h5s) {\n delete element.h5s.data;\n }\n};\n/**\n * Cross-browser shortcut for actual `Element.matches` method,\n * which has vendor prefix in older browsers\n */\nvar matches;\nswitch (true) {\n case 'matches' in window.Element.prototype:\n matches = 'matches';\n break;\n case 'mozMatchesSelector' in window.Element.prototype:\n matches = 'mozMatchesSelector';\n break;\n case 'msMatchesSelector' in window.Element.prototype:\n matches = 'msMatchesSelector';\n break;\n case 'webkitMatchesSelector' in window.Element.prototype:\n matches = 'webkitMatchesSelector';\n break;\n}\n/**\n * Filter only wanted nodes\n * @param {Array|NodeList} nodes\n * @param {Array/string} wanted\n * @returns {Array}\n */\nvar _filter = function(nodes, wanted) {\n if (!wanted) {\n return Array.prototype.slice.call(nodes);\n }\n var result = [];\n for (var i = 0; i < nodes.length; ++i) {\n if (typeof wanted === 'string' && nodes[i][matches](wanted)) {\n result.push(nodes[i]);\n }\n if (wanted.indexOf(nodes[i]) !== -1) {\n result.push(nodes[i]);\n }\n }\n return result;\n};\n/**\n * @param {Array|Element} element\n * @param {Array|string} event\n * @param {Function} callback\n */\nvar _on = function(element, event, callback) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n _on(element[i], event, callback);\n }\n return;\n }\n element.addEventListener(event, callback);\n element.h5s = element.h5s || {};\n element.h5s.events = element.h5s.events || {};\n element.h5s.events[event] = callback;\n};\n/**\n * @param {Array|Element} element\n * @param {Array|string} event\n */\nvar _off = function(element, event) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n _off(element[i], event);\n }\n return;\n }\n if (element.h5s && element.h5s.events && element.h5s.events[event]) {\n element.removeEventListener(event, element.h5s.events[event]);\n delete element.h5s.events[event];\n }\n};\n/**\n * @param {Array|Element} element\n * @param {string} attribute\n * @param {*} value\n */\nvar _attr = function(element, attribute, value) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n _attr(element[i], attribute, value);\n }\n return;\n }\n element.setAttribute(attribute, value);\n};\n/**\n * @param {Array|Element} element\n * @param {string} attribute\n */\nvar _removeAttr = function(element, attribute) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n _removeAttr(element[i], attribute);\n }\n return;\n }\n element.removeAttribute(attribute);\n};\n/**\n * @param {Element} element\n * @returns {{left: *, top: *}}\n */\nvar _offset = function(element) {\n var rect = element.getClientRects()[0];\n return {\n left: rect.left + window.scrollX,\n top: rect.top + window.scrollY\n };\n};\n/*\n * remove event handlers from items\n * @param {Array|NodeList} items\n */\nvar _removeItemEvents = function(items) {\n _off(items, 'dragstart');\n _off(items, 'dragend');\n _off(items, 'selectstart');\n _off(items, 'dragover');\n _off(items, 'dragenter');\n _off(items, 'drop');\n};\n/*\n * Remove event handlers from sortable\n * @param {Element} sortable a single sortable\n */\nvar _removeSortableEvents = function(sortable) {\n _off(sortable, 'dragover');\n _off(sortable, 'dragenter');\n _off(sortable, 'drop');\n};\n/*\n * Attach ghost to dataTransfer object\n * @param {Event} original event\n * @param {object} ghost-object with item, x and y coordinates\n */\nvar _attachGhost = function(event, ghost) {\n // this needs to be set for HTML5 drag & drop to work\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text', '');\n\n // check if setDragImage method is available\n if (event.dataTransfer.setDragImage) {\n event.dataTransfer.setDragImage(ghost.draggedItem, ghost.x, ghost.y);\n }\n};\n/**\n * _addGhostPos clones the dragged item and adds it as a Ghost item\n * @param {Event} event - the event fired when dragstart is triggered\n * @param {object} ghost - .draggedItem = Element\n */\nvar _addGhostPos = function(event, ghost) {\n if (!ghost.x) {\n ghost.x = parseInt(event.pageX - _offset(ghost.draggedItem).left);\n }\n if (!ghost.y) {\n ghost.y = parseInt(event.pageY - _offset(ghost.draggedItem).top);\n }\n return ghost;\n};\n/**\n * _makeGhost decides which way to make a ghost and passes it to attachGhost\n * @param {Element} draggedItem - the item that the user drags\n */\nvar _makeGhost = function(draggedItem) {\n return {\n draggedItem: draggedItem\n };\n};\n/**\n * _getGhost constructs ghost and attaches it to dataTransfer\n * @param {Event} event - the original drag event object\n * @param {Element} draggedItem - the item that the user drags\n */\n// TODO: could draggedItem be replaced by event.target in all instances\nvar _getGhost = function(event, draggedItem) {\n // add ghost item & draggedItem to ghost object\n var ghost = _makeGhost(draggedItem);\n // attach ghost position\n ghost = _addGhostPos(event, ghost);\n // attach ghost to dataTransfer\n _attachGhost(event, ghost);\n};\n/*\n * Remove data from sortable\n * @param {Element} sortable a single sortable\n */\nvar _removeSortableData = function(sortable) {\n _removeData(sortable);\n _removeAttr(sortable, 'aria-dropeffect');\n};\n/*\n * Remove data from items\n * @param {Array|Element} items\n */\nvar _removeItemData = function(items) {\n _removeAttr(items, 'aria-grabbed');\n _removeAttr(items, 'draggable');\n _removeAttr(items, 'role');\n};\n/*\n * Check if two lists are connected\n * @param {Element} curList\n * @param {Element} destList\n */\nvar _listsConnected = function(curList, destList) {\n if (curList === destList) {\n return true;\n }\n if (_data(curList, 'connectWith') !== undefined) {\n return _data(curList, 'connectWith') === _data(destList, 'connectWith');\n }\n return false;\n};\nvar _getHandles = function(items, handle) {\n var result = [];\n var handles;\n if (!handle) {\n return items;\n }\n for (var i = 0; i < items.length; ++i) {\n handles = items[i].querySelectorAll(handle);\n result = result.concat(Array.prototype.slice.call(handles));\n }\n return result;\n};\n/*\n * Destroy the sortable\n * @param {Element} sortableElement a single sortable\n */\nvar _destroySortable = function(sortableElement) {\n var opts = _data(sortableElement, 'opts') || {};\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n // remove event handlers & data from sortable\n _removeSortableEvents(sortableElement);\n _removeSortableData(sortableElement);\n // remove event handlers & data from items\n _off(handles, 'mousedown');\n _removeItemEvents(items);\n _removeItemData(items);\n};\n/*\n * Enable the sortable\n * @param {Element} sortableElement a single sortable\n */\nvar _enableSortable = function(sortableElement) {\n var opts = _data(sortableElement, 'opts');\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n _attr(sortableElement, 'aria-dropeffect', 'move');\n _attr(handles, 'draggable', 'true');\n // IE FIX for ghost\n // can be disabled as it has the side effect that other events\n // (e.g. click) will be ignored\n var spanEl = (document || window.document).createElement('span');\n if (typeof spanEl.dragDrop === 'function' && !opts.disableIEFix) {\n _on(handles, 'mousedown', function() {\n if (items.indexOf(this) !== -1) {\n this.dragDrop();\n } else {\n var parent = this.parentElement;\n while (items.indexOf(parent) === -1) {\n parent = parent.parentElement;\n }\n parent.dragDrop();\n }\n });\n }\n};\n/*\n * Disable the sortable\n * @param {Element} sortableElement a single sortable\n */\nvar _disableSortable = function(sortableElement) {\n var opts = _data(sortableElement, 'opts');\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n _attr(sortableElement, 'aria-dropeffect', 'none');\n _attr(handles, 'draggable', 'false');\n _off(handles, 'mousedown');\n};\n/*\n * Reload the sortable\n * @param {Element} sortableElement a single sortable\n * @description events need to be removed to not be double bound\n */\nvar _reloadSortable = function(sortableElement) {\n var opts = _data(sortableElement, 'opts');\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n // remove event handlers from items\n _removeItemEvents(items);\n _off(handles, 'mousedown');\n // remove event handlers from sortable\n _removeSortableEvents(sortableElement);\n};\n/**\n * Get position of the element relatively to its sibling elements\n * @param {Element} element\n * @returns {number}\n */\nvar _index = function(element) {\n if (!element.parentElement) {\n return 0;\n }\n return Array.prototype.indexOf.call(element.parentElement.children, element);\n};\n/**\n * Whether element is in DOM\n * @param {Element} element\n * @returns {boolean}\n */\nvar _attached = function(element) {\n return !!element.parentNode;\n};\n/**\n * Convert HTML string into DOM element\n * @param {Element|string} html\n * @returns {Element}\n */\nvar _html2element = function(html) {\n if (typeof html !== 'string') {\n return html;\n }\n var div = document.createElement('div');\n div.innerHTML\t= html;\n return div.firstChild;\n};\n/**\n * Insert before target\n * @param {Element} target\n * @param {Element} element\n */\nvar _before = function(target, element) {\n target.parentElement.insertBefore(\n element,\n target\n );\n};\n/**\n * Insert after target\n * @param {Element} target\n * @param {Element} element\n */\nvar _after = function(target, element) {\n target.parentElement.insertBefore(\n element,\n target.nextElementSibling\n );\n};\n/**\n * Detach element from DOM\n * @param {Element} element\n */\nvar _detach = function(element) {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n};\n/**\n * Make native event that can be dispatched afterwards\n * @param {string} name\n * @param {object} detail\n * @returns {CustomEvent}\n */\nvar _makeEvent = function(name, detail) {\n var e = document.createEvent('Event');\n if (detail) {\n e.detail = detail;\n }\n e.initEvent(name, false, true);\n return e;\n};\n/**\n * @param {Element} sortableElement\n * @param {CustomEvent} event\n */\nvar _dispatchEventOnConnected = function(sortableElement, event) {\n sortables.forEach(function(target) {\n if (_listsConnected(sortableElement, target)) {\n target.dispatchEvent(event);\n }\n });\n};\n/*\n * Public sortable object\n * @param {Array|NodeList} sortableElements\n * @param {object|string} options|method\n */\nvar sortable = function(sortableElements, options) {\n\n var method = String(options);\n\n options = (function(options) {\n var result = {\n connectWith: false,\n placeholder: null,\n // dragImage can be null or a Element\n dragImage: null,\n disableIEFix: false,\n placeholderClass: 'sortable-placeholder',\n draggingClass: 'sortable-dragging',\n hoverClass: false\n };\n for (var option in options) {\n result[option] = options[option];\n }\n return result;\n })(options);\n\n if (typeof sortableElements === 'string') {\n sortableElements = document.querySelectorAll(sortableElements);\n }\n\n if (sortableElements instanceof window.Element) {\n sortableElements = [sortableElements];\n }\n\n sortableElements = Array.prototype.slice.call(sortableElements);\n\n /* TODO: maxstatements should be 25, fix and remove line below */\n /*jshint maxstatements:false */\n sortableElements.forEach(function(sortableElement) {\n\n if (/enable|disable|destroy/.test(method)) {\n sortable[method](sortableElement);\n return;\n }\n\n // get options & set options on sortable\n options = _data(sortableElement, 'opts') || options;\n _data(sortableElement, 'opts', options);\n // reset sortable\n _reloadSortable(sortableElement);\n // initialize\n var items = _filter(sortableElement.children, options.items);\n var index;\n var startParent;\n var placeholder = options.placeholder;\n if (!placeholder) {\n placeholder = document.createElement(\n /^ul|ol$/i.test(sortableElement.tagName) ? 'li' : 'div'\n );\n }\n placeholder = _html2element(placeholder);\n placeholder.classList.add.apply(\n placeholder.classList,\n options.placeholderClass.split(' ')\n );\n\n // setup sortable ids\n if (!sortableElement.getAttribute('data-sortable-id')) {\n var id = sortables.length;\n sortables[id] = sortableElement;\n _attr(sortableElement, 'data-sortable-id', id);\n _attr(items, 'data-item-sortable-id', id);\n }\n\n _data(sortableElement, 'items', options.items);\n placeholders.push(placeholder);\n if (options.connectWith) {\n _data(sortableElement, 'connectWith', options.connectWith);\n }\n\n _enableSortable(sortableElement);\n _attr(items, 'role', 'option');\n _attr(items, 'aria-grabbed', 'false');\n\n // Mouse over class\n if (options.hoverClass) {\n var hoverClass = 'sortable-over';\n if (typeof options.hoverClass === 'string') {\n hoverClass = options.hoverClass;\n }\n\n _on(items, 'mouseenter', function() {\n this.classList.add(hoverClass);\n });\n _on(items, 'mouseleave', function() {\n this.classList.remove(hoverClass);\n });\n }\n\n // Handle drag events on draggable items\n _on(items, 'dragstart', function(e) {\n e.stopImmediatePropagation();\n\n if (options.dragImage) {\n _attachGhost(e, {\n draggedItem: options.dragImage,\n x: 0,\n y: 0\n });\n console.log('WARNING: dragImage option is deprecated' +\n ' and will be removed in the future!');\n } else {\n // add transparent clone or other ghost to cursor\n _getGhost(e, this);\n }\n // cache selsection & add attr for dragging\n this.classList.add(options.draggingClass);\n dragging = this;\n _attr(dragging, 'aria-grabbed', 'true');\n // grab values\n index = _index(dragging);\n draggingHeight = parseInt(window.getComputedStyle(dragging).height);\n startParent = this.parentElement;\n // dispatch sortstart event on each element in group\n _dispatchEventOnConnected(sortableElement, _makeEvent('sortstart', {\n item: dragging,\n placeholder: placeholder,\n startparent: startParent\n }));\n });\n // Handle drag events on draggable items\n _on(items, 'dragend', function() {\n var newParent;\n if (!dragging) {\n return;\n }\n // remove dragging attributes and show item\n dragging.classList.remove(options.draggingClass);\n _attr(dragging, 'aria-grabbed', 'false');\n dragging.style.display = dragging.oldDisplay;\n delete dragging.oldDisplay;\n\n placeholders.forEach(_detach);\n newParent = this.parentElement;\n _dispatchEventOnConnected(sortableElement, _makeEvent('sortstop', {\n item: dragging,\n startparent: startParent\n }));\n if (index !== _index(dragging) || startParent !== newParent) {\n _dispatchEventOnConnected(sortableElement, _makeEvent('sortupdate', {\n item: dragging,\n index: _filter(newParent.children, _data(newParent, 'items'))\n .indexOf(dragging),\n oldindex: items.indexOf(dragging),\n elementIndex: _index(dragging),\n oldElementIndex: index,\n startparent: startParent,\n endparent: newParent\n }));\n }\n dragging = null;\n draggingHeight = null;\n });\n // Handle drop event on sortable & placeholder\n // TODO: REMOVE placeholder?????\n _on([sortableElement, placeholder], 'drop', function(e) {\n var visiblePlaceholder;\n if (!_listsConnected(sortableElement, dragging.parentElement)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n visiblePlaceholder = placeholders.filter(_attached)[0];\n _after(visiblePlaceholder, dragging);\n dragging.dispatchEvent(_makeEvent('dragend'));\n });\n\n // Handle dragover and dragenter events on draggable items\n var onDragOverEnter = function(e) {\n if (!_listsConnected(sortableElement, dragging.parentElement)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = 'move';\n if (items.indexOf(this) !== -1) {\n var thisHeight = parseInt(window.getComputedStyle(this).height);\n var placeholderIndex = _index(placeholder);\n var thisIndex = _index(this);\n if (options.forcePlaceholderSize) {\n placeholder.style.height = draggingHeight + 'px';\n }\n\n // Check if `this` is bigger than the draggable. If it is, we have to define a dead zone to prevent flickering\n if (thisHeight > draggingHeight) {\n // Dead zone?\n var deadZone = thisHeight - draggingHeight;\n var offsetTop = _offset(this).top;\n if (placeholderIndex < thisIndex &&\n e.pageY < offsetTop + deadZone) {\n return;\n }\n if (placeholderIndex > thisIndex &&\n e.pageY > offsetTop + thisHeight - deadZone) {\n return;\n }\n }\n\n if (dragging.oldDisplay === undefined) {\n dragging.oldDisplay = dragging.style.display;\n }\n dragging.style.display = 'none';\n if (placeholderIndex < thisIndex) {\n _after(this, placeholder);\n } else {\n _before(this, placeholder);\n }\n // Intentionally violated chaining, it is more complex otherwise\n placeholders\n .filter(function(element) {return element !== placeholder;})\n .forEach(_detach);\n } else {\n if (placeholders.indexOf(this) === -1 &&\n !_filter(this.children, options.items).length) {\n placeholders.forEach(_detach);\n this.appendChild(placeholder);\n }\n }\n };\n _on(items.concat(sortableElement), 'dragover', onDragOverEnter);\n _on(items.concat(sortableElement), 'dragenter', onDragOverEnter);\n });\n\n return sortableElements;\n};\n\nsortable.destroy = function(sortableElement) {\n _destroySortable(sortableElement);\n};\n\nsortable.enable = function(sortableElement) {\n _enableSortable(sortableElement);\n};\n\nsortable.disable = function(sortableElement) {\n _disableSortable(sortableElement);\n};\n\n\nreturn sortable;\n}));\n"],"sourceRoot":"/source/"}