define(["dom", "events"], function(dom, events) { "use strict"; function getTouches(e) { return e.changedTouches || e.targetTouches || e.touches } function TouchHelper(elem, options) { options = options || {}; var touchTarget, touchStartX, touchStartY, lastDeltaX, lastDeltaY, thresholdYMet, self = this, swipeXThreshold = options.swipeXThreshold || 50, swipeYThreshold = options.swipeYThreshold || 50, excludeTagNames = options.ignoreTagNames || [], touchStart = function(e) { var touch = getTouches(e)[0]; if (touchTarget = null, touchStartX = 0, touchStartY = 0, lastDeltaX = null, lastDeltaY = null, thresholdYMet = !1, touch) { var currentTouchTarget = touch.target; if (dom.parentWithTag(currentTouchTarget, excludeTagNames)) return; touchTarget = currentTouchTarget, touchStartX = touch.clientX, touchStartY = touch.clientY } }, touchEnd = function(e) { var isTouchMove = "touchmove" === e.type; if (touchTarget) { var deltaX, deltaY, clientX, clientY, touch = getTouches(e)[0]; touch ? (clientX = touch.clientX || 0, clientY = touch.clientY || 0, deltaX = clientX - (touchStartX || 0), deltaY = clientY - (touchStartY || 0)) : (deltaX = 0, deltaY = 0); var currentDeltaX = null == lastDeltaX ? deltaX : deltaX - lastDeltaX, currentDeltaY = null == lastDeltaY ? deltaY : deltaY - lastDeltaY; lastDeltaX = deltaX, lastDeltaY = deltaY, deltaX > swipeXThreshold && Math.abs(deltaY) < 30 ? events.trigger(self, "swiperight", [touchTarget]) : deltaX < 0 - swipeXThreshold && Math.abs(deltaY) < 30 ? events.trigger(self, "swipeleft", [touchTarget]) : (deltaY < 0 - swipeYThreshold || thresholdYMet) && Math.abs(deltaX) < 30 ? (thresholdYMet = !0, events.trigger(self, "swipeup", [touchTarget, { deltaY: deltaY, deltaX: deltaX, clientX: clientX, clientY: clientY, currentDeltaX: currentDeltaX, currentDeltaY: currentDeltaY }])) : (deltaY > swipeYThreshold || thresholdYMet) && Math.abs(deltaX) < 30 && (thresholdYMet = !0, events.trigger(self, "swipedown", [touchTarget, { deltaY: deltaY, deltaX: deltaX, clientX: clientX, clientY: clientY, currentDeltaX: currentDeltaX, currentDeltaY: currentDeltaY }])), isTouchMove && options.preventDefaultOnMove && e.preventDefault() } isTouchMove || (touchTarget = null, touchStartX = 0, touchStartY = 0, lastDeltaX = null, lastDeltaY = null, thresholdYMet = !1) }; this.touchStart = touchStart, this.touchEnd = touchEnd, dom.addEventListener(elem, "touchstart", touchStart, { passive: !0 }), options.triggerOnMove && dom.addEventListener(elem, "touchmove", touchEnd, { passive: !options.preventDefaultOnMove }), dom.addEventListener(elem, "touchend", touchEnd, { passive: !0 }), dom.addEventListener(elem, "touchcancel", touchEnd, { passive: !0 }) } return TouchHelper.prototype.destroy = function() { var elem = this.elem; if (elem) { var touchStart = this.touchStart, touchEnd = this.touchEnd; dom.removeEventListener(elem, "touchstart", touchStart, { passive: !0 }), dom.removeEventListener(elem, "touchmove", touchEnd, { passive: !0 }), dom.removeEventListener(elem, "touchend", touchEnd, { passive: !0 }), dom.removeEventListener(elem, "touchcancel", touchEnd, { passive: !0 }) } this.touchStart = null, this.touchEnd = null, this.elem = null }, TouchHelper });