{"version":3,"file":"kendo.draganddrop.min.js","sources":["kendo.draganddrop.js"],"sourcesContent":["(function(f, define) {\n define('kendo.draganddrop',[ \"kendo.core\", \"kendo.userevents\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"draganddrop\",\n name: \"Drag & drop\",\n category: \"framework\",\n description: \"Drag & drop functionality for any DOM element.\",\n depends: [ \"core\", \"userevents\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n support = kendo.support,\n document = window.document,\n $window = $(window),\n Class = kendo.Class,\n Widget = kendo.ui.Widget,\n Observable = kendo.Observable,\n UserEvents = kendo.UserEvents,\n extend = $.extend,\n getOffset = kendo.getOffset,\n draggables = {},\n dropTargets = {},\n dropAreas = {},\n lastDropTarget,\n elementUnderCursor = kendo.elementUnderCursor,\n KEYUP = \"keyup\",\n CHANGE = \"change\",\n\n // Draggable events\n DRAGSTART = \"dragstart\",\n HOLD = \"hold\",\n DRAG = \"drag\",\n DRAGEND = \"dragend\",\n DRAGCANCEL = \"dragcancel\",\n HINTDESTROYED = \"hintDestroyed\",\n\n // DropTarget events\n DRAGENTER = \"dragenter\",\n DRAGLEAVE = \"dragleave\",\n DROP = \"drop\";\n\n function contains(parent, child) {\n try {\n return $.contains(parent, child) || parent == child;\n } catch (e) {\n return false;\n }\n }\n\n function numericCssPropery(element, property) {\n return parseInt(element.css(property), 10) || 0;\n }\n\n function within(value, range) {\n return Math.min(Math.max(value, range.min), range.max);\n }\n\n function containerBoundaries(container, element) {\n var offset = getOffset(container),\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n minX = offset.left + numericCssPropery(container, \"borderLeftWidth\") + numericCssPropery(container, \"paddingLeft\"),\n minY = offset.top + numericCssPropery(container, \"borderTopWidth\") + numericCssPropery(container, \"paddingTop\"),\n maxX = minX + container.width() - outerWidth(element, true),\n maxY = minY + container.height() - outerHeight(element, true);\n\n return {\n x: { min: minX, max: maxX },\n y: { min: minY, max: maxY }\n };\n }\n\n function checkTarget(target, targets, areas) {\n var theTarget, theFilter, i = 0,\n targetLen = targets && targets.length,\n areaLen = areas && areas.length;\n\n while (target && target.parentNode) {\n for (i = 0; i < targetLen; i ++) {\n theTarget = targets[i];\n if (theTarget.element[0] === target) {\n return { target: theTarget, targetElement: target };\n }\n }\n\n for (i = 0; i < areaLen; i ++) {\n theFilter = areas[i];\n if ($.contains(theFilter.element[0], target) && support.matchesSelector.call(target, theFilter.options.filter)) {\n return { target: theFilter, targetElement: target };\n }\n }\n\n target = target.parentNode;\n }\n\n return undefined;\n }\n\n var TapCapture = Observable.extend({\n init: function(element, options) {\n var that = this,\n domElement = element[0];\n\n that.capture = false;\n\n if (domElement.addEventListener) {\n $.each(kendo.eventMap.down.split(\" \"), function() {\n domElement.addEventListener(this, that._press.bind(that), true);\n });\n $.each(kendo.eventMap.up.split(\" \"), function() {\n domElement.addEventListener(this, that._release.bind(that), true);\n });\n } else {\n $.each(kendo.eventMap.down.split(\" \"), function() {\n domElement.attachEvent(this, that._press.bind(that));\n });\n $.each(kendo.eventMap.up.split(\" \"), function() {\n domElement.attachEvent(this, that._release.bind(that));\n });\n }\n\n Observable.fn.init.call(that);\n\n that.bind([\"press\", \"release\"], options || {});\n },\n\n captureNext: function() {\n this.capture = true;\n },\n\n cancelCapture: function() {\n this.capture = false;\n },\n\n _press: function(e) {\n var that = this;\n that.trigger(\"press\");\n if (that.capture) {\n e.preventDefault();\n }\n },\n\n _release: function(e) {\n var that = this;\n that.trigger(\"release\");\n\n if (that.capture) {\n e.preventDefault();\n that.cancelCapture();\n }\n }\n });\n\n var PaneDimension = Observable.extend({\n init: function(options) {\n var that = this;\n Observable.fn.init.call(that);\n\n that.forcedEnabled = false;\n\n $.extend(that, options);\n\n that.scale = 1;\n\n if (that.horizontal) {\n that.measure = \"offsetWidth\";\n that.scrollSize = \"scrollWidth\";\n that.axis = \"x\";\n } else {\n that.measure = \"offsetHeight\";\n that.scrollSize = \"scrollHeight\";\n that.axis = \"y\";\n }\n },\n\n makeVirtual: function() {\n $.extend(this, {\n virtual: true,\n forcedEnabled: true,\n _virtualMin: 0,\n _virtualMax: 0\n });\n },\n\n virtualSize: function(min, max) {\n if (this._virtualMin !== min || this._virtualMax !== max) {\n this._virtualMin = min;\n this._virtualMax = max;\n this.update();\n }\n },\n\n outOfBounds: function(offset) {\n return offset > this.max || offset < this.min;\n },\n\n forceEnabled: function() {\n this.forcedEnabled = true;\n },\n\n getSize: function() {\n return this.container[0][this.measure];\n },\n\n getTotal: function() {\n return this.element[0][this.scrollSize];\n },\n\n rescale: function(scale) {\n this.scale = scale;\n },\n\n update: function(silent) {\n var that = this,\n total = that.virtual ? that._virtualMax : that.getTotal(),\n scaledTotal = total * that.scale,\n size = that.getSize();\n\n if (total === 0 && !that.forcedEnabled) {\n return; // we are not visible.\n }\n\n that.max = that.virtual ? -that._virtualMin : 0;\n that.size = size;\n that.total = scaledTotal;\n that.min = Math.min(that.max, size - scaledTotal);\n that.minScale = size / total;\n that.centerOffset = (scaledTotal - size) / 2;\n\n that.enabled = that.forcedEnabled || (scaledTotal > size);\n\n if (!silent) {\n that.trigger(CHANGE, that);\n }\n }\n });\n\n var PaneDimensions = Observable.extend({\n init: function(options) {\n var that = this;\n\n Observable.fn.init.call(that);\n\n that.x = new PaneDimension(extend({ horizontal: true }, options));\n that.y = new PaneDimension(extend({ horizontal: false }, options));\n that.container = options.container;\n that.forcedMinScale = options.minScale;\n that.maxScale = options.maxScale || 100;\n\n that.bind(CHANGE, options);\n },\n\n rescale: function(newScale) {\n this.x.rescale(newScale);\n this.y.rescale(newScale);\n this.refresh();\n },\n\n centerCoordinates: function() {\n return { x: Math.min(0, -this.x.centerOffset), y: Math.min(0, -this.y.centerOffset) };\n },\n\n refresh: function() {\n var that = this;\n that.x.update();\n that.y.update();\n that.enabled = that.x.enabled || that.y.enabled;\n that.minScale = that.forcedMinScale || Math.min(that.x.minScale, that.y.minScale);\n that.fitScale = Math.max(that.x.minScale, that.y.minScale);\n that.trigger(CHANGE);\n }\n });\n\n var PaneAxis = Observable.extend({\n init: function(options) {\n var that = this;\n extend(that, options);\n Observable.fn.init.call(that);\n },\n\n outOfBounds: function() {\n return this.dimension.outOfBounds(this.movable[this.axis]);\n },\n\n dragMove: function(delta) {\n var that = this,\n dimension = that.dimension,\n axis = that.axis,\n movable = that.movable,\n position = movable[axis] + delta;\n\n if (!dimension.enabled) {\n return;\n }\n\n if ((position < dimension.min && delta < 0) || (position > dimension.max && delta > 0)) {\n delta *= that.resistance;\n }\n\n movable.translateAxis(axis, delta);\n that.trigger(CHANGE, that);\n }\n });\n\n var Pane = Class.extend({\n\n init: function(options) {\n var that = this,\n x,\n y,\n resistance,\n movable;\n\n extend(that, { elastic: true }, options);\n\n resistance = that.elastic ? 0.5 : 0;\n movable = that.movable;\n\n that.x = x = new PaneAxis({\n axis: \"x\",\n dimension: that.dimensions.x,\n resistance: resistance,\n movable: movable\n });\n\n that.y = y = new PaneAxis({\n axis: \"y\",\n dimension: that.dimensions.y,\n resistance: resistance,\n movable: movable\n });\n\n that.userEvents.bind([\"press\", \"move\", \"end\", \"gesturestart\", \"gesturechange\"], {\n gesturestart: function(e) {\n that.gesture = e;\n that.offset = that.dimensions.container.offset();\n },\n\n press: function(e) {\n if ($(e.event.target).closest(\"a\").is(\"[data-navigate-on-press=true]\")) {\n e.sender.cancel();\n }\n },\n\n gesturechange: function(e) {\n var previousGesture = that.gesture,\n previousCenter = previousGesture.center,\n\n center = e.center,\n\n scaleDelta = e.distance / previousGesture.distance,\n\n minScale = that.dimensions.minScale,\n maxScale = that.dimensions.maxScale,\n coordinates;\n\n if (movable.scale <= minScale && scaleDelta < 1) {\n // Resist shrinking. Instead of shrinking from 1 to 0.5, it will shrink to 0.5 + (1 /* minScale */ - 0.5) * 0.8 = 0.9;\n scaleDelta += (1 - scaleDelta) * 0.8;\n }\n\n if (movable.scale * scaleDelta >= maxScale) {\n scaleDelta = maxScale / movable.scale;\n }\n\n var offsetX = movable.x + that.offset.left,\n offsetY = movable.y + that.offset.top;\n\n coordinates = {\n x: (offsetX - previousCenter.x) * scaleDelta + center.x - offsetX,\n y: (offsetY - previousCenter.y) * scaleDelta + center.y - offsetY\n };\n\n movable.scaleWith(scaleDelta);\n\n x.dragMove(coordinates.x);\n y.dragMove(coordinates.y);\n\n that.dimensions.rescale(movable.scale);\n that.gesture = e;\n e.preventDefault();\n },\n\n move: function(e) {\n if (e.event.target.tagName.match(/textarea|input/i)) {\n return;\n }\n\n if (x.dimension.enabled || y.dimension.enabled) {\n x.dragMove(e.x.delta);\n y.dragMove(e.y.delta);\n e.preventDefault();\n } else {\n e.touch.skip();\n }\n },\n\n end: function(e) {\n e.preventDefault();\n }\n });\n }\n });\n\n var TRANSFORM_STYLE = support.transitions.prefix + \"Transform\",\n translate;\n\n\n if (support.hasHW3D) {\n translate = function(x, y, scale) {\n return \"translate3d(\" + x + \"px,\" + y + \"px,0) scale(\" + scale + \")\";\n };\n } else {\n translate = function(x, y, scale) {\n return \"translate(\" + x + \"px,\" + y + \"px) scale(\" + scale + \")\";\n };\n }\n\n var Movable = Observable.extend({\n init: function(element) {\n var that = this;\n\n Observable.fn.init.call(that);\n\n that.element = $(element);\n that.element[0].style.webkitTransformOrigin = \"left top\";\n that.x = 0;\n that.y = 0;\n that.scale = 1;\n that._saveCoordinates(translate(that.x, that.y, that.scale));\n },\n\n translateAxis: function(axis, by) {\n this[axis] += by;\n this.refresh();\n },\n\n scaleTo: function(scale) {\n this.scale = scale;\n this.refresh();\n },\n\n scaleWith: function(scaleDelta) {\n this.scale *= scaleDelta;\n this.refresh();\n },\n\n translate: function(coordinates) {\n this.x += coordinates.x;\n this.y += coordinates.y;\n this.refresh();\n },\n\n moveAxis: function(axis, value) {\n this[axis] = value;\n this.refresh();\n },\n\n moveTo: function(coordinates) {\n extend(this, coordinates);\n this.refresh();\n },\n\n refresh: function() {\n var that = this,\n x = that.x,\n y = that.y,\n newCoordinates;\n\n if (that.round) {\n x = Math.round(x);\n y = Math.round(y);\n }\n\n newCoordinates = translate(x, y, that.scale);\n\n if (newCoordinates != that.coordinates) {\n if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n that.element[0].style.position = \"absolute\";\n that.element[0].style.left = that.x + \"px\";\n that.element[0].style.top = that.y + \"px\";\n\n } else {\n that.element[0].style[TRANSFORM_STYLE] = newCoordinates;\n }\n that._saveCoordinates(newCoordinates);\n that.trigger(CHANGE);\n }\n },\n\n _saveCoordinates: function(coordinates) {\n this.coordinates = coordinates;\n }\n });\n\n function destroyDroppable(collection, widget) {\n var groupName = widget.options.group,\n droppables = collection[groupName],\n i;\n\n Widget.fn.destroy.call(widget);\n\n if (droppables.length > 1) {\n for (i = 0; i < droppables.length; i++) {\n if (droppables[i] == widget) {\n droppables.splice(i, 1);\n break;\n }\n }\n } else {\n droppables.length = 0; // WTF, porting this from the previous destroyGroup\n delete collection[groupName];\n }\n }\n\n var DropTarget = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n var group = that.options.group;\n\n if (!(group in dropTargets)) {\n dropTargets[group] = [ that ];\n } else {\n dropTargets[group].push( that );\n }\n },\n\n events: [\n DRAGENTER,\n DRAGLEAVE,\n DROP\n ],\n\n options: {\n name: \"DropTarget\",\n group: \"default\"\n },\n\n destroy: function() {\n destroyDroppable(dropTargets, this);\n },\n\n _trigger: function(eventName, e) {\n var that = this,\n draggable = draggables[that.options.group];\n\n if (draggable) {\n return that.trigger(eventName, extend({}, e.event, {\n draggable: draggable,\n dropTarget: e.dropTarget\n }));\n }\n },\n\n _over: function(e) {\n this._trigger(DRAGENTER, e);\n },\n\n _out: function(e) {\n this._trigger(DRAGLEAVE, e);\n },\n\n _drop: function(e) {\n var that = this,\n draggable = draggables[that.options.group];\n\n if (draggable) {\n draggable.dropped = !that._trigger(DROP, e);\n }\n }\n });\n\n DropTarget.destroyGroup = function(groupName) {\n var group = dropTargets[groupName] || dropAreas[groupName],\n i;\n\n if (group) {\n for (i = 0; i < group.length; i++) {\n Widget.fn.destroy.call(group[i]);\n }\n\n group.length = 0;\n delete dropTargets[groupName];\n delete dropAreas[groupName];\n }\n };\n\n DropTarget._cache = dropTargets;\n\n var DropTargetArea = DropTarget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n var group = that.options.group;\n\n if (!(group in dropAreas)) {\n dropAreas[group] = [ that ];\n } else {\n dropAreas[group].push( that );\n }\n },\n\n destroy: function() {\n destroyDroppable(dropAreas, this);\n },\n\n options: {\n name: \"DropTargetArea\",\n group: \"default\",\n filter: null\n }\n });\n\n var Draggable = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that._activated = false;\n\n that.userEvents = new UserEvents(that.element, {\n global: true,\n allowSelection: true,\n filter: that.options.filter,\n threshold: that.options.distance,\n start: that._start.bind(that),\n hold: that._hold.bind(that),\n move: that._drag.bind(that),\n end: that._end.bind(that),\n cancel: that._cancel.bind(that),\n select: that._select.bind(that)\n });\n\n if (kendo.support.touch) {\n that.element.find(that.options.filter).css('touch-action', 'none');\n }\n\n that._afterEndHandler = that._afterEnd.bind(that);\n that._captureEscape = that._captureEscape.bind(that);\n },\n\n events: [\n HOLD,\n DRAGSTART,\n DRAG,\n DRAGEND,\n DRAGCANCEL,\n HINTDESTROYED\n ],\n\n options: {\n name: \"Draggable\",\n distance: ( kendo.support.touch ? 0 : 5),\n group: \"default\",\n cursorOffset: null,\n axis: null,\n container: null,\n filter: null,\n ignore: null,\n holdToDrag: false,\n autoScroll: false,\n dropped: false\n },\n\n cancelHold: function() {\n this._activated = false;\n },\n\n _captureEscape: function(e) {\n var that = this;\n\n if (e.keyCode === kendo.keys.ESC) {\n that._trigger(DRAGCANCEL, { event: e });\n that.userEvents.cancel();\n }\n },\n\n _updateHint: function(e) {\n var that = this,\n coordinates,\n options = that.options,\n boundaries = that.boundaries,\n axis = options.axis,\n cursorOffset = that.options.cursorOffset;\n\n if (cursorOffset) {\n coordinates = { left: e.x.location + cursorOffset.left, top: e.y.location + cursorOffset.top };\n } else {\n that.hintOffset.left += e.x.delta;\n that.hintOffset.top += e.y.delta;\n coordinates = $.extend({}, that.hintOffset);\n }\n\n if (boundaries) {\n coordinates.top = within(coordinates.top, boundaries.y);\n coordinates.left = within(coordinates.left, boundaries.x);\n }\n\n if (axis === \"x\") {\n delete coordinates.top;\n } else if (axis === \"y\") {\n delete coordinates.left;\n }\n\n that.hint.css(coordinates);\n },\n\n _shouldIgnoreTarget: function(target) {\n var ignoreSelector = this.options.ignore;\n return ignoreSelector && $(target).is(ignoreSelector);\n },\n\n _select: function(e) {\n if (!this._shouldIgnoreTarget(e.event.target)) {\n e.preventDefault();\n }\n },\n\n _start: function(e) {\n var that = this,\n options = that.options,\n container = options.container ? $(options.container) : null,\n hint = options.hint;\n\n if (this._shouldIgnoreTarget(e.touch.initialTouch) || (options.holdToDrag && !that._activated)) {\n that.userEvents.cancel();\n return;\n }\n\n that.currentTarget = e.target;\n that.currentTargetOffset = getOffset(that.currentTarget);\n\n if (hint) {\n if (that.hint) {\n that.hint.stop(true, true).remove();\n }\n\n that.hint = kendo.isFunction(hint) ? $(hint.call(that, that.currentTarget)) : hint;\n\n var offset = getOffset(that.currentTarget);\n that.hintOffset = offset;\n\n that.hint.css( {\n position: \"absolute\",\n zIndex: 20000, // the Window's z-index is 10000 and can be raised because of z-stacking\n left: offset.left,\n top: offset.top\n })\n .appendTo(document.body);\n\n that.angular(\"compile\", function() {\n that.hint.removeAttr(\"ng-repeat\");\n var scopeTarget = $(e.target);\n\n while (!scopeTarget.data(\"$$kendoScope\") && scopeTarget.length) {\n scopeTarget = scopeTarget.parent();\n }\n\n return {\n elements: that.hint.get(),\n scopeFrom: scopeTarget.data(\"$$kendoScope\")\n };\n });\n }\n\n draggables[options.group] = that;\n\n that.dropped = false;\n\n if (container) {\n that.boundaries = containerBoundaries(container, that.hint);\n }\n\n $(document).on(KEYUP, that._captureEscape);\n\n if (that._trigger(DRAGSTART, e)) {\n that.userEvents.cancel();\n that._afterEnd();\n }\n\n that.userEvents.capture();\n },\n\n _hold: function(e) {\n this.currentTarget = e.target;\n\n if (this._trigger(HOLD, e)) {\n this.userEvents.cancel();\n } else {\n this._activated = true;\n }\n },\n\n _drag: function(e) {\n e.preventDefault();\n\n var cursorElement = this._elementUnderCursor(e);\n\n if (this.options.autoScroll && this._cursorElement !== cursorElement) {\n this._scrollableParent = findScrollableParent(cursorElement);\n this._cursorElement = cursorElement;\n }\n\n this._lastEvent = e;\n this._processMovement(e, cursorElement);\n\n if (this.options.autoScroll) {\n // chrome seems to trigger mousemove when mouse is moved outside of the window (over the Chrome), too.\n if (this._scrollableParent[0]) {\n var velocity = autoScrollVelocity(e.x.location, e.y.location, scrollableViewPort(this._scrollableParent));\n\n\n this._scrollCompenstation = $.extend({}, this.hintOffset);\n this._scrollVelocity = velocity;\n\n if (velocity.y === 0 && velocity.x === 0) {\n clearInterval(this._scrollInterval);\n this._scrollInterval = null;\n } else if (!this._scrollInterval) {\n this._scrollInterval = setInterval(this._autoScroll.bind(this), 50);\n }\n }\n }\n\n if (this.hint) {\n this._updateHint(e);\n }\n },\n\n _processMovement: function(e, cursorElement) {\n this._withDropTarget(cursorElement, function(target, targetElement) {\n if (!target) {\n if (lastDropTarget) {\n lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n lastDropTarget = null;\n }\n return;\n }\n\n if (lastDropTarget) {\n if (targetElement === lastDropTarget.targetElement) {\n return;\n }\n\n lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n }\n\n target._trigger(DRAGENTER, extend(e, { dropTarget: $(targetElement) }));\n lastDropTarget = extend(target, { targetElement: targetElement });\n });\n\n this._trigger(DRAG, extend(e, { dropTarget: lastDropTarget, elementUnderCursor: cursorElement }));\n },\n\n _autoScroll: function() {\n var parent = this._scrollableParent[0],\n velocity = this._scrollVelocity,\n compensation = this._scrollCompenstation;\n\n if (!parent) {\n return;\n }\n\n var cursorElement = this._elementUnderCursor(this._lastEvent);\n this._processMovement(this._lastEvent, cursorElement);\n\n var yIsScrollable, xIsScrollable;\n\n var isRootNode = parent === scrollableRoot()[0];\n\n if (isRootNode) {\n yIsScrollable = document.body.scrollHeight > $window.height();\n xIsScrollable = document.body.scrollWidth > $window.width();\n } else {\n yIsScrollable = parent.offsetHeight <= parent.scrollHeight;\n xIsScrollable = parent.offsetWidth <= parent.scrollWidth;\n }\n\n var yDelta = parent.scrollTop + velocity.y;\n var yInBounds = yIsScrollable && yDelta > 0 && yDelta < parent.scrollHeight;\n\n var xDelta = parent.scrollLeft + velocity.x;\n var xInBounds = xIsScrollable && xDelta > 0 && xDelta < parent.scrollWidth;\n\n if (yInBounds) {\n parent.scrollTop += velocity.y;\n } else if (yIsScrollable && yDelta < 0) {\n parent.scrollTop = 0;\n }\n\n if (xInBounds) {\n parent.scrollLeft += velocity.x;\n } else if (xIsScrollable && xDelta < 0) {\n parent.scrollLeft = 0;\n }\n\n if (this.hint && isRootNode && (xInBounds || yInBounds)) {\n if (yInBounds) {\n compensation.top += velocity.y;\n }\n\n if (xInBounds) {\n compensation.left += velocity.x;\n }\n\n this.hint.css(compensation);\n }\n },\n\n _end: function(e) {\n this._withDropTarget(this._elementUnderCursor(e), function(target, targetElement) {\n if (target) {\n target._drop(extend({}, e, { dropTarget: $(targetElement) }));\n lastDropTarget = null;\n }\n });\n\n clearInterval(this._scrollInterval);\n this._scrollInterval = null;\n this._cancel(this._trigger(DRAGEND, e));\n },\n\n _cancel: function(isDefaultPrevented) {\n var that = this;\n\n that._scrollableParent = null;\n this._cursorElement = null;\n clearInterval(this._scrollInterval);\n that._activated = false;\n\n if (that.hint && !that.dropped) {\n setTimeout(function() {\n that.hint.stop(true, true);\n\n if (isDefaultPrevented) {\n that._afterEndHandler();\n } else {\n that.hint.animate(that.currentTargetOffset, \"fast\", that._afterEndHandler);\n }\n }, 0);\n\n } else {\n that._afterEnd();\n }\n },\n\n _trigger: function(eventName, e) {\n var that = this;\n\n return that.trigger(\n eventName, extend(\n {},\n e.event,\n {\n x: e.x,\n y: e.y,\n currentTarget: that.currentTarget,\n initialTarget: e.touch ? e.touch.initialTouch : null,\n dropTarget: e.dropTarget,\n elementUnderCursor: e.elementUnderCursor\n }\n ));\n },\n\n _elementUnderCursor: function(e) {\n var target = elementUnderCursor(e),\n hint = this.hint;\n\n if (hint && contains(hint[0], target)) {\n hint.hide();\n target = elementUnderCursor(e);\n // IE8 does not return the element in iframe from first attempt\n if (!target) {\n target = elementUnderCursor(e);\n }\n hint.show();\n }\n\n return target;\n },\n\n _withDropTarget: function(element, callback) {\n var result,\n group = this.options.group,\n targets = dropTargets[group],\n areas = dropAreas[group];\n\n if (targets && targets.length || areas && areas.length) {\n result = checkTarget(element, targets, areas);\n\n if (result) {\n callback(result.target, result.targetElement);\n } else {\n callback();\n }\n }\n },\n\n destroy: function() {\n var that = this;\n\n Widget.fn.destroy.call(that);\n\n that._afterEnd();\n\n that.userEvents.destroy();\n\n this._scrollableParent = null;\n this._cursorElement = null;\n clearInterval(this._scrollInterval);\n\n that.currentTarget = null;\n },\n\n _afterEnd: function() {\n var that = this;\n\n if (that.hint) {\n that.hint.remove();\n }\n\n delete draggables[that.options.group];\n\n that.trigger(\"destroy\");\n that.trigger(HINTDESTROYED);\n $(document).off(KEYUP, that._captureEscape);\n }\n });\n\n kendo.ui.plugin(DropTarget);\n kendo.ui.plugin(DropTargetArea);\n kendo.ui.plugin(Draggable);\n kendo.TapCapture = TapCapture;\n kendo.containerBoundaries = containerBoundaries;\n\n extend(kendo.ui, {\n Pane: Pane,\n PaneDimensions: PaneDimensions,\n Movable: Movable\n });\n\n function scrollableViewPort(element) {\n var root = scrollableRoot()[0],\n offset,\n top,\n left;\n\n if (element[0] === root) {\n top = root.scrollTop;\n left = root.scrollLeft;\n\n return {\n top: top,\n left: left,\n bottom: top + $window.height(),\n right: left + $window.width()\n };\n } else {\n offset = element.offset();\n offset.bottom = offset.top + element.height();\n offset.right = offset.left + element.width();\n return offset;\n }\n }\n\n function scrollableRoot() {\n return $(kendo.support.browser.edge || kendo.support.browser.safari ? document.body : document.documentElement);\n }\n\n function findScrollableParent(element) {\n var root = scrollableRoot();\n\n if (!element || element === document.body || element === document.documentElement) {\n return root;\n }\n\n var parent = $(element)[0];\n\n while (parent && !kendo.isScrollable(parent) && parent !== document.body) {\n parent = parent.parentNode;\n }\n\n if (parent === document.body) {\n return root;\n }\n\n return $(parent);\n }\n\n function autoScrollVelocity(mouseX, mouseY, rect) {\n var velocity = { x: 0, y: 0 };\n\n var AUTO_SCROLL_AREA = 50;\n\n if (mouseX - rect.left < AUTO_SCROLL_AREA) {\n velocity.x = -(AUTO_SCROLL_AREA - (mouseX - rect.left));\n } else if (rect.right - mouseX < AUTO_SCROLL_AREA) {\n velocity.x = AUTO_SCROLL_AREA - (rect.right - mouseX);\n }\n\n if (mouseY - rect.top < AUTO_SCROLL_AREA) {\n velocity.y = -(AUTO_SCROLL_AREA - (mouseY - rect.top));\n } else if (rect.bottom - mouseY < AUTO_SCROLL_AREA) {\n velocity.y = AUTO_SCROLL_AREA - (rect.bottom - mouseY);\n }\n\n return velocity;\n }\n\n // export for testing\n kendo.ui.Draggable.utils = {\n autoScrollVelocity: autoScrollVelocity,\n scrollableViewPort: scrollableViewPort,\n findScrollableParent: findScrollableParent\n };\n\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","description","depends","$","window","kendo","jQuery","undefined","support","document","$window","Class","Widget","ui","Observable","UserEvents","extend","getOffset","draggables","dropTargets","dropAreas","lastDropTarget","elementUnderCursor","KEYUP","CHANGE","DRAGSTART","HOLD","DRAG","DRAGEND","DRAGCANCEL","HINTDESTROYED","DRAGENTER","DRAGLEAVE","DROP","contains","parent","child","e","numericCssPropery","element","property","parseInt","css","within","value","range","Math","min","max","containerBoundaries","container","offset","outerWidth","_outerWidth","outerHeight","_outerHeight","minX","left","minY","top","maxX","width","maxY","height","x","y","checkTarget","target","targets","areas","theTarget","theFilter","i","targetLen","length","areaLen","parentNode","targetElement","matchesSelector","call","options","filter","TapCapture","init","that","this","domElement","capture","addEventListener","each","eventMap","down","split","_press","bind","up","_release","attachEvent","fn","captureNext","cancelCapture","trigger","preventDefault","PaneDimension","forcedEnabled","scale","horizontal","measure","scrollSize","axis","makeVirtual","virtual","_virtualMin","_virtualMax","virtualSize","update","outOfBounds","forceEnabled","getSize","getTotal","rescale","silent","total","scaledTotal","size","minScale","centerOffset","enabled","PaneDimensions","forcedMinScale","maxScale","newScale","refresh","centerCoordinates","fitScale","PaneAxis","dimension","movable","dragMove","delta","position","resistance","translateAxis","Pane","elastic","dimensions","userEvents","gesturestart","gesture","press","event","closest","is","sender","cancel","gesturechange","previousGesture","previousCenter","center","scaleDelta","distance","coordinates","offsetX","offsetY","scaleWith","move","tagName","match","touch","skip","end","TRANSFORM_STYLE","transitions","prefix","translate","hasHW3D","Movable","style","webkitTransformOrigin","_saveCoordinates","by","scaleTo","moveAxis","moveTo","newCoordinates","round","browser","msie","version","destroyDroppable","collection","widget","groupName","group","droppables","destroy","splice","DropTarget","push","events","_trigger","eventName","draggable","dropTarget","_over","_out","_drop","dropped","DropTargetArea","destroyGroup","_cache","Draggable","_activated","global","allowSelection","threshold","start","_start","hold","_hold","_drag","_end","_cancel","select","_select","find","_afterEndHandler","_afterEnd","_captureEscape","cursorOffset","ignore","holdToDrag","autoScroll","cancelHold","keyCode","keys","ESC","_updateHint","boundaries","location","hintOffset","hint","_shouldIgnoreTarget","ignoreSelector","initialTouch","currentTarget","currentTargetOffset","stop","remove","isFunction","zIndex","appendTo","body","angular","removeAttr","scopeTarget","data","elements","get","scopeFrom","on","cursorElement","_elementUnderCursor","_cursorElement","_scrollableParent","findScrollableParent","_lastEvent","_processMovement","velocity","autoScrollVelocity","scrollableViewPort","_scrollCompenstation","_scrollVelocity","clearInterval","_scrollInterval","setInterval","_autoScroll","_withDropTarget","compensation","yIsScrollable","xIsScrollable","isRootNode","scrollableRoot","scrollHeight","scrollWidth","offsetHeight","offsetWidth","yDelta","scrollTop","yInBounds","xDelta","scrollLeft","xInBounds","isDefaultPrevented","setTimeout","animate","initialTarget","hide","show","callback","result","off","root","bottom","right","edge","safari","documentElement","isScrollable","mouseX","mouseY","rect","AUTO_SCROLL_AREA","plugin","utils","amd","a1","a2","a3"],"mappings":"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"}