{"version":3,"file":"kendo.userevents.min.js","sources":["kendo.userevents.js"],"sourcesContent":["(function(f, define) {\n define('kendo.userevents',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"userevents\",\n name: \"User Events\",\n category: \"framework\",\n depends: [ \"core\" ],\n hidden: true\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n support = kendo.support,\n Class = kendo.Class,\n Observable = kendo.Observable,\n now = Date.now,\n extend = $.extend,\n OS = support.mobileOS,\n invalidZeroEvents = OS && OS.android,\n DEFAULT_MIN_HOLD = 800,\n CLICK_DELAY = 300,\n DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0, // WP8 and W8 are very sensitive and always report move.\n\n // UserEvents events\n PRESS = \"press\",\n HOLD = \"hold\",\n SELECT = \"select\",\n START = \"start\",\n MOVE = \"move\",\n END = \"end\",\n CANCEL = \"cancel\",\n TAP = \"tap\",\n DOUBLETAP = \"doubleTap\",\n RELEASE = \"release\",\n GESTURESTART = \"gesturestart\",\n GESTURECHANGE = \"gesturechange\",\n GESTUREEND = \"gestureend\",\n GESTURETAP = \"gesturetap\";\n\n var THRESHOLD = {\n \"api\": 0,\n \"touch\": 0,\n \"mouse\": 9,\n \"pointer\": 9\n };\n\n var ENABLE_GLOBAL_SURFACE = (!support.touch || support.mouseAndTouchPresent);\n\n function touchDelta(touch1, touch2) {\n var x1 = touch1.x.location,\n y1 = touch1.y.location,\n x2 = touch2.x.location,\n y2 = touch2.y.location,\n dx = x1 - x2,\n dy = y1 - y2;\n\n return {\n center: {\n x: (x1 + x2) / 2,\n y: (y1 + y2) / 2\n },\n\n distance: Math.sqrt(dx * dx + dy * dy)\n };\n }\n\n function getTouches(e) {\n var touches = [],\n originalEvent = e.originalEvent,\n currentTarget = e.currentTarget,\n idx = 0, length,\n changedTouches,\n touch;\n\n if (e.api) {\n touches.push({\n id: 2, // hardcoded ID for API call;\n event: e,\n target: e.target,\n currentTarget: e.target,\n location: e,\n type: \"api\"\n });\n }\n else if (e.type.match(/touch/)) {\n changedTouches = originalEvent ? originalEvent.changedTouches : [];\n for (length = changedTouches.length; idx < length; idx ++) {\n touch = changedTouches[idx];\n touches.push({\n location: touch,\n event: e,\n target: touch.target,\n currentTarget: currentTarget,\n id: touch.identifier,\n type: \"touch\"\n });\n }\n }\n else if (support.pointers || support.msPointers) {\n touches.push({\n location: originalEvent,\n event: e,\n target: e.target,\n currentTarget: currentTarget,\n id: originalEvent.pointerId,\n type: \"pointer\"\n });\n } else {\n touches.push({\n id: 1, // hardcoded ID for mouse event;\n event: e,\n target: e.target,\n currentTarget: currentTarget,\n location: e,\n type: \"mouse\"\n });\n }\n\n return touches;\n }\n\n var TouchAxis = Class.extend({\n init: function(axis, location) {\n var that = this;\n\n that.axis = axis;\n\n that._updateLocationData(location);\n\n that.startLocation = that.location;\n that.velocity = that.delta = 0;\n that.timeStamp = now();\n },\n\n move: function(location) {\n var that = this,\n offset = location[\"page\" + that.axis],\n timeStamp = now(),\n timeDelta = (timeStamp - that.timeStamp) || 1; // Firing manually events in tests can make this 0;\n\n if (!offset && invalidZeroEvents) {\n return;\n }\n\n that.delta = offset - that.location;\n\n that._updateLocationData(location);\n\n that.initialDelta = offset - that.startLocation;\n that.velocity = that.delta / timeDelta;\n that.timeStamp = timeStamp;\n },\n\n _updateLocationData: function(location) {\n var that = this, axis = that.axis;\n\n that.location = location[\"page\" + axis];\n that.client = location[\"client\" + axis];\n that.screen = location[\"screen\" + axis];\n }\n });\n\n var Touch = Class.extend({\n init: function(userEvents, target, touchInfo) {\n extend(this, {\n x: new TouchAxis(\"X\", touchInfo.location),\n y: new TouchAxis(\"Y\", touchInfo.location),\n type: touchInfo.type,\n useClickAsTap: userEvents.useClickAsTap,\n threshold: userEvents.threshold || THRESHOLD[touchInfo.type],\n userEvents: userEvents,\n target: target,\n currentTarget: touchInfo.currentTarget,\n initialTouch: touchInfo.target,\n id: touchInfo.id,\n pressEvent: touchInfo,\n _clicks: userEvents._clicks,\n supportDoubleTap: userEvents.supportDoubleTap,\n _moved: false,\n _finished: false\n });\n },\n\n press: function() {\n this._holdTimeout = setTimeout(this._hold.bind(this), this.userEvents.minHold);\n this._trigger(PRESS, this.pressEvent);\n },\n\n _tap: function(touchInfo) {\n var that = this;\n that.userEvents._clicks++;\n if (that.userEvents._clicks == 1) {\n that._clickTimeout = setTimeout(function() {\n if (that.userEvents._clicks == 1) {\n that._trigger(TAP, touchInfo);\n }\n else {\n that._trigger(DOUBLETAP, touchInfo);\n }\n that.userEvents._clicks = 0;\n }, CLICK_DELAY);\n }\n },\n\n _hold: function() {\n this._trigger(HOLD, this.pressEvent);\n },\n\n move: function(touchInfo) {\n var that = this;\n var preventMove = touchInfo.type !== \"api\" && that.userEvents._shouldNotMove;\n\n if (that._finished || preventMove) { return; }\n\n that.x.move(touchInfo.location);\n that.y.move(touchInfo.location);\n\n if (!that._moved) {\n if (that._withinIgnoreThreshold()) {\n return;\n }\n\n if (!UserEvents.current || UserEvents.current === that.userEvents) {\n that._start(touchInfo);\n } else {\n return that.dispose();\n }\n }\n\n // Event handlers may cancel the drag in the START event handler, hence the double check for pressed.\n if (!that._finished) {\n that._trigger(MOVE, touchInfo);\n }\n },\n\n end: function(touchInfo) {\n this.endTime = now();\n\n if (this._finished) { return; }\n\n // Mark the object as finished if there are blocking operations in the event handlers (alert/confirm)\n this._finished = true;\n\n this._trigger(RELEASE, touchInfo); // Release should be fired before TAP (as click is after mouseup/touchend)\n\n if (this._moved) {\n this._trigger(END, touchInfo);\n } else {\n if (!this.useClickAsTap) {\n if (this.supportDoubleTap) {\n this._tap(touchInfo);\n }\n else {\n this._trigger(TAP, touchInfo);\n }\n }\n }\n\n clearTimeout(this._holdTimeout);\n\n this.dispose();\n },\n\n dispose: function() {\n var userEvents = this.userEvents,\n activeTouches = userEvents.touches;\n\n this._finished = true;\n this.pressEvent = null;\n clearTimeout(this._holdTimeout);\n\n activeTouches.splice($.inArray(this, activeTouches), 1);\n },\n\n skip: function() {\n this.dispose();\n },\n\n cancel: function() {\n this.dispose();\n },\n\n isMoved: function() {\n return this._moved;\n },\n\n _start: function(touchInfo) {\n clearTimeout(this._holdTimeout);\n\n this.startTime = now();\n this._moved = true;\n this._trigger(START, touchInfo);\n },\n\n _trigger: function(name, touchInfo) {\n var that = this,\n jQueryEvent = touchInfo.event,\n data = {\n touch: that,\n x: that.x,\n y: that.y,\n target: that.target,\n event: jQueryEvent\n };\n\n if (that.userEvents.notify(name, data)) {\n jQueryEvent.preventDefault();\n }\n },\n\n _withinIgnoreThreshold: function() {\n var xDelta = this.x.initialDelta,\n yDelta = this.y.initialDelta;\n\n return Math.sqrt(xDelta * xDelta + yDelta * yDelta) <= this.threshold;\n }\n });\n\n function withEachUpEvent(callback) {\n var downEvents = kendo.eventMap.up.split(\" \"),\n idx = 0,\n length = downEvents.length;\n\n for (; idx < length; idx ++) {\n callback(downEvents[idx]);\n }\n }\n\n var UserEvents = Observable.extend({\n init: function(element, options) {\n var that = this,\n filter,\n ns = kendo.guid();\n\n options = options || {};\n filter = that.filter = options.filter;\n that.threshold = options.threshold || DEFAULT_THRESHOLD;\n that.minHold = options.minHold || DEFAULT_MIN_HOLD;\n that.touches = [];\n that._maxTouches = options.multiTouch ? 2 : 1;\n that.allowSelection = options.allowSelection;\n that.captureUpIfMoved = options.captureUpIfMoved;\n that.useClickAsTap = !options.fastTap && !support.delayedClick();\n that.eventNS = ns;\n that._clicks = 0;\n that.supportDoubleTap = options.supportDoubleTap;\n\n element = $(element).handler(that);\n Observable.fn.init.call(that);\n\n extend(that, {\n element: element,\n // the touch events lock to the element anyway, so no need for the global setting\n surface: options.global && ENABLE_GLOBAL_SURFACE ? $(element[0].ownerDocument.documentElement) : $(options.surface || element),\n stopPropagation: options.stopPropagation,\n pressed: false\n });\n\n that.surface.handler(that)\n .on(kendo.applyEventMap(\"move\", ns), \"_move\")\n .on(kendo.applyEventMap(\"up cancel\", ns), \"_end\");\n\n element.on(kendo.applyEventMap(\"down\", ns), filter, \"_start\");\n\n if (that.useClickAsTap) {\n element.on(kendo.applyEventMap(\"click\", ns), filter, \"_click\");\n }\n\n if (support.pointers || support.msPointers) {\n //touch-action:none will not work for IE10\n if (support.browser.version < 11) {\n var defaultAction = \"pinch-zoom double-tap-zoom\";\n element.css(\"-ms-touch-action\", options.touchAction && options.touchAction != \"none\" ? defaultAction + \" \" + options.touchAction : defaultAction);\n } else {\n element.css(\"touch-action\", options.touchAction || \"none\");\n }\n }\n\n if (options.preventDragEvent) {\n element.on(kendo.applyEventMap(\"dragstart\", ns), kendo.preventDefault);\n }\n\n element.on(kendo.applyEventMap(\"mousedown\", ns), filter, { root: element }, \"_select\");\n\n if (that.captureUpIfMoved && support.eventCapture) {\n var surfaceElement = that.surface[0],\n preventIfMovingProxy = that.preventIfMoving.bind(that);\n\n withEachUpEvent(function(eventName) {\n surfaceElement.addEventListener(eventName, preventIfMovingProxy, true);\n });\n }\n\n that.bind([\n PRESS,\n HOLD,\n TAP,\n DOUBLETAP,\n START,\n MOVE,\n END,\n RELEASE,\n CANCEL,\n GESTURESTART,\n GESTURECHANGE,\n GESTUREEND,\n GESTURETAP,\n SELECT\n ], options);\n },\n\n preventIfMoving: function(e) {\n if (this._isMoved()) {\n e.preventDefault();\n }\n },\n\n destroy: function() {\n var that = this;\n\n if (that._destroyed) {\n return;\n }\n\n that._destroyed = true;\n\n if (that.captureUpIfMoved && support.eventCapture) {\n var surfaceElement = that.surface[0];\n withEachUpEvent(function(eventName) {\n surfaceElement.removeEventListener(eventName, that.preventIfMoving);\n });\n }\n\n that.element.kendoDestroy(that.eventNS);\n that.surface.kendoDestroy(that.eventNS);\n that.element.removeData(\"handler\");\n that.surface.removeData(\"handler\");\n that._disposeAll();\n\n that.unbind();\n delete that.surface;\n delete that.element;\n delete that.currentTarget;\n },\n\n capture: function() {\n UserEvents.current = this;\n },\n\n cancel: function() {\n this._disposeAll();\n this.trigger(CANCEL);\n },\n\n notify: function(eventName, data) {\n var that = this,\n touches = that.touches;\n\n if (this._isMultiTouch()) {\n switch (eventName) {\n case MOVE:\n eventName = GESTURECHANGE;\n break;\n case END:\n eventName = GESTUREEND;\n break;\n case TAP:\n eventName = GESTURETAP;\n break;\n }\n\n extend(data, { touches: touches }, touchDelta(touches[0], touches[1]));\n }\n\n return this.trigger(eventName, extend(data, { type: eventName }));\n },\n\n // API\n press: function(x, y, target) {\n this._apiCall(\"_start\", x, y, target);\n },\n\n move: function(x, y) {\n this._apiCall(\"_move\", x, y);\n },\n\n end: function(x, y) {\n this._apiCall(\"_end\", x, y);\n },\n\n _isMultiTouch: function() {\n return this.touches.length > 1;\n },\n\n _maxTouchesReached: function() {\n return this.touches.length >= this._maxTouches;\n },\n\n _disposeAll: function() {\n var touches = this.touches;\n while (touches.length > 0) {\n touches.pop().dispose();\n }\n },\n\n _isMoved: function() {\n return $.grep(this.touches, function(touch) {\n return touch.isMoved();\n }).length;\n },\n\n _select: function(e) {\n if (!this.allowSelection || this.trigger(SELECT, { event: e })) {\n e.preventDefault();\n }\n },\n\n _start: function(e) {\n var that = this,\n idx = 0,\n filter = that.filter,\n target,\n touches = getTouches(e),\n length = touches.length,\n touch,\n which = e.which;\n\n if ((which && which > 1) || (that._maxTouchesReached())) {\n return;\n }\n\n UserEvents.current = null;\n\n that.currentTarget = e.currentTarget;\n\n if (that.stopPropagation) {\n e.stopPropagation();\n }\n\n for (; idx < length; idx ++) {\n if (that._maxTouchesReached()) {\n break;\n }\n\n touch = touches[idx];\n\n if (filter) {\n target = $(touch.currentTarget); // target.is(filter) ? target : target.closest(filter, that.element);\n } else {\n target = that.element;\n }\n\n if (!target.length) {\n continue;\n }\n\n touch = new Touch(that, target, touch);\n that.touches.push(touch);\n touch.press();\n\n if (that._isMultiTouch()) {\n that.notify(\"gesturestart\", {});\n }\n }\n },\n\n _move: function(e) {\n this._eachTouch(\"move\", e);\n },\n\n _end: function(e) {\n this._eachTouch(\"end\", e);\n },\n\n _click: function(e) {\n var data = {\n touch: {\n initialTouch: e.target,\n target: $(e.currentTarget),\n endTime: now(),\n x: {\n location: e.pageX,\n client: e.clientX\n },\n y: {\n location: e.pageY,\n client: e.clientY\n }\n },\n x: e.pageX,\n y: e.pageY,\n target: $(e.currentTarget),\n event: e,\n type: \"tap\"\n };\n\n if (this.trigger(\"tap\", data)) {\n e.preventDefault();\n }\n },\n\n _eachTouch: function(methodName, e) {\n var that = this,\n dict = {},\n touches = getTouches(e),\n activeTouches = that.touches,\n idx,\n touch,\n touchInfo,\n matchingTouch;\n\n for (idx = 0; idx < activeTouches.length; idx ++) {\n touch = activeTouches[idx];\n dict[touch.id] = touch;\n }\n\n for (idx = 0; idx < touches.length; idx ++) {\n touchInfo = touches[idx];\n matchingTouch = dict[touchInfo.id];\n\n if (matchingTouch) {\n matchingTouch[methodName](touchInfo);\n }\n }\n },\n\n _apiCall: function(type, x, y, target) {\n this[type]({\n api: true,\n pageX: x,\n pageY: y,\n clientX: x,\n clientY: y,\n target: $(target || this.element)[0],\n stopPropagation: $.noop,\n preventDefault: $.noop\n });\n }\n });\n\n UserEvents.defaultThreshold = function(value) {\n DEFAULT_THRESHOLD = value;\n };\n\n UserEvents.minHold = function(value) {\n DEFAULT_MIN_HOLD = value;\n };\n\n kendo.getTouches = getTouches;\n kendo.touchDelta = touchDelta;\n kendo.UserEvents = UserEvents;\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","hidden","$","window","kendo","jQuery","undefined","support","Class","Observable","now","Date","extend","OS","mobileOS","invalidZeroEvents","android","DEFAULT_MIN_HOLD","CLICK_DELAY","DEFAULT_THRESHOLD","browser","msie","PRESS","HOLD","SELECT","START","MOVE","END","CANCEL","TAP","DOUBLETAP","RELEASE","GESTURESTART","GESTURECHANGE","GESTUREEND","GESTURETAP","THRESHOLD","api","touch","mouse","pointer","ENABLE_GLOBAL_SURFACE","mouseAndTouchPresent","touchDelta","touch1","touch2","x1","x","location","y1","y","x2","y2","dx","dy","center","distance","Math","sqrt","getTouches","e","touches","originalEvent","currentTarget","idx","length","changedTouches","push","event","target","type","match","identifier","pointers","msPointers","pointerId","TouchAxis","init","axis","that","this","_updateLocationData","startLocation","velocity","delta","timeStamp","move","offset","timeDelta","initialDelta","client","screen","Touch","userEvents","touchInfo","useClickAsTap","threshold","initialTouch","pressEvent","_clicks","supportDoubleTap","_moved","_finished","press","_holdTimeout","setTimeout","_hold","bind","minHold","_trigger","_tap","_clickTimeout","preventMove","_shouldNotMove","_withinIgnoreThreshold","UserEvents","current","_start","dispose","end","endTime","clearTimeout","activeTouches","splice","inArray","skip","cancel","isMoved","startTime","jQueryEvent","data","notify","preventDefault","xDelta","yDelta","withEachUpEvent","callback","downEvents","eventMap","up","split","element","options","filter","ns","guid","_maxTouches","multiTouch","allowSelection","captureUpIfMoved","fastTap","delayedClick","eventNS","handler","fn","call","surface","global","ownerDocument","documentElement","stopPropagation","pressed","on","applyEventMap","version","defaultAction","css","touchAction","preventDragEvent","root","eventCapture","surfaceElement","preventIfMovingProxy","preventIfMoving","eventName","addEventListener","_isMoved","destroy","_destroyed","removeEventListener","kendoDestroy","removeData","_disposeAll","unbind","capture","trigger","_isMultiTouch","_apiCall","_maxTouchesReached","pop","grep","_select","which","_move","_eachTouch","_end","_click","pageX","clientX","pageY","clientY","methodName","dict","matchingTouch","noop","defaultThreshold","value","amd","a1","a2","a3"],"mappings":"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"}