{"version":3,"file":"kendo.sortable.min.js","sources":["kendo.sortable.js"],"sourcesContent":["\n(function(f, define) {\n define('kendo.sortable',[ \"kendo.draganddrop\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"sortable\",\n name: \"Sortable\",\n category: \"framework\",\n depends: [ \"draganddrop\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n\n START = \"start\",\n BEFORE_MOVE = \"beforeMove\",\n MOVE = \"move\",\n END = \"end\",\n CHANGE = \"change\",\n CANCEL = \"cancel\",\n\n ACTION_SORT = \"sort\",\n ACTION_REMOVE = \"remove\",\n ACTION_RECEIVE = \"receive\",\n\n DEFAULT_FILTER = \">*\",\n MISSING_INDEX = -1;\n\n function containsOrEqualTo(parent, child) {\n try {\n return $.contains(parent, child) || parent == child;\n } catch (e) {\n return false;\n }\n }\n\n function defaultHint(element) {\n return element.clone();\n }\n\n function defaultPlaceholder(element) {\n return element.clone().removeAttr(\"id\").css(\"visibility\", \"hidden\");\n }\n\n var Sortable = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n if (!that.options.placeholder) {\n that.options.placeholder = defaultPlaceholder;\n }\n\n if (!that.options.hint) {\n that.options.hint = defaultHint;\n }\n\n that.draggable = that._createDraggable();\n },\n\n events: [\n START,\n BEFORE_MOVE,\n MOVE,\n END,\n CHANGE,\n CANCEL\n ],\n\n options: {\n name: \"Sortable\",\n hint: null,\n placeholder: null,\n filter: DEFAULT_FILTER,\n holdToDrag: false,\n disabled: null,\n container: null,\n connectWith: null,\n handler: null,\n cursorOffset: null,\n axis: null,\n ignore: null,\n autoScroll: false,\n cursor: \"auto\",\n moveOnDragEnter: false\n },\n\n destroy: function() {\n this.draggable.destroy();\n Widget.fn.destroy.call(this);\n },\n\n _createDraggable: function() {\n var that = this,\n element = that.element,\n options = that.options;\n\n return new kendo.ui.Draggable(element, {\n filter: options.filter,\n hint: kendo.isFunction(options.hint) ? options.hint : $(options.hint),\n holdToDrag: options.holdToDrag,\n container: options.container ? $(options.container) : null,\n cursorOffset: options.cursorOffset,\n axis: options.axis,\n ignore: options.ignore,\n autoScroll: options.autoScroll,\n dragstart: that._dragstart.bind(that),\n dragcancel: that._dragcancel.bind(that),\n drag: that._drag.bind(that),\n dragend: that._dragend.bind(that)\n });\n },\n\n _dragstart: function(e) {\n var draggedElement = this.draggedElement = e.currentTarget,\n disabled = this.options.disabled,\n handler = this.options.handler,\n _placeholder = this.options.placeholder,\n placeholder = this.placeholder = kendo.isFunction(_placeholder) ? $(_placeholder.call(this, draggedElement)) : $(_placeholder);\n\n if (disabled && draggedElement.is(disabled)) {\n e.preventDefault();\n } else if (handler && !$(e.initialTarget).is(handler)) {\n e.preventDefault();\n } else {\n\n if (this.trigger(START, { item: draggedElement, draggableEvent: e })) {\n e.preventDefault();\n } else {\n draggedElement.css(\"display\", \"none\");\n draggedElement.before(placeholder);\n\n this._setCursor();\n }\n\n }\n },\n\n _dragcancel: function() {\n this._cancel();\n this.trigger(CANCEL, { item: this.draggedElement });\n\n this._resetCursor();\n },\n\n _drag: function(e) {\n var draggedElement = this.draggedElement,\n target = this._findTarget(e),\n targetCenter,\n cursorOffset = { left: e.x.location, top: e.y.location },\n offsetDelta,\n axisDelta = { x: e.x.delta, y: e.y.delta },\n direction,\n sibling,\n getSibling,\n axis = this.options.axis,\n moveOnDragEnter = this.options.moveOnDragEnter,\n eventData = { item: draggedElement, list: this, draggableEvent: e };\n\n if (axis === \"x\" || axis === \"y\") {\n this._movementByAxis(axis, cursorOffset, axisDelta[axis], eventData);\n return;\n }\n\n if (target) {\n targetCenter = this._getElementCenter(target.element);\n\n offsetDelta = {\n left: Math.round(cursorOffset.left - targetCenter.left),\n top: Math.round(cursorOffset.top - targetCenter.top)\n };\n\n $.extend(eventData, { target: target.element });\n\n if (target.appendToBottom) {\n this._movePlaceholder(target, null, eventData);\n return;\n }\n\n if (target.appendAfterHidden) {\n this._movePlaceholder(target, \"next\", eventData);\n }\n\n if (this._isFloating(target.element)) { //horizontal\n if ((axisDelta.x < 0 && moveOnDragEnter) || (!moveOnDragEnter && offsetDelta.left < 0)) {\n direction = \"prev\";\n } else if ((axisDelta.x > 0 && moveOnDragEnter) || (!moveOnDragEnter && offsetDelta.left > 0)) {\n direction = \"next\";\n }\n } else { //vertical\n if ((axisDelta.y < 0 && moveOnDragEnter) || (!moveOnDragEnter && offsetDelta.top < 0)) {\n direction = \"prev\";\n } else if ((axisDelta.y > 0 && moveOnDragEnter) || (!moveOnDragEnter && offsetDelta.top > 0)) {\n direction = \"next\";\n }\n }\n\n if (direction) {\n getSibling = (direction === \"prev\") ? jQuery.fn.prev : jQuery.fn.next;\n\n sibling = getSibling.call(target.element);\n\n //find the prev/next visible sibling\n while (sibling.length && !sibling.is(\":visible\")) {\n sibling = getSibling.call(sibling);\n }\n\n if (sibling[0] != this.placeholder[0]) {\n this._movePlaceholder(target, direction, eventData);\n }\n }\n }\n },\n\n _dragend: function(e) {\n var placeholder = this.placeholder,\n draggedElement = this.draggedElement,\n draggedIndex = this.indexOf(draggedElement),\n placeholderIndex = this.indexOf(placeholder),\n connectWith = this.options.connectWith,\n connectedList,\n isDefaultPrevented,\n eventData,\n connectedListEventData;\n\n this._resetCursor();\n\n eventData = {\n action: ACTION_SORT,\n item: draggedElement,\n oldIndex: draggedIndex,\n newIndex: placeholderIndex,\n draggableEvent: e\n };\n\n if (placeholderIndex >= 0) {\n isDefaultPrevented = this.trigger(END, eventData);\n } else {\n connectedList = placeholder.parents(connectWith).getKendoSortable();\n\n eventData.action = ACTION_REMOVE;\n connectedListEventData = $.extend({}, eventData, {\n action: ACTION_RECEIVE,\n oldIndex: MISSING_INDEX,\n newIndex: connectedList.indexOf(placeholder)\n });\n\n isDefaultPrevented = !(!this.trigger(END, eventData) && !connectedList.trigger(END, connectedListEventData));\n }\n\n if (isDefaultPrevented || placeholderIndex === draggedIndex) {\n this._cancel();\n return;\n }\n\n placeholder.replaceWith(draggedElement);\n\n draggedElement.show();\n this.draggable.dropped = true;\n\n eventData = {\n action: this.indexOf(draggedElement) != MISSING_INDEX ? ACTION_SORT : ACTION_REMOVE,\n item: draggedElement,\n oldIndex: draggedIndex,\n newIndex: this.indexOf(draggedElement),\n draggableEvent: e\n };\n\n this.trigger(CHANGE, eventData);\n\n if (connectedList) {\n connectedListEventData = $.extend({}, eventData, {\n action: ACTION_RECEIVE,\n oldIndex: MISSING_INDEX,\n newIndex: connectedList.indexOf(draggedElement)\n });\n\n connectedList.trigger(CHANGE, connectedListEventData);\n }\n\n },\n\n _findTarget: function(e) {\n var element = this._findElementUnderCursor(e),\n items,\n connectWith = this.options.connectWith,\n node;\n\n if ($.contains(this.element[0], element)) { //the element is part of the sortable container\n items = this.items();\n node = items.filter(element)[0] || items.has(element)[0];\n\n return node ? { element: $(node), sortable: this } : null;\n } else if (this.element[0] == element && this._isEmpty()) {\n return { element: this.element, sortable: this, appendToBottom: true };\n } else if (this.element[0] == element && this._isLastHidden()) {\n node = this.items().eq(0);\n return { element: node , sortable: this, appendAfterHidden: true };\n } else if (connectWith) { //connected lists are present\n return this._searchConnectedTargets(element, e);\n }\n },\n\n _findElementUnderCursor: function(e) {\n var elementUnderCursor = kendo.elementUnderCursor(e),\n draggable = e.sender;\n\n if (containsOrEqualTo(draggable.hint[0], elementUnderCursor)) {\n draggable.hint.hide();\n elementUnderCursor = kendo.elementUnderCursor(e);\n // IE8 does not return the element in iframe from first attempt\n if (!elementUnderCursor) {\n elementUnderCursor = kendo.elementUnderCursor(e);\n }\n draggable.hint.show();\n }\n\n return elementUnderCursor;\n },\n\n _searchConnectedTargets: function(element, e) {\n var connected = $(this.options.connectWith),\n sortableInstance,\n items,\n node;\n\n for (var i = 0; i < connected.length; i++) {\n sortableInstance = connected.eq(i).getKendoSortable();\n\n if ($.contains(connected[i], element)) {\n if (sortableInstance) {\n items = sortableInstance.items();\n node = items.filter(element)[0] || items.has(element)[0];\n\n if (node) {\n sortableInstance.placeholder = this.placeholder;\n return { element: $(node), sortable: sortableInstance };\n } else {\n return null;\n }\n }\n } else if (connected[i] == element) {\n if (sortableInstance && sortableInstance._isEmpty()) {\n return { element: connected.eq(i), sortable: sortableInstance, appendToBottom: true };\n } else if (this._isCursorAfterLast(sortableInstance, e)) {\n node = sortableInstance.items().last();\n return { element: node, sortable: sortableInstance };\n }\n }\n }\n\n },\n\n _isCursorAfterLast: function(sortable, e) {\n var lastItem = sortable.items().last(),\n cursorOffset = { left: e.x.location, top: e.y.location },\n lastItemOffset,\n delta;\n\n lastItemOffset = kendo.getOffset(lastItem);\n lastItemOffset.top += outerHeight(lastItem);\n lastItemOffset.left += outerWidth(lastItem);\n\n if (this._isFloating(lastItem)) { //horizontal\n delta = lastItemOffset.left - cursorOffset.left;\n } else { //vertical\n delta = lastItemOffset.top - cursorOffset.top;\n }\n\n return delta < 0 ? true : false;\n },\n\n _movementByAxis: function(axis, cursorOffset, delta, eventData) {\n var cursorPosition = (axis === \"x\") ? cursorOffset.left : cursorOffset.top,\n target = (delta < 0) ? this.placeholder.prev() : this.placeholder.next(),\n items = this.items(),\n targetCenter;\n\n if (target.length && !target.is(\":visible\")) {\n target = (delta < 0) ? target.prev() : target.next();\n }\n\n if (!items.filter(target).length) {\n return;\n }\n\n $.extend(eventData, { target: target });\n targetCenter = this._getElementCenter(target);\n\n if (targetCenter) {\n targetCenter = (axis === \"x\") ? targetCenter.left : targetCenter.top;\n }\n\n if (target.length && delta < 0 && cursorPosition - targetCenter < 0) { //prev\n this._movePlaceholder({ element: target, sortable: this }, \"prev\", eventData);\n } else if (target.length && delta > 0 && cursorPosition - targetCenter > 0) { //next\n this._movePlaceholder({ element: target, sortable: this }, \"next\", eventData);\n }\n },\n\n _movePlaceholder: function(target, direction, eventData) {\n var placeholder = this.placeholder;\n\n if (!target.sortable.trigger(BEFORE_MOVE, eventData)) {\n\n if (!direction) {\n target.element.append(placeholder);\n } else if (direction === \"prev\") {\n target.element.before(placeholder);\n } else if (direction === \"next\") {\n target.element.after(placeholder);\n }\n\n target.sortable.trigger(MOVE, eventData);\n }\n },\n\n _setCursor: function() {\n var cursor = this.options.cursor,\n body;\n\n if (cursor && cursor !== \"auto\") {\n body = $(document.body);\n\n this._originalCursorType = body.css(\"cursor\");\n body.css({ \"cursor\": cursor });\n\n if (!this._cursorStylesheet) {\n this._cursorStylesheet = $(\"\");\n }\n\n this._cursorStylesheet.appendTo(body);\n }\n },\n\n _resetCursor: function() {\n if (this._originalCursorType) {\n $(document.body).css(\"cursor\", this._originalCursorType);\n this._originalCursorType = null;\n\n this._cursorStylesheet.remove();\n }\n },\n\n _getElementCenter: function(element) {\n var center = element.length ? kendo.getOffset(element) : null;\n if (center) {\n center.top += outerHeight(element) / 2;\n center.left += outerWidth(element) / 2;\n }\n\n return center;\n },\n\n _isFloating: function(item) {\n var isFloating = /left|right/.test(item.css('float'));\n var isTable = /inline|table-cell/.test(item.css('display'));\n var isHorizontalFlex = /flex/.test(item.parent().css('display')) && (/row|row-reverse/.test(item.parent().css('flex-direction')) || !item.parent().css('flex-direction'));\n return isFloating || isTable || isHorizontalFlex;\n },\n\n _cancel: function() {\n this.draggedElement.show();\n this.placeholder.remove();\n this.draggable.dropped = true;\n },\n\n _items: function() {\n var filter = this.options.filter,\n items;\n\n if (filter) {\n items = this.element.find(filter);\n } else {\n items = this.element.children();\n }\n\n return items;\n },\n\n indexOf: function(element) {\n var items = this._items(),\n placeholder = this.placeholder,\n draggedElement = this.draggedElement;\n\n if (placeholder && element[0] == placeholder[0]) {\n return items.not(draggedElement).index(element);\n } else {\n return items.not(placeholder).index(element);\n }\n },\n\n items: function() {\n var placeholder = this.placeholder,\n items = this._items();\n\n if (placeholder) {\n items = items.not(placeholder);\n }\n\n return items;\n },\n\n _isEmpty: function() {\n return !this.items().length;\n },\n\n _isLastHidden: function() {\n return this.items().length === 1 && this.items().is(\":hidden\");\n }\n\n });\n\n kendo.ui.plugin(Sortable);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n"],"names":["define","__meta__","id","name","category","depends","$","window","kendo","jQuery","undefined","Widget","ui","outerWidth","_outerWidth","outerHeight","_outerHeight","START","BEFORE_MOVE","MOVE","END","CHANGE","CANCEL","ACTION_SORT","ACTION_REMOVE","ACTION_RECEIVE","DEFAULT_FILTER","MISSING_INDEX","containsOrEqualTo","parent","child","contains","e","defaultHint","element","clone","defaultPlaceholder","removeAttr","css","Sortable","extend","init","options","that","this","fn","call","placeholder","hint","draggable","_createDraggable","events","filter","holdToDrag","disabled","container","connectWith","handler","cursorOffset","axis","ignore","autoScroll","cursor","moveOnDragEnter","destroy","Draggable","isFunction","dragstart","_dragstart","bind","dragcancel","_dragcancel","drag","_drag","dragend","_dragend","draggedElement","currentTarget","_placeholder","is","preventDefault","initialTarget","trigger","item","draggableEvent","before","_setCursor","_cancel","_resetCursor","target","_findTarget","targetCenter","left","x","location","top","y","offsetDelta","axisDelta","delta","direction","sibling","getSibling","eventData","list","_movementByAxis","_getElementCenter","Math","round","appendToBottom","_movePlaceholder","appendAfterHidden","_isFloating","prev","next","length","draggedIndex","indexOf","placeholderIndex","connectedList","isDefaultPrevented","connectedListEventData","action","oldIndex","newIndex","parents","getKendoSortable","replaceWith","show","dropped","_findElementUnderCursor","items","node","has","sortable","_isEmpty","_isLastHidden","eq","_searchConnectedTargets","elementUnderCursor","sender","hide","connected","sortableInstance","i","_isCursorAfterLast","last","lastItem","lastItemOffset","getOffset","cursorPosition","append","after","body","document","_originalCursorType","_cursorStylesheet","appendTo","remove","center","isFloating","test","isTable","isHorizontalFlex","_items","find","children","not","index","plugin","amd","a1","a2","a3"],"mappings":"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"}